From e7ee089139bc135d00d5ad67e5138acbcfa6cdb9 Mon Sep 17 00:00:00 2001 From: Rasika Date: Mon, 1 Jun 2015 16:09:21 +0530 Subject: [PATCH] adding sensebot app --- .../jaggeryapps/sensebot/api/device-api.jag | 46 + .../jaggeryapps/sensebot/api/stats-api.jag | 144 + .../jaggeryapps/sensebot/config/config.json | 16 + .../jaggeryapps/sensebot/config/dc-props.js | 37 + .../jaggeryapps/sensebot/config/init.js | 28 + .../jaggeryapps/sensebot/jaggery.conf | 23 + .../sensebot/layouts/enrollment.hbs | 29 + .../jaggeryapps/sensebot/layouts/fluid.hbs | 23 + .../sensebot/layouts/nav-fluid.hbs | 50 + .../jaggeryapps/sensebot/lib/acs.jag | 49 + .../jaggeryapps/sensebot/lib/fuse-router.js | 210 + .../jaggeryapps/sensebot/lib/fuse.jag | 29 + .../jaggeryapps/sensebot/lib/fuse.js | 417 + .../sensebot/lib/handlebars-helpers.js | 194 + .../sensebot/lib/handlebars-v2.0.0.js | 3079 +++++ .../sensebot/lib/less-rhino-1.7.5.js | 10209 ++++++++++++++ .../jaggeryapps/sensebot/lib/login.jag | 36 + .../jaggeryapps/sensebot/lib/logout.jag | 37 + .../jaggeryapps/sensebot/modules/constants.js | 26 + .../jaggeryapps/sensebot/modules/download.js | 68 + .../jaggeryapps/sensebot/modules/pinch.min.js | 27 + .../jaggeryapps/sensebot/modules/sso.js | 161 + .../jaggeryapps/sensebot/modules/user.js | 299 + .../jaggeryapps/sensebot/modules/utility.js | 59 + .../jaggeryapps/sensebot/pages/index.hbs | 8 + .../jaggeryapps/sensebot/pages/mydevice.hbs | 9 + .../sensebot/test/testExecutor.jag | 20 + .../sensebot/tmp/cached_theme_less_base.css | 6293 +++++++++ .../sensebot/units/appbar/appbar.hbs | 141 + .../sensebot/units/appbar/appbar.js | 19 + .../sensebot/units/appbar/appbar.json | 3 + .../units/appbar/public/images/logo.png | Bin 0 -> 5174 bytes .../sensebot/units/mydevice/mydevice.hbs | 77 + .../sensebot/units/mydevice/mydevice.js | 4 + .../sensebot/units/mydevice/mydevice.json | 3 + .../mydevice/public/css/daterangepicker.css | 232 + .../units/mydevice/public/css/nv.d3.css | 645 + .../units/mydevice/public/images/bulb-off.png | Bin 0 -> 516 bytes .../units/mydevice/public/images/bulb-on.png | Bin 0 -> 451 bytes .../units/mydevice/public/images/fan.png | Bin 0 -> 650 bytes .../units/mydevice/public/images/temp.png | Bin 0 -> 373 bytes .../sensebot/units/mydevice/public/js/bulb.js | 10 + .../mydevice/public/js/cumulativelinechart.js | 0 .../units/mydevice/public/js/d3.min.js | 5 + .../units/mydevice/public/js/date-range.js | 0 .../mydevice/public/js/discretebarchart.js | 0 .../units/mydevice/public/js/graph_util.js | 116 + .../public/js/jquery.daterangepicker.js | 1627 +++ .../units/mydevice/public/js/light_graph.js | 60 + .../mydevice/public/js/linewithfocuschart.js | 0 .../units/mydevice/public/js/moment.min.js | 7 + .../units/mydevice/public/js/motion_graph.js | 60 + .../units/mydevice/public/js/nv.d3.js | 11357 ++++++++++++++++ .../units/mydevice/public/js/sonar_graph.js | 60 + .../units/mydevice/public/js/stream_layers.js | 35 + .../mydevice/public/js/temperature_graph.js | 60 + .../units/theme/public/css/bootstrap.min.css | 6671 +++++++++ .../units/theme/public/css/custom-theme.css | 74 + .../theme/public/css/fontwso2-extend.css | 177 + .../units/theme/public/css/fontwso2.css | 481 + .../sensebot/units/theme/public/css/main.css | 484 + .../public/fonts/OpenSans-Bold-webfont.eot | Bin 0 -> 30858 bytes .../public/fonts/OpenSans-Bold-webfont.svg | 251 + .../public/fonts/OpenSans-Bold-webfont.ttf | Bin 0 -> 30680 bytes .../public/fonts/OpenSans-Bold-webfont.woff | Bin 0 -> 19788 bytes .../fonts/OpenSans-BoldItalic-webfont.eot | Bin 0 -> 34166 bytes .../fonts/OpenSans-BoldItalic-webfont.svg | 251 + .../fonts/OpenSans-BoldItalic-webfont.ttf | Bin 0 -> 33960 bytes .../fonts/OpenSans-BoldItalic-webfont.woff | Bin 0 -> 21940 bytes .../fonts/OpenSans-ExtraBold-webfont.eot | Bin 0 -> 30602 bytes .../fonts/OpenSans-ExtraBold-webfont.svg | 251 + .../fonts/OpenSans-ExtraBold-webfont.ttf | Bin 0 -> 30404 bytes .../fonts/OpenSans-ExtraBold-webfont.woff | Bin 0 -> 19972 bytes .../OpenSans-ExtraBoldItalic-webfont.eot | Bin 0 -> 33758 bytes .../OpenSans-ExtraBoldItalic-webfont.svg | 251 + .../OpenSans-ExtraBoldItalic-webfont.ttf | Bin 0 -> 33532 bytes .../OpenSans-ExtraBoldItalic-webfont.woff | Bin 0 -> 21824 bytes .../public/fonts/OpenSans-Italic-webfont.eot | Bin 0 -> 34798 bytes .../public/fonts/OpenSans-Italic-webfont.svg | 251 + .../public/fonts/OpenSans-Italic-webfont.ttf | Bin 0 -> 34612 bytes .../public/fonts/OpenSans-Italic-webfont.woff | Bin 0 -> 22416 bytes .../public/fonts/OpenSans-Light-webfont.eot | Bin 0 -> 29794 bytes .../public/fonts/OpenSans-Light-webfont.svg | 252 + .../public/fonts/OpenSans-Light-webfont.ttf | Bin 0 -> 29612 bytes .../public/fonts/OpenSans-Light-webfont.woff | Bin 0 -> 19396 bytes .../fonts/OpenSans-LightItalic-webfont.eot | Bin 0 -> 34578 bytes .../fonts/OpenSans-LightItalic-webfont.svg | 252 + .../fonts/OpenSans-LightItalic-webfont.ttf | Bin 0 -> 34368 bytes .../fonts/OpenSans-LightItalic-webfont.woff | Bin 0 -> 22444 bytes .../public/fonts/OpenSans-Regular-webfont.eot | Bin 0 -> 29934 bytes .../public/fonts/OpenSans-Regular-webfont.svg | 252 + .../public/fonts/OpenSans-Regular-webfont.ttf | Bin 0 -> 29744 bytes .../fonts/OpenSans-Regular-webfont.woff | Bin 0 -> 19624 bytes .../fonts/OpenSans-Semibold-webfont.eot | Bin 0 -> 30350 bytes .../fonts/OpenSans-Semibold-webfont.svg | 251 + .../fonts/OpenSans-Semibold-webfont.ttf | Bin 0 -> 30156 bytes .../fonts/OpenSans-Semibold-webfont.woff | Bin 0 -> 19736 bytes .../fonts/OpenSans-SemiboldItalic-webfont.eot | Bin 0 -> 34866 bytes .../fonts/OpenSans-SemiboldItalic-webfont.svg | 251 + .../fonts/OpenSans-SemiboldItalic-webfont.ttf | Bin 0 -> 34644 bytes .../OpenSans-SemiboldItalic-webfont.woff | Bin 0 -> 22332 bytes .../units/theme/public/fonts/fontwso2.eot | Bin 0 -> 34828 bytes .../units/theme/public/fonts/fontwso2.svg | 124 + .../units/theme/public/fonts/fontwso2.ttf | Bin 0 -> 34660 bytes .../units/theme/public/fonts/fontwso2.woff | Bin 0 -> 34736 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41280 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes .../theme/public/images/content-bg-1.png | Bin 0 -> 29835 bytes .../units/theme/public/images/content-bg.png | Bin 0 -> 11641 bytes .../units/theme/public/js/bootstrap.min.js | 7 + .../units/theme/public/js/html5shiv.min.js | 7 + .../theme/public/js/jquery-1.11.2.min.js | 5 + .../units/theme/public/js/jquery.min.js | 5 + .../units/theme/public/js/respond.min.js | 5 + .../sensebot/units/theme/public/js/toggle.js | 11 + .../theme/public/scripts/validate-register.js | 140 + .../sensebot/units/theme/theme.hbs | 27 + .../sensebot/units/theme/theme.json | 3 + 120 files changed, 47110 insertions(+) create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/api/device-api.jag create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/api/stats-api.jag create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/config/config.json create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/config/dc-props.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/config/init.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/jaggery.conf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/layouts/enrollment.hbs create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/layouts/fluid.hbs create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/layouts/nav-fluid.hbs create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/acs.jag create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse-router.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse.jag create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/handlebars-helpers.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/handlebars-v2.0.0.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/less-rhino-1.7.5.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/login.jag create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/lib/logout.jag create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/modules/constants.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/modules/download.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/modules/pinch.min.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/modules/sso.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/modules/user.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/modules/utility.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/pages/index.hbs create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/pages/mydevice.hbs create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/test/testExecutor.jag create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/tmp/cached_theme_less_base.css create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.hbs create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.json create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/public/images/logo.png create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.hbs create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.json create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/css/daterangepicker.css create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/css/nv.d3.css create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/images/bulb-off.png create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/images/bulb-on.png create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/images/fan.png create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/images/temp.png create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/bulb.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/cumulativelinechart.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/d3.min.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/date-range.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/discretebarchart.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/graph_util.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/jquery.daterangepicker.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/light_graph.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/linewithfocuschart.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/moment.min.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/motion_graph.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/nv.d3.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/sonar_graph.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/stream_layers.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/temperature_graph.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/bootstrap.min.css create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/custom-theme.css create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/fontwso2-extend.css create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/fontwso2.css create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/main.css create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Italic-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Italic-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Italic-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Italic-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Regular-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Regular-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Regular-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Regular-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.eot create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.svg create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.ttf create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.woff create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/images/content-bg-1.png create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/images/content-bg.png create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/bootstrap.min.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/html5shiv.min.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/jquery-1.11.2.min.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/jquery.min.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/respond.min.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/toggle.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/scripts/validate-register.js create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/theme.hbs create mode 100755 modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/theme.json diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/api/device-api.jag b/modules/distribution/src/repository/jaggeryapps/sensebot/api/device-api.jag new file mode 100755 index 00000000..0a5c8ef4 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/api/device-api.jag @@ -0,0 +1,46 @@ +<% +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var uri = request.getRequestURI(); +var uriMatcher = new URIMatcher(String(uri)); + +var log = new Log("api/device-api.jag"); + +var constants = require("/modules/constants.js"); +var dcProps = require('/config/dc-props.js').config(); +var downloadModule = require("/modules/download.js").downloadModule; +var utility = require("/modules/utility.js").utility; + +var result; + +if (uriMatcher.match("/{context}/api/device/sketch/")) { + sketchType = request.getParameter("type"); + if(!sketchType){log.error("Sketch Type is empty");} + + senseBotManagerService = "http://localhost:9763/iotdevices/SenseBotManager"; + sketchDownloadEndPoint = senseBotManagerService + "/downloadSketch"; + response.sendRedirect(sketchDownloadEndPoint + "?type="+sketchType+"&owner=anonymous"); + exit(); +} + +// returning the result. +if (result) { + print(result); +} +%> diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/api/stats-api.jag b/modules/distribution/src/repository/jaggeryapps/sensebot/api/stats-api.jag new file mode 100755 index 00000000..e56545b5 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/api/stats-api.jag @@ -0,0 +1,144 @@ +<% +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var uri = request.getRequestURI(); +var uriMatcher = new URIMatcher(String(uri)); + +var log = new Log("api/stats-api.jag"); + +var constants = require("/modules/constants.js"); +var dcProps = require('/config/dc-props.js').config(); +var utility = require("/modules/utility.js").utility; + +var result; +var statsClient = new Packages.org.wso2.carbon.device.mgt.iot.usage.statistics.IoTUsageStatisticsClient; + +if (uriMatcher.match("/{context}/api/stats")) { + + var deviceId = request.getParameter("deviceId"); + var from = request.getParameter("from"); + var to = request.getParameter("to"); + + log.info("deviceId : " + deviceId + " from : " + from + " to : " + to); + + result = getData(getUsername(), deviceId, from, to); + +} + +// returning the result. +if (result) { + print(result); +} + +function getUsername() { + + var user = session.get(constants.USER_SESSION_KEY); + + if (user) { + log.info("username: "+ user.username); + return user.username; + } else { + log.info("username is null"); + return null; + } + + + +} + +function getData(user, deviceId, from, to) { + + result = new Object(); + + result['sonarData'] = getSensorData("SONAR_SENSOR_SUMMARY","SONAR",user, deviceId, from, to); + result['motionData'] = getSensorData("PIR_MOTION_SENSOR_SUMMARY","MOTION",user, deviceId, from, to); + result['lightData'] = getSensorData("LDR_LIGHT_SENSOR_SUMMARY","LIGHT",user, deviceId, from, to); + result['temperatureData'] = getSensorData("DEVICE_TEMPERATURE_SUMMARY","TEMPERATURE",user, deviceId, from, to); + + return result; + +} + +function getSensorData(table, column, user, deviceId, from, to) { + + var fetchedData = statsClient.getDeviceStats(table, column, user, deviceId, from, to); + + var temperatureData = []; + + for (var i = 0; i < fetchedData.size(); i++) { + temperatureData.push({ + time: fetchedData.get(i).getTime(), + value: fetchedData.get(i).getValue() + }); + } + + return temperatureData; +} + +// ------------- Sample data generation ----------------- + +function getSampleData() { + + result = new Object(); + + result['bulbStatusData'] = getBulbStatusSampleData(); + result['fanStatusData'] = getFanStatusSampleData(); + result['temperatureData'] = getTemperatureSampleData(); + + return result; +} + +function getBulbStatusSampleData(from, to) { + + var bulbStatusData = []; + + for (var i = 0; i < 100; i++) { + bulbStatusData.push({ + time: Date.now() + (i * 1000), + value: Math.floor((Math.random() * 100) + 1) % 2 == 0 ? 'ON' : 'OFF'}); + } + + return bulbStatusData; +}; + + +function getFanStatusSampleData(from, to) { + + var fanStatusData = []; + + for (var i = 0; i < 100; i++) { + fanStatusData.push({time: Date.now() + (i * 1000), value: Math.floor((Math.random() * 100) + 1) % 2 == 0 ? 'ON' : 'OFF'}); + } + + return fanStatusData; +} + +function getTemperatureSampleData(from, to) { + + var temperatureData = []; + + for (var i = 0; i < 100; i++) { + temperatureData.push({time: Date.now() + (i * 1000), value: Math.random() * 100}); + } + + return temperatureData; +} + + +%> \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/config/config.json b/modules/distribution/src/repository/jaggeryapps/sensebot/config/config.json new file mode 100755 index 00000000..95a917df --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/config/config.json @@ -0,0 +1,16 @@ +{ + "appContext" : "/iot/", + "apiContext" : "api", + "httpsURL": "%https.ip%", + "httpURL": "%http.ip%", + "ssoConfiguration": { + "enabled": false, + "issuer": "iot", + "appName": "iot", + "identityProviderURL": "%https.ip%/sso/samlsso.jag", + "responseSigningEnabled": "true", + "keyStorePassword": "wso2carbon", + "identityAlias": "wso2carbon", + "keyStoreName": "/repository/resources/security/wso2carbon.jks" + } +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/config/dc-props.js b/modules/distribution/src/repository/jaggeryapps/sensebot/config/dc-props.js new file mode 100755 index 00000000..7911f514 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/config/dc-props.js @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var config = function () { + var conf = application.get("PINCH_CONFIG"); + if (!conf) {//if not in cache + var pinch = require('/modules/pinch.min.js').pinch; + var server = require('carbon').server; + var config = require('/config/config.json'); + pinch(config, /^/, function (path, key, value) { + if ((typeof value === 'string') && value.indexOf('%https.ip%') > -1) { + return value.replace('%https.ip%', server.address("https")); + } else if ((typeof value === 'string') && value.indexOf('%http.ip%') > -1) { + return value.replace('%http.ip%', server.address("http")); + } + return value; + }); + application.put("PINCH_CONFIG", config);//caching + conf = config; + } + return conf; +}; \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/config/init.js b/modules/distribution/src/repository/jaggeryapps/sensebot/config/init.js new file mode 100755 index 00000000..d492ae79 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/config/init.js @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var carbonModule = require("carbon"); +var dcProps = require('/config/dc-props.js').config(); +var carbonServer = new carbonModule.server.Server({ + tenanted: true, + url: dcProps.httpsURL + '/admin' +}); +application.put("carbonServer", carbonServer); +var userModule = require("/modules/user.js").userModule; +var utility = require("/modules/utility.js").utility; +utility.insertAppPermissions(userModule, "init"); \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/jaggery.conf b/modules/distribution/src/repository/jaggeryapps/sensebot/jaggery.conf new file mode 100755 index 00000000..c0d708f1 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/jaggery.conf @@ -0,0 +1,23 @@ +{ + "displayName": "Fuse Sample", + "logLevel": "info", + "initScripts": ["/config/init.js"], + "urlMappings": [ + { + "url" : "/test/*", + "path" : "test/testExecutor.jag" + }, + { + "url": "/api/stats/*", + "path": "/api/stats-api.jag" + }, + { + "url": "/api/device/*", + "path": "/api/device-api.jag" + }, + { + "url": "/*", + "path": "/lib/fuse.jag" + } + ] +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/enrollment.hbs b/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/enrollment.hbs new file mode 100755 index 00000000..388ca0d4 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/enrollment.hbs @@ -0,0 +1,29 @@ + + + + + + + {{ defineZone "title"}} + + {{ defineZone "topLibCss"}} + {{ defineZone "topCss"}} + + +
+ +
+
+ +
+
+ + {{ defineZone "body"}} +
+ {{ defineZone "bottomjquery" }} + {{ defineZone "bottomLibJs" }} + {{ defineZone "bottomJs" }} + + diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/fluid.hbs b/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/fluid.hbs new file mode 100755 index 00000000..1c9a5847 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/fluid.hbs @@ -0,0 +1,23 @@ + + + + + + + + {{ defineZone "title"}} + {{ defineZone "topLibCss"}} + {{ defineZone "topCss"}} + {{ defineZone "topJs"}} + + +
+ + {{ defineZone "header"}} + + {{ defineZone "body"}} +
+ {{ defineZone "bottomLibJs" }} + {{ defineZone "bottomJs" }} + + diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/nav-fluid.hbs b/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/nav-fluid.hbs new file mode 100755 index 00000000..00278772 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/layouts/nav-fluid.hbs @@ -0,0 +1,50 @@ + + + + + {{ defineZone "title"}} + {{ defineZone "topCss"}} + + + + +
+
+ +
+
+ {{ defineZone "left"}} +
+ +
+ {{ defineZone "content"}} +
+
+ +
+ +
+ + + + diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/lib/acs.jag b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/acs.jag new file mode 100755 index 00000000..147c20a2 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/acs.jag @@ -0,0 +1,49 @@ +<% +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var dataConfig = require('/config/dc-props.js').config(); +var sso = require('/modules/sso.js').sso; +var constants = require('/modules/constants.js'); +var carbonModule = require("carbon"); +var log = new Log(); +var keyStoreParams = { + keyStoreName: dataConfig.ssoConfiguration.keyStoreName, + keyStorePassword: dataConfig.ssoConfiguration.keyStorePassword, + identityAlias: dataConfig.ssoConfiguration.identityAlias +}; +sso.configure(dataConfig.ssoConfiguration.issuer, + dataConfig.ssoConfiguration.appName, + keyStoreParams, dataConfig.ssoConfiguration.identityProviderURL); +sso.acs( + function(loggedInUser) { + var carbonUser = carbonModule.server.tenantUser(loggedInUser); + session.put(constants.USER_SESSION_KEY, carbonUser); + var username = carbonUser.username; + if(log.isDebugEnabled()){ + log.debug("User logged in: "+username); + } + response.sendRedirect(dataConfig.appContext); + }, function() { + if(log.isDebugEnabled()){ + log.debug("User logged out"); + } + response.sendRedirect(dataConfig.appContext); + } +); +%> \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse-router.js b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse-router.js new file mode 100755 index 00000000..7aab77d7 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse-router.js @@ -0,0 +1,210 @@ +//public function declarations +var route; + +(function () { + + //public + /** + * front controller entity point. acts as the main function for every request. + */ + route = function () { + //lets assume URL looks like https://my.domain.com/app/{one}/{two}/{three}/{four} + var uri = request.getRequestURI(); // = app/{one}/{two}/{three}/{four} + var parts = splitFirst(uri); + fuseState.appName = parts.head; + var path = parts.tail; // = /{one}/{two}/{three}/{four} + var handled = false; + + parts = splitFirst(path); + if (parts.head == 'public') { // {one} == 'public' + parts = splitFirst(parts.tail); + if (splitFirst(parts.tail).head == 'less') { // {three} == 'less' + handled = renderLess(parts.head, parts.tail); // renderLess({two},{three}/{four}) + } else { + handled = renderStatic(parts.head, parts.tail); + } + } else { + handled = renderPage(path); + if (!handled) { + handled = renderUnit(path); + } + } + + if (!handled) { + response.sendError(404, 'Requested resource not found'); + } + + }; + + + //private + var log = new Log('fuse.router'); + + var getMime = function (path) { + var index = path.lastIndexOf('.') + 1; + var knowMime = { + 'js': 'application/javascript', + 'html': 'text/html', + 'htm': 'text/html', + 'woff': 'application/x-font-woff', + "png": "image/png", + "css": "text/css", + "hbs": "text/x-handlebars-template", + "apk": "application/vnd.android.package-archive", + "ipa": "application/octet-stream" + }; + var mime; + if (index >= 0) { + mime = knowMime[path.substr(index)]; + } + return mime || 'text/plain'; + }; + + /** + * '/a/b/c/d' -> {'a','b/c/d'} + * @param path URI part, should start with '/' + * @returns {{head: string, tail: string}} + */ + var splitFirst = function (path) { + var firstSlashPos = path.indexOf('/', 1); + var head = path.substring(1, firstSlashPos); + var tail = path.substring(firstSlashPos); + return {head: head, tail: tail}; + }; + + /** + * @param str + * @param prefix + * @returns {boolean} true iif str starts with prefix + */ + var startsWith = function (str, prefix) { + return (str.lastIndexOf(prefix, 0) === 0); + }; + + var renderStatic = function (unit, path) { + log.debug('[' + requestId + '] for unit "' + unit + '" a request received for a static file "' + path + '"'); + var staticFile = fuse.getFile(unit, 'public' + path); + if (staticFile.isExists() && !staticFile.isDirectory()) { + response.addHeader('Content-type', getMime(path)); + response.addHeader('Cache-Control', 'public,max-age=12960000'); + staticFile.open('r'); + var stream = staticFile.getStream(); + print(stream); + staticFile.close(); + return true; + } + return false; + }; + + var renderPage = function (path) { + var jagFile; + if (path.indexOf('/', path.length - 1) !== -1) { + jagFile = new File('/pages' + path + 'index.jag'); + } else { + jagFile = new File('/pages' + path + '.jag'); + } + if (jagFile.isExists()) { + include(jagFile.getPath()); + return true; + }else{ + return false; + } + }; + + var renderUnit = function (path) { + var mainUnit = null; + var matchedUnits = fuse.getMatchedUnitDefinitions(); + fuse.addDependencies(matchedUnits); + var zones = fuseState.zones; + + // A map of maps. this is used to ensure same zone is not render twice in to same definition. + // zonesAdded = { titleZone : { zoneFromA : true, zoneFromB : true } } + var zonesAdded = {}; + + for (var i = 0; i < matchedUnits.length; i++) { + var definition = matchedUnits[i]; + + for (var j = 0; j < definition.zones.length; j++) { + var zone = definition.zones[j]; + if (!zones[zone.name]) { + zones[zone.name] = []; + zonesAdded[zone.name] = {}; + } + var zoneKey = zone.origin + ':' + zone.name; // temp unique key to identify zone form a given unit. + if (!zonesAdded[zone.name][zoneKey]) { + var zoneInfo = {unitName: definition.name}; + if (zone.origin != definition.name) { + zoneInfo.originUnitName = zone.origin; + } + zones[zone.name].push(zoneInfo); + zonesAdded[zone.name][zoneKey] = true; + } + } + + } + + var layout = fuseState.layout; + if (layout !== null) { + log.debug( + '[' + requestId + '] request for "' + path + '" will be rendered using layout "' + + layout + '" (defined in "' + mainUnit + '") and zones ' + + stringify(zones) + ); + + var output = handlebars.Handlebars.compileFile(fuse.getLayoutPath(layout))({}); + response.addHeader('Content-type', 'text/html'); + print(output); + return true; + } else { + log.debug( + '[' + requestId + '] request for "' + path + '" will can\'t be rendered, since no layout is defined' + + 'in any of the units ' + stringify(zones)); + return false; + } + }; + + function fileToString(path) { + } + + /** + * convert less file to css and print to output. add '?nocache=true' to force regenerate. + * @param unit name of the unit + * @param path the path to the less file relative to unit root (should start with slash) + * @returns {boolean} is successfully rendered. + */ + function renderLess(unit, path) { + //TODO: fix - incorrect less files makes it respond the old less even if it is nocahce. + log.debug('[' + requestId + '] for unit "' + unit + '" a request received for a less file "' + path + '"'); + var cacheKey = '/tmp/cached_' + unit + path.replace(/[^\w\.-]/g, '_'); + fuseState.currentUnit = unit; + var cachedCss = new File(cacheKey); + + //TODO: move this check to caller function ?? + if (fuseDebug || request.getParameter('nocache') == 'true' || !cachedCss.isExists()) { + var parts = splitFirst(path); + var lessPath = '/public/less' + parts.tail.replace(/\.css$/, '') + '.less'; + var lessFile = fuse.getFile(unit, lessPath); + + if (lessFile.isExists()) { + var x = require('less-rhino-1.7.5.js'); + x.compile([lessFile.getPath(), cacheKey]); + log.debug('[' + requestId + '] for unit "' + unit + '" request for "' + path + '" is cached as "' + cacheKey + '"'); + } + } + + + if (cachedCss.isExists()) { + response.addHeader('Content-type', 'text/css'); + response.addHeader('Cache-Control', 'public,max-age=12960000'); + cachedCss.open('r'); + var stream = cachedCss.getStream(); + print(stream); + cachedCss.close(); + return true; + } + return false; + + } + + +})(); diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse.jag b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse.jag new file mode 100755 index 00000000..597c9970 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse.jag @@ -0,0 +1,29 @@ +<% + +//global object to pass request stat among fuse framework files. +var fuseState = { + zones: {}, + appName: '', + zoneStack: [], + currentUnit: null +}; + +var requestId = function makeId() { + var text = ""; + var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (var i = 0; i < 5; i++) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + + return text; +}(); +var fuseDebug = false; +//var fuseDebug = true; + +var handlebars = require('handlebars-helpers.js'); +var fuseRouter = require('fuse-router.js'); +var fuse = require('fuse.js'); + + +fuseRouter.route(); + +%> diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse.js b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse.js new file mode 100755 index 00000000..f802f4be --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/fuse.js @@ -0,0 +1,417 @@ +//public function declarations +var getHbsFile, getFile, toRelativePath, cleanupAncestors, + getUnitPath, getMatchedUnitDefinitions, getZoneDefinition, getUnitDefinition, + getUnitDefinitions, getLayoutPath; + +(function () { + //private + var log = new Log('fuse.core'); + var lookUpTable = null; + var definitions = null; + + var initLookUp = function (definitions) { + if (lookUpTable === null) { + lookUpTable = {}; + for (var i = 0; i < definitions.length; i++) { + var definition = definitions[i]; + lookUpTable[definition.name] = i; + } + } + }; + + var isMatched = function (definition, layout) { + var urlMatch = function (pattern) { + var uriMatcher = new URIMatcher(request.getRequestURI()); + return Boolean(uriMatcher.match('/{appName}' + pattern)); + }; + var permission = function (permissionStr) { + var carbonModule = require("carbon"); + var carbonServer = application.get("carbonServer"); + var carbonUser = session.get("USER"); + if (carbonUser) { + var userManager = new carbonModule.user.UserManager(carbonServer, carbonUser.tenantId); + var user = new carbonModule.user.User(userManager, carbonUser.username); + return user.isAuthorized(permissionStr, "ui.execute"); + } + return false; + }; + var config = {'theme': 'default'}; + var predicateStr = definition.definition.predicate; + if (predicateStr) { + var js = 'function(config,urlMatch,permission,layout){ return ' + predicateStr + ';}'; + return Boolean(eval(js)(config, urlMatch,permission, layout ? layout : NaN)); + } + return false; + }; + + var getAncestorModels = function (unit) { + var unitModel = getUnitDefinition(unit); + var ancestors = [unitModel]; + var parentName; + while ((parentName = unitModel.definition.extends) != null) { + unitModel = getUnitDefinition(parentName); + ancestors.push(unitModel); + } + return ancestors; + }; + + addDependencies = function (unitModels) { + var resolved = {}; + for (var i = 0; i < unitModels.length; i++) { + resolved[unitModels[i].name] = true; + } + + for (i = 0; i < unitModels.length; i++) { + var unitModel = unitModels[i]; + var dependencies = unitModel.definition.dependencies; + if (dependencies) { + for (var j = 0; j < dependencies.length; j++) { + var dependencyName = dependencies[j]; + unitModels.push(getUnitDefinition(dependencyName)); + resolved[dependencyName] = true; + } + } + } + + + }; + + + //public + getMatchedUnitDefinitions = function () { + //TODO: return map not list + var unitDefinitions = getUnitDefinitions(); + var matched = []; + var unMatched = []; + var layout = null; + var mainUnit = null; + + var addToMatched = function (model) { + matched.push(model); + if (model.layout) { + if (layout == null) { + layout = model.layout; + mainUnit = model.name; + } else { + log.warn( + '[' + requestId + '] multiple layouts ' + mainUnit + ':' + + layout + ' vs ' + model.name + ':' + model.layout + ); + } + } + }; + + + // first pass + for (var i = 0; i < unitDefinitions.length; i++) { + var unitDefinition = unitDefinitions[i]; + if (isMatched(unitDefinition)) { + addToMatched(unitDefinition); + } else { + unMatched.push(unitDefinition); + } + } + + fuseState.layout = layout; + + // second pass : we have to do this two passes since we don't know the layout + // first time around + if (layout) { + for (i = 0; i < unMatched.length; i++) { + unitDefinition = unMatched[i]; + if (isMatched(unitDefinition, layout)) { + addToMatched(unitDefinition) + } + } + } + + + var toDelete = []; + + for (i = 0; i < matched.length; i++) { + var ancestors = getAncestorModels(matched[i].name); + for (var j = 1; j < ancestors.length; j++) { + var ancestor = ancestors[j]; + toDelete.push(ancestor.name); + } + } + + + for (i = matched.length - 1; i >= 0; i--) { + //log.info(matched[i].name); + if (toDelete.indexOf(matched[i].name) >= 0) { + matched.splice(i, 1); + } + } + + return matched; + }; + + getUnitDefinition = function (unit) { + var definitions = getUnitDefinitions(); + initLookUp(definitions); + var model = definitions[lookUpTable[unit]]; + if (!model) { + log.warn('[' + requestId + '] unit "' + unit + '" does not exits'); + throw '[' + requestId + '] unit "' + unit + '" does not exits'; + } + return model; + }; + + var flattenAllInheritance = function (unitModels) { + var hasFlattend = {}; + for (var i = 0; i < unitModels.length; i++) { + var model = unitModels[i]; + if (!hasFlattend[model]) { + var ancestors = getAncestorModels(model.name); + for (var j = ancestors.length - 1; j >= 1; j--) { + flattenInheritance(ancestors[j], ancestors[j - 1]); + } + } + } + }; + + var flattenInheritance = function (parent, child) { + var parentZones = parent.zones; + for (var i = 0; i < parentZones.length; i++) { + var parentZone = parentZones[i]; + child.zones.push(parentZone); + } + }; + + getUnitDefinitions = function () { + if (definitions !== null) { + return definitions; + } else { + definitions = []; + } + + var unitDirs = new File('/units').listFiles(); + for (var i = 0; i < unitDirs.length; i++) { + var unitDir = unitDirs[i]; + if (unitDir.isDirectory()) { + + var unitName = unitDir.getName(); + var unitModel = { + name: unitName, + path: unitDir.getPath() + }; + + // unit definition is read form is the .json file. + // if doesn't exits it will be an empty json. + var definitionFile = new File(fuse.getUnitPath(unitName) + '/' + unitName + '.json'); + if (definitionFile.isExists() && !definitionFile.isDirectory()) { + var path = definitionFile.getPath(); + log.debug('[' + requestId + '] reading file "' + path + '"'); + unitModel.definition = require(path); + } else { + log.warn('[' + requestId + '] for unit "' + unitName + '", unable to find a definition file'); + unitModel.definition = {}; + } + + // add the information derived by parsing hbs file to the same model + var hbsMetadata = getHbsMetadata(unitModel); + unitModel.zones = hbsMetadata.zones; + if (hbsMetadata.layout) { + unitModel.layout = hbsMetadata.layout; + } + + definitions.push(unitModel); + } + } + + addPageUnitDefinitions(definitions); + + initLookUp(definitions); + flattenAllInheritance(definitions); + + return definitions; + }; + + addPageUnitDefinitions = function (unitModels, dir) { + var pageFiles = new File(dir || '/pages').listFiles(); + for (var i = 0; i < pageFiles.length; i++) { + var pageFile = pageFiles[i]; + var fileName = pageFile.getName(); + if (pageFile.isDirectory()) { + addPageUnitDefinitions(unitModels, pageFile.getPath()) + } else if (fileName.indexOf('.hbs', fileName.length - 4) !== -1) { // File name ends with '.hbs' + + var isLeaf = true; + //path relative to app root + var relativePath = pageFile.getPath() + .substring(6 + pageFile.getPath().indexOf('/pages/'), pageFile.getPath().length - 4); + + if (relativePath.match(/\/index$/)) { + relativePath = relativePath.replace(/\/index$/, ''); + var parentFile = new File(pageFile.getPath().substr(0, pageFile.getPath().lastIndexOf('/'))); + var hasSiblings = parentFile.listFiles().length != 1; + if (hasSiblings) { + isLeaf = false; + } + } + + //this will be used as a name for the virtual unit, useful for debugging purposes. + var unitName = (relativePath == '' ? 'index' : relativePath.substr(1).replace(/\//, '-') ) + '-page'; + + var predicate = "urlMatch('" + relativePath + "')"; + // leaf is page that can handle multiple URLs. in this case it should have a wildcard at end. + // but since our current matcher doesn't support {/wildcard*} patten, "OR" ( || ) is used + if (isLeaf) { + predicate += " || urlMatch('" + relativePath + "/{+wildcard}')"; + } + var unitModel = { + name: unitName, + + path: pageFile.getPath(), + definition: {predicate: predicate} + }; + var hbsMetadata = getHbsMetadata(unitModel); + unitModel.zones = hbsMetadata.zones; + if (hbsMetadata.layout) { + unitModel.layout = hbsMetadata.layout; + } + + unitModels.push(unitModel); + } + } + }; + + + getLayoutPath = function (layout) { + return '/layouts/' + layout + '.hbs'; + }; + + getHbsFile = function (unit) { + // we determining if it's page unit or a proper unit + // by checking if path ends with '.hbs' + // TODO: improve getFile to do include this logic + if (unit.path.indexOf('.hbs', unit.path.length - 4) !== -1) { + return new File(unit.path); + } else { + return new File(unit.path + '/' + unit.name + '.hbs'); + } + }; + + var getHbsMetadata = function (unit) { + var zoneDef = {'zones': []}; + var hbsFile = getHbsFile(unit); + if (!hbsFile.isExists()) { + return zoneDef; + } + var output = handlebars.Handlebars.compileFile(hbsFile)({}); + var zonesAndLayouts = output.trim().split(/\s+/gm); + for (var i = 0; i < zonesAndLayouts.length; i++) { + var name = zonesAndLayouts[i]; + if (name.lastIndexOf('zone_', 0) === 0) { + zoneDef.zones.push({name: name.substr(5), origin: unit.name}); + } else if (name.lastIndexOf('layout_', 0) === 0) { + zoneDef.layout = name.substr(7); + } + } + return zoneDef; + }; + + + getUnitPath = function (unit) { + return '/units/' + unit; + }; + + cleanupAncestors = function (units) { + var toDelete = {}; + var len = units.length; + for (var i = 0; i < len; i++) { + var unit = units[i]; + if (!toDelete[unit]) { + var ancestors = getAncestorModels(unit.name); + for (var j = 1; j < ancestors.length; j++) { + toDelete[ancestors[j].name] = unit; + } + } + } + while (len--) { + if (toDelete[units[len]]) { + log.debug( + '[' + requestId + '] unit "' + units[len] + + '" is overridden by "' + toDelete[units[len]] + '"' + ); + units.splice(len, 1); + } + } + }; + + toRelativePath = function (path) { + var start = 0; + if (path.lastIndexOf('/units/', 0) == 0) { + start = 7; // len('/units/') + } + var slashPos = path.indexOf('/', 7); + return { + unit: path.substring(start, slashPos), + path: path.substr(slashPos) + } + }; + + /** + * Get a file inside a unit by relative path. if the file is not available in the given unit, + * the closest ancestor's file will be returned. if an optional suffix is used the relative path is + * calculated as ( path + < unit name > + opt_suffix ). if no such a file exists a returned file object will + * point to provided unit's non-existing file location (not to any ancestors). + * + * @param unitName name of the unit + * @param path path relative to unit root. + * @param opt_suffix + * @returns {File} + */ + getFile = function (unitName, path, opt_suffix) { + var slashPath = ((path[0] === '/') ? '' : '/') + path; + var selfFileName = ''; + var fileName = ''; + if (opt_suffix) { + selfFileName = unitName + opt_suffix; + slashPath = slashPath + ((slashPath[slashPath.length - 1] === '/') ? '' : '/'); + } + + //TODO: remove this hack that makes in page-unit, any file is same + var unitDef = getUnitDefinition(unitName); + if (unitDef.path.indexOf('.hbs', unitDef.path.length - 4) !== -1) { + if (opt_suffix.indexOf('.hbs', opt_suffix.length - 4) !== -1) { + return new File(unitDef.path); + } else { + return new File(unitDef.path.replace(/.hbs$/, opt_suffix)); + } + } + + var selfFile = new File(getUnitPath(unitName) + slashPath + selfFileName); + if (selfFile.isExists()) { + log.debug( + '[' + requestId + '] for unit "' + unitName + '" file resolved : "' + + slashPath + selfFileName + '" -> "' + selfFile.getPath() + '"' + ); + + return selfFile; + } + + var ancestors = getAncestorModels(unitName); + for (var i = 1; i < ancestors.length; i++) { + var ancestorName = ancestors[i].name; + if (opt_suffix) { + fileName = ancestorName + opt_suffix; + } + var file = new File(getUnitPath(ancestorName) + slashPath + fileName); + if (file.isExists()) { + log.debug( + '[' + requestId + '] for unit "' + unitName + '" file resolved : "' + + slashPath + selfFileName + '" -> "' + file.getPath() + '"' + ); + return file; + } + } + log.debug( + '[' + requestId + '] for unit "' + unitName + '" (non-excising) file resolved : "' + + slashPath + selfFileName + '" -> "' + selfFile.getPath() + '"' + ); + return selfFile; + }; + +})(); \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/lib/handlebars-helpers.js b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/handlebars-helpers.js new file mode 100755 index 00000000..80342019 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/handlebars-helpers.js @@ -0,0 +1,194 @@ +var log = new Log('fuse.handlebars'); +//TODO: create a different set of helpers for init parsing + +var Handlebars = require('handlebars-v2.0.0.js').Handlebars; +var USER_SESSION_KEY = "USER"; +var getScope = function (unit,configs) { + var jsFile = fuse.getFile(unit, '', '.js'); + var templateConfigs = configs || {}; + var script; + var onRequestCb = function(){}; //Assume that onRequest function will not be defined by the user + var viewModel = {}; + var cbResult; + if (jsFile.isExists()) { + script = require(jsFile.getPath()); + //Eagerly make the viewModel the template configs + viewModel = templateConfigs; + //Check if the unit author has specified an onRequest + //callback + if(script.hasOwnProperty('onRequest')){ + script.app = { + url: '/' + fuseState.appName, + publicURL: '/' + fuseState.appName + '/public/' + unit, + "class": unit + '-unit' + }; + onRequestCb = script.onRequest; + cbResult = onRequestCb(templateConfigs); + log.debug("passing configs to unit "+unit+" configs: "+stringify(templateConfigs)); + //If the execution does not yield an object we will print + //a warning as the unit author may have forgotten to return a data object + if(cbResult===undefined){ + cbResult = {}; //Give an empty data object + log.warn('[' + requestId + '] unit "' + unit + '" has a onRequest method which does not return a value.This may lead to the ' + +'unit not been rendered correctly.'); + } + viewModel = cbResult; + } + } + else{ + //If there is no script then the view should get the configurations + //passed in the unit call + viewModel = templateConfigs; + } + viewModel.app = { + url: '/' + fuseState.appName + }; + viewModel.self = { + publicURL: '/' + fuseState.appName + '/public/' + unit, + "class": unit + '-unit' + }; + return viewModel; +}; + +Handlebars.innerZones = []; +Handlebars.innerZonesFromUnit = null; + +Handlebars.registerHelper('defineZone', function (zoneName, zoneContent) { + var result = ''; + var zone = Handlebars.Utils.escapeExpression(zoneName); + fuseState.zoneStack.push(zone); + var unitsToRender = fuseState.zones[zone] || []; + + if (Handlebars.innerZones.length > 0) { + unitsToRender = fuseState.zones[Handlebars.innerZones[0]] || []; + } + + // if there is no one overriding, then display inline zone + if (zoneContent['fn'] && unitsToRender.length == 0) { + return zoneContent.fn(this).trim(); + } + + for (var i = 0; i < unitsToRender.length; i++) { + var unit = unitsToRender[i]; + if (Handlebars.innerZonesFromUnit == null || Handlebars.innerZonesFromUnit.unitName == unit.unitName) { + var template = fuse.getFile(unit.originUnitName || unit.unitName, '', '.hbs'); + log.debug('[' + requestId + '] for zone "' + zone + '" including template :"' + template.getPath() + '"'); + result += Handlebars.compileFile(template)(getScope(unit.unitName, zoneContent.data.root)); + } + } + + // we go to inner zones if result is empty, what we should really do it + // if matched zone is fully made of sub-zones. this is a hack to + // make it easy to implement. + if (result.trim().length == 0 && zoneContent['fn']) { + Handlebars.innerZones.push(zoneName); + for (i = 0; i < unitsToRender.length; i++) { + unit = unitsToRender[i]; + Handlebars.innerZonesFromUnit = unit; + result += zoneContent.fn(this).trim(); + Handlebars.innerZonesFromUnit = null; + } + Handlebars.innerZones.pop(); + return result; + } + + fuseState.zoneStack.pop(); + return new Handlebars.SafeString(result); +}); + +Handlebars.registerHelper('zone', function (zoneName, zoneContent) { + var currentZone = fuseState.zoneStack[fuseState.zoneStack.length - 1]; + if (currentZone == null) { + return 'zone_' + zoneName + ' '; + } + + // if it's exact zone match or if any in inner zone matches we render zone. + // this second condition is a hack. what we should really do is to keep another stack, + // and only match with the peek of that stack and always fill it with next in innerZone stack. + if (zoneName == currentZone || Handlebars.innerZones.indexOf(zoneName) >= 0) { + return zoneContent.fn(this).trim(); + } else { + return ''; + } +}); + +Handlebars.registerHelper('layout', function (layoutName) { + var currentZone = fuseState.zoneStack[fuseState.zoneStack.length - 1]; + if (currentZone == null) { + return 'layout_' + layoutName; + } else { + return ''; + } +}); + +Handlebars.registerHelper('authorized', function () { + var currentZone = fuseState.zoneStack[fuseState.zoneStack.length - 1]; + if (currentZone == null) { + return ''; + } else { + var loggedUser = session.get(USER_SESSION_KEY); + if(loggedUser == null){ + response.sendRedirect("/"+ fuseState.appName + "/login"); + exit(); + } + } +}); + +Handlebars.registerHelper('unit', function (unitName,options) { + var unitDef = fuse.getUnitDefinition(unitName); + var baseUnit = null; + var templateConfigs = options.hash || {}; + for (var i = 0; i < unitDef.zones.length; i++) { + var zone = unitDef.zones[i]; + if (zone.name == 'main') { + baseUnit = zone.origin; + } else { + var golbalZone = fuseState.zones[zone.name]; + if (!golbalZone) { + fuseState.zones[zone.name] = [{"unitName": unitName}]; + } else { + fuseState.zones[zone.name].push({"unitName": unitName}); + } + } + } + if (baseUnit == null) { + log.error('unit does not have a main zone'); + } + //TODO warn when unspecified decencies are included. + fuseState.zoneStack.push('main'); + var template = fuse.getFile(baseUnit, '', '.hbs'); + log.debug('[' + requestId + '] including "' + baseUnit + '"'+" with configs "+stringify(templateConfigs)); + var result = new Handlebars.SafeString(Handlebars.compileFile(template)(getScope(baseUnit,templateConfigs))); + fuseState.zoneStack.pop(); + return result; +}); + +Handlebars.compileFile = function (file) { + //TODO: remove this overloaded argument + var f = (typeof file === 'string') ? new File(file) : file; + + if (!Handlebars.cache) { + Handlebars.cache = {}; + } + + if (Handlebars.cache[f.getPath()] != null) { + return Handlebars.cache[f.getPath()]; + } + + f.open('r'); + log.debug('[' + requestId + '] reading file "' + f.getPath() + '"'); + var content = f.readAll().trim(); + f.close(); + var compiled = Handlebars.compile(content); + Handlebars.cache[f.getPath()] = compiled; + return compiled; +}; +Handlebars.registerHelper('equal', function(lvalue, rvalue, options) { + if (arguments.length < 3) + throw new Error("Handlebars Helper equal needs 2 parameters"); + if( lvalue!=rvalue ) { + return options.inverse(this); + } else { + return options.fn(this); + } +}); diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/lib/handlebars-v2.0.0.js b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/handlebars-v2.0.0.js new file mode 100755 index 00000000..f826bbfd --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/handlebars-v2.0.0.js @@ -0,0 +1,3079 @@ +/*! + + handlebars v2.0.0 + +Copyright (C) 2011-2014 by Yehuda Katz + +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. + +@license +*/ +/* exported Handlebars */ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define([], factory); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.Handlebars = root.Handlebars || factory(); + } +}(this, function () { +// handlebars/safe-string.js +var __module4__ = (function() { + "use strict"; + var __exports__; + // Build out our basic SafeString type + function SafeString(string) { + this.string = string; + } + + SafeString.prototype.toString = function() { + return "" + this.string; + }; + + __exports__ = SafeString; + return __exports__; +})(); + +// handlebars/utils.js +var __module3__ = (function(__dependency1__) { + "use strict"; + var __exports__ = {}; + /*jshint -W004 */ + var SafeString = __dependency1__; + + var escape = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + "`": "`" + }; + + var badChars = /[&<>"'`]/g; + var possible = /[&<>"'`]/; + + function escapeChar(chr) { + return escape[chr]; + } + + function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; + } + + __exports__.extend = extend;var toString = Object.prototype.toString; + __exports__.toString = toString; + // Sourced from lodash + // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt + var isFunction = function(value) { + return typeof value === 'function'; + }; + // fallback for older versions of Chrome and Safari + /* istanbul ignore next */ + if (isFunction(/x/)) { + isFunction = function(value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; + } + var isFunction; + __exports__.isFunction = isFunction; + /* istanbul ignore next */ + var isArray = Array.isArray || function(value) { + return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false; + }; + __exports__.isArray = isArray; + + function escapeExpression(string) { + // don't escape SafeStrings, since they're already safe + if (string instanceof SafeString) { + return string.toString(); + } else if (string == null) { + return ""; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = "" + string; + + if(!possible.test(string)) { return string; } + return string.replace(badChars, escapeChar); + } + + __exports__.escapeExpression = escapeExpression;function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } + } + + __exports__.isEmpty = isEmpty;function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; + } + + __exports__.appendContextPath = appendContextPath; + return __exports__; +})(__module4__); + +// handlebars/exception.js +var __module5__ = (function() { + "use strict"; + var __exports__; + + var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + + function Exception(message, node) { + var line; + if (node && node.firstLine) { + line = node.firstLine; + + message += ' - ' + line + ':' + node.firstColumn; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + if (line) { + this.lineNumber = line; + this.column = node.firstColumn; + } + } + + Exception.prototype = new Error(); + + __exports__ = Exception; + return __exports__; +})(); + +// handlebars/base.js +var __module2__ = (function(__dependency1__, __dependency2__) { + "use strict"; + var __exports__ = {}; + var Utils = __dependency1__; + var Exception = __dependency2__; + + var VERSION = "2.0.0"; + __exports__.VERSION = VERSION;var COMPILER_REVISION = 6; + __exports__.COMPILER_REVISION = COMPILER_REVISION; + var REVISION_CHANGES = { + 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it + 2: '== 1.0.0-rc.3', + 3: '== 1.0.0-rc.4', + 4: '== 1.x.x', + 5: '== 2.0.0-alpha.x', + 6: '>= 2.0.0-beta.1' + }; + __exports__.REVISION_CHANGES = REVISION_CHANGES; + var isArray = Utils.isArray, + isFunction = Utils.isFunction, + toString = Utils.toString, + objectType = '[object Object]'; + + function HandlebarsEnvironment(helpers, partials) { + this.helpers = helpers || {}; + this.partials = partials || {}; + + registerDefaultHelpers(this); + } + + __exports__.HandlebarsEnvironment = HandlebarsEnvironment;HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: logger, + log: log, + + registerHelper: function(name, fn) { + if (toString.call(name) === objectType) { + if (fn) { throw new Exception('Arg not supported with multiple helpers'); } + Utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function(name) { + delete this.helpers[name]; + }, + + registerPartial: function(name, partial) { + if (toString.call(name) === objectType) { + Utils.extend(this.partials, name); + } else { + this.partials[name] = partial; + } + }, + unregisterPartial: function(name) { + delete this.partials[name]; + } + }; + + function registerDefaultHelpers(instance) { + instance.registerHelper('helperMissing', function(/* [args, ]options */) { + if(arguments.length === 1) { + // A missing field in a {{foo}} constuct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new Exception("Missing helper: '" + arguments[arguments.length-1].name + "'"); + } + }); + + instance.registerHelper('blockHelperMissing', function(context, options) { + var inverse = options.inverse, + fn = options.fn; + + if(context === true) { + return fn(this); + } else if(context === false || context == null) { + return inverse(this); + } else if (isArray(context)) { + if(context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = createFrame(options.data); + data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); + options = {data: data}; + } + + return fn(context, options); + } + }); + + instance.registerHelper('each', function(context, options) { + if (!options) { + throw new Exception('Must pass iterator to #each'); + } + + var fn = options.fn, inverse = options.inverse; + var i = 0, ret = "", data; + + var contextPath; + if (options.data && options.ids) { + contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (isFunction(context)) { context = context.call(this); } + + if (options.data) { + data = createFrame(options.data); + } + + if(context && typeof context === 'object') { + if (isArray(context)) { + for(var j = context.length; i 0) { + throw new Exception("Invalid path: " + original, this); + } else if (part === "..") { + depth++; + depthString += '../'; + } else { + this.isScoped = true; + } + } else { + dig.push(part); + } + } + + this.original = original; + this.parts = dig; + this.string = dig.join('.'); + this.depth = depth; + this.idName = depthString + this.string; + + // an ID is simple if it only has one part, and that part is not + // `..` or `this`. + this.isSimple = parts.length === 1 && !this.isScoped && depth === 0; + + this.stringModeValue = this.string; + }, + + PartialNameNode: function(name, locInfo) { + LocationInfo.call(this, locInfo); + this.type = "PARTIAL_NAME"; + this.name = name.original; + }, + + DataNode: function(id, locInfo) { + LocationInfo.call(this, locInfo); + this.type = "DATA"; + this.id = id; + this.stringModeValue = id.stringModeValue; + this.idName = '@' + id.stringModeValue; + }, + + StringNode: function(string, locInfo) { + LocationInfo.call(this, locInfo); + this.type = "STRING"; + this.original = + this.string = + this.stringModeValue = string; + }, + + NumberNode: function(number, locInfo) { + LocationInfo.call(this, locInfo); + this.type = "NUMBER"; + this.original = + this.number = number; + this.stringModeValue = Number(number); + }, + + BooleanNode: function(bool, locInfo) { + LocationInfo.call(this, locInfo); + this.type = "BOOLEAN"; + this.bool = bool; + this.stringModeValue = bool === "true"; + }, + + CommentNode: function(comment, locInfo) { + LocationInfo.call(this, locInfo); + this.type = "comment"; + this.comment = comment; + + this.strip = { + inlineStandalone: true + }; + } + }; + + + // Must be exported as an object rather than the root of the module as the jison lexer + // most modify the object to operate properly. + __exports__ = AST; + return __exports__; +})(__module5__); + +// handlebars/compiler/parser.js +var __module9__ = (function() { + "use strict"; + var __exports__; + /* jshint ignore:start */ + /* istanbul ignore next */ + /* Jison generated parser */ + var handlebars = (function(){ + var parser = {trace: function trace() { }, + yy: {}, + symbols_: {"error":2,"root":3,"program":4,"EOF":5,"program_repetition0":6,"statement":7,"mustache":8,"block":9,"rawBlock":10,"partial":11,"CONTENT":12,"COMMENT":13,"openRawBlock":14,"END_RAW_BLOCK":15,"OPEN_RAW_BLOCK":16,"sexpr":17,"CLOSE_RAW_BLOCK":18,"openBlock":19,"block_option0":20,"closeBlock":21,"openInverse":22,"block_option1":23,"OPEN_BLOCK":24,"CLOSE":25,"OPEN_INVERSE":26,"inverseAndProgram":27,"INVERSE":28,"OPEN_ENDBLOCK":29,"path":30,"OPEN":31,"OPEN_UNESCAPED":32,"CLOSE_UNESCAPED":33,"OPEN_PARTIAL":34,"partialName":35,"param":36,"partial_option0":37,"partial_option1":38,"sexpr_repetition0":39,"sexpr_option0":40,"dataName":41,"STRING":42,"NUMBER":43,"BOOLEAN":44,"OPEN_SEXPR":45,"CLOSE_SEXPR":46,"hash":47,"hash_repetition_plus0":48,"hashSegment":49,"ID":50,"EQUALS":51,"DATA":52,"pathSegments":53,"SEP":54,"$accept":0,"$end":1}, + terminals_: {2:"error",5:"EOF",12:"CONTENT",13:"COMMENT",15:"END_RAW_BLOCK",16:"OPEN_RAW_BLOCK",18:"CLOSE_RAW_BLOCK",24:"OPEN_BLOCK",25:"CLOSE",26:"OPEN_INVERSE",28:"INVERSE",29:"OPEN_ENDBLOCK",31:"OPEN",32:"OPEN_UNESCAPED",33:"CLOSE_UNESCAPED",34:"OPEN_PARTIAL",42:"STRING",43:"NUMBER",44:"BOOLEAN",45:"OPEN_SEXPR",46:"CLOSE_SEXPR",50:"ID",51:"EQUALS",52:"DATA",54:"SEP"}, + productions_: [0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[10,3],[14,3],[9,4],[9,4],[19,3],[22,3],[27,2],[21,3],[8,3],[8,3],[11,5],[11,4],[17,3],[17,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,3],[47,1],[49,3],[35,1],[35,1],[35,1],[41,2],[30,1],[53,3],[53,1],[6,0],[6,2],[20,0],[20,1],[23,0],[23,1],[37,0],[37,1],[38,0],[38,1],[39,0],[39,2],[40,0],[40,1],[48,1],[48,2]], + performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { + + var $0 = $$.length - 1; + switch (yystate) { + case 1: yy.prepareProgram($$[$0-1].statements, true); return $$[$0-1]; + break; + case 2:this.$ = new yy.ProgramNode(yy.prepareProgram($$[$0]), {}, this._$); + break; + case 3:this.$ = $$[$0]; + break; + case 4:this.$ = $$[$0]; + break; + case 5:this.$ = $$[$0]; + break; + case 6:this.$ = $$[$0]; + break; + case 7:this.$ = new yy.ContentNode($$[$0], this._$); + break; + case 8:this.$ = new yy.CommentNode($$[$0], this._$); + break; + case 9:this.$ = new yy.RawBlockNode($$[$0-2], $$[$0-1], $$[$0], this._$); + break; + case 10:this.$ = new yy.MustacheNode($$[$0-1], null, '', '', this._$); + break; + case 11:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], false, this._$); + break; + case 12:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], true, this._$); + break; + case 13:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$); + break; + case 14:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$); + break; + case 15:this.$ = { strip: yy.stripFlags($$[$0-1], $$[$0-1]), program: $$[$0] }; + break; + case 16:this.$ = {path: $$[$0-1], strip: yy.stripFlags($$[$0-2], $$[$0])}; + break; + case 17:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$); + break; + case 18:this.$ = new yy.MustacheNode($$[$0-1], null, $$[$0-2], yy.stripFlags($$[$0-2], $$[$0]), this._$); + break; + case 19:this.$ = new yy.PartialNode($$[$0-3], $$[$0-2], $$[$0-1], yy.stripFlags($$[$0-4], $$[$0]), this._$); + break; + case 20:this.$ = new yy.PartialNode($$[$0-2], undefined, $$[$0-1], yy.stripFlags($$[$0-3], $$[$0]), this._$); + break; + case 21:this.$ = new yy.SexprNode([$$[$0-2]].concat($$[$0-1]), $$[$0], this._$); + break; + case 22:this.$ = new yy.SexprNode([$$[$0]], null, this._$); + break; + case 23:this.$ = $$[$0]; + break; + case 24:this.$ = new yy.StringNode($$[$0], this._$); + break; + case 25:this.$ = new yy.NumberNode($$[$0], this._$); + break; + case 26:this.$ = new yy.BooleanNode($$[$0], this._$); + break; + case 27:this.$ = $$[$0]; + break; + case 28:$$[$0-1].isHelper = true; this.$ = $$[$0-1]; + break; + case 29:this.$ = new yy.HashNode($$[$0], this._$); + break; + case 30:this.$ = [$$[$0-2], $$[$0]]; + break; + case 31:this.$ = new yy.PartialNameNode($$[$0], this._$); + break; + case 32:this.$ = new yy.PartialNameNode(new yy.StringNode($$[$0], this._$), this._$); + break; + case 33:this.$ = new yy.PartialNameNode(new yy.NumberNode($$[$0], this._$)); + break; + case 34:this.$ = new yy.DataNode($$[$0], this._$); + break; + case 35:this.$ = new yy.IdNode($$[$0], this._$); + break; + case 36: $$[$0-2].push({part: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2]; + break; + case 37:this.$ = [{part: $$[$0]}]; + break; + case 38:this.$ = []; + break; + case 39:$$[$0-1].push($$[$0]); + break; + case 48:this.$ = []; + break; + case 49:$$[$0-1].push($$[$0]); + break; + case 52:this.$ = [$$[$0]]; + break; + case 53:$$[$0-1].push($$[$0]); + break; + } + }, + table: [{3:1,4:2,5:[2,38],6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],31:[2,38],32:[2,38],34:[2,38]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:[1,10],13:[1,11],14:16,16:[1,20],19:14,22:15,24:[1,18],26:[1,19],28:[2,2],29:[2,2],31:[1,12],32:[1,13],34:[1,17]},{1:[2,1]},{5:[2,39],12:[2,39],13:[2,39],16:[2,39],24:[2,39],26:[2,39],28:[2,39],29:[2,39],31:[2,39],32:[2,39],34:[2,39]},{5:[2,3],12:[2,3],13:[2,3],16:[2,3],24:[2,3],26:[2,3],28:[2,3],29:[2,3],31:[2,3],32:[2,3],34:[2,3]},{5:[2,4],12:[2,4],13:[2,4],16:[2,4],24:[2,4],26:[2,4],28:[2,4],29:[2,4],31:[2,4],32:[2,4],34:[2,4]},{5:[2,5],12:[2,5],13:[2,5],16:[2,5],24:[2,5],26:[2,5],28:[2,5],29:[2,5],31:[2,5],32:[2,5],34:[2,5]},{5:[2,6],12:[2,6],13:[2,6],16:[2,6],24:[2,6],26:[2,6],28:[2,6],29:[2,6],31:[2,6],32:[2,6],34:[2,6]},{5:[2,7],12:[2,7],13:[2,7],16:[2,7],24:[2,7],26:[2,7],28:[2,7],29:[2,7],31:[2,7],32:[2,7],34:[2,7]},{5:[2,8],12:[2,8],13:[2,8],16:[2,8],24:[2,8],26:[2,8],28:[2,8],29:[2,8],31:[2,8],32:[2,8],34:[2,8]},{17:21,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:27,30:22,41:23,50:[1,26],52:[1,25],53:24},{4:28,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],28:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{4:29,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],28:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{12:[1,30]},{30:32,35:31,42:[1,33],43:[1,34],50:[1,26],53:24},{17:35,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:36,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:37,30:22,41:23,50:[1,26],52:[1,25],53:24},{25:[1,38]},{18:[2,48],25:[2,48],33:[2,48],39:39,42:[2,48],43:[2,48],44:[2,48],45:[2,48],46:[2,48],50:[2,48],52:[2,48]},{18:[2,22],25:[2,22],33:[2,22],46:[2,22]},{18:[2,35],25:[2,35],33:[2,35],42:[2,35],43:[2,35],44:[2,35],45:[2,35],46:[2,35],50:[2,35],52:[2,35],54:[1,40]},{30:41,50:[1,26],53:24},{18:[2,37],25:[2,37],33:[2,37],42:[2,37],43:[2,37],44:[2,37],45:[2,37],46:[2,37],50:[2,37],52:[2,37],54:[2,37]},{33:[1,42]},{20:43,27:44,28:[1,45],29:[2,40]},{23:46,27:47,28:[1,45],29:[2,42]},{15:[1,48]},{25:[2,46],30:51,36:49,38:50,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],47:57,48:58,49:60,50:[1,59],52:[1,25],53:24},{25:[2,31],42:[2,31],43:[2,31],44:[2,31],45:[2,31],50:[2,31],52:[2,31]},{25:[2,32],42:[2,32],43:[2,32],44:[2,32],45:[2,32],50:[2,32],52:[2,32]},{25:[2,33],42:[2,33],43:[2,33],44:[2,33],45:[2,33],50:[2,33],52:[2,33]},{25:[1,61]},{25:[1,62]},{18:[1,63]},{5:[2,17],12:[2,17],13:[2,17],16:[2,17],24:[2,17],26:[2,17],28:[2,17],29:[2,17],31:[2,17],32:[2,17],34:[2,17]},{18:[2,50],25:[2,50],30:51,33:[2,50],36:65,40:64,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],46:[2,50],47:66,48:58,49:60,50:[1,59],52:[1,25],53:24},{50:[1,67]},{18:[2,34],25:[2,34],33:[2,34],42:[2,34],43:[2,34],44:[2,34],45:[2,34],46:[2,34],50:[2,34],52:[2,34]},{5:[2,18],12:[2,18],13:[2,18],16:[2,18],24:[2,18],26:[2,18],28:[2,18],29:[2,18],31:[2,18],32:[2,18],34:[2,18]},{21:68,29:[1,69]},{29:[2,41]},{4:70,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{21:71,29:[1,69]},{29:[2,43]},{5:[2,9],12:[2,9],13:[2,9],16:[2,9],24:[2,9],26:[2,9],28:[2,9],29:[2,9],31:[2,9],32:[2,9],34:[2,9]},{25:[2,44],37:72,47:73,48:58,49:60,50:[1,74]},{25:[1,75]},{18:[2,23],25:[2,23],33:[2,23],42:[2,23],43:[2,23],44:[2,23],45:[2,23],46:[2,23],50:[2,23],52:[2,23]},{18:[2,24],25:[2,24],33:[2,24],42:[2,24],43:[2,24],44:[2,24],45:[2,24],46:[2,24],50:[2,24],52:[2,24]},{18:[2,25],25:[2,25],33:[2,25],42:[2,25],43:[2,25],44:[2,25],45:[2,25],46:[2,25],50:[2,25],52:[2,25]},{18:[2,26],25:[2,26],33:[2,26],42:[2,26],43:[2,26],44:[2,26],45:[2,26],46:[2,26],50:[2,26],52:[2,26]},{18:[2,27],25:[2,27],33:[2,27],42:[2,27],43:[2,27],44:[2,27],45:[2,27],46:[2,27],50:[2,27],52:[2,27]},{17:76,30:22,41:23,50:[1,26],52:[1,25],53:24},{25:[2,47]},{18:[2,29],25:[2,29],33:[2,29],46:[2,29],49:77,50:[1,74]},{18:[2,37],25:[2,37],33:[2,37],42:[2,37],43:[2,37],44:[2,37],45:[2,37],46:[2,37],50:[2,37],51:[1,78],52:[2,37],54:[2,37]},{18:[2,52],25:[2,52],33:[2,52],46:[2,52],50:[2,52]},{12:[2,13],13:[2,13],16:[2,13],24:[2,13],26:[2,13],28:[2,13],29:[2,13],31:[2,13],32:[2,13],34:[2,13]},{12:[2,14],13:[2,14],16:[2,14],24:[2,14],26:[2,14],28:[2,14],29:[2,14],31:[2,14],32:[2,14],34:[2,14]},{12:[2,10]},{18:[2,21],25:[2,21],33:[2,21],46:[2,21]},{18:[2,49],25:[2,49],33:[2,49],42:[2,49],43:[2,49],44:[2,49],45:[2,49],46:[2,49],50:[2,49],52:[2,49]},{18:[2,51],25:[2,51],33:[2,51],46:[2,51]},{18:[2,36],25:[2,36],33:[2,36],42:[2,36],43:[2,36],44:[2,36],45:[2,36],46:[2,36],50:[2,36],52:[2,36],54:[2,36]},{5:[2,11],12:[2,11],13:[2,11],16:[2,11],24:[2,11],26:[2,11],28:[2,11],29:[2,11],31:[2,11],32:[2,11],34:[2,11]},{30:79,50:[1,26],53:24},{29:[2,15]},{5:[2,12],12:[2,12],13:[2,12],16:[2,12],24:[2,12],26:[2,12],28:[2,12],29:[2,12],31:[2,12],32:[2,12],34:[2,12]},{25:[1,80]},{25:[2,45]},{51:[1,78]},{5:[2,20],12:[2,20],13:[2,20],16:[2,20],24:[2,20],26:[2,20],28:[2,20],29:[2,20],31:[2,20],32:[2,20],34:[2,20]},{46:[1,81]},{18:[2,53],25:[2,53],33:[2,53],46:[2,53],50:[2,53]},{30:51,36:82,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],50:[1,26],52:[1,25],53:24},{25:[1,83]},{5:[2,19],12:[2,19],13:[2,19],16:[2,19],24:[2,19],26:[2,19],28:[2,19],29:[2,19],31:[2,19],32:[2,19],34:[2,19]},{18:[2,28],25:[2,28],33:[2,28],42:[2,28],43:[2,28],44:[2,28],45:[2,28],46:[2,28],50:[2,28],52:[2,28]},{18:[2,30],25:[2,30],33:[2,30],46:[2,30],50:[2,30]},{5:[2,16],12:[2,16],13:[2,16],16:[2,16],24:[2,16],26:[2,16],28:[2,16],29:[2,16],31:[2,16],32:[2,16],34:[2,16]}], + defaultActions: {4:[2,1],44:[2,41],47:[2,43],57:[2,47],63:[2,10],70:[2,15],73:[2,45]}, + parseError: function parseError(str, hash) { + throw new Error(str); + }, + parse: function parse(input) { + var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + this.lexer.setInput(input); + this.lexer.yy = this.yy; + this.yy.lexer = this.lexer; + this.yy.parser = this; + if (typeof this.lexer.yylloc == "undefined") + this.lexer.yylloc = {}; + var yyloc = this.lexer.yylloc; + lstack.push(yyloc); + var ranges = this.lexer.options && this.lexer.options.ranges; + if (typeof this.yy.parseError === "function") + this.parseError = this.yy.parseError; + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + function lex() { + var token; + token = self.lexer.lex() || 1; + if (typeof token !== "number") { + token = self.symbols_[token] || token; + } + return token; + } + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + if (!recovering) { + expected = []; + for (p in table[state]) + if (this.terminals_[p] && p > 2) { + expected.push("'" + this.terminals_[p] + "'"); + } + if (this.lexer.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); + } + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(this.lexer.yytext); + lstack.push(this.lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = this.lexer.yyleng; + yytext = this.lexer.yytext; + yylineno = this.lexer.yylineno; + yyloc = this.lexer.yylloc; + if (recovering > 0) + recovering--; + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; + if (ranges) { + yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; + } + r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + /* Jison generated lexer */ + var lexer = (function(){ + var lexer = ({EOF:1, + parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + setInput:function (input) { + this._input = input; + this._more = this._less = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; + if (this.options.ranges) this.yylloc.range = [0,0]; + this.offset = 0; + return this; + }, + input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) this.yylloc.range[1]++; + + this._input = this._input.slice(1); + return ch; + }, + unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length-len-1); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length-1); + this.matched = this.matched.substr(0, this.matched.length-1); + + if (lines.length-1) this.yylineno -= lines.length-1; + var r = this.yylloc.range; + + this.yylloc = {first_line: this.yylloc.first_line, + last_line: this.yylineno+1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length: + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + return this; + }, + more:function () { + this._more = true; + return this; + }, + less:function (n) { + this.unput(this.match.slice(n)); + }, + pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, + upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); + }, + showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c+"^"; + }, + next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) this.done = true; + + var token, + match, + tempMatch, + index, + col, + lines; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i=0;i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (!this.options.flex) break; + } + } + if (match) { + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) this.yylineno += lines.length; + this.yylloc = {first_line: this.yylloc.last_line, + last_line: this.yylineno+1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length}; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); + if (this.done && this._input) this.done = false; + if (token) return token; + else return; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), + {text: "", token: null, line: this.yylineno}); + } + }, + lex:function lex() { + var r = this.next(); + if (typeof r !== 'undefined') { + return r; + } else { + return this.lex(); + } + }, + begin:function begin(condition) { + this.conditionStack.push(condition); + }, + popState:function popState() { + return this.conditionStack.pop(); + }, + _currentRules:function _currentRules() { + return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; + }, + topState:function () { + return this.conditionStack[this.conditionStack.length-2]; + }, + pushState:function begin(condition) { + this.begin(condition); + }}); + lexer.options = {}; + lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { + + + function strip(start, end) { + return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng-end); + } + + + var YYSTATE=YY_START + switch($avoiding_name_collisions) { + case 0: + if(yy_.yytext.slice(-2) === "\\\\") { + strip(0,1); + this.begin("mu"); + } else if(yy_.yytext.slice(-1) === "\\") { + strip(0,1); + this.begin("emu"); + } else { + this.begin("mu"); + } + if(yy_.yytext) return 12; + + break; + case 1:return 12; + break; + case 2: + this.popState(); + return 12; + + break; + case 3: + yy_.yytext = yy_.yytext.substr(5, yy_.yyleng-9); + this.popState(); + return 15; + + break; + case 4: return 12; + break; + case 5:strip(0,4); this.popState(); return 13; + break; + case 6:return 45; + break; + case 7:return 46; + break; + case 8: return 16; + break; + case 9: + this.popState(); + this.begin('raw'); + return 18; + + break; + case 10:return 34; + break; + case 11:return 24; + break; + case 12:return 29; + break; + case 13:this.popState(); return 28; + break; + case 14:this.popState(); return 28; + break; + case 15:return 26; + break; + case 16:return 26; + break; + case 17:return 32; + break; + case 18:return 31; + break; + case 19:this.popState(); this.begin('com'); + break; + case 20:strip(3,5); this.popState(); return 13; + break; + case 21:return 31; + break; + case 22:return 51; + break; + case 23:return 50; + break; + case 24:return 50; + break; + case 25:return 54; + break; + case 26:// ignore whitespace + break; + case 27:this.popState(); return 33; + break; + case 28:this.popState(); return 25; + break; + case 29:yy_.yytext = strip(1,2).replace(/\\"/g,'"'); return 42; + break; + case 30:yy_.yytext = strip(1,2).replace(/\\'/g,"'"); return 42; + break; + case 31:return 52; + break; + case 32:return 44; + break; + case 33:return 44; + break; + case 34:return 43; + break; + case 35:return 50; + break; + case 36:yy_.yytext = strip(1,2); return 50; + break; + case 37:return 'INVALID'; + break; + case 38:return 5; + break; + } + }; + lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/]; + lexer.conditions = {"mu":{"rules":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[5],"inclusive":false},"raw":{"rules":[3,4],"inclusive":false},"INITIAL":{"rules":[0,1,38],"inclusive":true}}; + return lexer;})() + parser.lexer = lexer; + function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser; + return new Parser; + })();__exports__ = handlebars; + /* jshint ignore:end */ + return __exports__; +})(); + +// handlebars/compiler/helpers.js +var __module10__ = (function(__dependency1__) { + "use strict"; + var __exports__ = {}; + var Exception = __dependency1__; + + function stripFlags(open, close) { + return { + left: open.charAt(2) === '~', + right: close.charAt(close.length-3) === '~' + }; + } + + __exports__.stripFlags = stripFlags; + function prepareBlock(mustache, program, inverseAndProgram, close, inverted, locInfo) { + /*jshint -W040 */ + if (mustache.sexpr.id.original !== close.path.original) { + throw new Exception(mustache.sexpr.id.original + ' doesn\'t match ' + close.path.original, mustache); + } + + var inverse = inverseAndProgram && inverseAndProgram.program; + + var strip = { + left: mustache.strip.left, + right: close.strip.right, + + // Determine the standalone candiacy. Basically flag our content as being possibly standalone + // so our parent can determine if we actually are standalone + openStandalone: isNextWhitespace(program.statements), + closeStandalone: isPrevWhitespace((inverse || program).statements) + }; + + if (mustache.strip.right) { + omitRight(program.statements, null, true); + } + + if (inverse) { + var inverseStrip = inverseAndProgram.strip; + + if (inverseStrip.left) { + omitLeft(program.statements, null, true); + } + if (inverseStrip.right) { + omitRight(inverse.statements, null, true); + } + if (close.strip.left) { + omitLeft(inverse.statements, null, true); + } + + // Find standalone else statments + if (isPrevWhitespace(program.statements) + && isNextWhitespace(inverse.statements)) { + + omitLeft(program.statements); + omitRight(inverse.statements); + } + } else { + if (close.strip.left) { + omitLeft(program.statements, null, true); + } + } + + if (inverted) { + return new this.BlockNode(mustache, inverse, program, strip, locInfo); + } else { + return new this.BlockNode(mustache, program, inverse, strip, locInfo); + } + } + + __exports__.prepareBlock = prepareBlock; + function prepareProgram(statements, isRoot) { + for (var i = 0, l = statements.length; i < l; i++) { + var current = statements[i], + strip = current.strip; + + if (!strip) { + continue; + } + + var _isPrevWhitespace = isPrevWhitespace(statements, i, isRoot, current.type === 'partial'), + _isNextWhitespace = isNextWhitespace(statements, i, isRoot), + + openStandalone = strip.openStandalone && _isPrevWhitespace, + closeStandalone = strip.closeStandalone && _isNextWhitespace, + inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; + + if (strip.right) { + omitRight(statements, i, true); + } + if (strip.left) { + omitLeft(statements, i, true); + } + + if (inlineStandalone) { + omitRight(statements, i); + + if (omitLeft(statements, i)) { + // If we are on a standalone node, save the indent info for partials + if (current.type === 'partial') { + current.indent = (/([ \t]+$)/).exec(statements[i-1].original) ? RegExp.$1 : ''; + } + } + } + if (openStandalone) { + omitRight((current.program || current.inverse).statements); + + // Strip out the previous content node if it's whitespace only + omitLeft(statements, i); + } + if (closeStandalone) { + // Always strip the next node + omitRight(statements, i); + + omitLeft((current.inverse || current.program).statements); + } + } + + return statements; + } + + __exports__.prepareProgram = prepareProgram;function isPrevWhitespace(statements, i, isRoot) { + if (i === undefined) { + i = statements.length; + } + + // Nodes that end with newlines are considered whitespace (but are special + // cased for strip operations) + var prev = statements[i-1], + sibling = statements[i-2]; + if (!prev) { + return isRoot; + } + + if (prev.type === 'content') { + return (sibling || !isRoot ? (/\r?\n\s*?$/) : (/(^|\r?\n)\s*?$/)).test(prev.original); + } + } + function isNextWhitespace(statements, i, isRoot) { + if (i === undefined) { + i = -1; + } + + var next = statements[i+1], + sibling = statements[i+2]; + if (!next) { + return isRoot; + } + + if (next.type === 'content') { + return (sibling || !isRoot ? (/^\s*?\r?\n/) : (/^\s*?(\r?\n|$)/)).test(next.original); + } + } + + // Marks the node to the right of the position as omitted. + // I.e. {{foo}}' ' will mark the ' ' node as omitted. + // + // If i is undefined, then the first child will be marked as such. + // + // If mulitple is truthy then all whitespace will be stripped out until non-whitespace + // content is met. + function omitRight(statements, i, multiple) { + var current = statements[i == null ? 0 : i + 1]; + if (!current || current.type !== 'content' || (!multiple && current.rightStripped)) { + return; + } + + var original = current.string; + current.string = current.string.replace(multiple ? (/^\s+/) : (/^[ \t]*\r?\n?/), ''); + current.rightStripped = current.string !== original; + } + + // Marks the node to the left of the position as omitted. + // I.e. ' '{{foo}} will mark the ' ' node as omitted. + // + // If i is undefined then the last child will be marked as such. + // + // If mulitple is truthy then all whitespace will be stripped out until non-whitespace + // content is met. + function omitLeft(statements, i, multiple) { + var current = statements[i == null ? statements.length - 1 : i - 1]; + if (!current || current.type !== 'content' || (!multiple && current.leftStripped)) { + return; + } + + // We omit the last node if it's whitespace only and not preceeded by a non-content node. + var original = current.string; + current.string = current.string.replace(multiple ? (/\s+$/) : (/[ \t]+$/), ''); + current.leftStripped = current.string !== original; + return current.leftStripped; + } + return __exports__; +})(__module5__); + +// handlebars/compiler/base.js +var __module8__ = (function(__dependency1__, __dependency2__, __dependency3__, __dependency4__) { + "use strict"; + var __exports__ = {}; + var parser = __dependency1__; + var AST = __dependency2__; + var Helpers = __dependency3__; + var extend = __dependency4__.extend; + + __exports__.parser = parser; + + var yy = {}; + extend(yy, Helpers, AST); + + function parse(input) { + // Just return if an already-compile AST was passed in. + if (input.constructor === AST.ProgramNode) { return input; } + + parser.yy = yy; + + return parser.parse(input); + } + + __exports__.parse = parse; + return __exports__; +})(__module9__, __module7__, __module10__, __module3__); + +// handlebars/compiler/compiler.js +var __module11__ = (function(__dependency1__, __dependency2__) { + "use strict"; + var __exports__ = {}; + var Exception = __dependency1__; + var isArray = __dependency2__.isArray; + + var slice = [].slice; + + function Compiler() {} + + __exports__.Compiler = Compiler;// the foundHelper register will disambiguate helper lookup from finding a + // function in a context. This is necessary for mustache compatibility, which + // requires that context functions in blocks are evaluated by blockHelperMissing, + // and then proceed as if the resulting value was provided to blockHelperMissing. + + Compiler.prototype = { + compiler: Compiler, + + equals: function(other) { + var len = this.opcodes.length; + if (other.opcodes.length !== len) { + return false; + } + + for (var i = 0; i < len; i++) { + var opcode = this.opcodes[i], + otherOpcode = other.opcodes[i]; + if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { + return false; + } + } + + // We know that length is the same between the two arrays because they are directly tied + // to the opcode behavior above. + len = this.children.length; + for (i = 0; i < len; i++) { + if (!this.children[i].equals(other.children[i])) { + return false; + } + } + + return true; + }, + + guid: 0, + + compile: function(program, options) { + this.opcodes = []; + this.children = []; + this.depths = {list: []}; + this.options = options; + this.stringParams = options.stringParams; + this.trackIds = options.trackIds; + + // These changes will propagate to the other compiler components + var knownHelpers = this.options.knownHelpers; + this.options.knownHelpers = { + 'helperMissing': true, + 'blockHelperMissing': true, + 'each': true, + 'if': true, + 'unless': true, + 'with': true, + 'log': true, + 'lookup': true + }; + if (knownHelpers) { + for (var name in knownHelpers) { + this.options.knownHelpers[name] = knownHelpers[name]; + } + } + + return this.accept(program); + }, + + accept: function(node) { + return this[node.type](node); + }, + + program: function(program) { + var statements = program.statements; + + for(var i=0, l=statements.length; i 0) { + varDeclarations += ", " + locals.join(", "); + } + + // Generate minimizer alias mappings + for (var alias in this.aliases) { + if (this.aliases.hasOwnProperty(alias)) { + varDeclarations += ', ' + alias + '=' + this.aliases[alias]; + } + } + + var params = ["depth0", "helpers", "partials", "data"]; + + if (this.useDepths) { + params.push('depths'); + } + + // Perform a second pass over the output to merge content when possible + var source = this.mergeSource(varDeclarations); + + if (asObject) { + params.push(source); + + return Function.apply(this, params); + } else { + return 'function(' + params.join(',') + ') {\n ' + source + '}'; + } + }, + mergeSource: function(varDeclarations) { + var source = '', + buffer, + appendOnly = !this.forceBuffer, + appendFirst; + + for (var i = 0, len = this.source.length; i < len; i++) { + var line = this.source[i]; + if (line.appendToBuffer) { + if (buffer) { + buffer = buffer + '\n + ' + line.content; + } else { + buffer = line.content; + } + } else { + if (buffer) { + if (!source) { + appendFirst = true; + source = buffer + ';\n '; + } else { + source += 'buffer += ' + buffer + ';\n '; + } + buffer = undefined; + } + source += line + '\n '; + + if (!this.environment.isSimple) { + appendOnly = false; + } + } + } + + if (appendOnly) { + if (buffer || !source) { + source += 'return ' + (buffer || '""') + ';\n'; + } + } else { + varDeclarations += ", buffer = " + (appendFirst ? '' : this.initializeBuffer()); + if (buffer) { + source += 'return buffer + ' + buffer + ';\n'; + } else { + source += 'return buffer;\n'; + } + } + + if (varDeclarations) { + source = 'var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n ') + source; + } + + return source; + }, + + // [blockValue] + // + // On stack, before: hash, inverse, program, value + // On stack, after: return value of blockHelperMissing + // + // The purpose of this opcode is to take a block of the form + // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and + // replace it on the stack with the result of properly + // invoking blockHelperMissing. + blockValue: function(name) { + this.aliases.blockHelperMissing = 'helpers.blockHelperMissing'; + + var params = [this.contextName(0)]; + this.setupParams(name, 0, params); + + var blockName = this.popStack(); + params.splice(1, 0, blockName); + + this.push('blockHelperMissing.call(' + params.join(', ') + ')'); + }, + + // [ambiguousBlockValue] + // + // On stack, before: hash, inverse, program, value + // Compiler value, before: lastHelper=value of last found helper, if any + // On stack, after, if no lastHelper: same as [blockValue] + // On stack, after, if lastHelper: value + ambiguousBlockValue: function() { + this.aliases.blockHelperMissing = 'helpers.blockHelperMissing'; + + // We're being a bit cheeky and reusing the options value from the prior exec + var params = [this.contextName(0)]; + this.setupParams('', 0, params, true); + + this.flushInline(); + + var current = this.topStack(); + params.splice(1, 0, current); + + this.pushSource("if (!" + this.lastHelper + ") { " + current + " = blockHelperMissing.call(" + params.join(", ") + "); }"); + }, + + // [appendContent] + // + // On stack, before: ... + // On stack, after: ... + // + // Appends the string value of `content` to the current buffer + appendContent: function(content) { + if (this.pendingContent) { + content = this.pendingContent + content; + } + + this.pendingContent = content; + }, + + // [append] + // + // On stack, before: value, ... + // On stack, after: ... + // + // Coerces `value` to a String and appends it to the current buffer. + // + // If `value` is truthy, or 0, it is coerced into a string and appended + // Otherwise, the empty string is appended + append: function() { + // Force anything that is inlined onto the stack so we don't have duplication + // when we examine local + this.flushInline(); + var local = this.popStack(); + this.pushSource('if (' + local + ' != null) { ' + this.appendToBuffer(local) + ' }'); + if (this.environment.isSimple) { + this.pushSource("else { " + this.appendToBuffer("''") + " }"); + } + }, + + // [appendEscaped] + // + // On stack, before: value, ... + // On stack, after: ... + // + // Escape `value` and append it to the buffer + appendEscaped: function() { + this.aliases.escapeExpression = 'this.escapeExpression'; + + this.pushSource(this.appendToBuffer("escapeExpression(" + this.popStack() + ")")); + }, + + // [getContext] + // + // On stack, before: ... + // On stack, after: ... + // Compiler value, after: lastContext=depth + // + // Set the value of the `lastContext` compiler value to the depth + getContext: function(depth) { + this.lastContext = depth; + }, + + // [pushContext] + // + // On stack, before: ... + // On stack, after: currentContext, ... + // + // Pushes the value of the current context onto the stack. + pushContext: function() { + this.pushStackLiteral(this.contextName(this.lastContext)); + }, + + // [lookupOnContext] + // + // On stack, before: ... + // On stack, after: currentContext[name], ... + // + // Looks up the value of `name` on the current context and pushes + // it onto the stack. + lookupOnContext: function(parts, falsy, scoped) { + /*jshint -W083 */ + var i = 0, + len = parts.length; + + if (!scoped && this.options.compat && !this.lastContext) { + // The depthed query is expected to handle the undefined logic for the root level that + // is implemented below, so we evaluate that directly in compat mode + this.push(this.depthedLookup(parts[i++])); + } else { + this.pushContext(); + } + + for (; i < len; i++) { + this.replaceStack(function(current) { + var lookup = this.nameLookup(current, parts[i], 'context'); + // We want to ensure that zero and false are handled properly if the context (falsy flag) + // needs to have the special handling for these values. + if (!falsy) { + return ' != null ? ' + lookup + ' : ' + current; + } else { + // Otherwise we can use generic falsy handling + return ' && ' + lookup; + } + }); + } + }, + + // [lookupData] + // + // On stack, before: ... + // On stack, after: data, ... + // + // Push the data lookup operator + lookupData: function(depth, parts) { + /*jshint -W083 */ + if (!depth) { + this.pushStackLiteral('data'); + } else { + this.pushStackLiteral('this.data(data, ' + depth + ')'); + } + + var len = parts.length; + for (var i = 0; i < len; i++) { + this.replaceStack(function(current) { + return ' && ' + this.nameLookup(current, parts[i], 'data'); + }); + } + }, + + // [resolvePossibleLambda] + // + // On stack, before: value, ... + // On stack, after: resolved value, ... + // + // If the `value` is a lambda, replace it on the stack by + // the return value of the lambda + resolvePossibleLambda: function() { + this.aliases.lambda = 'this.lambda'; + + this.push('lambda(' + this.popStack() + ', ' + this.contextName(0) + ')'); + }, + + // [pushStringParam] + // + // On stack, before: ... + // On stack, after: string, currentContext, ... + // + // This opcode is designed for use in string mode, which + // provides the string value of a parameter along with its + // depth rather than resolving it immediately. + pushStringParam: function(string, type) { + this.pushContext(); + this.pushString(type); + + // If it's a subexpression, the string result + // will be pushed after this opcode. + if (type !== 'sexpr') { + if (typeof string === 'string') { + this.pushString(string); + } else { + this.pushStackLiteral(string); + } + } + }, + + emptyHash: function() { + this.pushStackLiteral('{}'); + + if (this.trackIds) { + this.push('{}'); // hashIds + } + if (this.stringParams) { + this.push('{}'); // hashContexts + this.push('{}'); // hashTypes + } + }, + pushHash: function() { + if (this.hash) { + this.hashes.push(this.hash); + } + this.hash = {values: [], types: [], contexts: [], ids: []}; + }, + popHash: function() { + var hash = this.hash; + this.hash = this.hashes.pop(); + + if (this.trackIds) { + this.push('{' + hash.ids.join(',') + '}'); + } + if (this.stringParams) { + this.push('{' + hash.contexts.join(',') + '}'); + this.push('{' + hash.types.join(',') + '}'); + } + + this.push('{\n ' + hash.values.join(',\n ') + '\n }'); + }, + + // [pushString] + // + // On stack, before: ... + // On stack, after: quotedString(string), ... + // + // Push a quoted version of `string` onto the stack + pushString: function(string) { + this.pushStackLiteral(this.quotedString(string)); + }, + + // [push] + // + // On stack, before: ... + // On stack, after: expr, ... + // + // Push an expression onto the stack + push: function(expr) { + this.inlineStack.push(expr); + return expr; + }, + + // [pushLiteral] + // + // On stack, before: ... + // On stack, after: value, ... + // + // Pushes a value onto the stack. This operation prevents + // the compiler from creating a temporary variable to hold + // it. + pushLiteral: function(value) { + this.pushStackLiteral(value); + }, + + // [pushProgram] + // + // On stack, before: ... + // On stack, after: program(guid), ... + // + // Push a program expression onto the stack. This takes + // a compile-time guid and converts it into a runtime-accessible + // expression. + pushProgram: function(guid) { + if (guid != null) { + this.pushStackLiteral(this.programExpression(guid)); + } else { + this.pushStackLiteral(null); + } + }, + + // [invokeHelper] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of helper invocation + // + // Pops off the helper's parameters, invokes the helper, + // and pushes the helper's return value onto the stack. + // + // If the helper is not found, `helperMissing` is called. + invokeHelper: function(paramSize, name, isSimple) { + this.aliases.helperMissing = 'helpers.helperMissing'; + + var nonHelper = this.popStack(); + var helper = this.setupHelper(paramSize, name); + + var lookup = (isSimple ? helper.name + ' || ' : '') + nonHelper + ' || helperMissing'; + this.push('((' + lookup + ').call(' + helper.callParams + '))'); + }, + + // [invokeKnownHelper] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of helper invocation + // + // This operation is used when the helper is known to exist, + // so a `helperMissing` fallback is not required. + invokeKnownHelper: function(paramSize, name) { + var helper = this.setupHelper(paramSize, name); + this.push(helper.name + ".call(" + helper.callParams + ")"); + }, + + // [invokeAmbiguous] + // + // On stack, before: hash, inverse, program, params..., ... + // On stack, after: result of disambiguation + // + // This operation is used when an expression like `{{foo}}` + // is provided, but we don't know at compile-time whether it + // is a helper or a path. + // + // This operation emits more code than the other options, + // and can be avoided by passing the `knownHelpers` and + // `knownHelpersOnly` flags at compile-time. + invokeAmbiguous: function(name, helperCall) { + this.aliases.functionType = '"function"'; + this.aliases.helperMissing = 'helpers.helperMissing'; + this.useRegister('helper'); + + var nonHelper = this.popStack(); + + this.emptyHash(); + var helper = this.setupHelper(0, name, helperCall); + + var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); + + this.push( + '((helper = (helper = ' + helperName + ' || ' + nonHelper + ') != null ? helper : helperMissing' + + (helper.paramsInit ? '),(' + helper.paramsInit : '') + '),' + + '(typeof helper === functionType ? helper.call(' + helper.callParams + ') : helper))'); + }, + + // [invokePartial] + // + // On stack, before: context, ... + // On stack after: result of partial invocation + // + // This operation pops off a context, invokes a partial with that context, + // and pushes the result of the invocation back. + invokePartial: function(name, indent) { + var params = [this.nameLookup('partials', name, 'partial'), "'" + indent + "'", "'" + name + "'", this.popStack(), this.popStack(), "helpers", "partials"]; + + if (this.options.data) { + params.push("data"); + } else if (this.options.compat) { + params.push('undefined'); + } + if (this.options.compat) { + params.push('depths'); + } + + this.push("this.invokePartial(" + params.join(", ") + ")"); + }, + + // [assignToHash] + // + // On stack, before: value, ..., hash, ... + // On stack, after: ..., hash, ... + // + // Pops a value off the stack and assigns it to the current hash + assignToHash: function(key) { + var value = this.popStack(), + context, + type, + id; + + if (this.trackIds) { + id = this.popStack(); + } + if (this.stringParams) { + type = this.popStack(); + context = this.popStack(); + } + + var hash = this.hash; + if (context) { + hash.contexts.push("'" + key + "': " + context); + } + if (type) { + hash.types.push("'" + key + "': " + type); + } + if (id) { + hash.ids.push("'" + key + "': " + id); + } + hash.values.push("'" + key + "': (" + value + ")"); + }, + + pushId: function(type, name) { + if (type === 'ID' || type === 'DATA') { + this.pushString(name); + } else if (type === 'sexpr') { + this.pushStackLiteral('true'); + } else { + this.pushStackLiteral('null'); + } + }, + + // HELPERS + + compiler: JavaScriptCompiler, + + compileChildren: function(environment, options) { + var children = environment.children, child, compiler; + + for(var i=0, l=children.length; i this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); } + return this.topStackName(); + }, + topStackName: function() { + return "stack" + this.stackSlot; + }, + flushInline: function() { + var inlineStack = this.inlineStack; + if (inlineStack.length) { + this.inlineStack = []; + for (var i = 0, len = inlineStack.length; i < len; i++) { + var entry = inlineStack[i]; + if (entry instanceof Literal) { + this.compileStack.push(entry); + } else { + this.pushStack(entry); + } + } + } + }, + isInline: function() { + return this.inlineStack.length; + }, + + popStack: function(wrapped) { + var inline = this.isInline(), + item = (inline ? this.inlineStack : this.compileStack).pop(); + + if (!wrapped && (item instanceof Literal)) { + return item.value; + } else { + if (!inline) { + /* istanbul ignore next */ + if (!this.stackSlot) { + throw new Exception('Invalid stack pop'); + } + this.stackSlot--; + } + return item; + } + }, + + topStack: function() { + var stack = (this.isInline() ? this.inlineStack : this.compileStack), + item = stack[stack.length - 1]; + + if (item instanceof Literal) { + return item.value; + } else { + return item; + } + }, + + contextName: function(context) { + if (this.useDepths && context) { + return 'depths[' + context + ']'; + } else { + return 'depth' + context; + } + }, + + quotedString: function(str) { + return '"' + str + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 + .replace(/\u2029/g, '\\u2029') + '"'; + }, + + objectLiteral: function(obj) { + var pairs = []; + + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + pairs.push(this.quotedString(key) + ':' + obj[key]); + } + } + + return '{' + pairs.join(',') + '}'; + }, + + setupHelper: function(paramSize, name, blockHelper) { + var params = [], + paramsInit = this.setupParams(name, paramSize, params, blockHelper); + var foundHelper = this.nameLookup('helpers', name, 'helper'); + + return { + params: params, + paramsInit: paramsInit, + name: foundHelper, + callParams: [this.contextName(0)].concat(params).join(", ") + }; + }, + + setupOptions: function(helper, paramSize, params) { + var options = {}, contexts = [], types = [], ids = [], param, inverse, program; + + options.name = this.quotedString(helper); + options.hash = this.popStack(); + + if (this.trackIds) { + options.hashIds = this.popStack(); + } + if (this.stringParams) { + options.hashTypes = this.popStack(); + options.hashContexts = this.popStack(); + } + + inverse = this.popStack(); + program = this.popStack(); + + // Avoid setting fn and inverse if neither are set. This allows + // helpers to do a check for `if (options.fn)` + if (program || inverse) { + if (!program) { + program = 'this.noop'; + } + + if (!inverse) { + inverse = 'this.noop'; + } + + options.fn = program; + options.inverse = inverse; + } + + // The parameters go on to the stack in order (making sure that they are evaluated in order) + // so we need to pop them off the stack in reverse order + var i = paramSize; + while (i--) { + param = this.popStack(); + params[i] = param; + + if (this.trackIds) { + ids[i] = this.popStack(); + } + if (this.stringParams) { + types[i] = this.popStack(); + contexts[i] = this.popStack(); + } + } + + if (this.trackIds) { + options.ids = "[" + ids.join(",") + "]"; + } + if (this.stringParams) { + options.types = "[" + types.join(",") + "]"; + options.contexts = "[" + contexts.join(",") + "]"; + } + + if (this.options.data) { + options.data = "data"; + } + + return options; + }, + + // the params and contexts arguments are passed in arrays + // to fill in + setupParams: function(helperName, paramSize, params, useRegister) { + var options = this.objectLiteral(this.setupOptions(helperName, paramSize, params)); + + if (useRegister) { + this.useRegister('options'); + params.push('options'); + return 'options=' + options; + } else { + params.push(options); + return ''; + } + } + }; + + var reservedWords = ( + "break else new var" + + " case finally return void" + + " catch for switch while" + + " continue function this with" + + " default if throw" + + " delete in try" + + " do instanceof typeof" + + " abstract enum int short" + + " boolean export interface static" + + " byte extends long super" + + " char final native synchronized" + + " class float package throws" + + " const goto private transient" + + " debugger implements protected volatile" + + " double import public let yield" + ).split(" "); + + var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; + + for(var i=0, l=reservedWords.length; i */ + +// +// Stub out `require` in rhino +// +function require(arg) { + var split = arg.split('/'); + var resultModule = split.length == 1 ? less.modules[split[0]] : less[split[1]]; + if (!resultModule) { + throw {message: "Cannot find module '" + arg + "'"}; + } + return resultModule; +} + + +if (typeof(window) === 'undefined') { + less = {} +} +else { + less = window.less = {} +} +tree = less.tree = {}; +less.mode = 'rhino'; + +(function () { + + console = function () { + function doLog(out) { + return function (a) { + //TODO: for some reason loging dosn't work,fix later + } + } + + return { + log: doLog(log.info), + info: doLog(log.info), + error: doLog(log.error), + warn: doLog(log.warn) + }; + }(); + + less.modules = {}; + + less.modules.path = { + join: function () { + var parts = []; + for (i in arguments) { + parts = parts.concat(arguments[i].split(/\/|\\/)); + } + var result = []; + for (i in parts) { + var part = parts[i]; + if (part === '..' && result.length > 0 && result[result.length - 1] !== '..') { + result.pop(); + } else if (part === '' && result.length > 0) { + // skip + } else if (part !== '.') { + if (part.slice(-1) === '\\' || part.slice(-1) === '/') { + part = part.slice(0, -1); + } + result.push(part); + } + } + return result.join('/'); + }, + dirname: function (p) { + var path = p.split('/'); + path.pop(); + return path.join('/'); + }, + basename: function (p, ext) { + var base = p.split('/').pop(); + if (ext) { + var index = base.lastIndexOf(ext); + if (base.length === index + ext.length) { + base = base.substr(0, index); + } + } + return base; + }, + extname: function (p) { + var index = p.lastIndexOf('.'); + return index > 0 ? p.substring(index) : ''; + } + }; + + less.modules.fs = { + readFileSync: function (name) { + // read a file into a byte array + var file = new java.io.File(name); + new Log('xxxxxxxx').info(file.getCanonicalPath()); + var stream = new java.io.FileInputStream(file); + var buffer = []; + var c; + while ((c = stream.read()) != -1) { + buffer.push(c); + } + stream.close(); + return { + length: buffer.length, + toString: function (enc) { + if (enc === 'base64') { + return encodeBase64Bytes(buffer); + } else if (enc) { + return java.lang.String["(byte[],java.lang.String)"](buffer, enc); + } else { + return java.lang.String["(byte[])"](buffer); + } + } + }; + } + }; + + less.encoder = { + encodeBase64: function (str) { + return encodeBase64String(str); + } + }; + + // --------------------------------------------------------------------------------------------- + // private helper functions + // --------------------------------------------------------------------------------------------- + + function encodeBase64Bytes(bytes) { + // requires at least a JRE Platform 6 (or JAXB 1.0 on the classpath) + return javax.xml.bind.DatatypeConverter.printBase64Binary(bytes) + } + + function encodeBase64String(str) { + return encodeBase64Bytes(new java.lang.String(str).getBytes()); + } + +})(); + +var less, tree; + +// Node.js does not have a header file added which defines less +if (less === undefined) { + less = exports; + tree = require('./tree'); + less.mode = 'node'; +} +// +// less.js - parser +// +// A relatively straight-forward predictive parser. +// There is no tokenization/lexing stage, the input is parsed +// in one sweep. +// +// To make the parser fast enough to run in the browser, several +// optimization had to be made: +// +// - Matching and slicing on a huge input is often cause of slowdowns. +// The solution is to chunkify the input into smaller strings. +// The chunks are stored in the `chunks` var, +// `j` holds the current chunk index, and `currentPos` holds +// the index of the current chunk in relation to `input`. +// This gives us an almost 4x speed-up. +// +// - In many cases, we don't need to match individual tokens; +// for example, if a value doesn't hold any variables, operations +// or dynamic references, the parser can effectively 'skip' it, +// treating it as a literal. +// An example would be '1px solid #000' - which evaluates to itself, +// we don't need to know what the individual components are. +// The drawback, of course is that you don't get the benefits of +// syntax-checking on the CSS. This gives us a 50% speed-up in the parser, +// and a smaller speed-up in the code-gen. +// +// +// Token matching is done with the `$` function, which either takes +// a terminal string or regexp, or a non-terminal function to call. +// It also takes care of moving all the indices forwards. +// +// +less.Parser = function Parser(env) { + var input, // LeSS input string + i, // current index in `input` + j, // current chunk + saveStack = [], // holds state for backtracking + furthest, // furthest index the parser has gone to + chunks, // chunkified input + current, // current chunk + currentPos, // index of current chunk, in `input` + parser, + parsers, + rootFilename = env && env.filename; + + // Top parser on an import tree must be sure there is one "env" + // which will then be passed around by reference. + if (!(env instanceof tree.parseEnv)) { + env = new tree.parseEnv(env); + } + + var imports = this.imports = { + paths: env.paths || [], // Search paths, when importing + queue: [], // Files which haven't been imported yet + files: env.files, // Holds the imported parse trees + contents: env.contents, // Holds the imported file contents + contentsIgnoredChars: env.contentsIgnoredChars, // lines inserted, not in the original less + mime: env.mime, // MIME type of .less files + error: null, // Error in parsing/evaluating an import + push: function (path, currentFileInfo, importOptions, callback) { + var parserImports = this; + this.queue.push(path); + + var fileParsedFunc = function (e, root, fullPath) { + parserImports.queue.splice(parserImports.queue.indexOf(path), 1); // Remove the path from the queue + + var importedPreviously = fullPath === rootFilename; + + parserImports.files[fullPath] = root; // Store the root + + if (e && !parserImports.error) { + parserImports.error = e; + } + + callback(e, root, importedPreviously, fullPath); + }; + + if (less.Parser.importer) { + less.Parser.importer(path, currentFileInfo, fileParsedFunc, env); + } else { + less.Parser.fileLoader(path, currentFileInfo, function (e, contents, fullPath, newFileInfo) { + if (e) { + fileParsedFunc(e); + return; + } + + var newEnv = new tree.parseEnv(env); + + newEnv.currentFileInfo = newFileInfo; + newEnv.processImports = false; + newEnv.contents[fullPath] = contents; + + if (currentFileInfo.reference || importOptions.reference) { + newFileInfo.reference = true; + } + + if (importOptions.inline) { + fileParsedFunc(null, contents, fullPath); + } else { + new (less.Parser)(newEnv).parse(contents, function (e, root) { + fileParsedFunc(e, root, fullPath); + }); + } + }, env); + } + } + }; + + function save() { + currentPos = i; + saveStack.push({current: current, i: i, j: j}); + } + + function restore() { + var state = saveStack.pop(); + current = state.current; + currentPos = i = state.i; + j = state.j; + } + + function forget() { + saveStack.pop(); + } + + function sync() { + if (i > currentPos) { + current = current.slice(i - currentPos); + currentPos = i; + } + } + + function isWhitespace(str, pos) { + var code = str.charCodeAt(pos | 0); + return (code <= 32) && (code === 32 || code === 10 || code === 9); + } + + // + // Parse from a token, regexp or string, and move forward if match + // + function $(tok) { + var tokType = typeof tok, + match, length; + + // Either match a single character in the input, + // or match a regexp in the current chunk (`current`). + // + if (tokType === "string") { + if (input.charAt(i) !== tok) { + return null; + } + skipWhitespace(1); + return tok; + } + + // regexp + sync(); + if (!(match = tok.exec(current))) { + return null; + } + + length = match[0].length; + + // The match is confirmed, add the match length to `i`, + // and consume any extra white-space characters (' ' || '\n') + // which come after that. The reason for this is that LeSS's + // grammar is mostly white-space insensitive. + // + skipWhitespace(length); + + if (typeof(match) === 'string') { + return match; + } else { + return match.length === 1 ? match[0] : match; + } + } + + // Specialization of $(tok) + function $re(tok) { + if (i > currentPos) { + current = current.slice(i - currentPos); + currentPos = i; + } + var m = tok.exec(current); + if (!m) { + return null; + } + + skipWhitespace(m[0].length); + if (typeof m === "string") { + return m; + } + + return m.length === 1 ? m[0] : m; + } + + var _$re = $re; + + // Specialization of $(tok) + function $char(tok) { + if (input.charAt(i) !== tok) { + return null; + } + skipWhitespace(1); + return tok; + } + + function skipWhitespace(length) { + var oldi = i, oldj = j, + curr = i - currentPos, + endIndex = i + current.length - curr, + mem = (i += length), + inp = input, + c; + + for (; i < endIndex; i++) { + c = inp.charCodeAt(i); + if (c > 32) { + break; + } + + if ((c !== 32) && (c !== 10) && (c !== 9) && (c !== 13)) { + break; + } + } + + current = current.slice(length + i - mem + curr); + currentPos = i; + + if (!current.length && (j < chunks.length - 1)) { + current = chunks[++j]; + skipWhitespace(0); // skip space at the beginning of a chunk + return true; // things changed + } + + return oldi !== i || oldj !== j; + } + + function expect(arg, msg, index) { + // some older browsers return typeof 'function' for RegExp + var result = (Object.prototype.toString.call(arg) === '[object Function]') ? arg.call(parsers) : $(arg); + if (result) { + return result; + } + error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + input.charAt(i) + "'" + : "unexpected token")); + } + + // Specialization of expect() + function expectChar(arg, msg) { + if (input.charAt(i) === arg) { + skipWhitespace(1); + return arg; + } + error(msg || "expected '" + arg + "' got '" + input.charAt(i) + "'"); + } + + function error(msg, type) { + var e = new Error(msg); + e.index = i; + e.type = type || 'Syntax'; + throw e; + } + + // Same as $(), but don't change the state of the parser, + // just return the match. + function peek(tok) { + if (typeof(tok) === 'string') { + return input.charAt(i) === tok; + } else { + return tok.test(current); + } + } + + // Specialization of peek() + function peekChar(tok) { + return input.charAt(i) === tok; + } + + + function getInput(e, env) { + if (e.filename && env.currentFileInfo.filename && (e.filename !== env.currentFileInfo.filename)) { + return parser.imports.contents[e.filename]; + } else { + return input; + } + } + + function getLocation(index, inputStream) { + var n = index + 1, + line = null, + column = -1; + + while (--n >= 0 && inputStream.charAt(n) !== '\n') { + column++; + } + + if (typeof index === 'number') { + line = (inputStream.slice(0, index).match(/\n/g) || "").length; + } + + return { + line: line, + column: column + }; + } + + function getDebugInfo(index, inputStream, env) { + var filename = env.currentFileInfo.filename; + if (less.mode !== 'browser' && less.mode !== 'rhino') { + filename = require('path').resolve(filename); + } + + return { + lineNumber: getLocation(index, inputStream).line + 1, + fileName: filename + }; + } + + function LessError(e, env) { + var input = getInput(e, env), + loc = getLocation(e.index, input), + line = loc.line, + col = loc.column, + callLine = e.call && getLocation(e.call, input).line, + lines = input.split('\n'); + + this.type = e.type || 'Syntax'; + this.message = e.message; + this.filename = e.filename || env.currentFileInfo.filename; + this.index = e.index; + this.line = typeof(line) === 'number' ? line + 1 : null; + this.callLine = callLine + 1; + this.callExtract = lines[callLine]; + this.stack = e.stack; + this.column = col; + this.extract = [ + lines[line - 1], + lines[line], + lines[line + 1] + ]; + } + + LessError.prototype = new Error(); + LessError.prototype.constructor = LessError; + + this.env = env = env || {}; + + // The optimization level dictates the thoroughness of the parser, + // the lower the number, the less nodes it will create in the tree. + // This could matter for debugging, or if you want to access + // the individual nodes in the tree. + this.optimization = ('optimization' in this.env) ? this.env.optimization : 1; + + // + // The Parser + // + parser = { + + imports: imports, + // + // Parse an input string into an abstract syntax tree, + // @param str A string containing 'less' markup + // @param callback call `callback` when done. + // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply + // + parse: function (str, callback, additionalData) { + var root, line, lines, error = null, globalVars, modifyVars, preText = ""; + + i = j = currentPos = furthest = 0; + + globalVars = (additionalData && additionalData.globalVars) ? less.Parser.serializeVars(additionalData.globalVars) + '\n' : ''; + modifyVars = (additionalData && additionalData.modifyVars) ? '\n' + less.Parser.serializeVars(additionalData.modifyVars) : ''; + + if (globalVars || (additionalData && additionalData.banner)) { + preText = ((additionalData && additionalData.banner) ? additionalData.banner : "") + globalVars; + parser.imports.contentsIgnoredChars[env.currentFileInfo.filename] = preText.length; + } + + str = str.replace(/\r\n/g, '\n'); + // Remove potential UTF Byte Order Mark + input = str = preText + str.replace(/^\uFEFF/, '') + modifyVars; + parser.imports.contents[env.currentFileInfo.filename] = str; + + // Split the input into chunks. + chunks = (function (input) { + var len = input.length, level = 0, parenLevel = 0, + lastOpening, lastOpeningParen, lastMultiComment, lastMultiCommentEndBrace, + chunks = [], emitFrom = 0, + parserCurrentIndex, currentChunkStartIndex, cc, cc2, matched; + + function fail(msg, index) { + error = new (LessError)({ + index: index || parserCurrentIndex, + type: 'Parse', + message: msg, + filename: env.currentFileInfo.filename + }, env); + } + + function emitChunk(force) { + var len = parserCurrentIndex - emitFrom; + if (((len < 512) && !force) || !len) { + return; + } + chunks.push(input.slice(emitFrom, parserCurrentIndex + 1)); + emitFrom = parserCurrentIndex + 1; + } + + for (parserCurrentIndex = 0; parserCurrentIndex < len; parserCurrentIndex++) { + cc = input.charCodeAt(parserCurrentIndex); + if (((cc >= 97) && (cc <= 122)) || (cc < 34)) { + // a-z or whitespace + continue; + } + + switch (cc) { + case 40: // ( + parenLevel++; + lastOpeningParen = parserCurrentIndex; + continue; + case 41: // ) + if (--parenLevel < 0) { + return fail("missing opening `(`"); + } + continue; + case 59: // ; + if (!parenLevel) { + emitChunk(); + } + continue; + case 123: // { + level++; + lastOpening = parserCurrentIndex; + continue; + case 125: // } + if (--level < 0) { + return fail("missing opening `{`"); + } + if (!level && !parenLevel) { + emitChunk(); + } + continue; + case 92: // \ + if (parserCurrentIndex < len - 1) { + parserCurrentIndex++; + continue; + } + return fail("unescaped `\\`"); + case 34: + case 39: + case 96: // ", ' and ` + matched = 0; + currentChunkStartIndex = parserCurrentIndex; + for (parserCurrentIndex = parserCurrentIndex + 1; parserCurrentIndex < len; parserCurrentIndex++) { + cc2 = input.charCodeAt(parserCurrentIndex); + if (cc2 > 96) { + continue; + } + if (cc2 == cc) { + matched = 1; + break; + } + if (cc2 == 92) { // \ + if (parserCurrentIndex == len - 1) { + return fail("unescaped `\\`"); + } + parserCurrentIndex++; + } + } + if (matched) { + continue; + } + return fail("unmatched `" + String.fromCharCode(cc) + "`", currentChunkStartIndex); + case 47: // /, check for comment + if (parenLevel || (parserCurrentIndex == len - 1)) { + continue; + } + cc2 = input.charCodeAt(parserCurrentIndex + 1); + if (cc2 == 47) { + // //, find lnfeed + for (parserCurrentIndex = parserCurrentIndex + 2; parserCurrentIndex < len; parserCurrentIndex++) { + cc2 = input.charCodeAt(parserCurrentIndex); + if ((cc2 <= 13) && ((cc2 == 10) || (cc2 == 13))) { + break; + } + } + } else if (cc2 == 42) { + // /*, find */ + lastMultiComment = currentChunkStartIndex = parserCurrentIndex; + for (parserCurrentIndex = parserCurrentIndex + 2; parserCurrentIndex < len - 1; parserCurrentIndex++) { + cc2 = input.charCodeAt(parserCurrentIndex); + if (cc2 == 125) { + lastMultiCommentEndBrace = parserCurrentIndex; + } + if (cc2 != 42) { + continue; + } + if (input.charCodeAt(parserCurrentIndex + 1) == 47) { + break; + } + } + if (parserCurrentIndex == len - 1) { + return fail("missing closing `*/`", currentChunkStartIndex); + } + parserCurrentIndex++; + } + continue; + case 42: // *, check for unmatched */ + if ((parserCurrentIndex < len - 1) && (input.charCodeAt(parserCurrentIndex + 1) == 47)) { + return fail("unmatched `/*`"); + } + continue; + } + } + + if (level !== 0) { + if ((lastMultiComment > lastOpening) && (lastMultiCommentEndBrace > lastMultiComment)) { + return fail("missing closing `}` or `*/`", lastOpening); + } else { + return fail("missing closing `}`", lastOpening); + } + } else if (parenLevel !== 0) { + return fail("missing closing `)`", lastOpeningParen); + } + + emitChunk(true); + return chunks; + })(str); + + if (error) { + return callback(new (LessError)(error, env)); + } + + current = chunks[0]; + + // Start with the primary rule. + // The whole syntax tree is held under a Ruleset node, + // with the `root` property set to true, so no `{}` are + // output. The callback is called when the input is parsed. + try { + root = new (tree.Ruleset)(null, this.parsers.primary()); + root.root = true; + root.firstRoot = true; + } catch (e) { + return callback(new (LessError)(e, env)); + } + + root.toCSS = (function (evaluate) { + return function (options, variables) { + options = options || {}; + var evaldRoot, + css, + evalEnv = new tree.evalEnv(options); + + // + // Allows setting variables with a hash, so: + // + // `{ color: new(tree.Color)('#f01') }` will become: + // + // new(tree.Rule)('@color', + // new(tree.Value)([ + // new(tree.Expression)([ + // new(tree.Color)('#f01') + // ]) + // ]) + // ) + // + if (typeof(variables) === 'object' && !Array.isArray(variables)) { + variables = Object.keys(variables).map(function (k) { + var value = variables[k]; + + if (!(value instanceof tree.Value)) { + if (!(value instanceof tree.Expression)) { + value = new (tree.Expression)([value]); + } + value = new (tree.Value)([value]); + } + return new (tree.Rule)('@' + k, value, false, null, 0); + }); + evalEnv.frames = [new (tree.Ruleset)(null, variables)]; + } + + try { + var preEvalVisitors = [], + visitors = [ + new (tree.joinSelectorVisitor)(), + new (tree.processExtendsVisitor)(), + new (tree.toCSSVisitor)({compress: Boolean(options.compress)}) + ], i, root = this; + + if (options.plugins) { + for (i = 0; i < options.plugins.length; i++) { + if (options.plugins[i].isPreEvalVisitor) { + preEvalVisitors.push(options.plugins[i]); + } else { + if (options.plugins[i].isPreVisitor) { + visitors.splice(0, 0, options.plugins[i]); + } else { + visitors.push(options.plugins[i]); + } + } + } + } + + for (i = 0; i < preEvalVisitors.length; i++) { + preEvalVisitors[i].run(root); + } + + evaldRoot = evaluate.call(root, evalEnv); + + for (i = 0; i < visitors.length; i++) { + visitors[i].run(evaldRoot); + } + + if (options.sourceMap) { + evaldRoot = new tree.sourceMapOutput( + { + contentsIgnoredCharsMap: parser.imports.contentsIgnoredChars, + writeSourceMap: options.writeSourceMap, + rootNode: evaldRoot, + contentsMap: parser.imports.contents, + sourceMapFilename: options.sourceMapFilename, + sourceMapURL: options.sourceMapURL, + outputFilename: options.sourceMapOutputFilename, + sourceMapBasepath: options.sourceMapBasepath, + sourceMapRootpath: options.sourceMapRootpath, + outputSourceFiles: options.outputSourceFiles, + sourceMapGenerator: options.sourceMapGenerator + }); + } + + css = evaldRoot.toCSS({ + compress: Boolean(options.compress), + dumpLineNumbers: env.dumpLineNumbers, + strictUnits: Boolean(options.strictUnits), + numPrecision: 8 + }); + } catch (e) { + throw new (LessError)(e, env); + } + + if (options.cleancss && less.mode === 'node') { + var CleanCSS = require('clean-css'), + cleancssOptions = options.cleancssOptions || {}; + + if (cleancssOptions.keepSpecialComments === undefined) { + cleancssOptions.keepSpecialComments = "*"; + } + cleancssOptions.processImport = false; + cleancssOptions.noRebase = true; + if (cleancssOptions.noAdvanced === undefined) { + cleancssOptions.noAdvanced = true; + } + + return new CleanCSS(cleancssOptions).minify(css); + } else if (options.compress) { + return css.replace(/(^(\s)+)|((\s)+$)/g, ""); + } else { + return css; + } + }; + })(root.eval); + + // If `i` is smaller than the `input.length - 1`, + // it means the parser wasn't able to parse the whole + // string, so we've got a parsing error. + // + // We try to extract a \n delimited string, + // showing the line where the parse error occured. + // We split it up into two parts (the part which parsed, + // and the part which didn't), so we can color them differently. + if (i < input.length - 1) { + i = furthest; + var loc = getLocation(i, input); + lines = input.split('\n'); + line = loc.line + 1; + + error = { + type: "Parse", + message: "Unrecognised input", + index: i, + filename: env.currentFileInfo.filename, + line: line, + column: loc.column, + extract: [ + lines[line - 2], + lines[line - 1], + lines[line] + ] + }; + } + + var finish = function (e) { + e = error || e || parser.imports.error; + + if (e) { + if (!(e instanceof LessError)) { + e = new (LessError)(e, env); + } + + return callback(e); + } + else { + return callback(null, root); + } + }; + + if (env.processImports !== false) { + new tree.importVisitor(this.imports, finish) + .run(root); + } else { + return finish(); + } + }, + + // + // Here in, the parsing rules/functions + // + // The basic structure of the syntax tree generated is as follows: + // + // Ruleset -> Rule -> Value -> Expression -> Entity + // + // Here's some Less code: + // + // .class { + // color: #fff; + // border: 1px solid #000; + // width: @w + 4px; + // > .child {...} + // } + // + // And here's what the parse tree might look like: + // + // Ruleset (Selector '.class', [ + // Rule ("color", Value ([Expression [Color #fff]])) + // Rule ("border", Value ([Expression [Dimension 1px][Keyword "solid"][Color #000]])) + // Rule ("width", Value ([Expression [Operation "+" [Variable "@w"][Dimension 4px]]])) + // Ruleset (Selector [Element '>', '.child'], [...]) + // ]) + // + // In general, most rules will try to parse a token with the `$()` function, and if the return + // value is truly, will return a new node, of the relevant type. Sometimes, we need to check + // first, before parsing, that's when we use `peek()`. + // + parsers: parsers = { + // + // The `primary` rule is the *entry* and *exit* point of the parser. + // The rules here can appear at any level of the parse tree. + // + // The recursive nature of the grammar is an interplay between the `block` + // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule, + // as represented by this simplified grammar: + // + // primary → (ruleset | rule)+ + // ruleset → selector+ block + // block → '{' primary '}' + // + // Only at one point is the primary rule not called from the + // block rule: at the root level. + // + primary: function () { + var mixin = this.mixin, $re = _$re, root = [], node; + + while (current) { + node = this.extendRule() || mixin.definition() || this.rule() || this.ruleset() || + mixin.call() || this.comment() || this.rulesetCall() || this.directive(); + if (node) { + root.push(node); + } else { + if (!($re(/^[\s\n]+/) || $re(/^;+/))) { + break; + } + } + if (peekChar('}')) { + break; + } + } + + return root; + }, + + // We create a Comment node for CSS comments `/* */`, + // but keep the LeSS comments `//` silent, by just skipping + // over them. + comment: function () { + var comment; + + if (input.charAt(i) !== '/') { + return; + } + + if (input.charAt(i + 1) === '/') { + return new (tree.Comment)($re(/^\/\/.*/), true, i, env.currentFileInfo); + } + comment = $re(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/); + if (comment) { + return new (tree.Comment)(comment, false, i, env.currentFileInfo); + } + }, + + comments: function () { + var comment, comments = []; + + while (true) { + comment = this.comment(); + if (!comment) { + break; + } + comments.push(comment); + } + + return comments; + }, + + // + // Entities are tokens which can be found inside an Expression + // + entities: { + // + // A string, which supports escaping " and ' + // + // "milky way" 'he\'s the one!' + // + quoted: function () { + var str, j = i, e, index = i; + + if (input.charAt(j) === '~') { + j++; + e = true; + } // Escaped strings + if (input.charAt(j) !== '"' && input.charAt(j) !== "'") { + return; + } + + if (e) { + $char('~'); + } + + str = $re(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/); + if (str) { + return new (tree.Quoted)(str[0], str[1] || str[2], e, index, env.currentFileInfo); + } + }, + + // + // A catch-all word, such as: + // + // black border-collapse + // + keyword: function () { + var k; + + k = $re(/^%|^[_A-Za-z-][_A-Za-z0-9-]*/); + if (k) { + var color = tree.Color.fromKeyword(k); + if (color) { + return color; + } + return new (tree.Keyword)(k); + } + }, + + // + // A function call + // + // rgb(255, 0, 255) + // + // We also try to catch IE's `alpha()`, but let the `alpha` parser + // deal with the details. + // + // The arguments are parsed with the `entities.arguments` parser. + // + call: function () { + var name, nameLC, args, alpha_ret, index = i; + + name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(current); + if (!name) { + return; + } + + name = name[1]; + nameLC = name.toLowerCase(); + if (nameLC === 'url') { + return null; + } + + i += name.length; + + if (nameLC === 'alpha') { + alpha_ret = parsers.alpha(); + if (typeof alpha_ret !== 'undefined') { + return alpha_ret; + } + } + + $char('('); // Parse the '(' and consume whitespace. + + args = this.arguments(); + + if (!$char(')')) { + return; + } + + if (name) { + return new (tree.Call)(name, args, index, env.currentFileInfo); + } + }, + arguments: function () { + var args = [], arg; + + while (true) { + arg = this.assignment() || parsers.expression(); + if (!arg) { + break; + } + args.push(arg); + if (!$char(',')) { + break; + } + } + return args; + }, + literal: function () { + return this.dimension() || + this.color() || + this.quoted() || + this.unicodeDescriptor(); + }, + + // Assignments are argument entities for calls. + // They are present in ie filter properties as shown below. + // + // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) + // + + assignment: function () { + var key, value; + key = $re(/^\w+(?=\s?=)/i); + if (!key) { + return; + } + if (!$char('=')) { + return; + } + value = parsers.entity(); + if (value) { + return new (tree.Assignment)(key, value); + } + }, + + // + // Parse url() tokens + // + // We use a specific rule for urls, because they don't really behave like + // standard function calls. The difference is that the argument doesn't have + // to be enclosed within a string, so it can't be parsed as an Expression. + // + url: function () { + var value; + + if (input.charAt(i) !== 'u' || !$re(/^url\(/)) { + return; + } + + value = this.quoted() || this.variable() || + $re(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/) || ""; + + expectChar(')'); + + return new (tree.URL)((value.value != null || value instanceof tree.Variable) + ? value : new (tree.Anonymous)(value), env.currentFileInfo); + }, + + // + // A Variable entity, such as `@fink`, in + // + // width: @fink + 2px + // + // We use a different parser for variable definitions, + // see `parsers.variable`. + // + variable: function () { + var name, index = i; + + if (input.charAt(i) === '@' && (name = $re(/^@@?[\w-]+/))) { + return new (tree.Variable)(name, index, env.currentFileInfo); + } + }, + + // A variable entity useing the protective {} e.g. @{var} + variableCurly: function () { + var curly, index = i; + + if (input.charAt(i) === '@' && (curly = $re(/^@\{([\w-]+)\}/))) { + return new (tree.Variable)("@" + curly[1], index, env.currentFileInfo); + } + }, + + // + // A Hexadecimal color + // + // #4F3C2F + // + // `rgb` and `hsl` colors are parsed through the `entities.call` parser. + // + color: function () { + var rgb; + + if (input.charAt(i) === '#' && (rgb = $re(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))) { + var colorCandidateString = rgb.input.match(/^#([\w]+).*/); // strip colons, brackets, whitespaces and other characters that should not definitely be part of color string + colorCandidateString = colorCandidateString[1]; + if (!colorCandidateString.match(/^[A-Fa-f0-9]+$/)) { // verify if candidate consists only of allowed HEX characters + error("Invalid HEX color code"); + } + return new (tree.Color)(rgb[1]); + } + }, + + // + // A Dimension, that is, a number and a unit + // + // 0.5em 95% + // + dimension: function () { + var value, c = input.charCodeAt(i); + //Is the first char of the dimension 0-9, '.', '+' or '-' + if ((c > 57 || c < 43) || c === 47 || c == 44) { + return; + } + + value = $re(/^([+-]?\d*\.?\d+)(%|[a-z]+)?/); + if (value) { + return new (tree.Dimension)(value[1], value[2]); + } + }, + + // + // A unicode descriptor, as is used in unicode-range + // + // U+0?? or U+00A1-00A9 + // + unicodeDescriptor: function () { + var ud; + + ud = $re(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/); + if (ud) { + return new (tree.UnicodeDescriptor)(ud[0]); + } + }, + + // + // JavaScript code to be evaluated + // + // `window.location.href` + // + javascript: function () { + var str, j = i, e; + + if (input.charAt(j) === '~') { + j++; + e = true; + } // Escaped strings + if (input.charAt(j) !== '`') { + return; + } + if (env.javascriptEnabled !== undefined && !env.javascriptEnabled) { + error("You are using JavaScript, which has been disabled."); + } + + if (e) { + $char('~'); + } + + str = $re(/^`([^`]*)`/); + if (str) { + return new (tree.JavaScript)(str[1], i, e); + } + } + }, + + // + // The variable part of a variable definition. Used in the `rule` parser + // + // @fink: + // + variable: function () { + var name; + + if (input.charAt(i) === '@' && (name = $re(/^(@[\w-]+)\s*:/))) { + return name[1]; + } + }, + + // + // The variable part of a variable definition. Used in the `rule` parser + // + // @fink(); + // + rulesetCall: function () { + var name; + + if (input.charAt(i) === '@' && (name = $re(/^(@[\w-]+)\s*\(\s*\)\s*;/))) { + return new tree.RulesetCall(name[1]); + } + }, + + // + // extend syntax - used to extend selectors + // + extend: function (isRule) { + var elements, e, index = i, option, extendList, extend; + + if (!(isRule ? $re(/^&:extend\(/) : $re(/^:extend\(/))) { + return; + } + + do { + option = null; + elements = null; + while (!(option = $re(/^(all)(?=\s*(\)|,))/))) { + e = this.element(); + if (!e) { + break; + } + if (elements) { + elements.push(e); + } else { + elements = [e]; + } + } + + option = option && option[1]; + if (!elements) + error("Missing target selector for :extend()."); + extend = new (tree.Extend)(new (tree.Selector)(elements), option, index); + if (extendList) { + extendList.push(extend); + } else { + extendList = [extend]; + } + + } while ($char(",")); + + expect(/^\)/); + + if (isRule) { + expect(/^;/); + } + + return extendList; + }, + + // + // extendRule - used in a rule to extend all the parent selectors + // + extendRule: function () { + return this.extend(true); + }, + + // + // Mixins + // + mixin: { + // + // A Mixin call, with an optional argument list + // + // #mixins > .square(#fff); + // .rounded(4px, black); + // .button; + // + // The `while` loop is there because mixins can be + // namespaced, but we only support the child and descendant + // selector for now. + // + call: function () { + var s = input.charAt(i), important = false, index = i, elemIndex, + elements, elem, e, c, args; + + if (s !== '.' && s !== '#') { + return; + } + + save(); // stop us absorbing part of an invalid selector + + while (true) { + elemIndex = i; + e = $re(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/); + if (!e) { + break; + } + elem = new (tree.Element)(c, e, elemIndex, env.currentFileInfo); + if (elements) { + elements.push(elem); + } else { + elements = [elem]; + } + c = $char('>'); + } + + if (elements) { + if ($char('(')) { + args = this.args(true).args; + expectChar(')'); + } + + if (parsers.important()) { + important = true; + } + + if (parsers.end()) { + forget(); + return new (tree.mixin.Call)(elements, args, index, env.currentFileInfo, important); + } + } + + restore(); + }, + args: function (isCall) { + var parsers = parser.parsers, entities = parsers.entities, + returner = {args: null, variadic: false}, + expressions = [], argsSemiColon = [], argsComma = [], + isSemiColonSeperated, expressionContainsNamed, name, nameLoop, value, arg; + + save(); + + while (true) { + if (isCall) { + arg = parsers.detachedRuleset() || parsers.expression(); + } else { + parsers.comments(); + if (input.charAt(i) === '.' && $re(/^\.{3}/)) { + returner.variadic = true; + if ($char(";") && !isSemiColonSeperated) { + isSemiColonSeperated = true; + } + (isSemiColonSeperated ? argsSemiColon : argsComma) + .push({variadic: true}); + break; + } + arg = entities.variable() || entities.literal() || entities.keyword(); + } + + if (!arg) { + break; + } + + nameLoop = null; + if (arg.throwAwayComments) { + arg.throwAwayComments(); + } + value = arg; + var val = null; + + if (isCall) { + // Variable + if (arg.value && arg.value.length == 1) { + val = arg.value[0]; + } + } else { + val = arg; + } + + if (val && val instanceof tree.Variable) { + if ($char(':')) { + if (expressions.length > 0) { + if (isSemiColonSeperated) { + error("Cannot mix ; and , as delimiter types"); + } + expressionContainsNamed = true; + } + + // we do not support setting a ruleset as a default variable - it doesn't make sense + // However if we do want to add it, there is nothing blocking it, just don't error + // and remove isCall dependency below + value = (isCall && parsers.detachedRuleset()) || parsers.expression(); + + if (!value) { + if (isCall) { + error("could not understand value for named argument"); + } else { + restore(); + returner.args = []; + return returner; + } + } + nameLoop = (name = val.name); + } else if (!isCall && $re(/^\.{3}/)) { + returner.variadic = true; + if ($char(";") && !isSemiColonSeperated) { + isSemiColonSeperated = true; + } + (isSemiColonSeperated ? argsSemiColon : argsComma) + .push({name: arg.name, variadic: true}); + break; + } else if (!isCall) { + name = nameLoop = val.name; + value = null; + } + } + + if (value) { + expressions.push(value); + } + + argsComma.push({name: nameLoop, value: value}); + + if ($char(',')) { + continue; + } + + if ($char(';') || isSemiColonSeperated) { + + if (expressionContainsNamed) { + error("Cannot mix ; and , as delimiter types"); + } + + isSemiColonSeperated = true; + + if (expressions.length > 1) { + value = new (tree.Value)(expressions); + } + argsSemiColon.push({name: name, value: value}); + + name = null; + expressions = []; + expressionContainsNamed = false; + } + } + + forget(); + returner.args = isSemiColonSeperated ? argsSemiColon : argsComma; + return returner; + }, + // + // A Mixin definition, with a list of parameters + // + // .rounded (@radius: 2px, @color) { + // ... + // } + // + // Until we have a finer grained state-machine, we have to + // do a look-ahead, to make sure we don't have a mixin call. + // See the `rule` function for more information. + // + // We start by matching `.rounded (`, and then proceed on to + // the argument list, which has optional default values. + // We store the parameters in `params`, with a `value` key, + // if there is a value, such as in the case of `@radius`. + // + // Once we've got our params list, and a closing `)`, we parse + // the `{...}` block. + // + definition: function () { + var name, params = [], match, ruleset, cond, variadic = false; + if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || + peek(/^[^{]*\}/)) { + return; + } + + save(); + + match = $re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/); + if (match) { + name = match[1]; + + var argInfo = this.args(false); + params = argInfo.args; + variadic = argInfo.variadic; + + // .mixincall("@{a}"); + // looks a bit like a mixin definition.. + // also + // .mixincall(@a: {rule: set;}); + // so we have to be nice and restore + if (!$char(')')) { + furthest = i; + restore(); + return; + } + + parsers.comments(); + + if ($re(/^when/)) { // Guard + cond = expect(parsers.conditions, 'expected condition'); + } + + ruleset = parsers.block(); + + if (ruleset) { + forget(); + return new (tree.mixin.Definition)(name, params, ruleset, cond, variadic); + } else { + restore(); + } + } else { + forget(); + } + } + }, + + // + // Entities are the smallest recognized token, + // and can be found inside a rule's value. + // + entity: function () { + var entities = this.entities; + + return entities.literal() || entities.variable() || entities.url() || + entities.call() || entities.keyword() || entities.javascript() || + this.comment(); + }, + + // + // A Rule terminator. Note that we use `peek()` to check for '}', + // because the `block` rule will be expecting it, but we still need to make sure + // it's there, if ';' was ommitted. + // + end: function () { + return $char(';') || peekChar('}'); + }, + + // + // IE's alpha function + // + // alpha(opacity=88) + // + alpha: function () { + var value; + + if (!$re(/^\(opacity=/i)) { + return; + } + value = $re(/^\d+/) || this.entities.variable(); + if (value) { + expectChar(')'); + return new (tree.Alpha)(value); + } + }, + + // + // A Selector Element + // + // div + // + h1 + // #socks + // input[type="text"] + // + // Elements are the building blocks for Selectors, + // they are made out of a `Combinator` (see combinator rule), + // and an element name, such as a tag a class, or `*`. + // + element: function () { + var e, c, v, index = i; + + c = this.combinator(); + + e = $re(/^(?:\d+\.\d+|\d+)%/) || $re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) || + $char('*') || $char('&') || this.attribute() || $re(/^\([^()@]+\)/) || $re(/^[\.#](?=@)/) || + this.entities.variableCurly(); + + if (!e) { + save(); + if ($char('(')) { + if ((v = this.selector()) && $char(')')) { + e = new (tree.Paren)(v); + forget(); + } else { + restore(); + } + } else { + forget(); + } + } + + if (e) { + return new (tree.Element)(c, e, index, env.currentFileInfo); + } + }, + + // + // Combinators combine elements together, in a Selector. + // + // Because our parser isn't white-space sensitive, special care + // has to be taken, when parsing the descendant combinator, ` `, + // as it's an empty space. We have to check the previous character + // in the input, to see if it's a ` ` character. More info on how + // we deal with this in *combinator.js*. + // + combinator: function () { + var c = input.charAt(i); + + if (c === '/') { + save(); + var slashedCombinator = $re(/^\/[a-z]+\//i); + if (slashedCombinator) { + forget(); + return new (tree.Combinator)(slashedCombinator); + } + restore(); + } + + if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') { + i++; + if (c === '^' && input.charAt(i) === '^') { + c = '^^'; + i++; + } + while (isWhitespace(input, i)) { + i++; + } + return new (tree.Combinator)(c); + } else if (isWhitespace(input, i - 1)) { + return new (tree.Combinator)(" "); + } else { + return new (tree.Combinator)(null); + } + }, + // + // A CSS selector (see selector below) + // with less extensions e.g. the ability to extend and guard + // + lessSelector: function () { + return this.selector(true); + }, + // + // A CSS Selector + // + // .class > div + h1 + // li a:hover + // + // Selectors are made out of one or more Elements, see above. + // + selector: function (isLess) { + var index = i, $re = _$re, elements, extendList, c, e, extend, when, condition; + + while ((isLess && (extend = this.extend())) || (isLess && (when = $re(/^when/))) || (e = this.element())) { + if (when) { + condition = expect(this.conditions, 'expected condition'); + } else if (condition) { + error("CSS guard can only be used at the end of selector"); + } else if (extend) { + if (extendList) { + extendList.push(extend); + } else { + extendList = [extend]; + } + } else { + if (extendList) { + error("Extend can only be used at the end of selector"); + } + c = input.charAt(i); + if (elements) { + elements.push(e); + } else { + elements = [e]; + } + e = null; + } + if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') { + break; + } + } + + if (elements) { + return new (tree.Selector)(elements, extendList, condition, index, env.currentFileInfo); + } + if (extendList) { + error("Extend must be used to extend a selector, it cannot be used on its own"); + } + }, + attribute: function () { + if (!$char('[')) { + return; + } + + var entities = this.entities, + key, val, op; + + if (!(key = entities.variableCurly())) { + key = expect(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/); + } + + op = $re(/^[|~*$^]?=/); + if (op) { + val = entities.quoted() || $re(/^[0-9]+%/) || $re(/^[\w-]+/) || entities.variableCurly(); + } + + expectChar(']'); + + return new (tree.Attribute)(key, op, val); + }, + + // + // The `block` rule is used by `ruleset` and `mixin.definition`. + // It's a wrapper around the `primary` rule, with added `{}`. + // + block: function () { + var content; + if ($char('{') && (content = this.primary()) && $char('}')) { + return content; + } + }, + + blockRuleset: function () { + var block = this.block(); + + if (block) { + block = new tree.Ruleset(null, block); + } + return block; + }, + + detachedRuleset: function () { + var blockRuleset = this.blockRuleset(); + if (blockRuleset) { + return new tree.DetachedRuleset(blockRuleset); + } + }, + + // + // div, .class, body > p {...} + // + ruleset: function () { + var selectors, s, rules, debugInfo; + + save(); + + if (env.dumpLineNumbers) { + debugInfo = getDebugInfo(i, input, env); + } + + while (true) { + s = this.lessSelector(); + if (!s) { + break; + } + if (selectors) { + selectors.push(s); + } else { + selectors = [s]; + } + this.comments(); + if (s.condition && selectors.length > 1) { + error("Guards are only currently allowed on a single selector."); + } + if (!$char(',')) { + break; + } + if (s.condition) { + error("Guards are only currently allowed on a single selector."); + } + this.comments(); + } + + if (selectors && (rules = this.block())) { + forget(); + var ruleset = new (tree.Ruleset)(selectors, rules, env.strictImports); + if (env.dumpLineNumbers) { + ruleset.debugInfo = debugInfo; + } + return ruleset; + } else { + // Backtrack + furthest = i; + restore(); + } + }, + rule: function (tryAnonymous) { + var name, value, startOfRule = i, c = input.charAt(startOfRule), important, merge, isVariable; + + if (c === '.' || c === '#' || c === '&') { + return; + } + + save(); + + name = this.variable() || this.ruleProperty(); + if (name) { + isVariable = typeof name === "string"; + + if (isVariable) { + value = this.detachedRuleset(); + } + + this.comments(); + if (!value) { + // prefer to try to parse first if its a variable or we are compressing + // but always fallback on the other one + value = !tryAnonymous && (env.compress || isVariable) ? + (this.value() || this.anonymousValue()) : + (this.anonymousValue() || this.value()); + + important = this.important(); + + // a name returned by this.ruleProperty() is always an array of the form: + // [string-1, ..., string-n, ""] or [string-1, ..., string-n, "+"] + // where each item is a tree.Keyword or tree.Variable + merge = !isVariable && name.pop().value; + } + + if (value && this.end()) { + forget(); + return new (tree.Rule)(name, value, important, merge, startOfRule, env.currentFileInfo); + } else { + furthest = i; + restore(); + if (value && !tryAnonymous) { + return this.rule(true); + } + } + } else { + forget(); + } + }, + anonymousValue: function () { + var match; + match = /^([^@+\/'"*`(;{}-]*);/.exec(current); + if (match) { + i += match[0].length - 1; + return new (tree.Anonymous)(match[1]); + } + }, + + // + // An @import directive + // + // @import "lib"; + // + // Depending on our environment, importing is done differently: + // In the browser, it's an XHR request, in Node, it would be a + // file-system operation. The function used for importing is + // stored in `import`, which we pass to the Import constructor. + // + "import": function () { + var path, features, index = i; + + var dir = $re(/^@import?\s+/); + + if (dir) { + var options = (dir ? this.importOptions() : null) || {}; + + if ((path = this.entities.quoted() || this.entities.url())) { + features = this.mediaFeatures(); + + if (!$(';')) { + i = index; + error("missing semi-colon or unrecognised media features on import"); + } + features = features && new (tree.Value)(features); + return new (tree.Import)(path, features, options, index, env.currentFileInfo); + } + else { + i = index; + error("malformed import statement"); + } + } + }, + + importOptions: function () { + var o, options = {}, optionName, value; + + // list of options, surrounded by parens + if (!$char('(')) { + return null; + } + do { + o = this.importOption(); + if (o) { + optionName = o; + value = true; + switch (optionName) { + case "css": + optionName = "less"; + value = false; + break; + case "once": + optionName = "multiple"; + value = false; + break; + } + options[optionName] = value; + if (!$char(',')) { + break; + } + } + } while (o); + expectChar(')'); + return options; + }, + + importOption: function () { + var opt = $re(/^(less|css|multiple|once|inline|reference)/); + if (opt) { + return opt[1]; + } + }, + + mediaFeature: function () { + var entities = this.entities, nodes = [], e, p; + do { + e = entities.keyword() || entities.variable(); + if (e) { + nodes.push(e); + } else if ($char('(')) { + p = this.property(); + e = this.value(); + if ($char(')')) { + if (p && e) { + nodes.push(new (tree.Paren)(new (tree.Rule)(p, e, null, null, i, env.currentFileInfo, true))); + } else if (e) { + nodes.push(new (tree.Paren)(e)); + } else { + return null; + } + } else { + return null; + } + } + } while (e); + + if (nodes.length > 0) { + return new (tree.Expression)(nodes); + } + }, + + mediaFeatures: function () { + var entities = this.entities, features = [], e; + do { + e = this.mediaFeature(); + if (e) { + features.push(e); + if (!$char(',')) { + break; + } + } else { + e = entities.variable(); + if (e) { + features.push(e); + if (!$char(',')) { + break; + } + } + } + } while (e); + + return features.length > 0 ? features : null; + }, + + media: function () { + var features, rules, media, debugInfo; + + if (env.dumpLineNumbers) { + debugInfo = getDebugInfo(i, input, env); + } + + if ($re(/^@media/)) { + features = this.mediaFeatures(); + + rules = this.block(); + if (rules) { + media = new (tree.Media)(rules, features, i, env.currentFileInfo); + if (env.dumpLineNumbers) { + media.debugInfo = debugInfo; + } + return media; + } + } + }, + + // + // A CSS Directive + // + // @charset "utf-8"; + // + directive: function () { + var index = i, name, value, rules, nonVendorSpecificName, + hasIdentifier, hasExpression, hasUnknown, hasBlock = true; + + if (input.charAt(i) !== '@') { + return; + } + + value = this['import']() || this.media(); + if (value) { + return value; + } + + save(); + + name = $re(/^@[a-z-]+/); + + if (!name) { + return; + } + + nonVendorSpecificName = name; + if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) { + nonVendorSpecificName = "@" + name.slice(name.indexOf('-', 2) + 1); + } + + switch (nonVendorSpecificName) { + /* + case "@font-face": + case "@viewport": + case "@top-left": + case "@top-left-corner": + case "@top-center": + case "@top-right": + case "@top-right-corner": + case "@bottom-left": + case "@bottom-left-corner": + case "@bottom-center": + case "@bottom-right": + case "@bottom-right-corner": + case "@left-top": + case "@left-middle": + case "@left-bottom": + case "@right-top": + case "@right-middle": + case "@right-bottom": + hasBlock = true; + break; + */ + case "@charset": + hasIdentifier = true; + hasBlock = false; + break; + case "@namespace": + hasExpression = true; + hasBlock = false; + break; + case "@keyframes": + hasIdentifier = true; + break; + case "@host": + case "@page": + case "@document": + case "@supports": + hasUnknown = true; + break; + } + + this.comments(); + + if (hasIdentifier) { + value = this.entity(); + if (!value) { + error("expected " + name + " identifier"); + } + } else if (hasExpression) { + value = this.expression(); + if (!value) { + error("expected " + name + " expression"); + } + } else if (hasUnknown) { + value = ($re(/^[^{;]+/) || '').trim(); + if (value) { + value = new (tree.Anonymous)(value); + } + } + + this.comments(); + + if (hasBlock) { + rules = this.blockRuleset(); + } + + if (rules || (!hasBlock && value && $char(';'))) { + forget(); + return new (tree.Directive)(name, value, rules, index, env.currentFileInfo, + env.dumpLineNumbers ? getDebugInfo(index, input, env) : null); + } + + restore(); + }, + + // + // A Value is a comma-delimited list of Expressions + // + // font-family: Baskerville, Georgia, serif; + // + // In a Rule, a Value represents everything after the `:`, + // and before the `;`. + // + value: function () { + var e, expressions = []; + + do { + e = this.expression(); + if (e) { + expressions.push(e); + if (!$char(',')) { + break; + } + } + } while (e); + + if (expressions.length > 0) { + return new (tree.Value)(expressions); + } + }, + important: function () { + if (input.charAt(i) === '!') { + return $re(/^! *important/); + } + }, + sub: function () { + var a, e; + + if ($char('(')) { + a = this.addition(); + if (a) { + e = new (tree.Expression)([a]); + expectChar(')'); + e.parens = true; + return e; + } + } + }, + multiplication: function () { + var m, a, op, operation, isSpaced; + m = this.operand(); + if (m) { + isSpaced = isWhitespace(input, i - 1); + while (true) { + if (peek(/^\/[*\/]/)) { + break; + } + + save(); + + op = $char('/') || $char('*'); + + if (!op) { + forget(); + break; + } + + a = this.operand(); + + if (!a) { + restore(); + break; + } + forget(); + + m.parensInOp = true; + a.parensInOp = true; + operation = new (tree.Operation)(op, [operation || m, a], isSpaced); + isSpaced = isWhitespace(input, i - 1); + } + return operation || m; + } + }, + addition: function () { + var m, a, op, operation, isSpaced; + m = this.multiplication(); + if (m) { + isSpaced = isWhitespace(input, i - 1); + while (true) { + op = $re(/^[-+]\s+/) || (!isSpaced && ($char('+') || $char('-'))); + if (!op) { + break; + } + a = this.multiplication(); + if (!a) { + break; + } + + m.parensInOp = true; + a.parensInOp = true; + operation = new (tree.Operation)(op, [operation || m, a], isSpaced); + isSpaced = isWhitespace(input, i - 1); + } + return operation || m; + } + }, + conditions: function () { + var a, b, index = i, condition; + + a = this.condition(); + if (a) { + while (true) { + if (!peek(/^,\s*(not\s*)?\(/) || !$char(',')) { + break; + } + b = this.condition(); + if (!b) { + break; + } + condition = new (tree.Condition)('or', condition || a, b, index); + } + return condition || a; + } + }, + condition: function () { + var entities = this.entities, index = i, negate = false, + a, b, c, op; + + if ($re(/^not/)) { + negate = true; + } + expectChar('('); + a = this.addition() || entities.keyword() || entities.quoted(); + if (a) { + op = $re(/^(?:>=|<=|=<|[<=>])/); + if (op) { + b = this.addition() || entities.keyword() || entities.quoted(); + if (b) { + c = new (tree.Condition)(op, a, b, index, negate); + } else { + error('expected expression'); + } + } else { + c = new (tree.Condition)('=', a, new (tree.Keyword)('true'), index, negate); + } + expectChar(')'); + return $re(/^and/) ? new (tree.Condition)('and', c, this.condition()) : c; + } + }, + + // + // An operand is anything that can be part of an operation, + // such as a Color, or a Variable + // + operand: function () { + var entities = this.entities, + p = input.charAt(i + 1), negate; + + if (input.charAt(i) === '-' && (p === '@' || p === '(')) { + negate = $char('-'); + } + var o = this.sub() || entities.dimension() || + entities.color() || entities.variable() || + entities.call(); + + if (negate) { + o.parensInOp = true; + o = new (tree.Negative)(o); + } + + return o; + }, + + // + // Expressions either represent mathematical operations, + // or white-space delimited Entities. + // + // 1px solid black + // @var * 2 + // + expression: function () { + var entities = [], e, delim; + + do { + e = this.addition() || this.entity(); + if (e) { + entities.push(e); + // operations do not allow keyword "/" dimension (e.g. small/20px) so we support that here + if (!peek(/^\/[\/*]/)) { + delim = $char('/'); + if (delim) { + entities.push(new (tree.Anonymous)(delim)); + } + } + } + } while (e); + if (entities.length > 0) { + return new (tree.Expression)(entities); + } + }, + property: function () { + var name = $re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/); + if (name) { + return name[1]; + } + }, + ruleProperty: function () { + var c = current, name = [], index = [], length = 0, s, k; + + function match(re) { + var a = re.exec(c); + if (a) { + index.push(i + length); + length += a[0].length; + c = c.slice(a[1].length); + return name.push(a[1]); + } + } + + function cutOutBlockComments() { + //match block comments + var a = /^\s*\/\*(?:[^*]|\*+[^\/*])*\*+\//.exec(c); + if (a) { + length += a[0].length; + c = c.slice(a[0].length); + return true; + } + return false; + } + + match(/^(\*?)/); + while (match(/^((?:[\w-]+)|(?:@\{[\w-]+\}))/)); // ! + while (cutOutBlockComments()); + if ((name.length > 1) && match(/^\s*((?:\+_|\+)?)\s*:/)) { + // at last, we have the complete match now. move forward, + // convert name particles to tree objects and return: + skipWhitespace(length); + if (name[0] === '') { + name.shift(); + index.shift(); + } + for (k = 0; k < name.length; k++) { + s = name[k]; + name[k] = (s.charAt(0) !== '@') + ? new (tree.Keyword)(s) + : new (tree.Variable)('@' + s.slice(2, -1), + index[k], env.currentFileInfo); + } + return name; + } + } + } + }; + return parser; +}; +less.Parser.serializeVars = function (vars) { + var s = ''; + + for (var name in vars) { + if (Object.hasOwnProperty.call(vars, name)) { + var value = vars[name]; + s += ((name[0] === '@') ? '' : '@') + name + ': ' + value + + ((('' + value).slice(-1) === ';') ? '' : ';'); + } + } + + return s; +}; + +(function (tree) { + + tree.functions = { + rgb: function (r, g, b) { + return this.rgba(r, g, b, 1.0); + }, + rgba: function (r, g, b, a) { + var rgb = [r, g, b].map(function (c) { + return scaled(c, 255); + }); + a = number(a); + return new (tree.Color)(rgb, a); + }, + hsl: function (h, s, l) { + return this.hsla(h, s, l, 1.0); + }, + hsla: function (h, s, l, a) { + function hue(h) { + h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h); + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + else if (h * 2 < 1) { + return m2; + } + else if (h * 3 < 2) { + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + } + else { + return m1; + } + } + + h = (number(h) % 360) / 360; + s = clamp(number(s)); + l = clamp(number(l)); + a = clamp(number(a)); + + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + + return this.rgba(hue(h + 1 / 3) * 255, + hue(h) * 255, + hue(h - 1 / 3) * 255, + a); + }, + + hsv: function (h, s, v) { + return this.hsva(h, s, v, 1.0); + }, + + hsva: function (h, s, v, a) { + h = ((number(h) % 360) / 360) * 360; + s = number(s); + v = number(v); + a = number(a); + + var i, f; + i = Math.floor((h / 60) % 6); + f = (h / 60) - i; + + var vs = [v, + v * (1 - s), + v * (1 - f * s), + v * (1 - (1 - f) * s)]; + var perm = [[0, 3, 1], + [2, 0, 1], + [1, 0, 3], + [1, 2, 0], + [3, 1, 0], + [0, 1, 2]]; + + return this.rgba(vs[perm[i][0]] * 255, + vs[perm[i][1]] * 255, + vs[perm[i][2]] * 255, + a); + }, + + hue: function (color) { + return new (tree.Dimension)(color.toHSL().h); + }, + saturation: function (color) { + return new (tree.Dimension)(color.toHSL().s * 100, '%'); + }, + lightness: function (color) { + return new (tree.Dimension)(color.toHSL().l * 100, '%'); + }, + hsvhue: function (color) { + return new (tree.Dimension)(color.toHSV().h); + }, + hsvsaturation: function (color) { + return new (tree.Dimension)(color.toHSV().s * 100, '%'); + }, + hsvvalue: function (color) { + return new (tree.Dimension)(color.toHSV().v * 100, '%'); + }, + red: function (color) { + return new (tree.Dimension)(color.rgb[0]); + }, + green: function (color) { + return new (tree.Dimension)(color.rgb[1]); + }, + blue: function (color) { + return new (tree.Dimension)(color.rgb[2]); + }, + alpha: function (color) { + return new (tree.Dimension)(color.toHSL().a); + }, + luma: function (color) { + return new (tree.Dimension)(color.luma() * color.alpha * 100, '%'); + }, + luminance: function (color) { + var luminance = + (0.2126 * color.rgb[0] / 255) + + (0.7152 * color.rgb[1] / 255) + + (0.0722 * color.rgb[2] / 255); + + return new (tree.Dimension)(luminance * color.alpha * 100, '%'); + }, + saturate: function (color, amount) { + // filter: saturate(3.2); + // should be kept as is, so check for color + if (!color.rgb) { + return null; + } + var hsl = color.toHSL(); + + hsl.s += amount.value / 100; + hsl.s = clamp(hsl.s); + return hsla(hsl); + }, + desaturate: function (color, amount) { + var hsl = color.toHSL(); + + hsl.s -= amount.value / 100; + hsl.s = clamp(hsl.s); + return hsla(hsl); + }, + lighten: function (color, amount) { + var hsl = color.toHSL(); + + hsl.l += amount.value / 100; + hsl.l = clamp(hsl.l); + return hsla(hsl); + }, + darken: function (color, amount) { + var hsl = color.toHSL(); + + hsl.l -= amount.value / 100; + hsl.l = clamp(hsl.l); + return hsla(hsl); + }, + fadein: function (color, amount) { + var hsl = color.toHSL(); + + hsl.a += amount.value / 100; + hsl.a = clamp(hsl.a); + return hsla(hsl); + }, + fadeout: function (color, amount) { + var hsl = color.toHSL(); + + hsl.a -= amount.value / 100; + hsl.a = clamp(hsl.a); + return hsla(hsl); + }, + fade: function (color, amount) { + var hsl = color.toHSL(); + + hsl.a = amount.value / 100; + hsl.a = clamp(hsl.a); + return hsla(hsl); + }, + spin: function (color, amount) { + var hsl = color.toHSL(); + var hue = (hsl.h + amount.value) % 360; + + hsl.h = hue < 0 ? 360 + hue : hue; + + return hsla(hsl); + }, + // + // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein + // http://sass-lang.com + // + mix: function (color1, color2, weight) { + if (!weight) { + weight = new (tree.Dimension)(50); + } + var p = weight.value / 100.0; + var w = p * 2 - 1; + var a = color1.toHSL().a - color2.toHSL().a; + + var w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + var rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2, + color1.rgb[1] * w1 + color2.rgb[1] * w2, + color1.rgb[2] * w1 + color2.rgb[2] * w2]; + + var alpha = color1.alpha * p + color2.alpha * (1 - p); + + return new (tree.Color)(rgb, alpha); + }, + greyscale: function (color) { + return this.desaturate(color, new (tree.Dimension)(100)); + }, + contrast: function (color, dark, light, threshold) { + // filter: contrast(3.2); + // should be kept as is, so check for color + if (!color.rgb) { + return null; + } + if (typeof light === 'undefined') { + light = this.rgba(255, 255, 255, 1.0); + } + if (typeof dark === 'undefined') { + dark = this.rgba(0, 0, 0, 1.0); + } + //Figure out which is actually light and dark! + if (dark.luma() > light.luma()) { + var t = light; + light = dark; + dark = t; + } + if (typeof threshold === 'undefined') { + threshold = 0.43; + } else { + threshold = number(threshold); + } + if (color.luma() < threshold) { + return light; + } else { + return dark; + } + }, + e: function (str) { + return new (tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str.value); + }, + escape: function (str) { + return new (tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29")); + }, + replace: function (string, pattern, replacement, flags) { + var result = string.value; + + result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement.value); + return new (tree.Quoted)(string.quote || '', result, string.escaped); + }, + '%': function (string /* arg, arg, ...*/) { + var args = Array.prototype.slice.call(arguments, 1), + result = string.value; + + for (var i = 0; i < args.length; i++) { + /*jshint loopfunc:true */ + result = result.replace(/%[sda]/i, function (token) { + var value = token.match(/s/i) ? args[i].value : args[i].toCSS(); + return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value; + }); + } + result = result.replace(/%%/g, '%'); + return new (tree.Quoted)(string.quote || '', result, string.escaped); + }, + unit: function (val, unit) { + if (!(val instanceof tree.Dimension)) { + throw { + type: "Argument", + message: "the first argument to unit must be a number" + (val instanceof tree.Operation ? ". Have you forgotten parenthesis?" : "") + }; + } + if (unit) { + if (unit instanceof tree.Keyword) { + unit = unit.value; + } else { + unit = unit.toCSS(); + } + } else { + unit = ""; + } + return new (tree.Dimension)(val.value, unit); + }, + convert: function (val, unit) { + return val.convertTo(unit.value); + }, + round: function (n, f) { + var fraction = typeof(f) === "undefined" ? 0 : f.value; + return _math(function (num) { + return num.toFixed(fraction); + }, null, n); + }, + pi: function () { + return new (tree.Dimension)(Math.PI); + }, + mod: function (a, b) { + return new (tree.Dimension)(a.value % b.value, a.unit); + }, + pow: function (x, y) { + if (typeof x === "number" && typeof y === "number") { + x = new (tree.Dimension)(x); + y = new (tree.Dimension)(y); + } else if (!(x instanceof tree.Dimension) || !(y instanceof tree.Dimension)) { + throw {type: "Argument", message: "arguments must be numbers"}; + } + + return new (tree.Dimension)(Math.pow(x.value, y.value), x.unit); + }, + _minmax: function (isMin, args) { + args = Array.prototype.slice.call(args); + switch (args.length) { + case 0: + throw {type: "Argument", message: "one or more arguments required"}; + } + var i, j, current, currentUnified, referenceUnified, unit, unitStatic, unitClone, + order = [], // elems only contains original argument values. + values = {}; // key is the unit.toString() for unified tree.Dimension values, + // value is the index into the order array. + for (i = 0; i < args.length; i++) { + current = args[i]; + if (!(current instanceof tree.Dimension)) { + if (Array.isArray(args[i].value)) { + Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value)); + } + continue; + } + currentUnified = current.unit.toString() === "" && unitClone !== undefined ? new (tree.Dimension)(current.value, unitClone).unify() : current.unify(); + unit = currentUnified.unit.toString() === "" && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString(); + unitStatic = unit !== "" && unitStatic === undefined || unit !== "" && order[0].unify().unit.toString() === "" ? unit : unitStatic; + unitClone = unit !== "" && unitClone === undefined ? current.unit.toString() : unitClone; + j = values[""] !== undefined && unit !== "" && unit === unitStatic ? values[""] : values[unit]; + if (j === undefined) { + if (unitStatic !== undefined && unit !== unitStatic) { + throw{type: "Argument", message: "incompatible types"}; + } + values[unit] = order.length; + order.push(current); + continue; + } + referenceUnified = order[j].unit.toString() === "" && unitClone !== undefined ? new (tree.Dimension)(order[j].value, unitClone).unify() : order[j].unify(); + if (isMin && currentUnified.value < referenceUnified.value || + !isMin && currentUnified.value > referenceUnified.value) { + order[j] = current; + } + } + if (order.length == 1) { + return order[0]; + } + args = order.map(function (a) { + return a.toCSS(this.env); + }).join(this.env.compress ? "," : ", "); + return new (tree.Anonymous)((isMin ? "min" : "max") + "(" + args + ")"); + }, + min: function () { + return this._minmax(true, arguments); + }, + max: function () { + return this._minmax(false, arguments); + }, + "get-unit": function (n) { + return new (tree.Anonymous)(n.unit); + }, + argb: function (color) { + return new (tree.Anonymous)(color.toARGB()); + }, + percentage: function (n) { + return new (tree.Dimension)(n.value * 100, '%'); + }, + color: function (n) { + if (n instanceof tree.Quoted) { + var colorCandidate = n.value, + returnColor; + returnColor = tree.Color.fromKeyword(colorCandidate); + if (returnColor) { + return returnColor; + } + if (/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/.test(colorCandidate)) { + return new (tree.Color)(colorCandidate.slice(1)); + } + throw {type: "Argument", message: "argument must be a color keyword or 3/6 digit hex e.g. #FFF"}; + } else { + throw {type: "Argument", message: "argument must be a string"}; + } + }, + iscolor: function (n) { + return this._isa(n, tree.Color); + }, + isnumber: function (n) { + return this._isa(n, tree.Dimension); + }, + isstring: function (n) { + return this._isa(n, tree.Quoted); + }, + iskeyword: function (n) { + return this._isa(n, tree.Keyword); + }, + isurl: function (n) { + return this._isa(n, tree.URL); + }, + ispixel: function (n) { + return this.isunit(n, 'px'); + }, + ispercentage: function (n) { + return this.isunit(n, '%'); + }, + isem: function (n) { + return this.isunit(n, 'em'); + }, + isunit: function (n, unit) { + return (n instanceof tree.Dimension) && n.unit.is(unit.value || unit) ? tree.True : tree.False; + }, + _isa: function (n, Type) { + return (n instanceof Type) ? tree.True : tree.False; + }, + tint: function (color, amount) { + return this.mix(this.rgb(255, 255, 255), color, amount); + }, + shade: function (color, amount) { + return this.mix(this.rgb(0, 0, 0), color, amount); + }, + extract: function (values, index) { + index = index.value - 1; // (1-based index) + // handle non-array values as an array of length 1 + // return 'undefined' if index is invalid + return Array.isArray(values.value) + ? values.value[index] : Array(values)[index]; + }, + length: function (values) { + var n = Array.isArray(values.value) ? values.value.length : 1; + return new tree.Dimension(n); + }, + + "data-uri": function (mimetypeNode, filePathNode) { + + if (typeof window !== 'undefined') { + return new tree.URL(filePathNode || mimetypeNode, this.currentFileInfo).eval(this.env); + } + + var mimetype = mimetypeNode.value; + var filePath = (filePathNode && filePathNode.value); + + var fs = require('./fs'), + path = require('path'), + useBase64 = false; + + if (arguments.length < 2) { + filePath = mimetype; + } + + var fragmentStart = filePath.indexOf('#'); + var fragment = ''; + if (fragmentStart !== -1) { + fragment = filePath.slice(fragmentStart); + filePath = filePath.slice(0, fragmentStart); + } + + if (this.env.isPathRelative(filePath)) { + if (this.currentFileInfo.relativeUrls) { + filePath = path.join(this.currentFileInfo.currentDirectory, filePath); + } else { + filePath = path.join(this.currentFileInfo.entryPath, filePath); + } + } + + // detect the mimetype if not given + if (arguments.length < 2) { + var mime; + try { + mime = require('mime'); + } catch (ex) { + mime = tree._mime; + } + + mimetype = mime.lookup(filePath); + + // use base 64 unless it's an ASCII or UTF-8 format + var charset = mime.charsets.lookup(mimetype); + useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0; + if (useBase64) { + mimetype += ';base64'; + } + } + else { + useBase64 = /;base64$/.test(mimetype); + } + + var buf = fs.readFileSync(filePath); + + // IE8 cannot handle a data-uri larger than 32KB. If this is exceeded + // and the --ieCompat flag is enabled, return a normal url() instead. + var DATA_URI_MAX_KB = 32, + fileSizeInKB = parseInt((buf.length / 1024), 10); + if (fileSizeInKB >= DATA_URI_MAX_KB) { + + if (this.env.ieCompat !== false) { + if (!this.env.silent) { + console.warn("Skipped data-uri embedding of %s because its size (%dKB) exceeds IE8-safe %dKB!", filePath, fileSizeInKB, DATA_URI_MAX_KB); + } + + return new tree.URL(filePathNode || mimetypeNode, this.currentFileInfo).eval(this.env); + } + } + + buf = useBase64 ? buf.toString('base64') + : encodeURIComponent(buf); + + var uri = "\"data:" + mimetype + ',' + buf + fragment + "\""; + return new (tree.URL)(new (tree.Anonymous)(uri)); + }, + + "svg-gradient": function (direction) { + + function throwArgumentDescriptor() { + throw { + type: "Argument", + message: "svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position]" + }; + } + + if (arguments.length < 3) { + throwArgumentDescriptor(); + } + var stops = Array.prototype.slice.call(arguments, 1), + gradientDirectionSvg, + gradientType = "linear", + rectangleDimension = 'x="0" y="0" width="1" height="1"', + useBase64 = true, + renderEnv = {compress: false}, + returner, + directionValue = direction.toCSS(renderEnv), + i, color, position, positionValue, alpha; + + switch (directionValue) { + case "to bottom": + gradientDirectionSvg = 'x1="0%" y1="0%" x2="0%" y2="100%"'; + break; + case "to right": + gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="0%"'; + break; + case "to bottom right": + gradientDirectionSvg = 'x1="0%" y1="0%" x2="100%" y2="100%"'; + break; + case "to top right": + gradientDirectionSvg = 'x1="0%" y1="100%" x2="100%" y2="0%"'; + break; + case "ellipse": + case "ellipse at center": + gradientType = "radial"; + gradientDirectionSvg = 'cx="50%" cy="50%" r="75%"'; + rectangleDimension = 'x="-50" y="-50" width="101" height="101"'; + break; + default: + throw { + type: "Argument", + message: "svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center'" + }; + } + returner = '' + + '' + + '<' + gradientType + 'Gradient id="gradient" gradientUnits="userSpaceOnUse" ' + gradientDirectionSvg + '>'; + + for (i = 0; i < stops.length; i += 1) { + if (stops[i].value) { + color = stops[i].value[0]; + position = stops[i].value[1]; + } else { + color = stops[i]; + position = undefined; + } + + if (!(color instanceof tree.Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof tree.Dimension))) { + throwArgumentDescriptor(); + } + positionValue = position ? position.toCSS(renderEnv) : i === 0 ? "0%" : "100%"; + alpha = color.alpha; + returner += ''; + } + returner += '' + + ''; + + if (useBase64) { + try { + returner = require('./encoder').encodeBase64(returner); // TODO browser implementation + } catch (e) { + useBase64 = false; + } + } + + returner = "'data:image/svg+xml" + (useBase64 ? ";base64" : "") + "," + returner + "'"; + return new (tree.URL)(new (tree.Anonymous)(returner)); + } + }; + +// these static methods are used as a fallback when the optional 'mime' dependency is missing + tree._mime = { + // this map is intentionally incomplete + // if you want more, install 'mime' dep + _types: { + '.htm': 'text/html', + '.html': 'text/html', + '.gif': 'image/gif', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.png': 'image/png' + }, + lookup: function (filepath) { + var ext = require('path').extname(filepath), + type = tree._mime._types[ext]; + if (type === undefined) { + throw new Error('Optional dependency "mime" is required for ' + ext); + } + return type; + }, + charsets: { + lookup: function (type) { + // assumes all text types are UTF-8 + return type && (/^text\//).test(type) ? 'UTF-8' : ''; + } + } + }; + +// Math + + var mathFunctions = { + // name, unit + ceil: null, + floor: null, + sqrt: null, + abs: null, + tan: "", + sin: "", + cos: "", + atan: "rad", + asin: "rad", + acos: "rad" + }; + + function _math(fn, unit, n) { + if (!(n instanceof tree.Dimension)) { + throw {type: "Argument", message: "argument must be a number"}; + } + if (unit == null) { + unit = n.unit; + } else { + n = n.unify(); + } + return new (tree.Dimension)(fn(parseFloat(n.value)), unit); + } + +// ~ End of Math + +// Color Blending +// ref: http://www.w3.org/TR/compositing-1 + + function colorBlend(mode, color1, color2) { + var ab = color1.alpha, cb, // backdrop + as = color2.alpha, cs, // source + ar, cr, r = []; // result + + ar = as + ab * (1 - as); + for (var i = 0; i < 3; i++) { + cb = color1.rgb[i] / 255; + cs = color2.rgb[i] / 255; + cr = mode(cb, cs); + if (ar) { + cr = (as * cs + ab * (cb + - as * (cb + cs - cr))) / ar; + } + r[i] = cr * 255; + } + + return new (tree.Color)(r, ar); + } + + var colorBlendMode = { + multiply: function (cb, cs) { + return cb * cs; + }, + screen: function (cb, cs) { + return cb + cs - cb * cs; + }, + overlay: function (cb, cs) { + cb *= 2; + return (cb <= 1) + ? colorBlendMode.multiply(cb, cs) + : colorBlendMode.screen(cb - 1, cs); + }, + softlight: function (cb, cs) { + var d = 1, e = cb; + if (cs > 0.5) { + e = 1; + d = (cb > 0.25) ? Math.sqrt(cb) + : ((16 * cb - 12) * cb + 4) * cb; + } + return cb - (1 - 2 * cs) * e * (d - cb); + }, + hardlight: function (cb, cs) { + return colorBlendMode.overlay(cs, cb); + }, + difference: function (cb, cs) { + return Math.abs(cb - cs); + }, + exclusion: function (cb, cs) { + return cb + cs - 2 * cb * cs; + }, + + // non-w3c functions: + average: function (cb, cs) { + return (cb + cs) / 2; + }, + negation: function (cb, cs) { + return 1 - Math.abs(cb + cs - 1); + } + }; + +// ~ End of Color Blending + + tree.defaultFunc = { + eval: function () { + var v = this.value_, e = this.error_; + if (e) { + throw e; + } + if (v != null) { + return v ? tree.True : tree.False; + } + }, + value: function (v) { + this.value_ = v; + }, + error: function (e) { + this.error_ = e; + }, + reset: function () { + this.value_ = this.error_ = null; + } + }; + + function initFunctions() { + var f, tf = tree.functions; + + // math + for (f in mathFunctions) { + if (mathFunctions.hasOwnProperty(f)) { + tf[f] = _math.bind(null, Math[f], mathFunctions[f]); + } + } + + // color blending + for (f in colorBlendMode) { + if (colorBlendMode.hasOwnProperty(f)) { + tf[f] = colorBlend.bind(null, colorBlendMode[f]); + } + } + + // default + f = tree.defaultFunc; + tf["default"] = f.eval.bind(f); + + } + + initFunctions(); + + function hsla(color) { + return tree.functions.hsla(color.h, color.s, color.l, color.a); + } + + function scaled(n, size) { + if (n instanceof tree.Dimension && n.unit.is('%')) { + return parseFloat(n.value * size / 100); + } else { + return number(n); + } + } + + function number(n) { + if (n instanceof tree.Dimension) { + return parseFloat(n.unit.is('%') ? n.value / 100 : n.value); + } else if (typeof(n) === 'number') { + return n; + } else { + throw { + error: "RuntimeError", + message: "color functions take numbers as parameters" + }; + } + } + + function clamp(val) { + return Math.min(1, Math.max(0, val)); + } + + tree.fround = function (env, value) { + var p = env && env.numPrecision; + //add "epsilon" to ensure numbers like 1.000000005 (represented as 1.000000004999....) are properly rounded... + return (p == null) ? value : Number((value + 2e-16).toFixed(p)); + }; + + tree.functionCall = function (env, currentFileInfo) { + this.env = env; + this.currentFileInfo = currentFileInfo; + }; + + tree.functionCall.prototype = tree.functions; + +})(require('./tree')); + +(function (tree) { + tree.colors = { + 'aliceblue': '#f0f8ff', + 'antiquewhite': '#faebd7', + 'aqua': '#00ffff', + 'aquamarine': '#7fffd4', + 'azure': '#f0ffff', + 'beige': '#f5f5dc', + 'bisque': '#ffe4c4', + 'black': '#000000', + 'blanchedalmond': '#ffebcd', + 'blue': '#0000ff', + 'blueviolet': '#8a2be2', + 'brown': '#a52a2a', + 'burlywood': '#deb887', + 'cadetblue': '#5f9ea0', + 'chartreuse': '#7fff00', + 'chocolate': '#d2691e', + 'coral': '#ff7f50', + 'cornflowerblue': '#6495ed', + 'cornsilk': '#fff8dc', + 'crimson': '#dc143c', + 'cyan': '#00ffff', + 'darkblue': '#00008b', + 'darkcyan': '#008b8b', + 'darkgoldenrod': '#b8860b', + 'darkgray': '#a9a9a9', + 'darkgrey': '#a9a9a9', + 'darkgreen': '#006400', + 'darkkhaki': '#bdb76b', + 'darkmagenta': '#8b008b', + 'darkolivegreen': '#556b2f', + 'darkorange': '#ff8c00', + 'darkorchid': '#9932cc', + 'darkred': '#8b0000', + 'darksalmon': '#e9967a', + 'darkseagreen': '#8fbc8f', + 'darkslateblue': '#483d8b', + 'darkslategray': '#2f4f4f', + 'darkslategrey': '#2f4f4f', + 'darkturquoise': '#00ced1', + 'darkviolet': '#9400d3', + 'deeppink': '#ff1493', + 'deepskyblue': '#00bfff', + 'dimgray': '#696969', + 'dimgrey': '#696969', + 'dodgerblue': '#1e90ff', + 'firebrick': '#b22222', + 'floralwhite': '#fffaf0', + 'forestgreen': '#228b22', + 'fuchsia': '#ff00ff', + 'gainsboro': '#dcdcdc', + 'ghostwhite': '#f8f8ff', + 'gold': '#ffd700', + 'goldenrod': '#daa520', + 'gray': '#808080', + 'grey': '#808080', + 'green': '#008000', + 'greenyellow': '#adff2f', + 'honeydew': '#f0fff0', + 'hotpink': '#ff69b4', + 'indianred': '#cd5c5c', + 'indigo': '#4b0082', + 'ivory': '#fffff0', + 'khaki': '#f0e68c', + 'lavender': '#e6e6fa', + 'lavenderblush': '#fff0f5', + 'lawngreen': '#7cfc00', + 'lemonchiffon': '#fffacd', + 'lightblue': '#add8e6', + 'lightcoral': '#f08080', + 'lightcyan': '#e0ffff', + 'lightgoldenrodyellow': '#fafad2', + 'lightgray': '#d3d3d3', + 'lightgrey': '#d3d3d3', + 'lightgreen': '#90ee90', + 'lightpink': '#ffb6c1', + 'lightsalmon': '#ffa07a', + 'lightseagreen': '#20b2aa', + 'lightskyblue': '#87cefa', + 'lightslategray': '#778899', + 'lightslategrey': '#778899', + 'lightsteelblue': '#b0c4de', + 'lightyellow': '#ffffe0', + 'lime': '#00ff00', + 'limegreen': '#32cd32', + 'linen': '#faf0e6', + 'magenta': '#ff00ff', + 'maroon': '#800000', + 'mediumaquamarine': '#66cdaa', + 'mediumblue': '#0000cd', + 'mediumorchid': '#ba55d3', + 'mediumpurple': '#9370d8', + 'mediumseagreen': '#3cb371', + 'mediumslateblue': '#7b68ee', + 'mediumspringgreen': '#00fa9a', + 'mediumturquoise': '#48d1cc', + 'mediumvioletred': '#c71585', + 'midnightblue': '#191970', + 'mintcream': '#f5fffa', + 'mistyrose': '#ffe4e1', + 'moccasin': '#ffe4b5', + 'navajowhite': '#ffdead', + 'navy': '#000080', + 'oldlace': '#fdf5e6', + 'olive': '#808000', + 'olivedrab': '#6b8e23', + 'orange': '#ffa500', + 'orangered': '#ff4500', + 'orchid': '#da70d6', + 'palegoldenrod': '#eee8aa', + 'palegreen': '#98fb98', + 'paleturquoise': '#afeeee', + 'palevioletred': '#d87093', + 'papayawhip': '#ffefd5', + 'peachpuff': '#ffdab9', + 'peru': '#cd853f', + 'pink': '#ffc0cb', + 'plum': '#dda0dd', + 'powderblue': '#b0e0e6', + 'purple': '#800080', + 'red': '#ff0000', + 'rosybrown': '#bc8f8f', + 'royalblue': '#4169e1', + 'saddlebrown': '#8b4513', + 'salmon': '#fa8072', + 'sandybrown': '#f4a460', + 'seagreen': '#2e8b57', + 'seashell': '#fff5ee', + 'sienna': '#a0522d', + 'silver': '#c0c0c0', + 'skyblue': '#87ceeb', + 'slateblue': '#6a5acd', + 'slategray': '#708090', + 'slategrey': '#708090', + 'snow': '#fffafa', + 'springgreen': '#00ff7f', + 'steelblue': '#4682b4', + 'tan': '#d2b48c', + 'teal': '#008080', + 'thistle': '#d8bfd8', + 'tomato': '#ff6347', + 'turquoise': '#40e0d0', + 'violet': '#ee82ee', + 'wheat': '#f5deb3', + 'white': '#ffffff', + 'whitesmoke': '#f5f5f5', + 'yellow': '#ffff00', + 'yellowgreen': '#9acd32' + }; +})(require('./tree')); + +(function (tree) { + + tree.debugInfo = function (env, ctx, lineSeperator) { + var result = ""; + if (env.dumpLineNumbers && !env.compress) { + switch (env.dumpLineNumbers) { + case 'comments': + result = tree.debugInfo.asComment(ctx); + break; + case 'mediaquery': + result = tree.debugInfo.asMediaQuery(ctx); + break; + case 'all': + result = tree.debugInfo.asComment(ctx) + (lineSeperator || "") + tree.debugInfo.asMediaQuery(ctx); + break; + } + } + return result; + }; + + tree.debugInfo.asComment = function (ctx) { + return '/* line ' + ctx.debugInfo.lineNumber + ', ' + ctx.debugInfo.fileName + ' */\n'; + }; + + tree.debugInfo.asMediaQuery = function (ctx) { + return '@media -sass-debug-info{filename{font-family:' + + ('file://' + ctx.debugInfo.fileName).replace(/([.:\/\\])/g, function (a) { + if (a == '\\') { + a = '\/'; + } + return '\\' + a; + }) + + '}line{font-family:\\00003' + ctx.debugInfo.lineNumber + '}}\n'; + }; + + tree.find = function (obj, fun) { + for (var i = 0, r; i < obj.length; i++) { + r = fun.call(obj, obj[i]); + if (r) { + return r; + } + } + return null; + }; + + tree.jsify = function (obj) { + if (Array.isArray(obj.value) && (obj.value.length > 1)) { + return '[' + obj.value.map(function (v) { + return v.toCSS(); + }).join(', ') + ']'; + } else { + return obj.toCSS(); + } + }; + + tree.toCSS = function (env) { + var strs = []; + this.genCSS(env, { + add: function (chunk, fileInfo, index) { + strs.push(chunk); + }, + isEmpty: function () { + return strs.length === 0; + } + }); + return strs.join(''); + }; + + tree.outputRuleset = function (env, output, rules) { + var ruleCnt = rules.length, i; + env.tabLevel = (env.tabLevel | 0) + 1; + + // Compressed + if (env.compress) { + output.add('{'); + for (i = 0; i < ruleCnt; i++) { + rules[i].genCSS(env, output); + } + output.add('}'); + env.tabLevel--; + return; + } + + // Non-compressed + var tabSetStr = '\n' + Array(env.tabLevel).join(" "), tabRuleStr = tabSetStr + " "; + if (!ruleCnt) { + output.add(" {" + tabSetStr + '}'); + } else { + output.add(" {" + tabRuleStr); + rules[0].genCSS(env, output); + for (i = 1; i < ruleCnt; i++) { + output.add(tabRuleStr); + rules[i].genCSS(env, output); + } + output.add(tabSetStr + '}'); + } + + env.tabLevel--; + }; + +})(require('./tree')); + +(function (tree) { + + tree.Alpha = function (val) { + this.value = val; + }; + tree.Alpha.prototype = { + type: "Alpha", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + eval: function (env) { + if (this.value.eval) { + return new tree.Alpha(this.value.eval(env)); + } + return this; + }, + genCSS: function (env, output) { + output.add("alpha(opacity="); + + if (this.value.genCSS) { + this.value.genCSS(env, output); + } else { + output.add(this.value); + } + + output.add(")"); + }, + toCSS: tree.toCSS + }; + +})(require('../tree')); + +(function (tree) { + + tree.Anonymous = function (value, index, currentFileInfo, mapLines, rulesetLike) { + this.value = value; + this.index = index; + this.mapLines = mapLines; + this.currentFileInfo = currentFileInfo; + this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike; + }; + tree.Anonymous.prototype = { + type: "Anonymous", + eval: function () { + return new tree.Anonymous(this.value, this.index, this.currentFileInfo, this.mapLines, this.rulesetLike); + }, + compare: function (x) { + if (!x.toCSS) { + return -1; + } + + var left = this.toCSS(), + right = x.toCSS(); + + if (left === right) { + return 0; + } + + return left < right ? -1 : 1; + }, + isRulesetLike: function () { + return this.rulesetLike; + }, + genCSS: function (env, output) { + output.add(this.value, this.currentFileInfo, this.index, this.mapLines); + }, + toCSS: tree.toCSS + }; + +})(require('../tree')); + +(function (tree) { + + tree.Assignment = function (key, val) { + this.key = key; + this.value = val; + }; + tree.Assignment.prototype = { + type: "Assignment", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + eval: function (env) { + if (this.value.eval) { + return new (tree.Assignment)(this.key, this.value.eval(env)); + } + return this; + }, + genCSS: function (env, output) { + output.add(this.key + '='); + if (this.value.genCSS) { + this.value.genCSS(env, output); + } else { + output.add(this.value); + } + }, + toCSS: tree.toCSS + }; + +})(require('../tree')); + +(function (tree) { + +// +// A function call node. +// + tree.Call = function (name, args, index, currentFileInfo) { + this.name = name; + this.args = args; + this.index = index; + this.currentFileInfo = currentFileInfo; + }; + tree.Call.prototype = { + type: "Call", + accept: function (visitor) { + if (this.args) { + this.args = visitor.visitArray(this.args); + } + }, + // + // When evaluating a function call, + // we either find the function in `tree.functions` [1], + // in which case we call it, passing the evaluated arguments, + // if this returns null or we cannot find the function, we + // simply print it out as it appeared originally [2]. + // + // The *functions.js* file contains the built-in functions. + // + // The reason why we evaluate the arguments, is in the case where + // we try to pass a variable to a function, like: `saturate(@color)`. + // The function should receive the value, not the variable. + // + eval: function (env) { + var args = this.args.map(function (a) { + return a.eval(env); + }), + nameLC = this.name.toLowerCase(), + result, func; + + if (nameLC in tree.functions) { // 1. + try { + func = new tree.functionCall(env, this.currentFileInfo); + result = func[nameLC].apply(func, args); + if (result != null) { + return result; + } + } catch (e) { + throw { + type: e.type || "Runtime", + message: "error evaluating function `" + this.name + "`" + + (e.message ? ': ' + e.message : ''), + index: this.index, filename: this.currentFileInfo.filename + }; + } + } + + return new tree.Call(this.name, args, this.index, this.currentFileInfo); + }, + + genCSS: function (env, output) { + output.add(this.name + "(", this.currentFileInfo, this.index); + + for (var i = 0; i < this.args.length; i++) { + this.args[i].genCSS(env, output); + if (i + 1 < this.args.length) { + output.add(", "); + } + } + + output.add(")"); + }, + + toCSS: tree.toCSS + }; + +})(require('../tree')); + +(function (tree) { +// +// RGB Colors - #ff0014, #eee +// + tree.Color = function (rgb, a) { + // + // The end goal here, is to parse the arguments + // into an integer triplet, such as `128, 255, 0` + // + // This facilitates operations and conversions. + // + if (Array.isArray(rgb)) { + this.rgb = rgb; + } else if (rgb.length == 6) { + this.rgb = rgb.match(/.{2}/g).map(function (c) { + return parseInt(c, 16); + }); + } else { + this.rgb = rgb.split('').map(function (c) { + return parseInt(c + c, 16); + }); + } + this.alpha = typeof(a) === 'number' ? a : 1; + }; + + var transparentKeyword = "transparent"; + + tree.Color.prototype = { + type: "Color", + eval: function () { + return this; + }, + luma: function () { + var r = this.rgb[0] / 255, + g = this.rgb[1] / 255, + b = this.rgb[2] / 255; + + r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4); + g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4); + b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4); + + return 0.2126 * r + 0.7152 * g + 0.0722 * b; + }, + + genCSS: function (env, output) { + output.add(this.toCSS(env)); + }, + toCSS: function (env, doNotCompress) { + var compress = env && env.compress && !doNotCompress, + alpha = tree.fround(env, this.alpha); + + // If we have some transparency, the only way to represent it + // is via `rgba`. Otherwise, we use the hex representation, + // which has better compatibility with older browsers. + // Values are capped between `0` and `255`, rounded and zero-padded. + if (alpha < 1) { + if (alpha === 0 && this.isTransparentKeyword) { + return transparentKeyword; + } + return "rgba(" + this.rgb.map(function (c) { + return clamp(Math.round(c), 255); + }).concat(clamp(alpha, 1)) + .join(',' + (compress ? '' : ' ')) + ")"; + } else { + var color = this.toRGB(); + + if (compress) { + var splitcolor = color.split(''); + + // Convert color to short format + if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) { + color = '#' + splitcolor[1] + splitcolor[3] + splitcolor[5]; + } + } + + return color; + } + }, + + // + // Operations have to be done per-channel, if not, + // channels will spill onto each other. Once we have + // our result, in the form of an integer triplet, + // we create a new Color node to hold the result. + // + operate: function (env, op, other) { + var rgb = []; + var alpha = this.alpha * (1 - other.alpha) + other.alpha; + for (var c = 0; c < 3; c++) { + rgb[c] = tree.operate(env, op, this.rgb[c], other.rgb[c]); + } + return new (tree.Color)(rgb, alpha); + }, + + toRGB: function () { + return toHex(this.rgb); + }, + + toHSL: function () { + var r = this.rgb[0] / 255, + g = this.rgb[1] / 255, + b = this.rgb[2] / 255, + a = this.alpha; + + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, l = (max + min) / 2, d = max - min; + + if (max === min) { + h = s = 0; + } else { + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return {h: h * 360, s: s, l: l, a: a}; + }, + //Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + toHSV: function () { + var r = this.rgb[0] / 255, + g = this.rgb[1] / 255, + b = this.rgb[2] / 255, + a = this.alpha; + + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, v = max; + + var d = max - min; + if (max === 0) { + s = 0; + } else { + s = d / max; + } + + if (max === min) { + h = 0; + } else { + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + return {h: h * 360, s: s, v: v, a: a}; + }, + toARGB: function () { + return toHex([this.alpha * 255].concat(this.rgb)); + }, + compare: function (x) { + if (!x.rgb) { + return -1; + } + + return (x.rgb[0] === this.rgb[0] && + x.rgb[1] === this.rgb[1] && + x.rgb[2] === this.rgb[2] && + x.alpha === this.alpha) ? 0 : -1; + } + }; + + tree.Color.fromKeyword = function (keyword) { + keyword = keyword.toLowerCase(); + + if (tree.colors.hasOwnProperty(keyword)) { + // detect named color + return new (tree.Color)(tree.colors[keyword].slice(1)); + } + if (keyword === transparentKeyword) { + var transparent = new (tree.Color)([0, 0, 0], 0); + transparent.isTransparentKeyword = true; + return transparent; + } + }; + + function toHex(v) { + return '#' + v.map(function (c) { + c = clamp(Math.round(c), 255); + return (c < 16 ? '0' : '') + c.toString(16); + }).join(''); + } + + function clamp(v, max) { + return Math.min(Math.max(v, 0), max); + } + +})(require('../tree')); + +(function (tree) { + + tree.Comment = function (value, silent, index, currentFileInfo) { + this.value = value; + this.silent = !!silent; + this.currentFileInfo = currentFileInfo; + }; + tree.Comment.prototype = { + type: "Comment", + genCSS: function (env, output) { + if (this.debugInfo) { + output.add(tree.debugInfo(env, this), this.currentFileInfo, this.index); + } + output.add(this.value.trim()); //TODO shouldn't need to trim, we shouldn't grab the \n + }, + toCSS: tree.toCSS, + isSilent: function (env) { + var isReference = (this.currentFileInfo && this.currentFileInfo.reference && !this.isReferenced), + isCompressed = env.compress && !this.value.match(/^\/\*!/); + return this.silent || isReference || isCompressed; + }, + eval: function () { + return this; + }, + markReferenced: function () { + this.isReferenced = true; + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Condition = function (op, l, r, i, negate) { + this.op = op.trim(); + this.lvalue = l; + this.rvalue = r; + this.index = i; + this.negate = negate; + }; + tree.Condition.prototype = { + type: "Condition", + accept: function (visitor) { + this.lvalue = visitor.visit(this.lvalue); + this.rvalue = visitor.visit(this.rvalue); + }, + eval: function (env) { + var a = this.lvalue.eval(env), + b = this.rvalue.eval(env); + + var i = this.index, result; + + result = (function (op) { + switch (op) { + case 'and': + return a && b; + case 'or': + return a || b; + default: + if (a.compare) { + result = a.compare(b); + } else if (b.compare) { + result = b.compare(a); + } else { + throw { + type: "Type", + message: "Unable to perform comparison", + index: i + }; + } + switch (result) { + case -1: + return op === '<' || op === '=<' || op === '<='; + case 0: + return op === '=' || op === '>=' || op === '=<' || op === '<='; + case 1: + return op === '>' || op === '>='; + } + } + })(this.op); + return this.negate ? !result : result; + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.DetachedRuleset = function (ruleset, frames) { + this.ruleset = ruleset; + this.frames = frames; + }; + tree.DetachedRuleset.prototype = { + type: "DetachedRuleset", + accept: function (visitor) { + this.ruleset = visitor.visit(this.ruleset); + }, + eval: function (env) { + var frames = this.frames || env.frames.slice(0); + return new tree.DetachedRuleset(this.ruleset, frames); + }, + callEval: function (env) { + return this.ruleset.eval(this.frames ? new (tree.evalEnv)(env, this.frames.concat(env.frames)) : env); + } + }; +})(require('../tree')); + +(function (tree) { + +// +// A number with a unit +// + tree.Dimension = function (value, unit) { + this.value = parseFloat(value); + this.unit = (unit && unit instanceof tree.Unit) ? unit : + new (tree.Unit)(unit ? [unit] : undefined); + }; + + tree.Dimension.prototype = { + type: "Dimension", + accept: function (visitor) { + this.unit = visitor.visit(this.unit); + }, + eval: function (env) { + return this; + }, + toColor: function () { + return new (tree.Color)([this.value, this.value, this.value]); + }, + genCSS: function (env, output) { + if ((env && env.strictUnits) && !this.unit.isSingular()) { + throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: " + this.unit.toString()); + } + + var value = tree.fround(env, this.value), + strValue = String(value); + + if (value !== 0 && value < 0.000001 && value > -0.000001) { + // would be output 1e-6 etc. + strValue = value.toFixed(20).replace(/0+$/, ""); + } + + if (env && env.compress) { + // Zero values doesn't need a unit + if (value === 0 && this.unit.isLength()) { + output.add(strValue); + return; + } + + // Float values doesn't need a leading zero + if (value > 0 && value < 1) { + strValue = (strValue).substr(1); + } + } + + output.add(strValue); + this.unit.genCSS(env, output); + }, + toCSS: tree.toCSS, + + // In an operation between two Dimensions, + // we default to the first Dimension's unit, + // so `1px + 2` will yield `3px`. + operate: function (env, op, other) { + /*jshint noempty:false */ + var value = tree.operate(env, op, this.value, other.value), + unit = this.unit.clone(); + + if (op === '+' || op === '-') { + if (unit.numerator.length === 0 && unit.denominator.length === 0) { + unit.numerator = other.unit.numerator.slice(0); + unit.denominator = other.unit.denominator.slice(0); + } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) { + // do nothing + } else { + other = other.convertTo(this.unit.usedUnits()); + + if (env.strictUnits && other.unit.toString() !== unit.toString()) { + throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '" + unit.toString() + + "' and '" + other.unit.toString() + "'."); + } + + value = tree.operate(env, op, this.value, other.value); + } + } else if (op === '*') { + unit.numerator = unit.numerator.concat(other.unit.numerator).sort(); + unit.denominator = unit.denominator.concat(other.unit.denominator).sort(); + unit.cancel(); + } else if (op === '/') { + unit.numerator = unit.numerator.concat(other.unit.denominator).sort(); + unit.denominator = unit.denominator.concat(other.unit.numerator).sort(); + unit.cancel(); + } + return new (tree.Dimension)(value, unit); + }, + + compare: function (other) { + if (other instanceof tree.Dimension) { + var a, b, + aValue, bValue; + + if (this.unit.isEmpty() || other.unit.isEmpty()) { + a = this; + b = other; + } else { + a = this.unify(); + b = other.unify(); + if (a.unit.compare(b.unit) !== 0) { + return -1; + } + } + aValue = a.value; + bValue = b.value; + + if (bValue > aValue) { + return -1; + } else if (bValue < aValue) { + return 1; + } else { + return 0; + } + } else { + return -1; + } + }, + + unify: function () { + return this.convertTo({length: 'px', duration: 's', angle: 'rad'}); + }, + + convertTo: function (conversions) { + var value = this.value, unit = this.unit.clone(), + i, groupName, group, targetUnit, derivedConversions = {}, applyUnit; + + if (typeof conversions === 'string') { + for (i in tree.UnitConversions) { + if (tree.UnitConversions[i].hasOwnProperty(conversions)) { + derivedConversions = {}; + derivedConversions[i] = conversions; + } + } + conversions = derivedConversions; + } + applyUnit = function (atomicUnit, denominator) { + /*jshint loopfunc:true */ + if (group.hasOwnProperty(atomicUnit)) { + if (denominator) { + value = value / (group[atomicUnit] / group[targetUnit]); + } else { + value = value * (group[atomicUnit] / group[targetUnit]); + } + + return targetUnit; + } + + return atomicUnit; + }; + + for (groupName in conversions) { + if (conversions.hasOwnProperty(groupName)) { + targetUnit = conversions[groupName]; + group = tree.UnitConversions[groupName]; + + unit.map(applyUnit); + } + } + + unit.cancel(); + + return new (tree.Dimension)(value, unit); + } + }; + +// http://www.w3.org/TR/css3-values/#absolute-lengths + tree.UnitConversions = { + length: { + 'm': 1, + 'cm': 0.01, + 'mm': 0.001, + 'in': 0.0254, + 'px': 0.0254 / 96, + 'pt': 0.0254 / 72, + 'pc': 0.0254 / 72 * 12 + }, + duration: { + 's': 1, + 'ms': 0.001 + }, + angle: { + 'rad': 1 / (2 * Math.PI), + 'deg': 1 / 360, + 'grad': 1 / 400, + 'turn': 1 + } + }; + + tree.Unit = function (numerator, denominator, backupUnit) { + this.numerator = numerator ? numerator.slice(0).sort() : []; + this.denominator = denominator ? denominator.slice(0).sort() : []; + this.backupUnit = backupUnit; + }; + + tree.Unit.prototype = { + type: "Unit", + clone: function () { + return new tree.Unit(this.numerator.slice(0), this.denominator.slice(0), this.backupUnit); + }, + genCSS: function (env, output) { + if (this.numerator.length >= 1) { + output.add(this.numerator[0]); + } else if (this.denominator.length >= 1) { + output.add(this.denominator[0]); + } else if ((!env || !env.strictUnits) && this.backupUnit) { + output.add(this.backupUnit); + } + }, + toCSS: tree.toCSS, + + toString: function () { + var i, returnStr = this.numerator.join("*"); + for (i = 0; i < this.denominator.length; i++) { + returnStr += "/" + this.denominator[i]; + } + return returnStr; + }, + + compare: function (other) { + return this.is(other.toString()) ? 0 : -1; + }, + + is: function (unitString) { + return this.toString() === unitString; + }, + + isLength: function () { + return Boolean(this.toCSS().match(/px|em|%|in|cm|mm|pc|pt|ex/)); + }, + + isEmpty: function () { + return this.numerator.length === 0 && this.denominator.length === 0; + }, + + isSingular: function () { + return this.numerator.length <= 1 && this.denominator.length === 0; + }, + + map: function (callback) { + var i; + + for (i = 0; i < this.numerator.length; i++) { + this.numerator[i] = callback(this.numerator[i], false); + } + + for (i = 0; i < this.denominator.length; i++) { + this.denominator[i] = callback(this.denominator[i], true); + } + }, + + usedUnits: function () { + var group, result = {}, mapUnit; + + mapUnit = function (atomicUnit) { + /*jshint loopfunc:true */ + if (group.hasOwnProperty(atomicUnit) && !result[groupName]) { + result[groupName] = atomicUnit; + } + + return atomicUnit; + }; + + for (var groupName in tree.UnitConversions) { + if (tree.UnitConversions.hasOwnProperty(groupName)) { + group = tree.UnitConversions[groupName]; + + this.map(mapUnit); + } + } + + return result; + }, + + cancel: function () { + var counter = {}, atomicUnit, i, backup; + + for (i = 0; i < this.numerator.length; i++) { + atomicUnit = this.numerator[i]; + if (!backup) { + backup = atomicUnit; + } + counter[atomicUnit] = (counter[atomicUnit] || 0) + 1; + } + + for (i = 0; i < this.denominator.length; i++) { + atomicUnit = this.denominator[i]; + if (!backup) { + backup = atomicUnit; + } + counter[atomicUnit] = (counter[atomicUnit] || 0) - 1; + } + + this.numerator = []; + this.denominator = []; + + for (atomicUnit in counter) { + if (counter.hasOwnProperty(atomicUnit)) { + var count = counter[atomicUnit]; + + if (count > 0) { + for (i = 0; i < count; i++) { + this.numerator.push(atomicUnit); + } + } else if (count < 0) { + for (i = 0; i < -count; i++) { + this.denominator.push(atomicUnit); + } + } + } + } + + if (this.numerator.length === 0 && this.denominator.length === 0 && backup) { + this.backupUnit = backup; + } + + this.numerator.sort(); + this.denominator.sort(); + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Directive = function (name, value, rules, index, currentFileInfo, debugInfo) { + this.name = name; + this.value = value; + if (rules) { + this.rules = rules; + this.rules.allowImports = true; + } + this.index = index; + this.currentFileInfo = currentFileInfo; + this.debugInfo = debugInfo; + }; + + tree.Directive.prototype = { + type: "Directive", + accept: function (visitor) { + var value = this.value, rules = this.rules; + if (rules) { + rules = visitor.visit(rules); + } + if (value) { + value = visitor.visit(value); + } + }, + isRulesetLike: function () { + return !this.isCharset(); + }, + isCharset: function () { + return "@charset" === this.name; + }, + genCSS: function (env, output) { + var value = this.value, rules = this.rules; + output.add(this.name, this.currentFileInfo, this.index); + if (value) { + output.add(' '); + value.genCSS(env, output); + } + if (rules) { + tree.outputRuleset(env, output, [rules]); + } else { + output.add(';'); + } + }, + toCSS: tree.toCSS, + eval: function (env) { + var value = this.value, rules = this.rules; + if (value) { + value = value.eval(env); + } + if (rules) { + rules = rules.eval(env); + rules.root = true; + } + return new (tree.Directive)(this.name, value, rules, + this.index, this.currentFileInfo, this.debugInfo); + }, + variable: function (name) { + if (this.rules) return tree.Ruleset.prototype.variable.call(this.rules, name); + }, + find: function () { + if (this.rules) return tree.Ruleset.prototype.find.apply(this.rules, arguments); + }, + rulesets: function () { + if (this.rules) return tree.Ruleset.prototype.rulesets.apply(this.rules); + }, + markReferenced: function () { + var i, rules; + this.isReferenced = true; + if (this.rules) { + rules = this.rules.rules; + for (i = 0; i < rules.length; i++) { + if (rules[i].markReferenced) { + rules[i].markReferenced(); + } + } + } + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Element = function (combinator, value, index, currentFileInfo) { + this.combinator = combinator instanceof tree.Combinator ? + combinator : new (tree.Combinator)(combinator); + + if (typeof(value) === 'string') { + this.value = value.trim(); + } else if (value) { + this.value = value; + } else { + this.value = ""; + } + this.index = index; + this.currentFileInfo = currentFileInfo; + }; + tree.Element.prototype = { + type: "Element", + accept: function (visitor) { + var value = this.value; + this.combinator = visitor.visit(this.combinator); + if (typeof value === "object") { + this.value = visitor.visit(value); + } + }, + eval: function (env) { + return new (tree.Element)(this.combinator, + this.value.eval ? this.value.eval(env) : this.value, + this.index, + this.currentFileInfo); + }, + genCSS: function (env, output) { + output.add(this.toCSS(env), this.currentFileInfo, this.index); + }, + toCSS: function (env) { + var value = (this.value.toCSS ? this.value.toCSS(env) : this.value); + if (value === '' && this.combinator.value.charAt(0) === '&') { + return ''; + } else { + return this.combinator.toCSS(env || {}) + value; + } + } + }; + + tree.Attribute = function (key, op, value) { + this.key = key; + this.op = op; + this.value = value; + }; + tree.Attribute.prototype = { + type: "Attribute", + eval: function (env) { + return new (tree.Attribute)(this.key.eval ? this.key.eval(env) : this.key, + this.op, (this.value && this.value.eval) ? this.value.eval(env) : this.value); + }, + genCSS: function (env, output) { + output.add(this.toCSS(env)); + }, + toCSS: function (env) { + var value = this.key.toCSS ? this.key.toCSS(env) : this.key; + + if (this.op) { + value += this.op; + value += (this.value.toCSS ? this.value.toCSS(env) : this.value); + } + + return '[' + value + ']'; + } + }; + + tree.Combinator = function (value) { + if (value === ' ') { + this.value = ' '; + } else { + this.value = value ? value.trim() : ""; + } + }; + tree.Combinator.prototype = { + type: "Combinator", + _noSpaceCombinators: { + '': true, + ' ': true, + '|': true + }, + genCSS: function (env, output) { + var spaceOrEmpty = (env.compress || this._noSpaceCombinators[this.value]) ? '' : ' '; + output.add(spaceOrEmpty + this.value + spaceOrEmpty); + }, + toCSS: tree.toCSS + }; + +})(require('../tree')); + +(function (tree) { + + tree.Expression = function (value) { + this.value = value; + }; + tree.Expression.prototype = { + type: "Expression", + accept: function (visitor) { + if (this.value) { + this.value = visitor.visitArray(this.value); + } + }, + eval: function (env) { + var returnValue, + inParenthesis = this.parens && !this.parensInOp, + doubleParen = false; + if (inParenthesis) { + env.inParenthesis(); + } + if (this.value.length > 1) { + returnValue = new (tree.Expression)(this.value.map(function (e) { + return e.eval(env); + })); + } else if (this.value.length === 1) { + if (this.value[0].parens && !this.value[0].parensInOp) { + doubleParen = true; + } + returnValue = this.value[0].eval(env); + } else { + returnValue = this; + } + if (inParenthesis) { + env.outOfParenthesis(); + } + if (this.parens && this.parensInOp && !(env.isMathOn()) && !doubleParen) { + returnValue = new (tree.Paren)(returnValue); + } + return returnValue; + }, + genCSS: function (env, output) { + for (var i = 0; i < this.value.length; i++) { + this.value[i].genCSS(env, output); + if (i + 1 < this.value.length) { + output.add(" "); + } + } + }, + toCSS: tree.toCSS, + throwAwayComments: function () { + this.value = this.value.filter(function (v) { + return !(v instanceof tree.Comment); + }); + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Extend = function Extend(selector, option, index) { + this.selector = selector; + this.option = option; + this.index = index; + this.object_id = tree.Extend.next_id++; + this.parent_ids = [this.object_id]; + + switch (option) { + case "all": + this.allowBefore = true; + this.allowAfter = true; + break; + default: + this.allowBefore = false; + this.allowAfter = false; + break; + } + }; + tree.Extend.next_id = 0; + + tree.Extend.prototype = { + type: "Extend", + accept: function (visitor) { + this.selector = visitor.visit(this.selector); + }, + eval: function (env) { + return new (tree.Extend)(this.selector.eval(env), this.option, this.index); + }, + clone: function (env) { + return new (tree.Extend)(this.selector, this.option, this.index); + }, + findSelfSelectors: function (selectors) { + var selfElements = [], + i, + selectorElements; + + for (i = 0; i < selectors.length; i++) { + selectorElements = selectors[i].elements; + // duplicate the logic in genCSS function inside the selector node. + // future TODO - move both logics into the selector joiner visitor + if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === "") { + selectorElements[0].combinator.value = ' '; + } + selfElements = selfElements.concat(selectors[i].elements); + } + + this.selfSelectors = [{elements: selfElements}]; + } + }; + +})(require('../tree')); + +(function (tree) { +// +// CSS @import node +// +// The general strategy here is that we don't want to wait +// for the parsing to be completed, before we start importing +// the file. That's because in the context of a browser, +// most of the time will be spent waiting for the server to respond. +// +// On creation, we push the import path to our import queue, though +// `import,push`, we also pass it a callback, which it'll call once +// the file has been fetched, and parsed. +// + tree.Import = function (path, features, options, index, currentFileInfo) { + this.options = options; + this.index = index; + this.path = path; + this.features = features; + this.currentFileInfo = currentFileInfo; + + if (this.options.less !== undefined || this.options.inline) { + this.css = !this.options.less || this.options.inline; + } else { + var pathValue = this.getPath(); + if (pathValue && /css([\?;].*)?$/.test(pathValue)) { + this.css = true; + } + } + }; + +// +// The actual import node doesn't return anything, when converted to CSS. +// The reason is that it's used at the evaluation stage, so that the rules +// it imports can be treated like any other rules. +// +// In `eval`, we make sure all Import nodes get evaluated, recursively, so +// we end up with a flat structure, which can easily be imported in the parent +// ruleset. +// + tree.Import.prototype = { + type: "Import", + accept: function (visitor) { + if (this.features) { + this.features = visitor.visit(this.features); + } + this.path = visitor.visit(this.path); + if (!this.options.inline && this.root) { + this.root = visitor.visit(this.root); + } + }, + genCSS: function (env, output) { + if (this.css) { + output.add("@import ", this.currentFileInfo, this.index); + this.path.genCSS(env, output); + if (this.features) { + output.add(" "); + this.features.genCSS(env, output); + } + output.add(';'); + } + }, + toCSS: tree.toCSS, + getPath: function () { + if (this.path instanceof tree.Quoted) { + var path = this.path.value; + return (this.css !== undefined || /(\.[a-z]*$)|([\?;].*)$/.test(path)) ? path : path + '.less'; + } else if (this.path instanceof tree.URL) { + return this.path.value.value; + } + return null; + }, + evalForImport: function (env) { + return new (tree.Import)(this.path.eval(env), this.features, this.options, this.index, this.currentFileInfo); + }, + evalPath: function (env) { + var path = this.path.eval(env); + var rootpath = this.currentFileInfo && this.currentFileInfo.rootpath; + + if (!(path instanceof tree.URL)) { + if (rootpath) { + var pathValue = path.value; + // Add the base path if the import is relative + if (pathValue && env.isPathRelative(pathValue)) { + path.value = rootpath + pathValue; + } + } + path.value = env.normalizePath(path.value); + } + + return path; + }, + eval: function (env) { + var ruleset, features = this.features && this.features.eval(env); + + if (this.skip) { + if (typeof this.skip === "function") { + this.skip = this.skip(); + } + if (this.skip) { + return []; + } + } + + if (this.options.inline) { + //todo needs to reference css file not import + var contents = new (tree.Anonymous)(this.root, 0, {filename: this.importedFilename}, true, true); + return this.features ? new (tree.Media)([contents], this.features.value) : [contents]; + } else if (this.css) { + var newImport = new (tree.Import)(this.evalPath(env), features, this.options, this.index); + if (!newImport.css && this.error) { + throw this.error; + } + return newImport; + } else { + ruleset = new (tree.Ruleset)(null, this.root.rules.slice(0)); + + ruleset.evalImports(env); + + return this.features ? new (tree.Media)(ruleset.rules, this.features.value) : ruleset.rules; + } + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.JavaScript = function (string, index, escaped) { + this.escaped = escaped; + this.expression = string; + this.index = index; + }; + tree.JavaScript.prototype = { + type: "JavaScript", + eval: function (env) { + var result, + that = this, + context = {}; + + var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) { + return tree.jsify(new (tree.Variable)('@' + name, that.index).eval(env)); + }); + + try { + expression = new (Function)('return (' + expression + ')'); + } catch (e) { + throw { + message: "JavaScript evaluation error: " + e.message + " from `" + expression + "`", + index: this.index + }; + } + + var variables = env.frames[0].variables(); + for (var k in variables) { + if (variables.hasOwnProperty(k)) { + /*jshint loopfunc:true */ + context[k.slice(1)] = { + value: variables[k].value, + toJS: function () { + return this.value.eval(env).toCSS(); + } + }; + } + } + + try { + result = expression.call(context); + } catch (e) { + throw { + message: "JavaScript evaluation error: '" + e.name + ': ' + e.message.replace(/["]/g, "'") + "'", + index: this.index + }; + } + if (typeof(result) === 'number') { + return new (tree.Dimension)(result); + } else if (typeof(result) === 'string') { + return new (tree.Quoted)('"' + result + '"', result, this.escaped, this.index); + } else if (Array.isArray(result)) { + return new (tree.Anonymous)(result.join(', ')); + } else { + return new (tree.Anonymous)(result); + } + } + }; + +})(require('../tree')); + + +(function (tree) { + + tree.Keyword = function (value) { + this.value = value; + }; + tree.Keyword.prototype = { + type: "Keyword", + eval: function () { + return this; + }, + genCSS: function (env, output) { + if (this.value === '%') { + throw {type: "Syntax", message: "Invalid % without number"}; + } + output.add(this.value); + }, + toCSS: tree.toCSS, + compare: function (other) { + if (other instanceof tree.Keyword) { + return other.value === this.value ? 0 : 1; + } else { + return -1; + } + } + }; + + tree.True = new (tree.Keyword)('true'); + tree.False = new (tree.Keyword)('false'); + +})(require('../tree')); + +(function (tree) { + + tree.Media = function (value, features, index, currentFileInfo) { + this.index = index; + this.currentFileInfo = currentFileInfo; + + var selectors = this.emptySelectors(); + + this.features = new (tree.Value)(features); + this.rules = [new (tree.Ruleset)(selectors, value)]; + this.rules[0].allowImports = true; + }; + tree.Media.prototype = { + type: "Media", + accept: function (visitor) { + if (this.features) { + this.features = visitor.visit(this.features); + } + if (this.rules) { + this.rules = visitor.visitArray(this.rules); + } + }, + genCSS: function (env, output) { + output.add('@media ', this.currentFileInfo, this.index); + this.features.genCSS(env, output); + tree.outputRuleset(env, output, this.rules); + }, + toCSS: tree.toCSS, + eval: function (env) { + if (!env.mediaBlocks) { + env.mediaBlocks = []; + env.mediaPath = []; + } + + var media = new (tree.Media)(null, [], this.index, this.currentFileInfo); + if (this.debugInfo) { + this.rules[0].debugInfo = this.debugInfo; + media.debugInfo = this.debugInfo; + } + var strictMathBypass = false; + if (!env.strictMath) { + strictMathBypass = true; + env.strictMath = true; + } + try { + media.features = this.features.eval(env); + } + finally { + if (strictMathBypass) { + env.strictMath = false; + } + } + + env.mediaPath.push(media); + env.mediaBlocks.push(media); + + env.frames.unshift(this.rules[0]); + media.rules = [this.rules[0].eval(env)]; + env.frames.shift(); + + env.mediaPath.pop(); + + return env.mediaPath.length === 0 ? media.evalTop(env) : + media.evalNested(env); + }, + variable: function (name) { + return tree.Ruleset.prototype.variable.call(this.rules[0], name); + }, + find: function () { + return tree.Ruleset.prototype.find.apply(this.rules[0], arguments); + }, + rulesets: function () { + return tree.Ruleset.prototype.rulesets.apply(this.rules[0]); + }, + emptySelectors: function () { + var el = new (tree.Element)('', '&', this.index, this.currentFileInfo), + sels = [new (tree.Selector)([el], null, null, this.index, this.currentFileInfo)]; + sels[0].mediaEmpty = true; + return sels; + }, + markReferenced: function () { + var i, rules = this.rules[0].rules; + this.rules[0].markReferenced(); + this.isReferenced = true; + for (i = 0; i < rules.length; i++) { + if (rules[i].markReferenced) { + rules[i].markReferenced(); + } + } + }, + + evalTop: function (env) { + var result = this; + + // Render all dependent Media blocks. + if (env.mediaBlocks.length > 1) { + var selectors = this.emptySelectors(); + result = new (tree.Ruleset)(selectors, env.mediaBlocks); + result.multiMedia = true; + } + + delete env.mediaBlocks; + delete env.mediaPath; + + return result; + }, + evalNested: function (env) { + var i, value, + path = env.mediaPath.concat([this]); + + // Extract the media-query conditions separated with `,` (OR). + for (i = 0; i < path.length; i++) { + value = path[i].features instanceof tree.Value ? + path[i].features.value : path[i].features; + path[i] = Array.isArray(value) ? value : [value]; + } + + // Trace all permutations to generate the resulting media-query. + // + // (a, b and c) with nested (d, e) -> + // a and d + // a and e + // b and c and d + // b and c and e + this.features = new (tree.Value)(this.permute(path).map(function (path) { + path = path.map(function (fragment) { + return fragment.toCSS ? fragment : new (tree.Anonymous)(fragment); + }); + + for (i = path.length - 1; i > 0; i--) { + path.splice(i, 0, new (tree.Anonymous)("and")); + } + + return new (tree.Expression)(path); + })); + + // Fake a tree-node that doesn't output anything. + return new (tree.Ruleset)([], []); + }, + permute: function (arr) { + if (arr.length === 0) { + return []; + } else if (arr.length === 1) { + return arr[0]; + } else { + var result = []; + var rest = this.permute(arr.slice(1)); + for (var i = 0; i < rest.length; i++) { + for (var j = 0; j < arr[0].length; j++) { + result.push([arr[0][j]].concat(rest[i])); + } + } + return result; + } + }, + bubbleSelectors: function (selectors) { + if (!selectors) + return; + this.rules = [new (tree.Ruleset)(selectors.slice(0), [this.rules[0]])]; + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.mixin = {}; + tree.mixin.Call = function (elements, args, index, currentFileInfo, important) { + this.selector = new (tree.Selector)(elements); + this.arguments = (args && args.length) ? args : null; + this.index = index; + this.currentFileInfo = currentFileInfo; + this.important = important; + }; + tree.mixin.Call.prototype = { + type: "MixinCall", + accept: function (visitor) { + if (this.selector) { + this.selector = visitor.visit(this.selector); + } + if (this.arguments) { + this.arguments = visitor.visitArray(this.arguments); + } + }, + eval: function (env) { + var mixins, mixin, args, rules = [], match = false, i, m, f, isRecursive, isOneFound, rule, + candidates = [], candidate, conditionResult = [], defaultFunc = tree.defaultFunc, + defaultResult, defNone = 0, defTrue = 1, defFalse = 2, count, originalRuleset; + + args = this.arguments && this.arguments.map(function (a) { + return {name: a.name, value: a.value.eval(env)}; + }); + + for (i = 0; i < env.frames.length; i++) { + if ((mixins = env.frames[i].find(this.selector)).length > 0) { + isOneFound = true; + + // To make `default()` function independent of definition order we have two "subpasses" here. + // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`), + // and build candidate list with corresponding flags. Then, when we know all possible matches, + // we make a final decision. + + for (m = 0; m < mixins.length; m++) { + mixin = mixins[m]; + isRecursive = false; + for (f = 0; f < env.frames.length; f++) { + if ((!(mixin instanceof tree.mixin.Definition)) && mixin === (env.frames[f].originalRuleset || env.frames[f])) { + isRecursive = true; + break; + } + } + if (isRecursive) { + continue; + } + + if (mixin.matchArgs(args, env)) { + candidate = {mixin: mixin, group: defNone}; + + if (mixin.matchCondition) { + for (f = 0; f < 2; f++) { + defaultFunc.value(f); + conditionResult[f] = mixin.matchCondition(args, env); + } + if (conditionResult[0] || conditionResult[1]) { + if (conditionResult[0] != conditionResult[1]) { + candidate.group = conditionResult[1] ? + defTrue : defFalse; + } + + candidates.push(candidate); + } + } + else { + candidates.push(candidate); + } + + match = true; + } + } + + defaultFunc.reset(); + + count = [0, 0, 0]; + for (m = 0; m < candidates.length; m++) { + count[candidates[m].group]++; + } + + if (count[defNone] > 0) { + defaultResult = defFalse; + } else { + defaultResult = defTrue; + if ((count[defTrue] + count[defFalse]) > 1) { + throw { + type: 'Runtime', + message: 'Ambiguous use of `default()` found when matching for `' + + this.format(args) + '`', + index: this.index, filename: this.currentFileInfo.filename + }; + } + } + + for (m = 0; m < candidates.length; m++) { + candidate = candidates[m].group; + if ((candidate === defNone) || (candidate === defaultResult)) { + try { + mixin = candidates[m].mixin; + if (!(mixin instanceof tree.mixin.Definition)) { + originalRuleset = mixin.originalRuleset || mixin; + mixin = new tree.mixin.Definition("", [], mixin.rules, null, false); + mixin.originalRuleset = originalRuleset; + } + Array.prototype.push.apply( + rules, mixin.evalCall(env, args, this.important).rules); + } catch (e) { + throw { + message: e.message, + index: this.index, + filename: this.currentFileInfo.filename, + stack: e.stack + }; + } + } + } + + if (match) { + if (!this.currentFileInfo || !this.currentFileInfo.reference) { + for (i = 0; i < rules.length; i++) { + rule = rules[i]; + if (rule.markReferenced) { + rule.markReferenced(); + } + } + } + return rules; + } + } + } + if (isOneFound) { + throw { + type: 'Runtime', + message: 'No matching definition was found for `' + this.format(args) + '`', + index: this.index, filename: this.currentFileInfo.filename + }; + } else { + throw { + type: 'Name', + message: this.selector.toCSS().trim() + " is undefined", + index: this.index, filename: this.currentFileInfo.filename + }; + } + }, + format: function (args) { + return this.selector.toCSS().trim() + '(' + + (args ? args.map(function (a) { + var argValue = ""; + if (a.name) { + argValue += a.name + ":"; + } + if (a.value.toCSS) { + argValue += a.value.toCSS(); + } else { + argValue += "???"; + } + return argValue; + }).join(', ') : "") + ")"; + } + }; + + tree.mixin.Definition = function (name, params, rules, condition, variadic, frames) { + this.name = name; + this.selectors = [new (tree.Selector)([new (tree.Element)(null, name, this.index, this.currentFileInfo)])]; + this.params = params; + this.condition = condition; + this.variadic = variadic; + this.arity = params.length; + this.rules = rules; + this._lookups = {}; + this.required = params.reduce(function (count, p) { + if (!p.name || (p.name && !p.value)) { + return count + 1; + } + else { + return count; + } + }, 0); + this.parent = tree.Ruleset.prototype; + this.frames = frames; + }; + tree.mixin.Definition.prototype = { + type: "MixinDefinition", + accept: function (visitor) { + if (this.params && this.params.length) { + this.params = visitor.visitArray(this.params); + } + this.rules = visitor.visitArray(this.rules); + if (this.condition) { + this.condition = visitor.visit(this.condition); + } + }, + variable: function (name) { + return this.parent.variable.call(this, name); + }, + variables: function () { + return this.parent.variables.call(this); + }, + find: function () { + return this.parent.find.apply(this, arguments); + }, + rulesets: function () { + return this.parent.rulesets.apply(this); + }, + + evalParams: function (env, mixinEnv, args, evaldArguments) { + /*jshint boss:true */ + var frame = new (tree.Ruleset)(null, null), + varargs, arg, + params = this.params.slice(0), + i, j, val, name, isNamedFound, argIndex, argsLength = 0; + + mixinEnv = new tree.evalEnv(mixinEnv, [frame].concat(mixinEnv.frames)); + + if (args) { + args = args.slice(0); + argsLength = args.length; + + for (i = 0; i < argsLength; i++) { + arg = args[i]; + if (name = (arg && arg.name)) { + isNamedFound = false; + for (j = 0; j < params.length; j++) { + if (!evaldArguments[j] && name === params[j].name) { + evaldArguments[j] = arg.value.eval(env); + frame.prependRule(new (tree.Rule)(name, arg.value.eval(env))); + isNamedFound = true; + break; + } + } + if (isNamedFound) { + args.splice(i, 1); + i--; + continue; + } else { + throw { + type: 'Runtime', message: "Named argument for " + this.name + + ' ' + args[i].name + ' not found' + }; + } + } + } + } + argIndex = 0; + for (i = 0; i < params.length; i++) { + if (evaldArguments[i]) { + continue; + } + + arg = args && args[argIndex]; + + if (name = params[i].name) { + if (params[i].variadic) { + varargs = []; + for (j = argIndex; j < argsLength; j++) { + varargs.push(args[j].value.eval(env)); + } + frame.prependRule(new (tree.Rule)(name, new (tree.Expression)(varargs).eval(env))); + } else { + val = arg && arg.value; + if (val) { + val = val.eval(env); + } else if (params[i].value) { + val = params[i].value.eval(mixinEnv); + frame.resetCache(); + } else { + throw { + type: 'Runtime', message: "wrong number of arguments for " + this.name + + ' (' + argsLength + ' for ' + this.arity + ')' + }; + } + + frame.prependRule(new (tree.Rule)(name, val)); + evaldArguments[i] = val; + } + } + + if (params[i].variadic && args) { + for (j = argIndex; j < argsLength; j++) { + evaldArguments[j] = args[j].value.eval(env); + } + } + argIndex++; + } + + return frame; + }, + eval: function (env) { + return new tree.mixin.Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || env.frames.slice(0)); + }, + evalCall: function (env, args, important) { + var _arguments = [], + mixinFrames = this.frames ? this.frames.concat(env.frames) : env.frames, + frame = this.evalParams(env, new (tree.evalEnv)(env, mixinFrames), args, _arguments), + rules, ruleset; + + frame.prependRule(new (tree.Rule)('@arguments', new (tree.Expression)(_arguments).eval(env))); + + rules = this.rules.slice(0); + + ruleset = new (tree.Ruleset)(null, rules); + ruleset.originalRuleset = this; + ruleset = ruleset.eval(new (tree.evalEnv)(env, [this, frame].concat(mixinFrames))); + if (important) { + ruleset = this.parent.makeImportant.apply(ruleset); + } + return ruleset; + }, + matchCondition: function (args, env) { + if (this.condition && !this.condition.eval( + new (tree.evalEnv)(env, + [this.evalParams(env, new (tree.evalEnv)(env, this.frames ? this.frames.concat(env.frames) : env.frames), args, [])] // the parameter variables + .concat(this.frames) // the parent namespace/mixin frames + .concat(env.frames)))) { // the current environment frames + return false; + } + return true; + }, + matchArgs: function (args, env) { + var argsLength = (args && args.length) || 0, len; + + if (!this.variadic) { + if (argsLength < this.required) { + return false; + } + if (argsLength > this.params.length) { + return false; + } + } else { + if (argsLength < (this.required - 1)) { + return false; + } + } + + len = Math.min(argsLength, this.arity); + + for (var i = 0; i < len; i++) { + if (!this.params[i].name && !this.params[i].variadic) { + if (args[i].value.eval(env).toCSS() != this.params[i].value.eval(env).toCSS()) { + return false; + } + } + } + return true; + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Negative = function (node) { + this.value = node; + }; + tree.Negative.prototype = { + type: "Negative", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + genCSS: function (env, output) { + output.add('-'); + this.value.genCSS(env, output); + }, + toCSS: tree.toCSS, + eval: function (env) { + if (env.isMathOn()) { + return (new (tree.Operation)('*', [new (tree.Dimension)(-1), this.value])).eval(env); + } + return new (tree.Negative)(this.value.eval(env)); + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Operation = function (op, operands, isSpaced) { + this.op = op.trim(); + this.operands = operands; + this.isSpaced = isSpaced; + }; + tree.Operation.prototype = { + type: "Operation", + accept: function (visitor) { + this.operands = visitor.visit(this.operands); + }, + eval: function (env) { + var a = this.operands[0].eval(env), + b = this.operands[1].eval(env); + + if (env.isMathOn()) { + if (a instanceof tree.Dimension && b instanceof tree.Color) { + a = a.toColor(); + } + if (b instanceof tree.Dimension && a instanceof tree.Color) { + b = b.toColor(); + } + if (!a.operate) { + throw { + type: "Operation", + message: "Operation on an invalid type" + }; + } + + return a.operate(env, this.op, b); + } else { + return new (tree.Operation)(this.op, [a, b], this.isSpaced); + } + }, + genCSS: function (env, output) { + this.operands[0].genCSS(env, output); + if (this.isSpaced) { + output.add(" "); + } + output.add(this.op); + if (this.isSpaced) { + output.add(" "); + } + this.operands[1].genCSS(env, output); + }, + toCSS: tree.toCSS + }; + + tree.operate = function (env, op, a, b) { + switch (op) { + case '+': + return a + b; + case '-': + return a - b; + case '*': + return a * b; + case '/': + return a / b; + } + }; + +})(require('../tree')); + + +(function (tree) { + + tree.Paren = function (node) { + this.value = node; + }; + tree.Paren.prototype = { + type: "Paren", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + genCSS: function (env, output) { + output.add('('); + this.value.genCSS(env, output); + output.add(')'); + }, + toCSS: tree.toCSS, + eval: function (env) { + return new (tree.Paren)(this.value.eval(env)); + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Quoted = function (str, content, escaped, index, currentFileInfo) { + this.escaped = escaped; + this.value = content || ''; + this.quote = str.charAt(0); + this.index = index; + this.currentFileInfo = currentFileInfo; + }; + tree.Quoted.prototype = { + type: "Quoted", + genCSS: function (env, output) { + if (!this.escaped) { + output.add(this.quote, this.currentFileInfo, this.index); + } + output.add(this.value); + if (!this.escaped) { + output.add(this.quote); + } + }, + toCSS: tree.toCSS, + eval: function (env) { + var that = this; + var value = this.value.replace(/`([^`]+)`/g, function (_, exp) { + return new (tree.JavaScript)(exp, that.index, true).eval(env).value; + }).replace(/@\{([\w-]+)\}/g, function (_, name) { + var v = new (tree.Variable)('@' + name, that.index, that.currentFileInfo).eval(env, true); + return (v instanceof tree.Quoted) ? v.value : v.toCSS(); + }); + return new (tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index, this.currentFileInfo); + }, + compare: function (x) { + if (!x.toCSS) { + return -1; + } + + var left, right; + + // when comparing quoted strings allow the quote to differ + if (x.type === "Quoted" && !this.escaped && !x.escaped) { + left = x.value; + right = this.value; + } else { + left = this.toCSS(); + right = x.toCSS(); + } + + if (left === right) { + return 0; + } + + return left < right ? -1 : 1; + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Rule = function (name, value, important, merge, index, currentFileInfo, inline, variable) { + this.name = name; + this.value = (value instanceof tree.Value || value instanceof tree.Ruleset) ? value : new (tree.Value)([value]); + this.important = important ? ' ' + important.trim() : ''; + this.merge = merge; + this.index = index; + this.currentFileInfo = currentFileInfo; + this.inline = inline || false; + this.variable = (variable !== undefined) ? variable + : (name.charAt && (name.charAt(0) === '@')); + }; + + tree.Rule.prototype = { + type: "Rule", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + genCSS: function (env, output) { + output.add(this.name + (env.compress ? ':' : ': '), this.currentFileInfo, this.index); + try { + this.value.genCSS(env, output); + } + catch (e) { + e.index = this.index; + e.filename = this.currentFileInfo.filename; + throw e; + } + output.add(this.important + ((this.inline || (env.lastRule && env.compress)) ? "" : ";"), this.currentFileInfo, this.index); + }, + toCSS: tree.toCSS, + eval: function (env) { + var strictMathBypass = false, name = this.name, variable = this.variable, evaldValue; + if (typeof name !== "string") { + // expand 'primitive' name directly to get + // things faster (~10% for benchmark.less): + name = (name.length === 1) + && (name[0] instanceof tree.Keyword) + ? name[0].value : evalName(env, name); + variable = false; // never treat expanded interpolation as new variable name + } + if (name === "font" && !env.strictMath) { + strictMathBypass = true; + env.strictMath = true; + } + try { + evaldValue = this.value.eval(env); + + if (!this.variable && evaldValue.type === "DetachedRuleset") { + throw { + message: "Rulesets cannot be evaluated on a property.", + index: this.index, filename: this.currentFileInfo.filename + }; + } + + return new (tree.Rule)(name, + evaldValue, + this.important, + this.merge, + this.index, this.currentFileInfo, this.inline, + variable); + } + catch (e) { + if (typeof e.index !== 'number') { + e.index = this.index; + e.filename = this.currentFileInfo.filename; + } + throw e; + } + finally { + if (strictMathBypass) { + env.strictMath = false; + } + } + }, + makeImportant: function () { + return new (tree.Rule)(this.name, + this.value, + "!important", + this.merge, + this.index, this.currentFileInfo, this.inline); + } + }; + + function evalName(env, name) { + var value = "", i, n = name.length, + output = { + add: function (s) { + value += s; + } + }; + for (i = 0; i < n; i++) { + name[i].eval(env).genCSS(env, output); + } + return value; + } + +})(require('../tree')); + +(function (tree) { + + tree.RulesetCall = function (variable) { + this.variable = variable; + }; + tree.RulesetCall.prototype = { + type: "RulesetCall", + accept: function (visitor) { + }, + eval: function (env) { + var detachedRuleset = new (tree.Variable)(this.variable).eval(env); + return detachedRuleset.callEval(env); + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Ruleset = function (selectors, rules, strictImports) { + this.selectors = selectors; + this.rules = rules; + this._lookups = {}; + this.strictImports = strictImports; + }; + tree.Ruleset.prototype = { + type: "Ruleset", + accept: function (visitor) { + if (this.paths) { + visitor.visitArray(this.paths, true); + } else if (this.selectors) { + this.selectors = visitor.visitArray(this.selectors); + } + if (this.rules && this.rules.length) { + this.rules = visitor.visitArray(this.rules); + } + }, + eval: function (env) { + var thisSelectors = this.selectors, selectors, + selCnt, selector, i, defaultFunc = tree.defaultFunc, hasOnePassingSelector = false; + + if (thisSelectors && (selCnt = thisSelectors.length)) { + selectors = []; + defaultFunc.error({ + type: "Syntax", + message: "it is currently only allowed in parametric mixin guards," + }); + for (i = 0; i < selCnt; i++) { + selector = thisSelectors[i].eval(env); + selectors.push(selector); + if (selector.evaldCondition) { + hasOnePassingSelector = true; + } + } + defaultFunc.reset(); + } else { + hasOnePassingSelector = true; + } + + var rules = this.rules ? this.rules.slice(0) : null, + ruleset = new (tree.Ruleset)(selectors, rules, this.strictImports), + rule, subRule; + + ruleset.originalRuleset = this; + ruleset.root = this.root; + ruleset.firstRoot = this.firstRoot; + ruleset.allowImports = this.allowImports; + + if (this.debugInfo) { + ruleset.debugInfo = this.debugInfo; + } + + if (!hasOnePassingSelector) { + rules.length = 0; + } + + // push the current ruleset to the frames stack + var envFrames = env.frames; + envFrames.unshift(ruleset); + + // currrent selectors + var envSelectors = env.selectors; + if (!envSelectors) { + env.selectors = envSelectors = []; + } + envSelectors.unshift(this.selectors); + + // Evaluate imports + if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) { + ruleset.evalImports(env); + } + + // Store the frames around mixin definitions, + // so they can be evaluated like closures when the time comes. + var rsRules = ruleset.rules, rsRuleCnt = rsRules ? rsRules.length : 0; + for (i = 0; i < rsRuleCnt; i++) { + if (rsRules[i] instanceof tree.mixin.Definition || rsRules[i] instanceof tree.DetachedRuleset) { + rsRules[i] = rsRules[i].eval(env); + } + } + + var mediaBlockCount = (env.mediaBlocks && env.mediaBlocks.length) || 0; + + // Evaluate mixin calls. + for (i = 0; i < rsRuleCnt; i++) { + if (rsRules[i] instanceof tree.mixin.Call) { + /*jshint loopfunc:true */ + rules = rsRules[i].eval(env).filter(function (r) { + if ((r instanceof tree.Rule) && r.variable) { + // do not pollute the scope if the variable is + // already there. consider returning false here + // but we need a way to "return" variable from mixins + return !(ruleset.variable(r.name)); + } + return true; + }); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); + rsRuleCnt += rules.length - 1; + i += rules.length - 1; + ruleset.resetCache(); + } else if (rsRules[i] instanceof tree.RulesetCall) { + /*jshint loopfunc:true */ + rules = rsRules[i].eval(env).rules.filter(function (r) { + if ((r instanceof tree.Rule) && r.variable) { + // do not pollute the scope at all + return false; + } + return true; + }); + rsRules.splice.apply(rsRules, [i, 1].concat(rules)); + rsRuleCnt += rules.length - 1; + i += rules.length - 1; + ruleset.resetCache(); + } + } + + // Evaluate everything else + for (i = 0; i < rsRules.length; i++) { + rule = rsRules[i]; + if (!(rule instanceof tree.mixin.Definition || rule instanceof tree.DetachedRuleset)) { + rsRules[i] = rule = rule.eval ? rule.eval(env) : rule; + } + } + + // Evaluate everything else + for (i = 0; i < rsRules.length; i++) { + rule = rsRules[i]; + // for rulesets, check if it is a css guard and can be removed + if (rule instanceof tree.Ruleset && rule.selectors && rule.selectors.length === 1) { + // check if it can be folded in (e.g. & where) + if (rule.selectors[0].isJustParentSelector()) { + rsRules.splice(i--, 1); + + for (var j = 0; j < rule.rules.length; j++) { + subRule = rule.rules[j]; + if (!(subRule instanceof tree.Rule) || !subRule.variable) { + rsRules.splice(++i, 0, subRule); + } + } + } + } + } + + // Pop the stack + envFrames.shift(); + envSelectors.shift(); + + if (env.mediaBlocks) { + for (i = mediaBlockCount; i < env.mediaBlocks.length; i++) { + env.mediaBlocks[i].bubbleSelectors(selectors); + } + } + + return ruleset; + }, + evalImports: function (env) { + var rules = this.rules, i, importRules; + if (!rules) { + return; + } + + for (i = 0; i < rules.length; i++) { + if (rules[i] instanceof tree.Import) { + importRules = rules[i].eval(env); + if (importRules && importRules.length) { + rules.splice.apply(rules, [i, 1].concat(importRules)); + i += importRules.length - 1; + } else { + rules.splice(i, 1, importRules); + } + this.resetCache(); + } + } + }, + makeImportant: function () { + return new tree.Ruleset(this.selectors, this.rules.map(function (r) { + if (r.makeImportant) { + return r.makeImportant(); + } else { + return r; + } + }), this.strictImports); + }, + matchArgs: function (args) { + return !args || args.length === 0; + }, + // lets you call a css selector with a guard + matchCondition: function (args, env) { + var lastSelector = this.selectors[this.selectors.length - 1]; + if (!lastSelector.evaldCondition) { + return false; + } + if (lastSelector.condition && !lastSelector.condition.eval( + new (tree.evalEnv)(env, + env.frames))) { + return false; + } + return true; + }, + resetCache: function () { + this._rulesets = null; + this._variables = null; + this._lookups = {}; + }, + variables: function () { + if (!this._variables) { + this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) { + if (r instanceof tree.Rule && r.variable === true) { + hash[r.name] = r; + } + return hash; + }, {}); + } + return this._variables; + }, + variable: function (name) { + return this.variables()[name]; + }, + rulesets: function () { + if (!this.rules) { + return null; + } + + var _Ruleset = tree.Ruleset, _MixinDefinition = tree.mixin.Definition, + filtRules = [], rules = this.rules, cnt = rules.length, + i, rule; + + for (i = 0; i < cnt; i++) { + rule = rules[i]; + if ((rule instanceof _Ruleset) || (rule instanceof _MixinDefinition)) { + filtRules.push(rule); + } + } + + return filtRules; + }, + prependRule: function (rule) { + var rules = this.rules; + if (rules) { + rules.unshift(rule); + } else { + this.rules = [rule]; + } + }, + find: function (selector, self) { + self = self || this; + var rules = [], match, + key = selector.toCSS(); + + if (key in this._lookups) { + return this._lookups[key]; + } + + this.rulesets().forEach(function (rule) { + if (rule !== self) { + for (var j = 0; j < rule.selectors.length; j++) { + match = selector.match(rule.selectors[j]); + if (match) { + if (selector.elements.length > match) { + Array.prototype.push.apply(rules, rule.find( + new (tree.Selector)(selector.elements.slice(match)), self)); + } else { + rules.push(rule); + } + break; + } + } + } + }); + this._lookups[key] = rules; + return rules; + }, + genCSS: function (env, output) { + var i, j, + charsetRuleNodes = [], + ruleNodes = [], + rulesetNodes = [], + rulesetNodeCnt, + debugInfo, // Line number debugging + rule, + path; + + env.tabLevel = (env.tabLevel || 0); + + if (!this.root) { + env.tabLevel++; + } + + var tabRuleStr = env.compress ? '' : Array(env.tabLevel + 1).join(" "), + tabSetStr = env.compress ? '' : Array(env.tabLevel).join(" "), + sep; + + function isRulesetLikeNode(rule, root) { + // if it has nested rules, then it should be treated like a ruleset + if (rule.rules) + return true; + + // medias and comments do not have nested rules, but should be treated like rulesets anyway + if ((rule instanceof tree.Media) || (root && rule instanceof tree.Comment)) + return true; + + // some directives and anonumoust nodes are ruleset like, others are not + if ((rule instanceof tree.Directive) || (rule instanceof tree.Anonymous)) { + return rule.isRulesetLike(); + } + + //anything else is assumed to be a rule + return false; + } + + for (i = 0; i < this.rules.length; i++) { + rule = this.rules[i]; + if (isRulesetLikeNode(rule, this.root)) { + rulesetNodes.push(rule); + } else { + //charsets should float on top of everything + if (rule.isCharset && rule.isCharset()) { + charsetRuleNodes.push(rule); + } else { + ruleNodes.push(rule); + } + } + } + ruleNodes = charsetRuleNodes.concat(ruleNodes); + + // If this is the root node, we don't render + // a selector, or {}. + if (!this.root) { + debugInfo = tree.debugInfo(env, this, tabSetStr); + + if (debugInfo) { + output.add(debugInfo); + output.add(tabSetStr); + } + + var paths = this.paths, pathCnt = paths.length, + pathSubCnt; + + sep = env.compress ? ',' : (',\n' + tabSetStr); + + for (i = 0; i < pathCnt; i++) { + path = paths[i]; + if (!(pathSubCnt = path.length)) { + continue; + } + if (i > 0) { + output.add(sep); + } + + env.firstSelector = true; + path[0].genCSS(env, output); + + env.firstSelector = false; + for (j = 1; j < pathSubCnt; j++) { + path[j].genCSS(env, output); + } + } + + output.add((env.compress ? '{' : ' {\n') + tabRuleStr); + } + + // Compile rules and rulesets + for (i = 0; i < ruleNodes.length; i++) { + rule = ruleNodes[i]; + + // @page{ directive ends up with root elements inside it, a mix of rules and rulesets + // In this instance we do not know whether it is the last property + if (i + 1 === ruleNodes.length && (!this.root || rulesetNodes.length === 0 || this.firstRoot)) { + env.lastRule = true; + } + + if (rule.genCSS) { + rule.genCSS(env, output); + } else if (rule.value) { + output.add(rule.value.toString()); + } + + if (!env.lastRule) { + output.add(env.compress ? '' : ('\n' + tabRuleStr)); + } else { + env.lastRule = false; + } + } + + if (!this.root) { + output.add((env.compress ? '}' : '\n' + tabSetStr + '}')); + env.tabLevel--; + } + + sep = (env.compress ? "" : "\n") + (this.root ? tabRuleStr : tabSetStr); + rulesetNodeCnt = rulesetNodes.length; + if (rulesetNodeCnt) { + if (ruleNodes.length && sep) { + output.add(sep); + } + rulesetNodes[0].genCSS(env, output); + for (i = 1; i < rulesetNodeCnt; i++) { + if (sep) { + output.add(sep); + } + rulesetNodes[i].genCSS(env, output); + } + } + + if (!output.isEmpty() && !env.compress && this.firstRoot) { + output.add('\n'); + } + }, + + toCSS: tree.toCSS, + + markReferenced: function () { + if (!this.selectors) { + return; + } + for (var s = 0; s < this.selectors.length; s++) { + this.selectors[s].markReferenced(); + } + }, + + joinSelectors: function (paths, context, selectors) { + for (var s = 0; s < selectors.length; s++) { + this.joinSelector(paths, context, selectors[s]); + } + }, + + joinSelector: function (paths, context, selector) { + + var i, j, k, + hasParentSelector, newSelectors, el, sel, parentSel, + newSelectorPath, afterParentJoin, newJoinedSelector, + newJoinedSelectorEmpty, lastSelector, currentElements, + selectorsMultiplied; + + for (i = 0; i < selector.elements.length; i++) { + el = selector.elements[i]; + if (el.value === '&') { + hasParentSelector = true; + } + } + + if (!hasParentSelector) { + if (context.length > 0) { + for (i = 0; i < context.length; i++) { + paths.push(context[i].concat(selector)); + } + } + else { + paths.push([selector]); + } + return; + } + + // The paths are [[Selector]] + // The first list is a list of comma seperated selectors + // The inner list is a list of inheritance seperated selectors + // e.g. + // .a, .b { + // .c { + // } + // } + // == [[.a] [.c]] [[.b] [.c]] + // + + // the elements from the current selector so far + currentElements = []; + // the current list of new selectors to add to the path. + // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors + // by the parents + newSelectors = [[]]; + + for (i = 0; i < selector.elements.length; i++) { + el = selector.elements[i]; + // non parent reference elements just get added + if (el.value !== "&") { + currentElements.push(el); + } else { + // the new list of selectors to add + selectorsMultiplied = []; + + // merge the current list of non parent selector elements + // on to the current list of selectors to add + if (currentElements.length > 0) { + this.mergeElementsOnToSelectors(currentElements, newSelectors); + } + + // loop through our current selectors + for (j = 0; j < newSelectors.length; j++) { + sel = newSelectors[j]; + // if we don't have any parent paths, the & might be in a mixin so that it can be used + // whether there are parents or not + if (context.length === 0) { + // the combinator used on el should now be applied to the next element instead so that + // it is not lost + if (sel.length > 0) { + sel[0].elements = sel[0].elements.slice(0); + sel[0].elements.push(new (tree.Element)(el.combinator, '', el.index, el.currentFileInfo)); + } + selectorsMultiplied.push(sel); + } + else { + // and the parent selectors + for (k = 0; k < context.length; k++) { + parentSel = context[k]; + // We need to put the current selectors + // then join the last selector's elements on to the parents selectors + + // our new selector path + newSelectorPath = []; + // selectors from the parent after the join + afterParentJoin = []; + newJoinedSelectorEmpty = true; + + //construct the joined selector - if & is the first thing this will be empty, + // if not newJoinedSelector will be the last set of elements in the selector + if (sel.length > 0) { + newSelectorPath = sel.slice(0); + lastSelector = newSelectorPath.pop(); + newJoinedSelector = selector.createDerived(lastSelector.elements.slice(0)); + newJoinedSelectorEmpty = false; + } + else { + newJoinedSelector = selector.createDerived([]); + } + + //put together the parent selectors after the join + if (parentSel.length > 1) { + afterParentJoin = afterParentJoin.concat(parentSel.slice(1)); + } + + if (parentSel.length > 0) { + newJoinedSelectorEmpty = false; + + // join the elements so far with the first part of the parent + newJoinedSelector.elements.push(new (tree.Element)(el.combinator, parentSel[0].elements[0].value, el.index, el.currentFileInfo)); + newJoinedSelector.elements = newJoinedSelector.elements.concat(parentSel[0].elements.slice(1)); + } + + if (!newJoinedSelectorEmpty) { + // now add the joined selector + newSelectorPath.push(newJoinedSelector); + } + + // and the rest of the parent + newSelectorPath = newSelectorPath.concat(afterParentJoin); + + // add that to our new set of selectors + selectorsMultiplied.push(newSelectorPath); + } + } + } + + // our new selectors has been multiplied, so reset the state + newSelectors = selectorsMultiplied; + currentElements = []; + } + } + + // if we have any elements left over (e.g. .a& .b == .b) + // add them on to all the current selectors + if (currentElements.length > 0) { + this.mergeElementsOnToSelectors(currentElements, newSelectors); + } + + for (i = 0; i < newSelectors.length; i++) { + if (newSelectors[i].length > 0) { + paths.push(newSelectors[i]); + } + } + }, + + mergeElementsOnToSelectors: function (elements, selectors) { + var i, sel; + + if (selectors.length === 0) { + selectors.push([new (tree.Selector)(elements)]); + return; + } + + for (i = 0; i < selectors.length; i++) { + sel = selectors[i]; + + // if the previous thing in sel is a parent this needs to join on to it + if (sel.length > 0) { + sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements)); + } + else { + sel.push(new (tree.Selector)(elements)); + } + } + } + }; +})(require('../tree')); + +(function (tree) { + + tree.Selector = function (elements, extendList, condition, index, currentFileInfo, isReferenced) { + this.elements = elements; + this.extendList = extendList; + this.condition = condition; + this.currentFileInfo = currentFileInfo || {}; + this.isReferenced = isReferenced; + if (!condition) { + this.evaldCondition = true; + } + }; + tree.Selector.prototype = { + type: "Selector", + accept: function (visitor) { + if (this.elements) { + this.elements = visitor.visitArray(this.elements); + } + if (this.extendList) { + this.extendList = visitor.visitArray(this.extendList); + } + if (this.condition) { + this.condition = visitor.visit(this.condition); + } + }, + createDerived: function (elements, extendList, evaldCondition) { + evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition; + var newSelector = new (tree.Selector)(elements, extendList || this.extendList, null, this.index, this.currentFileInfo, this.isReferenced); + newSelector.evaldCondition = evaldCondition; + newSelector.mediaEmpty = this.mediaEmpty; + return newSelector; + }, + match: function (other) { + var elements = this.elements, + len = elements.length, + olen, i; + + other.CacheElements(); + + olen = other._elements.length; + if (olen === 0 || len < olen) { + return 0; + } else { + for (i = 0; i < olen; i++) { + if (elements[i].value !== other._elements[i]) { + return 0; + } + } + } + + return olen; // return number of matched elements + }, + CacheElements: function () { + var css = '', len, v, i; + + if (!this._elements) { + + len = this.elements.length; + for (i = 0; i < len; i++) { + + v = this.elements[i]; + css += v.combinator.value; + + if (!v.value.value) { + css += v.value; + continue; + } + + if (typeof v.value.value !== "string") { + css = ''; + break; + } + css += v.value.value; + } + + this._elements = css.match(/[,&#\*\.\w-]([\w-]|(\\.))*/g); + + if (this._elements) { + if (this._elements[0] === "&") { + this._elements.shift(); + } + + } else { + this._elements = []; + } + + } + }, + isJustParentSelector: function () { + return !this.mediaEmpty && + this.elements.length === 1 && + this.elements[0].value === '&' && + (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === ''); + }, + eval: function (env) { + var evaldCondition = this.condition && this.condition.eval(env), + elements = this.elements, extendList = this.extendList; + + elements = elements && elements.map(function (e) { + return e.eval(env); + }); + extendList = extendList && extendList.map(function (extend) { + return extend.eval(env); + }); + + return this.createDerived(elements, extendList, evaldCondition); + }, + genCSS: function (env, output) { + var i, element; + if ((!env || !env.firstSelector) && this.elements[0].combinator.value === "") { + output.add(' ', this.currentFileInfo, this.index); + } + if (!this._css) { + //TODO caching? speed comparison? + for (i = 0; i < this.elements.length; i++) { + element = this.elements[i]; + element.genCSS(env, output); + } + } + }, + toCSS: tree.toCSS, + markReferenced: function () { + this.isReferenced = true; + }, + getIsReferenced: function () { + return !this.currentFileInfo.reference || this.isReferenced; + }, + getIsOutput: function () { + return this.evaldCondition; + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.UnicodeDescriptor = function (value) { + this.value = value; + }; + tree.UnicodeDescriptor.prototype = { + type: "UnicodeDescriptor", + genCSS: function (env, output) { + output.add(this.value); + }, + toCSS: tree.toCSS, + eval: function () { + return this; + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.URL = function (val, currentFileInfo, isEvald) { + this.value = val; + this.currentFileInfo = currentFileInfo; + this.isEvald = isEvald; + }; + tree.URL.prototype = { + type: "Url", + accept: function (visitor) { + this.value = visitor.visit(this.value); + }, + genCSS: function (env, output) { + output.add("url("); + this.value.genCSS(env, output); + output.add(")"); + }, + toCSS: tree.toCSS, + eval: function (ctx) { + var val = this.value.eval(ctx), + rootpath; + + if (!this.isEvald) { + // Add the base path if the URL is relative + rootpath = this.currentFileInfo && this.currentFileInfo.rootpath; + if (rootpath && typeof val.value === "string" && ctx.isPathRelative(val.value)) { + if (!val.quote) { + rootpath = rootpath.replace(/[\(\)'"\s]/g, function (match) { + return "\\" + match; + }); + } + val.value = rootpath + val.value; + } + + val.value = ctx.normalizePath(val.value); + + // Add url args if enabled + if (ctx.urlArgs) { + if (!val.value.match(/^\s*data:/)) { + var delimiter = val.value.indexOf('?') === -1 ? '?' : '&'; + var urlArgs = delimiter + ctx.urlArgs; + if (val.value.indexOf('#') !== -1) { + val.value = val.value.replace('#', urlArgs + '#'); + } else { + val.value += urlArgs; + } + } + } + } + + return new (tree.URL)(val, this.currentFileInfo, true); + } + }; + +})(require('../tree')); + +(function (tree) { + + tree.Value = function (value) { + this.value = value; + }; + tree.Value.prototype = { + type: "Value", + accept: function (visitor) { + if (this.value) { + this.value = visitor.visitArray(this.value); + } + }, + eval: function (env) { + if (this.value.length === 1) { + return this.value[0].eval(env); + } else { + return new (tree.Value)(this.value.map(function (v) { + return v.eval(env); + })); + } + }, + genCSS: function (env, output) { + var i; + for (i = 0; i < this.value.length; i++) { + this.value[i].genCSS(env, output); + if (i + 1 < this.value.length) { + output.add((env && env.compress) ? ',' : ', '); + } + } + }, + toCSS: tree.toCSS + }; + +})(require('../tree')); + +(function (tree) { + + tree.Variable = function (name, index, currentFileInfo) { + this.name = name; + this.index = index; + this.currentFileInfo = currentFileInfo || {}; + }; + tree.Variable.prototype = { + type: "Variable", + eval: function (env) { + var variable, name = this.name; + + if (name.indexOf('@@') === 0) { + name = '@' + new (tree.Variable)(name.slice(1)).eval(env).value; + } + + if (this.evaluating) { + throw { + type: 'Name', + message: "Recursive variable definition for " + name, + filename: this.currentFileInfo.file, + index: this.index + }; + } + + this.evaluating = true; + + variable = tree.find(env.frames, function (frame) { + var v = frame.variable(name); + if (v) { + return v.value.eval(env); + } + }); + if (variable) { + this.evaluating = false; + return variable; + } else { + throw { + type: 'Name', + message: "variable " + name + " is undefined", + filename: this.currentFileInfo.filename, + index: this.index + }; + } + } + }; + +})(require('../tree')); + +(function (tree) { + + var parseCopyProperties = [ + 'paths', // option - unmodified - paths to search for imports on + 'optimization', // option - optimization level (for the chunker) + 'files', // list of files that have been imported, used for import-once + 'contents', // map - filename to contents of all the files + 'contentsIgnoredChars', // map - filename to lines at the begining of each file to ignore + 'relativeUrls', // option - whether to adjust URL's to be relative + 'rootpath', // option - rootpath to append to URL's + 'strictImports', // option - + 'insecure', // option - whether to allow imports from insecure ssl hosts + 'dumpLineNumbers', // option - whether to dump line numbers + 'compress', // option - whether to compress + 'processImports', // option - whether to process imports. if false then imports will not be imported + 'syncImport', // option - whether to import synchronously + 'javascriptEnabled',// option - whether JavaScript is enabled. if undefined, defaults to true + 'mime', // browser only - mime type for sheet import + 'useFileCache', // browser only - whether to use the per file session cache + 'currentFileInfo' // information about the current file - for error reporting and importing and making urls relative etc. + ]; + + //currentFileInfo = { + // 'relativeUrls' - option - whether to adjust URL's to be relative + // 'filename' - full resolved filename of current file + // 'rootpath' - path to append to normal URLs for this node + // 'currentDirectory' - path to the current file, absolute + // 'rootFilename' - filename of the base file + // 'entryPath' - absolute path to the entry file + // 'reference' - whether the file should not be output and only output parts that are referenced + + tree.parseEnv = function (options) { + copyFromOriginal(options, this, parseCopyProperties); + + if (!this.contents) { + this.contents = {}; + } + if (!this.contentsIgnoredChars) { + this.contentsIgnoredChars = {}; + } + if (!this.files) { + this.files = {}; + } + + if (typeof this.paths === "string") { + this.paths = [this.paths]; + } + + if (!this.currentFileInfo) { + var filename = (options && options.filename) || "input"; + var entryPath = filename.replace(/[^\/\\]*$/, ""); + if (options) { + options.filename = null; + } + this.currentFileInfo = { + filename: filename, + relativeUrls: this.relativeUrls, + rootpath: (options && options.rootpath) || "", + currentDirectory: entryPath, + entryPath: entryPath, + rootFilename: filename + }; + } + }; + + var evalCopyProperties = [ + 'silent', // whether to swallow errors and warnings + 'verbose', // whether to log more activity + 'compress', // whether to compress + 'yuicompress', // whether to compress with the outside tool yui compressor + 'ieCompat', // whether to enforce IE compatibility (IE8 data-uri) + 'strictMath', // whether math has to be within parenthesis + 'strictUnits', // whether units need to evaluate correctly + 'cleancss', // whether to compress with clean-css + 'sourceMap', // whether to output a source map + 'importMultiple', // whether we are currently importing multiple copies + 'urlArgs' // whether to add args into url tokens + ]; + + tree.evalEnv = function (options, frames) { + copyFromOriginal(options, this, evalCopyProperties); + + this.frames = frames || []; + }; + + tree.evalEnv.prototype.inParenthesis = function () { + if (!this.parensStack) { + this.parensStack = []; + } + this.parensStack.push(true); + }; + + tree.evalEnv.prototype.outOfParenthesis = function () { + this.parensStack.pop(); + }; + + tree.evalEnv.prototype.isMathOn = function () { + return this.strictMath ? (this.parensStack && this.parensStack.length) : true; + }; + + tree.evalEnv.prototype.isPathRelative = function (path) { + return !/^(?:[a-z-]+:|\/)/.test(path); + }; + + tree.evalEnv.prototype.normalizePath = function (path) { + var + segments = path.split("/").reverse(), + segment; + + path = []; + while (segments.length !== 0) { + segment = segments.pop(); + switch (segment) { + case ".": + break; + case "..": + if ((path.length === 0) || (path[path.length - 1] === "..")) { + path.push(segment); + } else { + path.pop(); + } + break; + default: + path.push(segment); + break; + } + } + + return path.join("/"); + }; + + //todo - do the same for the toCSS env + //tree.toCSSEnv = function (options) { + //}; + + var copyFromOriginal = function (original, destination, propertiesToCopy) { + if (!original) { + return; + } + + for (var i = 0; i < propertiesToCopy.length; i++) { + if (original.hasOwnProperty(propertiesToCopy[i])) { + destination[propertiesToCopy[i]] = original[propertiesToCopy[i]]; + } + } + }; + +})(require('./tree')); + +(function (tree) { + + var _visitArgs = {visitDeeper: true}, + _hasIndexed = false; + + function _noop(node) { + return node; + } + + function indexNodeTypes(parent, ticker) { + // add .typeIndex to tree node types for lookup table + var key, child; + for (key in parent) { + if (parent.hasOwnProperty(key)) { + child = parent[key]; + switch (typeof child) { + case "function": + // ignore bound functions directly on tree which do not have a prototype + // or aren't nodes + if (child.prototype && child.prototype.type) { + child.prototype.typeIndex = ticker++; + } + break; + case "object": + ticker = indexNodeTypes(child, ticker); + break; + } + } + } + return ticker; + } + + tree.visitor = function (implementation) { + this._implementation = implementation; + this._visitFnCache = []; + + if (!_hasIndexed) { + indexNodeTypes(tree, 1); + _hasIndexed = true; + } + }; + + tree.visitor.prototype = { + visit: function (node) { + if (!node) { + return node; + } + + var nodeTypeIndex = node.typeIndex; + if (!nodeTypeIndex) { + return node; + } + + var visitFnCache = this._visitFnCache, + impl = this._implementation, + aryIndx = nodeTypeIndex << 1, + outAryIndex = aryIndx | 1, + func = visitFnCache[aryIndx], + funcOut = visitFnCache[outAryIndex], + visitArgs = _visitArgs, + fnName; + + visitArgs.visitDeeper = true; + + if (!func) { + fnName = "visit" + node.type; + func = impl[fnName] || _noop; + funcOut = impl[fnName + "Out"] || _noop; + visitFnCache[aryIndx] = func; + visitFnCache[outAryIndex] = funcOut; + } + + if (func !== _noop) { + var newNode = func.call(impl, node, visitArgs); + if (impl.isReplacing) { + node = newNode; + } + } + + if (visitArgs.visitDeeper && node && node.accept) { + node.accept(this); + } + + if (funcOut != _noop) { + funcOut.call(impl, node); + } + + return node; + }, + visitArray: function (nodes, nonReplacing) { + if (!nodes) { + return nodes; + } + + var cnt = nodes.length, i; + + // Non-replacing + if (nonReplacing || !this._implementation.isReplacing) { + for (i = 0; i < cnt; i++) { + this.visit(nodes[i]); + } + return nodes; + } + + // Replacing + var out = []; + for (i = 0; i < cnt; i++) { + var evald = this.visit(nodes[i]); + if (!evald.splice) { + out.push(evald); + } else if (evald.length) { + this.flatten(evald, out); + } + } + return out; + }, + flatten: function (arr, out) { + if (!out) { + out = []; + } + + var cnt, i, item, + nestedCnt, j, nestedItem; + + for (i = 0, cnt = arr.length; i < cnt; i++) { + item = arr[i]; + if (!item.splice) { + out.push(item); + continue; + } + + for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) { + nestedItem = item[j]; + if (!nestedItem.splice) { + out.push(nestedItem); + } else if (nestedItem.length) { + this.flatten(nestedItem, out); + } + } + } + + return out; + } + }; + +})(require('./tree')); +(function (tree) { + tree.importVisitor = function (importer, finish, evalEnv, onceFileDetectionMap, recursionDetector) { + this._visitor = new tree.visitor(this); + this._importer = importer; + this._finish = finish; + this.env = evalEnv || new tree.evalEnv(); + this.importCount = 0; + this.onceFileDetectionMap = onceFileDetectionMap || {}; + this.recursionDetector = {}; + if (recursionDetector) { + for (var fullFilename in recursionDetector) { + if (recursionDetector.hasOwnProperty(fullFilename)) { + this.recursionDetector[fullFilename] = true; + } + } + } + }; + + tree.importVisitor.prototype = { + isReplacing: true, + run: function (root) { + var error; + try { + // process the contents + this._visitor.visit(root); + } + catch (e) { + error = e; + } + + this.isFinished = true; + + if (this.importCount === 0) { + this._finish(error); + } + }, + visitImport: function (importNode, visitArgs) { + var importVisitor = this, + evaldImportNode, + inlineCSS = importNode.options.inline; + + if (!importNode.css || inlineCSS) { + + try { + evaldImportNode = importNode.evalForImport(this.env); + } catch (e) { + if (!e.filename) { + e.index = importNode.index; + e.filename = importNode.currentFileInfo.filename; + } + // attempt to eval properly and treat as css + importNode.css = true; + // if that fails, this error will be thrown + importNode.error = e; + } + + if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) { + importNode = evaldImportNode; + this.importCount++; + var env = new tree.evalEnv(this.env, this.env.frames.slice(0)); + + if (importNode.options.multiple) { + env.importMultiple = true; + } + + this._importer.push(importNode.getPath(), importNode.currentFileInfo, importNode.options, function (e, root, importedAtRoot, fullPath) { + if (e && !e.filename) { + e.index = importNode.index; + e.filename = importNode.currentFileInfo.filename; + } + + var duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector; + if (!env.importMultiple) { + if (duplicateImport) { + importNode.skip = true; + } else { + importNode.skip = function () { + if (fullPath in importVisitor.onceFileDetectionMap) { + return true; + } + importVisitor.onceFileDetectionMap[fullPath] = true; + return false; + }; + } + } + + var subFinish = function (e) { + importVisitor.importCount--; + + if (importVisitor.importCount === 0 && importVisitor.isFinished) { + importVisitor._finish(e); + } + }; + + if (root) { + importNode.root = root; + importNode.importedFilename = fullPath; + + if (!inlineCSS && (env.importMultiple || !duplicateImport)) { + importVisitor.recursionDetector[fullPath] = true; + new (tree.importVisitor)(importVisitor._importer, subFinish, env, importVisitor.onceFileDetectionMap, importVisitor.recursionDetector) + .run(root); + return; + } + } + + subFinish(); + }); + } + } + visitArgs.visitDeeper = false; + return importNode; + }, + visitRule: function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + return ruleNode; + }, + visitDirective: function (directiveNode, visitArgs) { + this.env.frames.unshift(directiveNode); + return directiveNode; + }, + visitDirectiveOut: function (directiveNode) { + this.env.frames.shift(); + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + this.env.frames.unshift(mixinDefinitionNode); + return mixinDefinitionNode; + }, + visitMixinDefinitionOut: function (mixinDefinitionNode) { + this.env.frames.shift(); + }, + visitRuleset: function (rulesetNode, visitArgs) { + this.env.frames.unshift(rulesetNode); + return rulesetNode; + }, + visitRulesetOut: function (rulesetNode) { + this.env.frames.shift(); + }, + visitMedia: function (mediaNode, visitArgs) { + this.env.frames.unshift(mediaNode.rules[0]); + return mediaNode; + }, + visitMediaOut: function (mediaNode) { + this.env.frames.shift(); + } + }; + +})(require('./tree')); +(function (tree) { + tree.joinSelectorVisitor = function () { + this.contexts = [[]]; + this._visitor = new tree.visitor(this); + }; + + tree.joinSelectorVisitor.prototype = { + run: function (root) { + return this._visitor.visit(root); + }, + visitRule: function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + + visitRuleset: function (rulesetNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1], + paths = [], selectors; + + this.contexts.push(paths); + + if (!rulesetNode.root) { + selectors = rulesetNode.selectors; + if (selectors) { + selectors = selectors.filter(function (selector) { + return selector.getIsOutput(); + }); + rulesetNode.selectors = selectors.length ? selectors : (selectors = null); + if (selectors) { + rulesetNode.joinSelectors(paths, context, selectors); + } + } + if (!selectors) { + rulesetNode.rules = null; + } + rulesetNode.paths = paths; + } + }, + visitRulesetOut: function (rulesetNode) { + this.contexts.length = this.contexts.length - 1; + }, + visitMedia: function (mediaNode, visitArgs) { + var context = this.contexts[this.contexts.length - 1]; + mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia); + } + }; + +})(require('./tree')); +(function (tree) { + tree.toCSSVisitor = function (env) { + this._visitor = new tree.visitor(this); + this._env = env; + }; + + tree.toCSSVisitor.prototype = { + isReplacing: true, + run: function (root) { + return this._visitor.visit(root); + }, + + visitRule: function (ruleNode, visitArgs) { + if (ruleNode.variable) { + return []; + } + return ruleNode; + }, + + visitMixinDefinition: function (mixinNode, visitArgs) { + // mixin definitions do not get eval'd - this means they keep state + // so we have to clear that state here so it isn't used if toCSS is called twice + mixinNode.frames = []; + return []; + }, + + visitExtend: function (extendNode, visitArgs) { + return []; + }, + + visitComment: function (commentNode, visitArgs) { + if (commentNode.isSilent(this._env)) { + return []; + } + return commentNode; + }, + + visitMedia: function (mediaNode, visitArgs) { + mediaNode.accept(this._visitor); + visitArgs.visitDeeper = false; + + if (!mediaNode.rules.length) { + return []; + } + return mediaNode; + }, + + visitDirective: function (directiveNode, visitArgs) { + if (directiveNode.currentFileInfo.reference && !directiveNode.isReferenced) { + return []; + } + if (directiveNode.name === "@charset") { + // Only output the debug info together with subsequent @charset definitions + // a comment (or @media statement) before the actual @charset directive would + // be considered illegal css as it has to be on the first line + if (this.charset) { + if (directiveNode.debugInfo) { + var comment = new tree.Comment("/* " + directiveNode.toCSS(this._env).replace(/\n/g, "") + " */\n"); + comment.debugInfo = directiveNode.debugInfo; + return this._visitor.visit(comment); + } + return []; + } + this.charset = true; + } + if (directiveNode.rules && directiveNode.rules.rules) { + this._mergeRules(directiveNode.rules.rules); + } + return directiveNode; + }, + + checkPropertiesInRoot: function (rules) { + var ruleNode; + for (var i = 0; i < rules.length; i++) { + ruleNode = rules[i]; + if (ruleNode instanceof tree.Rule && !ruleNode.variable) { + throw { + message: "properties must be inside selector blocks, they cannot be in the root.", + index: ruleNode.index, + filename: ruleNode.currentFileInfo ? ruleNode.currentFileInfo.filename : null + }; + } + } + }, + + visitRuleset: function (rulesetNode, visitArgs) { + var rule, rulesets = []; + if (rulesetNode.firstRoot) { + this.checkPropertiesInRoot(rulesetNode.rules); + } + if (!rulesetNode.root) { + if (rulesetNode.paths) { + rulesetNode.paths = rulesetNode.paths + .filter(function (p) { + var i; + if (p[0].elements[0].combinator.value === ' ') { + p[0].elements[0].combinator = new (tree.Combinator)(''); + } + for (i = 0; i < p.length; i++) { + if (p[i].getIsReferenced() && p[i].getIsOutput()) { + return true; + } + } + return false; + }); + } + + // Compile rules and rulesets + var nodeRules = rulesetNode.rules, nodeRuleCnt = nodeRules ? nodeRules.length : 0; + for (var i = 0; i < nodeRuleCnt;) { + rule = nodeRules[i]; + if (rule && rule.rules) { + // visit because we are moving them out from being a child + rulesets.push(this._visitor.visit(rule)); + nodeRules.splice(i, 1); + nodeRuleCnt--; + continue; + } + i++; + } + // accept the visitor to remove rules and refactor itself + // then we can decide now whether we want it or not + if (nodeRuleCnt > 0) { + rulesetNode.accept(this._visitor); + } else { + rulesetNode.rules = null; + } + visitArgs.visitDeeper = false; + + nodeRules = rulesetNode.rules; + if (nodeRules) { + this._mergeRules(nodeRules); + nodeRules = rulesetNode.rules; + } + if (nodeRules) { + this._removeDuplicateRules(nodeRules); + nodeRules = rulesetNode.rules; + } + + // now decide whether we keep the ruleset + if (nodeRules && nodeRules.length > 0 && rulesetNode.paths.length > 0) { + rulesets.splice(0, 0, rulesetNode); + } + } else { + rulesetNode.accept(this._visitor); + visitArgs.visitDeeper = false; + if (rulesetNode.firstRoot || (rulesetNode.rules && rulesetNode.rules.length > 0)) { + rulesets.splice(0, 0, rulesetNode); + } + } + if (rulesets.length === 1) { + return rulesets[0]; + } + return rulesets; + }, + + _removeDuplicateRules: function (rules) { + if (!rules) { + return; + } + + // remove duplicates + var ruleCache = {}, + ruleList, rule, i; + + for (i = rules.length - 1; i >= 0; i--) { + rule = rules[i]; + if (rule instanceof tree.Rule) { + if (!ruleCache[rule.name]) { + ruleCache[rule.name] = rule; + } else { + ruleList = ruleCache[rule.name]; + if (ruleList instanceof tree.Rule) { + ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._env)]; + } + var ruleCSS = rule.toCSS(this._env); + if (ruleList.indexOf(ruleCSS) !== -1) { + rules.splice(i, 1); + } else { + ruleList.push(ruleCSS); + } + } + } + } + }, + + _mergeRules: function (rules) { + if (!rules) { + return; + } + + var groups = {}, + parts, + rule, + key; + + for (var i = 0; i < rules.length; i++) { + rule = rules[i]; + + if ((rule instanceof tree.Rule) && rule.merge) { + key = [rule.name, + rule.important ? "!" : ""].join(","); + + if (!groups[key]) { + groups[key] = []; + } else { + rules.splice(i--, 1); + } + + groups[key].push(rule); + } + } + + Object.keys(groups).map(function (k) { + + function toExpression(values) { + return new (tree.Expression)(values.map(function (p) { + return p.value; + })); + } + + function toValue(values) { + return new (tree.Value)(values.map(function (p) { + return p; + })); + } + + parts = groups[k]; + + if (parts.length > 1) { + rule = parts[0]; + var spacedGroups = []; + var lastSpacedGroup = []; + parts.map(function (p) { + if (p.merge === "+") { + if (lastSpacedGroup.length > 0) { + spacedGroups.push(toExpression(lastSpacedGroup)); + } + lastSpacedGroup = []; + } + lastSpacedGroup.push(p); + }); + spacedGroups.push(toExpression(lastSpacedGroup)); + rule.value = toValue(spacedGroups); + } + }); + } + }; + +})(require('./tree')); +(function (tree) { + /*jshint loopfunc:true */ + + tree.extendFinderVisitor = function () { + this._visitor = new tree.visitor(this); + this.contexts = []; + this.allExtendsStack = [[]]; + }; + + tree.extendFinderVisitor.prototype = { + run: function (root) { + root = this._visitor.visit(root); + root.allExtends = this.allExtendsStack[0]; + return root; + }, + visitRule: function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitRuleset: function (rulesetNode, visitArgs) { + if (rulesetNode.root) { + return; + } + + var i, j, extend, allSelectorsExtendList = [], extendList; + + // get &:extend(.a); rules which apply to all selectors in this ruleset + var rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0; + for (i = 0; i < ruleCnt; i++) { + if (rulesetNode.rules[i] instanceof tree.Extend) { + allSelectorsExtendList.push(rules[i]); + rulesetNode.extendOnEveryPath = true; + } + } + + // now find every selector and apply the extends that apply to all extends + // and the ones which apply to an individual extend + var paths = rulesetNode.paths; + for (i = 0; i < paths.length; i++) { + var selectorPath = paths[i], + selector = selectorPath[selectorPath.length - 1], + selExtendList = selector.extendList; + + extendList = selExtendList ? selExtendList.slice(0).concat(allSelectorsExtendList) + : allSelectorsExtendList; + + if (extendList) { + extendList = extendList.map(function (allSelectorsExtend) { + return allSelectorsExtend.clone(); + }); + } + + for (j = 0; j < extendList.length; j++) { + this.foundExtends = true; + extend = extendList[j]; + extend.findSelfSelectors(selectorPath); + extend.ruleset = rulesetNode; + if (j === 0) { + extend.firstExtendOnThisSelectorPath = true; + } + this.allExtendsStack[this.allExtendsStack.length - 1].push(extend); + } + } + + this.contexts.push(rulesetNode.selectors); + }, + visitRulesetOut: function (rulesetNode) { + if (!rulesetNode.root) { + this.contexts.length = this.contexts.length - 1; + } + }, + visitMedia: function (mediaNode, visitArgs) { + mediaNode.allExtends = []; + this.allExtendsStack.push(mediaNode.allExtends); + }, + visitMediaOut: function (mediaNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + }, + visitDirective: function (directiveNode, visitArgs) { + directiveNode.allExtends = []; + this.allExtendsStack.push(directiveNode.allExtends); + }, + visitDirectiveOut: function (directiveNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + } + }; + + tree.processExtendsVisitor = function () { + this._visitor = new tree.visitor(this); + }; + + tree.processExtendsVisitor.prototype = { + run: function (root) { + var extendFinder = new tree.extendFinderVisitor(); + extendFinder.run(root); + if (!extendFinder.foundExtends) { + return root; + } + root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends)); + this.allExtendsStack = [root.allExtends]; + return this._visitor.visit(root); + }, + doExtendChaining: function (extendsList, extendsListTarget, iterationCount) { + // + // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering and pasting + // the selector we would do normally, but we are also adding an extend with the same target selector + // this means this new extend can then go and alter other extends + // + // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors + // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already processed if + // we look at each selector at a time, as is done in visitRuleset + + var extendIndex, targetExtendIndex, matches, extendsToAdd = [], newSelector, extendVisitor = this, selectorPath, extend, targetExtend, newExtend; + + iterationCount = iterationCount || 0; + + //loop through comparing every extend with every target extend. + // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place + // e.g. .a:extend(.b) {} and .b:extend(.c) {} then the first extend extends the second one + // and the second is the target. + // the seperation into two lists allows us to process a subset of chains with a bigger set, as is the + // case when processing media queries + for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) { + for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) { + + extend = extendsList[extendIndex]; + targetExtend = extendsListTarget[targetExtendIndex]; + + // look for circular references + if (extend.parent_ids.indexOf(targetExtend.object_id) >= 0) { + continue; + } + + // find a match in the target extends self selector (the bit before :extend) + selectorPath = [targetExtend.selfSelectors[0]]; + matches = extendVisitor.findMatch(extend, selectorPath); + + if (matches.length) { + + // we found a match, so for each self selector.. + extend.selfSelectors.forEach(function (selfSelector) { + + // process the extend as usual + newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector); + + // but now we create a new extend from it + newExtend = new (tree.Extend)(targetExtend.selector, targetExtend.option, 0); + newExtend.selfSelectors = newSelector; + + // add the extend onto the list of extends for that selector + newSelector[newSelector.length - 1].extendList = [newExtend]; + + // record that we need to add it. + extendsToAdd.push(newExtend); + newExtend.ruleset = targetExtend.ruleset; + + //remember its parents for circular references + newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids); + + // only process the selector once.. if we have :extend(.a,.b) then multiple + // extends will look at the same selector path, so when extending + // we know that any others will be duplicates in terms of what is added to the css + if (targetExtend.firstExtendOnThisSelectorPath) { + newExtend.firstExtendOnThisSelectorPath = true; + targetExtend.ruleset.paths.push(newSelector); + } + }); + } + } + } + + if (extendsToAdd.length) { + // try to detect circular references to stop a stack overflow. + // may no longer be needed. + this.extendChainCount++; + if (iterationCount > 100) { + var selectorOne = "{unable to calculate}"; + var selectorTwo = "{unable to calculate}"; + try { + selectorOne = extendsToAdd[0].selfSelectors[0].toCSS(); + selectorTwo = extendsToAdd[0].selector.toCSS(); + } + catch (e) { + } + throw {message: "extend circular reference detected. One of the circular extends is currently:" + selectorOne + ":extend(" + selectorTwo + ")"}; + } + + // now process the new extends on the existing rules so that we can handle a extending b extending c ectending d extending e... + return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1)); + } else { + return extendsToAdd; + } + }, + visitRule: function (ruleNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitMixinDefinition: function (mixinDefinitionNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitSelector: function (selectorNode, visitArgs) { + visitArgs.visitDeeper = false; + }, + visitRuleset: function (rulesetNode, visitArgs) { + if (rulesetNode.root) { + return; + } + var matches, pathIndex, extendIndex, allExtends = this.allExtendsStack[this.allExtendsStack.length - 1], selectorsToAdd = [], extendVisitor = this, selectorPath; + + // look at each selector path in the ruleset, find any extend matches and then copy, find and replace + + for (extendIndex = 0; extendIndex < allExtends.length; extendIndex++) { + for (pathIndex = 0; pathIndex < rulesetNode.paths.length; pathIndex++) { + selectorPath = rulesetNode.paths[pathIndex]; + + // extending extends happens initially, before the main pass + if (rulesetNode.extendOnEveryPath) { + continue; + } + var extendList = selectorPath[selectorPath.length - 1].extendList; + if (extendList && extendList.length) { + continue; + } + + matches = this.findMatch(allExtends[extendIndex], selectorPath); + + if (matches.length) { + + allExtends[extendIndex].selfSelectors.forEach(function (selfSelector) { + selectorsToAdd.push(extendVisitor.extendSelector(matches, selectorPath, selfSelector)); + }); + } + } + } + rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd); + }, + findMatch: function (extend, haystackSelectorPath) { + // + // look through the haystack selector path to try and find the needle - extend.selector + // returns an array of selector matches that can then be replaced + // + var haystackSelectorIndex, hackstackSelector, hackstackElementIndex, haystackElement, + targetCombinator, i, + extendVisitor = this, + needleElements = extend.selector.elements, + potentialMatches = [], potentialMatch, matches = []; + + // loop through the haystack elements + for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) { + hackstackSelector = haystackSelectorPath[haystackSelectorIndex]; + + for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) { + + haystackElement = hackstackSelector.elements[hackstackElementIndex]; + + // if we allow elements before our match we can add a potential match every time. otherwise only at the first element. + if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) { + potentialMatches.push({ + pathIndex: haystackSelectorIndex, + index: hackstackElementIndex, + matched: 0, + initialCombinator: haystackElement.combinator + }); + } + + for (i = 0; i < potentialMatches.length; i++) { + potentialMatch = potentialMatches[i]; + + // selectors add " " onto the first element. When we use & it joins the selectors together, but if we don't + // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to work out + // what the resulting combinator will be + targetCombinator = haystackElement.combinator.value; + if (targetCombinator === '' && hackstackElementIndex === 0) { + targetCombinator = ' '; + } + + // if we don't match, null our match to indicate failure + if (!extendVisitor.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) || + (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) { + potentialMatch = null; + } else { + potentialMatch.matched++; + } + + // if we are still valid and have finished, test whether we have elements after and whether these are allowed + if (potentialMatch) { + potentialMatch.finished = potentialMatch.matched === needleElements.length; + if (potentialMatch.finished && + (!extend.allowAfter && (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) { + potentialMatch = null; + } + } + // if null we remove, if not, we are still valid, so either push as a valid match or continue + if (potentialMatch) { + if (potentialMatch.finished) { + potentialMatch.length = needleElements.length; + potentialMatch.endPathIndex = haystackSelectorIndex; + potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match + potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again + matches.push(potentialMatch); + } + } else { + potentialMatches.splice(i, 1); + i--; + } + } + } + } + return matches; + }, + isElementValuesEqual: function (elementValue1, elementValue2) { + if (typeof elementValue1 === "string" || typeof elementValue2 === "string") { + return elementValue1 === elementValue2; + } + if (elementValue1 instanceof tree.Attribute) { + if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) { + return false; + } + if (!elementValue1.value || !elementValue2.value) { + if (elementValue1.value || elementValue2.value) { + return false; + } + return true; + } + elementValue1 = elementValue1.value.value || elementValue1.value; + elementValue2 = elementValue2.value.value || elementValue2.value; + return elementValue1 === elementValue2; + } + elementValue1 = elementValue1.value; + elementValue2 = elementValue2.value; + if (elementValue1 instanceof tree.Selector) { + if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) { + return false; + } + for (var i = 0; i < elementValue1.elements.length; i++) { + if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) { + if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) { + return false; + } + } + if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) { + return false; + } + } + return true; + } + return false; + }, + extendSelector: function (matches, selectorPath, replacementSelector) { + + //for a set of matches, replace each match with the replacement selector + + var currentSelectorPathIndex = 0, + currentSelectorPathElementIndex = 0, + path = [], + matchIndex, + selector, + firstElement, + match, + newElements; + + for (matchIndex = 0; matchIndex < matches.length; matchIndex++) { + match = matches[matchIndex]; + selector = selectorPath[match.pathIndex]; + firstElement = new tree.Element( + match.initialCombinator, + replacementSelector.elements[0].value, + replacementSelector.elements[0].index, + replacementSelector.elements[0].currentFileInfo + ); + + if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) { + path[path.length - 1].elements = path[path.length - 1].elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); + currentSelectorPathElementIndex = 0; + currentSelectorPathIndex++; + } + + newElements = selector.elements + .slice(currentSelectorPathElementIndex, match.index) + .concat([firstElement]) + .concat(replacementSelector.elements.slice(1)); + + if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) { + path[path.length - 1].elements = + path[path.length - 1].elements.concat(newElements); + } else { + path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex)); + + path.push(new tree.Selector( + newElements + )); + } + currentSelectorPathIndex = match.endPathIndex; + currentSelectorPathElementIndex = match.endPathElementIndex; + if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) { + currentSelectorPathElementIndex = 0; + currentSelectorPathIndex++; + } + } + + if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) { + path[path.length - 1].elements = path[path.length - 1].elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex)); + currentSelectorPathIndex++; + } + + path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length)); + + return path; + }, + visitRulesetOut: function (rulesetNode) { + }, + visitMedia: function (mediaNode, visitArgs) { + var newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); + newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends)); + this.allExtendsStack.push(newAllExtends); + }, + visitMediaOut: function (mediaNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + }, + visitDirective: function (directiveNode, visitArgs) { + var newAllExtends = directiveNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]); + newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, directiveNode.allExtends)); + this.allExtendsStack.push(newAllExtends); + }, + visitDirectiveOut: function (directiveNode) { + this.allExtendsStack.length = this.allExtendsStack.length - 1; + } + }; + +})(require('./tree')); + +(function (tree) { + + tree.sourceMapOutput = function (options) { + this._css = []; + this._rootNode = options.rootNode; + this._writeSourceMap = options.writeSourceMap; + this._contentsMap = options.contentsMap; + this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap; + this._sourceMapFilename = options.sourceMapFilename; + this._outputFilename = options.outputFilename; + this._sourceMapURL = options.sourceMapURL; + if (options.sourceMapBasepath) { + this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\/g, '/'); + } + this._sourceMapRootpath = options.sourceMapRootpath; + this._outputSourceFiles = options.outputSourceFiles; + this._sourceMapGeneratorConstructor = options.sourceMapGenerator || require("source-map").SourceMapGenerator; + + if (this._sourceMapRootpath && this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') { + this._sourceMapRootpath += '/'; + } + + this._lineNumber = 0; + this._column = 0; + }; + + tree.sourceMapOutput.prototype.normalizeFilename = function (filename) { + filename = filename.replace(/\\/g, '/'); + + if (this._sourceMapBasepath && filename.indexOf(this._sourceMapBasepath) === 0) { + filename = filename.substring(this._sourceMapBasepath.length); + if (filename.charAt(0) === '\\' || filename.charAt(0) === '/') { + filename = filename.substring(1); + } + } + return (this._sourceMapRootpath || "") + filename; + }; + + tree.sourceMapOutput.prototype.add = function (chunk, fileInfo, index, mapLines) { + + //ignore adding empty strings + if (!chunk) { + return; + } + + var lines, + sourceLines, + columns, + sourceColumns, + i; + + if (fileInfo) { + var inputSource = this._contentsMap[fileInfo.filename]; + + // remove vars/banner added to the top of the file + if (this._contentsIgnoredCharsMap[fileInfo.filename]) { + // adjust the index + index -= this._contentsIgnoredCharsMap[fileInfo.filename]; + if (index < 0) { + index = 0; + } + // adjust the source + inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]); + } + inputSource = inputSource.substring(0, index); + sourceLines = inputSource.split("\n"); + sourceColumns = sourceLines[sourceLines.length - 1]; + } + + lines = chunk.split("\n"); + columns = lines[lines.length - 1]; + + if (fileInfo) { + if (!mapLines) { + this._sourceMapGenerator.addMapping({ + generated: {line: this._lineNumber + 1, column: this._column}, + original: {line: sourceLines.length, column: sourceColumns.length}, + source: this.normalizeFilename(fileInfo.filename) + }); + } else { + for (i = 0; i < lines.length; i++) { + this._sourceMapGenerator.addMapping({ + generated: {line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0}, + original: {line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0}, + source: this.normalizeFilename(fileInfo.filename) + }); + } + } + } + + if (lines.length === 1) { + this._column += columns.length; + } else { + this._lineNumber += lines.length - 1; + this._column = columns.length; + } + + this._css.push(chunk); + }; + + tree.sourceMapOutput.prototype.isEmpty = function () { + return this._css.length === 0; + }; + + tree.sourceMapOutput.prototype.toCSS = function (env) { + this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ + file: this._outputFilename, + sourceRoot: null + }); + + if (this._outputSourceFiles) { + for (var filename in this._contentsMap) { + if (this._contentsMap.hasOwnProperty(filename)) { + var source = this._contentsMap[filename]; + if (this._contentsIgnoredCharsMap[filename]) { + source = source.slice(this._contentsIgnoredCharsMap[filename]); + } + this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source); + } + } + } + + this._rootNode.genCSS(env, this); + + if (this._css.length > 0) { + var sourceMapURL, + sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON()); + + if (this._sourceMapURL) { + sourceMapURL = this._sourceMapURL; + } else if (this._sourceMapFilename) { + sourceMapURL = this.normalizeFilename(this._sourceMapFilename); + } + + if (this._writeSourceMap) { + this._writeSourceMap(sourceMapContent); + } else { + sourceMapURL = "data:application/json;base64," + require('./encoder.js').encodeBase64(sourceMapContent); + } + + if (sourceMapURL) { + this._css.push("/*# sourceMappingURL=" + sourceMapURL + " */"); + } + } + + return this._css.join(''); + }; + +})(require('./tree')); + +// wraps the source-map code in a less module +(function () { + less.modules["source-map"] = function () { + + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + + /** + * Define a module along with a payload. + * @param {string} moduleName Name for the payload + * @param {ignored} deps Ignored. For compatibility with CommonJS AMD Spec + * @param {function} payload Function with (require, exports, module) params + */ + function define(moduleName, deps, payload) { + if (typeof moduleName != "string") { + throw new TypeError('Expected string, got: ' + moduleName); + } + + if (arguments.length == 2) { + payload = deps; + } + + if (moduleName in define.modules) { + throw new Error("Module already defined: " + moduleName); + } + define.modules[moduleName] = payload; + }; + + /** + * The global store of un-instantiated modules + */ + define.modules = {}; + + + /** + * We invoke require() in the context of a Domain so we can have multiple + * sets of modules running separate from each other. + * This contrasts with JSMs which are singletons, Domains allows us to + * optionally load a CommonJS module twice with separate data each time. + * Perhaps you want 2 command lines with a different set of commands in each, + * for example. + */ + function Domain() { + this.modules = {}; + this._currentModule = null; + } + + (function () { + + /** + * Lookup module names and resolve them by calling the definition function if + * needed. + * There are 2 ways to call this, either with an array of dependencies and a + * callback to call when the dependencies are found (which can happen + * asynchronously in an in-page context) or with a single string an no callback + * where the dependency is resolved synchronously and returned. + * The API is designed to be compatible with the CommonJS AMD spec and + * RequireJS. + * @param {string[]|string} deps A name, or names for the payload + * @param {function|undefined} callback Function to call when the dependencies + * are resolved + * @return {undefined|object} The module required or undefined for + * array/callback method + */ + Domain.prototype.require = function (deps, callback) { + if (Array.isArray(deps)) { + var params = deps.map(function (dep) { + return this.lookup(dep); + }, this); + if (callback) { + callback.apply(null, params); + } + return undefined; + } + else { + return this.lookup(deps); + } + }; + + function normalize(path) { + var bits = path.split('/'); + var i = 1; + while (i < bits.length) { + if (bits[i] === '..') { + bits.splice(i - 1, 1); + } else if (bits[i] === '.') { + bits.splice(i, 1); + } else { + i++; + } + } + return bits.join('/'); + } + + function join(a, b) { + a = a.trim(); + b = b.trim(); + if (/^\//.test(b)) { + return b; + } else { + return a.replace(/\/*$/, '/') + b; + } + } + + function dirname(path) { + var bits = path.split('/'); + bits.pop(); + return bits.join('/'); + } + + /** + * Lookup module names and resolve them by calling the definition function if + * needed. + * @param {string} moduleName A name for the payload to lookup + * @return {object} The module specified by aModuleName or null if not found. + */ + Domain.prototype.lookup = function (moduleName) { + if (/^\./.test(moduleName)) { + moduleName = normalize(join(dirname(this._currentModule), moduleName)); + } + + if (moduleName in this.modules) { + var module = this.modules[moduleName]; + return module; + } + + if (!(moduleName in define.modules)) { + throw new Error("Module not defined: " + moduleName); + } + + var module = define.modules[moduleName]; + + if (typeof module == "function") { + var exports = {}; + var previousModule = this._currentModule; + this._currentModule = moduleName; + module(this.require.bind(this), exports, {id: moduleName, uri: ""}); + this._currentModule = previousModule; + module = exports; + } + + // cache the resulting module object for next time + this.modules[moduleName] = module; + + return module; + }; + + }()); + + define.Domain = Domain; + define.globalDomain = new Domain(); + var require = define.globalDomain.require.bind(define.globalDomain); + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + define('source-map/source-map-generator', ['require', 'exports', 'module', 'source-map/base64-vlq', 'source-map/util', 'source-map/array-set'], function (require, exports, module) { + + var base64VLQ = require('./base64-vlq'); + var util = require('./util'); + var ArraySet = require('./array-set').ArraySet; + + /** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. To create a new one, you must pass an object + * with the following properties: + * + * - file: The filename of the generated source. + * - sourceRoot: An optional root for all URLs in this source map. + */ + function SourceMapGenerator(aArgs) { + this._file = util.getArg(aArgs, 'file'); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = []; + this._sourcesContents = null; + } + + SourceMapGenerator.prototype._version = 3; + + /** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ + SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source) { + newMapping.source = mapping.source; + if (sourceRoot) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + + /** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ + SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + this._validateMapping(generated, original, source, name); + + if (source && !this._sources.has(source)) { + this._sources.add(source); + } + + if (name && !this._names.has(name)) { + this._names.add(name); + } + + this._mappings.push({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + + /** + * Set the source content for a source file. + */ + SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent !== null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = {}; + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + + /** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + */ + SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile) { + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (!aSourceFile) { + aSourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "aSourceFile" relative if an absolute Url is passed. + if (sourceRoot) { + aSourceFile = util.relative(sourceRoot, aSourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "aSourceFile" + this._mappings.forEach(function (mapping) { + if (mapping.source === aSourceFile && mapping.originalLine) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source !== null) { + // Copy mapping + if (sourceRoot) { + mapping.source = util.relative(sourceRoot, original.source); + } else { + mapping.source = original.source; + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name !== null && mapping.name !== null) { + // Only use the identifier name if it's an identifier + // in both SourceMaps + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + if (sourceRoot) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + + /** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ + SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + + /** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ + SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var mapping; + + // The mappings must be guaranteed to be in sorted order before we start + // serializing them or else the generated line numbers (which are defined + // via the ';' separators) will be all messed up. Note: it might be more + // performant to maintain the sorting as we insert them, rather than as we + // serialize them, but the big O is the same either way. + this._mappings.sort(util.compareByGeneratedPositions); + + for (var i = 0, len = this._mappings.length; i < len; i++) { + mapping = this._mappings[i]; + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + result += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositions(mapping, this._mappings[i - 1])) { + continue; + } + result += ','; + } + } + + result += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source) { + result += base64VLQ.encode(this._sources.indexOf(mapping.source) + - previousSource); + previousSource = this._sources.indexOf(mapping.source); + + // lines are stored 0-based in SourceMap spec version 3 + result += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + result += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name) { + result += base64VLQ.encode(this._names.indexOf(mapping.name) + - previousName); + previousName = this._names.indexOf(mapping.name); + } + } + } + + return result; + }; + + SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, + key) + ? this._sourcesContents[key] + : null; + }, this); + }; + + /** + * Externalize the source map. + */ + SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + file: this._file, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._sourceRoot) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + + /** + * Render the source map being generated to a string. + */ + SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this); + }; + + exports.SourceMapGenerator = SourceMapGenerator; + + }); + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. 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 Google Inc. 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 THE COPYRIGHT + * OWNER OR 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. + */ + define('source-map/base64-vlq', ['require', 'exports', 'module', 'source-map/base64'], function (require, exports, module) { + + var base64 = require('./base64'); + + // A single base 64 digit can contain 6 bits of data. For the base 64 variable + // length quantities we use in the source map spec, the first bit is the sign, + // the next four bits are the actual value, and the 6th bit is the + // continuation bit. The continuation bit tells us whether there are more + // digits in this value following this digit. + // + // Continuation + // | Sign + // | | + // V V + // 101011 + + var VLQ_BASE_SHIFT = 5; + + // binary: 100000 + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + + // binary: 011111 + var VLQ_BASE_MASK = VLQ_BASE - 1; + + // binary: 100000 + var VLQ_CONTINUATION_BIT = VLQ_BASE; + + /** + * Converts from a two-complement value to a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ + function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; + } + + /** + * Returns the base 64 VLQ encoded value. + */ + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; + }; + + /** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string. + */ + exports.decode = function base64VLQ_decode(aStr) { + var i = 0; + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (i >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + digit = base64.decode(aStr.charAt(i++)); + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + return { + value: fromVLQSigned(result), + rest: aStr.slice(i) + }; + }; + + }); + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + define('source-map/base64', ['require', 'exports', 'module',], function (require, exports, module) { + + var charToIntMap = {}; + var intToCharMap = {}; + + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + .split('') + .forEach(function (ch, index) { + charToIntMap[ch] = index; + intToCharMap[index] = ch; + }); + + /** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ + exports.encode = function base64_encode(aNumber) { + if (aNumber in intToCharMap) { + return intToCharMap[aNumber]; + } + throw new TypeError("Must be between 0 and 63: " + aNumber); + }; + + /** + * Decode a single base 64 digit to an integer. + */ + exports.decode = function base64_decode(aChar) { + if (aChar in charToIntMap) { + return charToIntMap[aChar]; + } + throw new TypeError("Not a valid base 64 digit: " + aChar); + }; + + }); + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + define('source-map/util', ['require', 'exports', 'module',], function (require, exports, module) { + + /** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + + exports.getArg = getArg; + + var urlRegexp = /([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/; + var dataUrlRegexp = /^data:.+\,.+/; + + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[3], + host: match[4], + port: match[6], + path: match[7] + }; + } + + exports.urlParse = urlParse; + + function urlGenerate(aParsedUrl) { + var url = aParsedUrl.scheme + "://"; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + "@" + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + + exports.urlGenerate = urlGenerate; + + function join(aRoot, aPath) { + var url; + + if (aPath.match(urlRegexp) || aPath.match(dataUrlRegexp)) { + return aPath; + } + + if (aPath.charAt(0) === '/' && (url = urlParse(aRoot))) { + url.path = aPath; + return urlGenerate(url); + } + + return aRoot.replace(/\/$/, '') + '/' + aPath; + } + + exports.join = join; + + /** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ + function toSetString(aStr) { + return '$' + aStr; + } + + exports.toSetString = toSetString; + + function fromSetString(aStr) { + return aStr.substr(1); + } + + exports.fromSetString = fromSetString; + + function relative(aRoot, aPath) { + aRoot = aRoot.replace(/\/$/, ''); + + var url = urlParse(aRoot); + if (aPath.charAt(0) == "/" && url && url.path == "/") { + return aPath.slice(1); + } + + return aPath.indexOf(aRoot + '/') === 0 + ? aPath.substr(aRoot.length + 1) + : aPath; + } + + exports.relative = relative; + + function strcmp(aStr1, aStr2) { + var s1 = aStr1 || ""; + var s2 = aStr2 || ""; + return (s1 > s2) - (s1 < s2); + } + + /** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp; + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp || onlyCompareOriginal) { + return cmp; + } + + cmp = strcmp(mappingA.name, mappingB.name); + if (cmp) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp) { + return cmp; + } + + return mappingA.generatedColumn - mappingB.generatedColumn; + }; + exports.compareByOriginalPositions = compareByOriginalPositions; + + /** + * Comparator between two mappings where the generated positions are + * compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ + function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) { + var cmp; + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp || onlyCompareGenerated) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); + }; + exports.compareByGeneratedPositions = compareByGeneratedPositions; + + }); + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + define('source-map/array-set', ['require', 'exports', 'module', 'source-map/util'], function (require, exports, module) { + + var util = require('./util'); + + /** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ + function ArraySet() { + this._array = []; + this._set = {}; + } + + /** + * Static method for creating ArraySet instances from an existing array. + */ + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + + /** + * Add the given string to this set. + * + * @param String aStr + */ + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var isDuplicate = this.has(aStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + this._set[util.toSetString(aStr)] = idx; + } + }; + + /** + * Is the given string a member of this set? + * + * @param String aStr + */ + ArraySet.prototype.has = function ArraySet_has(aStr) { + return Object.prototype.hasOwnProperty.call(this._set, + util.toSetString(aStr)); + }; + + /** + * What is the index of the given string in the array? + * + * @param String aStr + */ + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (this.has(aStr)) { + return this._set[util.toSetString(aStr)]; + } + throw new Error('"' + aStr + '" is not in the set.'); + }; + + /** + * What is the element at the given index? + * + * @param Number aIdx + */ + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + + /** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + + exports.ArraySet = ArraySet; + + }); + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + define('source-map/source-map-consumer', ['require', 'exports', 'module', 'source-map/util', 'source-map/binary-search', 'source-map/array-set', 'source-map/base64-vlq'], function (require, exports, module) { + + var util = require('./util'); + var binarySearch = require('./binary-search'); + var ArraySet = require('./array-set').ArraySet; + var base64VLQ = require('./base64-vlq'); + + /** + * A SourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ + function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names, true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; + } + + /** + * Create a SourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns SourceMapConsumer + */ + SourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(SourceMapConsumer.prototype); + + smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + smc.__generatedMappings = aSourceMap._mappings.slice() + .sort(util.compareByGeneratedPositions); + smc.__originalMappings = aSourceMap._mappings.slice() + .sort(util.compareByOriginalPositions); + + return smc; + }; + + /** + * The version of the source mapping spec that we are consuming. + */ + SourceMapConsumer.prototype._version = 3; + + /** + * The list of original sources. + */ + Object.defineProperty(SourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot ? util.join(this.sourceRoot, s) : s; + }, this); + } + }); + + // `__generatedMappings` and `__originalMappings` are arrays that hold the + // parsed mapping coordinates from the source map's "mappings" attribute. They + // are lazily instantiated, accessed via the `_generatedMappings` and + // `_originalMappings` getters respectively, and we only parse the mappings + // and create these arrays once queried for a source location. We jump through + // these hoops because there can be many thousands of mappings, and parsing + // them is expensive, so we only want to do it if we must. + // + // Each object in the arrays is of the form: + // + // { + // generatedLine: The line number in the generated code, + // generatedColumn: The column number in the generated code, + // source: The path to the original source file that generated this + // chunk of code, + // originalLine: The line number in the original source that + // corresponds to this chunk of generated code, + // originalColumn: The column number in the original source that + // corresponds to this chunk of generated code, + // name: The name of the original symbol which generated this chunk of + // code. + // } + // + // All properties except for `generatedLine` and `generatedColumn` can be + // `null`. + // + // `_generatedMappings` is ordered by the generated positions. + // + // `_originalMappings` is ordered by the original positions. + + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this.__generatedMappings = []; + this.__originalMappings = []; + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } + }); + + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this.__generatedMappings = []; + this.__originalMappings = []; + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } + }); + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var mappingSeparator = /^[,;]/; + var str = aStr; + var mapping; + var temp; + + while (str.length > 0) { + if (str.charAt(0) === ';') { + generatedLine++; + str = str.slice(1); + previousGeneratedColumn = 0; + } + else if (str.charAt(0) === ',') { + str = str.slice(1); + } + else { + mapping = {}; + mapping.generatedLine = generatedLine; + + // Generated column. + temp = base64VLQ.decode(str); + mapping.generatedColumn = previousGeneratedColumn + temp.value; + previousGeneratedColumn = mapping.generatedColumn; + str = temp.rest; + + if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) { + // Original source. + temp = base64VLQ.decode(str); + mapping.source = this._sources.at(previousSource + temp.value); + previousSource += temp.value; + str = temp.rest; + if (str.length === 0 || mappingSeparator.test(str.charAt(0))) { + throw new Error('Found a source, but no line and column'); + } + + // Original line. + temp = base64VLQ.decode(str); + mapping.originalLine = previousOriginalLine + temp.value; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + str = temp.rest; + if (str.length === 0 || mappingSeparator.test(str.charAt(0))) { + throw new Error('Found a source and line, but no column'); + } + + // Original column. + temp = base64VLQ.decode(str); + mapping.originalColumn = previousOriginalColumn + temp.value; + previousOriginalColumn = mapping.originalColumn; + str = temp.rest; + + if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) { + // Original name. + temp = base64VLQ.decode(str); + mapping.name = this._names.at(previousName + temp.value); + previousName += temp.value; + str = temp.rest; + } + } + + this.__generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + this.__originalMappings.push(mapping); + } + } + } + + this.__originalMappings.sort(util.compareByOriginalPositions); + }; + + /** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ + SourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator); + }; + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ + SourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var mapping = this._findMapping(needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositions); + + if (mapping) { + var source = util.getArg(mapping, 'source', null); + if (source && this.sourceRoot) { + source = util.join(this.sourceRoot, source); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: util.getArg(mapping, 'name', null) + }; + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * availible. + */ + SourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + throw new Error('"' + aSource + '" is not in the SourceMap.'); + }; + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ + SourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + if (this.sourceRoot) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + + var mapping = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions); + + if (mapping) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null) + }; + } + + return { + line: null, + column: null + }; + }; + + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source; + if (source && sourceRoot) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name + }; + }).forEach(aCallback, context); + }; + + exports.SourceMapConsumer = SourceMapConsumer; + + }); + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + define('source-map/binary-search', ['require', 'exports', 'module',], function (require, exports, module) { + + /** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + */ + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the next + // closest element that is less than that element. + // + // 3. We did not find the exact element, and there is no next-closest + // element which is less than the one we are searching for, so we + // return null. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return aHaystack[mid]; + } + else if (cmp > 0) { + // aHaystack[mid] is greater than our needle. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare); + } + // We did not find an exact match, return the next closest one + // (termination case 2). + return aHaystack[mid]; + } + else { + // aHaystack[mid] is less than our needle. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare); + } + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (2) or (3) and return the appropriate thing. + return aLow < 0 + ? null + : aHaystack[aLow]; + } + } + + /** + * This is an implementation of binary search which will always try and return + * the next lowest value checked if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + */ + exports.search = function search(aNeedle, aHaystack, aCompare) { + return aHaystack.length > 0 + ? recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare) + : null; + }; + + }); + /* -*- Mode: js; js-indent-level: 2; -*- */ + /* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + define('source-map/source-node', ['require', 'exports', 'module', 'source-map/source-map-generator', 'source-map/util'], function (require, exports, module) { + + var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; + var util = require('./util'); + + /** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine === undefined ? null : aLine; + this.column = aColumn === undefined ? null : aColumn; + this.source = aSource === undefined ? null : aSource; + this.name = aName === undefined ? null : aName; + if (aChunks != null) this.add(aChunks); + } + + /** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + */ + SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // The generated code + // Processed fragments are removed from this array. + var remainingLines = aGeneratedCode.split('\n'); + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping === null) { + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(remainingLines.shift() + "\n"); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + } else { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + var code = ""; + // Associate full lines with "lastMapping" + do { + code += remainingLines.shift() + "\n"; + lastGeneratedLine++; + lastGeneratedColumn = 0; + } while (lastGeneratedLine < mapping.generatedLine); + // When we reached the correct line, we add code until we + // reach the correct column too. + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + code += nextLine.substr(0, mapping.generatedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + // Create the SourceNode. + addMappingWithCode(lastMapping, code); + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[0]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + } + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + // Associate the remaining code in the current line with "lastMapping" + // and add the remaining lines without any mapping + addMappingWithCode(lastMapping, remainingLines.join("\n")); + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content) { + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + mapping.source, + code, + mapping.name)); + } + } + }; + + /** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk instanceof SourceNode || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length - 1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk instanceof SourceNode || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; + }; + + /** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk instanceof SourceNode) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { + source: this.source, + line: this.line, + column: this.column, + name: this.name + }); + } + } + } + }; + + /** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len - 1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + + /** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild instanceof SourceNode) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + + /** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ + SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + + /** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ + SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i] instanceof SourceNode) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + + /** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + + /** + * Returns the string representation of this source node along with a source + * map. + */ + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if (lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + chunk.split('').forEach(function (ch) { + if (ch === '\n') { + generated.line++; + generated.column = 0; + } else { + generated.column++; + } + }); + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return {code: generated.code, map: map}; + }; + + exports.SourceNode = SourceNode; + + }); + /* -*- Mode: js; js-indent-level: 2; -*- */ +/////////////////////////////////////////////////////////////////////////////// + + this.sourceMap = { + SourceMapConsumer: require('source-map/source-map-consumer').SourceMapConsumer, + SourceMapGenerator: require('source-map/source-map-generator').SourceMapGenerator, + SourceNode: require('source-map/source-node').SourceNode + }; + +// footer to wrap "source-map" module + return this.sourceMap; + }(); +})(); + + +/* Less.js v1.7.5 RHINO | Copyright (c) 2009-2014, Alexis Sellier */ + +/*global name:true, less, loadStyleSheet, os */ + +function formatError(ctx, options) { + options = options || {}; + + var message = ""; + var extract = ctx.extract; + var error = []; + +// var stylize = options.color ? require('./lessc_helper').stylize : function (str) { return str; }; + var stylize = function (str) { + return str; + }; + + // only output a stack if it isn't a less error + if (ctx.stack && !ctx.type) { + return stylize(ctx.stack, 'red'); + } + + if (!ctx.hasOwnProperty('index') || !extract) { + return ctx.stack || ctx.message; + } + + if (typeof(extract[0]) === 'string') { + error.push(stylize((ctx.line - 1) + ' ' + extract[0], 'grey')); + } + + if (typeof(extract[1]) === 'string') { + var errorTxt = ctx.line + ' '; + if (extract[1]) { + errorTxt += extract[1].slice(0, ctx.column) + + stylize(stylize(stylize(extract[1][ctx.column], 'bold') + + extract[1].slice(ctx.column + 1), 'red'), 'inverse'); + } + error.push(errorTxt); + } + + if (typeof(extract[2]) === 'string') { + error.push(stylize((ctx.line + 1) + ' ' + extract[2], 'grey')); + } + error = error.join('\n') + stylize('', 'reset') + '\n'; + + message += stylize(ctx.type + 'Error: ' + ctx.message, 'red'); + if (ctx.filename) { + message += stylize(' in ', 'red') + ctx.filename + + stylize(' on line ' + ctx.line + ', column ' + (ctx.column + 1) + ':', 'grey'); + } + + message += '\n' + error; + + if (ctx.callLine) { + message += stylize('from ', 'red') + (ctx.filename || '') + '/n'; + message += stylize(ctx.callLine, 'grey') + ' ' + ctx.callExtract + '/n'; + } + + return message; +} + +function writeError(ctx, options) { + options = options || {}; + if (options.silent) { + return; + } + var message = formatError(ctx, options); + throw new Error(message); +} + +function loadStyleSheet(sheet, callback, reload, remaining) { + var endOfPath = Math.max(name.lastIndexOf('/'), name.lastIndexOf('\\')), + sheetName = name.slice(0, endOfPath + 1) + sheet.href, + contents = sheet.contents || {}, + input = readFile(sheetName); + + input = input.replace(/^\xEF\xBB\xBF/, ''); + + contents[sheetName] = input; + + var parser = new less.Parser({ + paths: [sheet.href.replace(/[\w\.-]+$/, '')], + contents: contents + }); + parser.parse(input, function (e, root) { + if (e) { + return writeError(e); + } + //try { + callback(e, root, input, sheet, {local: false, lastModified: 0, remaining: remaining}, sheetName); + //} catch (e) { + //writeError(e); + //log.error(e); + //} + }); +} + +less.Parser.fileLoader = function (file, currentFileInfo, callback, env) { + + var href = file; + if (currentFileInfo && currentFileInfo.currentDirectory && !/^\//.test(file)) { + href = less.modules.path.join(currentFileInfo.currentDirectory, file); + } + + var path = less.modules.path.dirname(href); + + var newFileInfo = { + currentDirectory: path + '/', + filename: href + }; + + if (currentFileInfo) { + newFileInfo.entryPath = currentFileInfo.entryPath; + newFileInfo.rootpath = currentFileInfo.rootpath; + newFileInfo.rootFilename = currentFileInfo.rootFilename; + newFileInfo.relativeUrls = currentFileInfo.relativeUrls; + } else { + newFileInfo.entryPath = path; + newFileInfo.rootpath = less.rootpath || path; + newFileInfo.rootFilename = href; + newFileInfo.relativeUrls = env.relativeUrls; + } + + var j = file.lastIndexOf('/'); + if (newFileInfo.relativeUrls && !/^(?:[a-z-]+:|\/)/.test(file) && j != -1) { + var relativeSubDirectory = file.slice(0, j + 1); + newFileInfo.rootpath = newFileInfo.rootpath + relativeSubDirectory; // append (sub|sup) directory path of imported file + } + newFileInfo.currentDirectory = path; + newFileInfo.filename = href; + + var data = null; + try { + data = readFile(href); + } catch (e) { + log.error(e); + callback({type: 'File', message: "'" + less.modules.path.basename(href) + "' wasn't found"}); + return; + } + + try { + callback(null, data, href, newFileInfo, {lastModified: 0}); + } catch (e) { + callback(e, null, href); + } +}; + + +function writeFile(filename, content) { + var f = new File(filename); + f.open('w'); + f.write(content); + f.close(); +} + +// Command line integration via Rhino +var compile = function (args) { + + var options = { + depends: false, + compress: false, + cleancss: false, + max_line_len: -1, + optimization: 1, + silent: false, + verbose: false, + lint: false, + paths: [], + color: true, + strictImports: false, + rootpath: '', + relativeUrls: false, + ieCompat: true, + strictMath: false, + strictUnits: false + }; + var continueProcessing = true, + currentErrorcode; + + var checkArgFunc = function (arg, option) { + if (!option) { + print(arg + " option requires a parameter"); + continueProcessing = false; + return false; + } + return true; + }; + + var checkBooleanArg = function (arg) { + var onOff = /^((on|t|true|y|yes)|(off|f|false|n|no))$/i.exec(arg); + if (!onOff) { + print(" unable to parse " + arg + " as a boolean. use one of on/t/true/y/yes/off/f/false/n/no"); + continueProcessing = false; + return false; + } + return Boolean(onOff[2]); + }; + + var warningMessages = ""; + var sourceMapFileInline = false; + + args = args.filter(function (arg) { + var match = arg.match(/^-I(.+)$/); + + if (match) { + options.paths.push(match[1]); + return false; + } + + match = arg.match(/^--?([a-z][0-9a-z-]*)(?:=(.*))?$/i); + if (match) { + arg = match[1]; + } // was (?:=([^\s]*)), check! + else { + return arg; + } + + switch (arg) { + case 'v': + case 'version': + console.log("lessc " + less.version.join('.') + " (Less Compiler) [JavaScript]"); + continueProcessing = false; + break; + case 'verbose': + options.verbose = true; + break; + case 's': + case 'silent': + options.silent = true; + break; + case 'l': + case 'lint': + options.lint = true; + break; + case 'strict-imports': + options.strictImports = true; + break; + case 'h': + case 'help': + //TODO +// require('../lib/less/lessc_helper').printUsage(); + continueProcessing = false; + break; + case 'x': + case 'compress': + options.compress = true; + break; + case 'M': + case 'depends': + options.depends = true; + break; + case 'yui-compress': + warningMessages += "yui-compress option has been removed. assuming clean-css."; + options.cleancss = true; + break; + case 'clean-css': + options.cleancss = true; + break; + case 'max-line-len': + if (checkArgFunc(arg, match[2])) { + options.maxLineLen = parseInt(match[2], 10); + if (options.maxLineLen <= 0) { + options.maxLineLen = -1; + } + } + break; + case 'no-color': + options.color = false; + break; + case 'no-ie-compat': + options.ieCompat = false; + break; + case 'no-js': + options.javascriptEnabled = false; + break; + case 'include-path': + if (checkArgFunc(arg, match[2])) { + options.paths = match[2].split(os.type().match(/Windows/) ? ';' : ':') + .map(function (p) { + if (p) { +// return path.resolve(process.cwd(), p); + return p; + } + }); + } + break; + case 'O0': + options.optimization = 0; + break; + case 'O1': + options.optimization = 1; + break; + case 'O2': + options.optimization = 2; + break; + case 'line-numbers': + if (checkArgFunc(arg, match[2])) { + options.dumpLineNumbers = match[2]; + } + break; + case 'source-map': + if (!match[2]) { + options.sourceMap = true; + } else { + options.sourceMap = match[2]; + } + break; + case 'source-map-rootpath': + if (checkArgFunc(arg, match[2])) { + options.sourceMapRootpath = match[2]; + } + break; + case 'source-map-basepath': + if (checkArgFunc(arg, match[2])) { + options.sourceMapBasepath = match[2]; + } + break; + case 'source-map-map-inline': + sourceMapFileInline = true; + options.sourceMap = true; + break; + case 'source-map-less-inline': + options.outputSourceFiles = true; + break; + case 'source-map-url': + if (checkArgFunc(arg, match[2])) { + options.sourceMapURL = match[2]; + } + break; + case 'source-map-output-map-file': + if (checkArgFunc(arg, match[2])) { + options.writeSourceMap = function (sourceMapContent) { + writeFile(match[2], sourceMapContent); + }; + } + break; + case 'rp': + case 'rootpath': + if (checkArgFunc(arg, match[2])) { + options.rootpath = match[2].replace(/\\/g, '/'); + } + break; + case "ru": + case "relative-urls": + options.relativeUrls = true; + break; + case "sm": + case "strict-math": + if (checkArgFunc(arg, match[2])) { + options.strictMath = checkBooleanArg(match[2]); + } + break; + case "su": + case "strict-units": + if (checkArgFunc(arg, match[2])) { + options.strictUnits = checkBooleanArg(match[2]); + } + break; + default: + console.log('invalid option ' + arg); + continueProcessing = false; + } + }); + + if (!continueProcessing) { + return; + } + + var name = args[0]; + if (name && name != '-') { +// name = path.resolve(process.cwd(), name); + } + var output = args[1]; + var outputbase = args[1]; + if (output) { + options.sourceMapOutputFilename = output; +// output = path.resolve(process.cwd(), output); + if (warningMessages) { + console.log(warningMessages); + } + } + +// options.sourceMapBasepath = process.cwd(); +// options.sourceMapBasepath = ''; + + if (options.sourceMap === true) { + console.log("output: " + output); + if (!output && !sourceMapFileInline) { + console.log("the sourcemap option only has an optional filename if the css filename is given"); + return; + } + options.sourceMapFullFilename = options.sourceMapOutputFilename + ".map"; + options.sourceMap = less.modules.path.basename(options.sourceMapFullFilename); + } else if (options.sourceMap) { + options.sourceMapOutputFilename = options.sourceMap; + } + + + if (!name) { + console.log("lessc: no inout files"); + console.log(""); + // TODO +// require('../lib/less/lessc_helper').printUsage(); + currentErrorcode = 1; + return; + } + +// var ensureDirectory = function (filepath) { +// var dir = path.dirname(filepath), +// cmd, +// existsSync = fs.existsSync || path.existsSync; +// if (!existsSync(dir)) { +// if (mkdirp === undefined) { +// try {mkdirp = require('mkdirp');} +// catch(e) { mkdirp = null; } +// } +// cmd = mkdirp && mkdirp.sync || fs.mkdirSync; +// cmd(dir); +// } +// }; + + if (options.depends) { + if (!outputbase) { + console.log("option --depends requires an output path to be specified"); + return; + } + console.log(outputbase + ": "); + } + + if (!name) { + console.log('No files present in the fileset'); + quit(1); + } + + var input = null; + try { + input = readFile(name, 'utf-8'); + } catch (e) { + log.error(e); + quit(1); + } + + options.filename = name; + var result; + var parser = new less.Parser(options); + parser.parse(input, function (e, root) { + if (e) { + log.info(e); + writeError(e, options); + quit(1); + } else { + result = root.toCSS(options); + if (output) { + writeFile(output, result); + console.log("Written to " + output); + } else { + print(result); + } + quit(0); + } + }, { + globalVars: {'self-class': fuseState.currentUnit + '-unit'} + }); +}; diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/lib/login.jag b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/login.jag new file mode 100755 index 00000000..7b93c3c7 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/login.jag @@ -0,0 +1,36 @@ +<% +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +(function(){ + var constants = require('/modules/constants.js'); + if (!session.get(constants.USER_SESSION_KEY)) { + var dataConfig = require('/config/dc-props.js').config(); + var sso = require('/modules/sso.js').sso; + var keyStoreParams = { + keyStoreName : dataConfig.ssoConfiguration.keyStoreName, + keyStorePassword : dataConfig.ssoConfiguration.keyStorePassword, + identityAlias : dataConfig.ssoConfiguration.identityAlias + } + sso.configure(dataConfig.ssoConfiguration.issuer, dataConfig.ssoConfiguration.appName, keyStoreParams, + dataConfig.ssoConfiguration.identityProviderURL); + sso.login(); + }else{ + response.sendRedirect(dataConfig.appContext); + } +}()); +%> diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/lib/logout.jag b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/logout.jag new file mode 100755 index 00000000..4ae365d9 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/lib/logout.jag @@ -0,0 +1,37 @@ +<% +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var constants = require('/modules/constants.js'); +var user = session.get(constants.USER_SESSION_KEY); +var dataConfig = require('/config/dc-props.js').config(); +var log = new Log(); +if (user === null) { + log.debug("Cannot perform logout. No user session found."); + response.sendRedirect(dataConfig.appContext+'dashboard'); +} else { + var sso = require('/modules/sso.js').sso; + var keyStoreParams = { + keyStoreName: dataConfig.ssoConfiguration.keyStoreName, + keyStorePassword: dataConfig.ssoConfiguration.keyStorePassword, + identityAlias: dataConfig.ssoConfiguration.identityAlias + } + sso.configure(dataConfig.ssoConfiguration.issuer, dataConfig.ssoConfiguration.appName, keyStoreParams, + dataConfig.ssoConfiguration.identityProviderURL); + sso.logout(user); +} +%> \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/modules/constants.js b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/constants.js new file mode 100755 index 00000000..182d319e --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/constants.js @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var WEB_APP_TITLE = "WSO2 DC - Device Cloud"; +var WEB_APP_CONTEXT = "/iot"; +var USER_SESSION_KEY = "USER"; +var UNSPECIFIED = "Unspecified"; + +var ERRORS = { + "USER_NOT_FOUND": "USER_NOT_FOUND" + }; diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/modules/download.js b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/download.js new file mode 100755 index 00000000..5394c8bf --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/download.js @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var downloadModule; +var Handlebars = require('../lib/handlebars-v2.0.0.js').Handlebars; +downloadModule = function () { + var log = new Log("modules/download.js"); + + var constants = require("/modules/constants.js"); + + var publicMethods = {}; + var privateMethods = {}; + + /** + * Downloading a specified sketch file. + * + * @param file File name or file object of the downloading file + * @param replaceParams + */ + publicMethods.downloadSketch = function (file, response, replaceParams) { + var file = new File("../sketch/" + file); + + file.open('r'); + log.debug("Reading file '" + file.getPath() + "'"); + var content = file.readAll().trim(); + file.close(); + + var downloadFile = privateMethods.allReplace(content,replaceParams); + + response.contentType = "application/octet-stream"; + response.addHeader("Content-Disposition", "attachment; filename='sketch.hbs'"); + response.addHeader("Content-Length", String(downloadFile.length)); + response.content = downloadFile; + }; + + /** + * Find and replace all occurrences. + * @param inStr input string + * @param replaceParams key value array + * @returns retStr replaced string + */ + privateMethods.allReplace = function (inStr, replaceParams) { + var retStr = inStr; + for (var x in replaceParams) { + retStr = retStr.replace(new RegExp(x, 'g'), replaceParams[x]) + } + return retStr; + }; + + return publicMethods; +}(); + + diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/modules/pinch.min.js b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/pinch.min.js new file mode 100755 index 00000000..feccd2da --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/pinch.min.js @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2011 František Hába +* +* 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. +* +* Reference:- https://github.com/Baggz/Pinch +* Pinch is a small JavaScript utility which is able to replace any data in a JavaScript object (or JSON). +* */ +(function(){var k=function(a,c){return a.length!==c.length?!1:a.every(function(a,b){return c[b]===a})},j=function(a,c,d){var b,e;if("[object Array]"===Object.prototype.toString.call(a)){b=0;for(e=a.length;b

You are now being redirected to SSO Provider. If the redirection fails, please click on the "+ + "button below.

" + + ""); + }; + + sso.logout = function (user) { + var sso_sessions = getSSOSessions(); + sso.sessionId = session.getId(); + sso.sessionIndex = sso_sessions[sso.sessionId]; + + var referer = request.getHeader("referer"); + sso.relayState = (referer ? referer : sso.relayState); + sso.relayState = sso.relayState + request.getQueryString(); // append query string + sso.encodedSAMLLogoutRequest = ssoMod.client.getEncodedSAMLLogoutRequest(user, sso.sessionIndex, sso.issuer); + var postUrl = sso.address + sso.ssoService; + + if (log.isDebugEnabled()) { + sso.log.debug("Logout request recieved from session id ::: " + sso.sessionId); + } + print("

You are now redirected to Stratos Identity. If theredirection fails, please click the post " + + "button.

"); + }; + + sso.acs = function (loginCallback, logoutCallback) { + var sso_sessions = getSSOSessions(); + sso.sessionId = session.getId(); + var samlResponse = request.getParameter('SAMLResponse'); + var samlRequest = request.getParameter('SAMLRequest'); + var relayState = request.getParameter('RelayState'); + var samlRespObj; + + if (samlResponse != null) { + samlRespObj = ssoMod.client.getSamlObject(samlResponse); + if (ssoMod.client.isLogoutResponse(samlRespObj)) { + logoutCallback(); + if (log.isDebugEnabled()) { + sso.log.debug('Session Id Invalidated :::' + sso.sessionId); + } + // Invalidating the session after the callback + session.invalidate(); + } else { + if (log.isDebugEnabled()) { + sso.log.debug("Login request"); + } + // validating the signature + if (sso.responseSign) { + if (ssoMod.client.validateSignature(samlRespObj, sso.keyStoreProps)) { + var sessionObj = ssoMod.client.decodeSAMLLoginResponse(samlRespObj, samlResponse, + sso.sessionId); + if (log.isDebugEnabled()) { + sso.log.debug("Saml object session ID :::" + sessionObj.sessionId); + } + if (sessionObj.sessionIndex != null || sessionObj.sessionIndex != 'undefined') { + sso_sessions[sso_sessions[sessionObj.sessionIndex] = sessionObj.sessionId] = + sessionObj.sessionIndex; + if (log.isDebugEnabled()) { + sso.log.debug("Login successful"); + sso.log.debug('User is set :::' + sessionObj.loggedInUser); + } + loginCallback(sessionObj.loggedInUser); + } else { + sso.log.error("Session index invalid"); + } + } else { + sso.log.error("Response Signing failed"); + } + } else { + if (log.isDebugEnabled()) { + sso.log.debug("Response Signing is disabled"); + } + } + } + } + /* + Executed for single logout requests + */ + if (samlRequest != null) { + var index = ssoMod.client.decodeSAMLLogoutRequest(ssoMod.client.getSamlObject(samlRequest)); + var jSessionId = getSSOSessions()[index]; + delete getSSOSessions()[index]; + if (log.isDebugEnabled()) { + sso.log.debug('Backend logout received from store. The index is :::' + index); + sso.log.debug('Session Id Invalidated :::' + jSessionId); + } + session.invalidate(); + } + } +})(); \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/modules/user.js b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/user.js new file mode 100755 index 00000000..2dfff33e --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/user.js @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var userModule; +userModule = function () { + var log = new Log("modules/user.js"); + + var constants = require("/modules/constants.js"); + var utility = require("/modules/utility.js").utility; + + //var userManagementService = utility.getUserManagementService(); + + var publicMethods = {}; + var privateMethods = {}; + + /** + * Authenticate a user when he or she attempts to login to DC. + * + * @param username Username of the user + * @param password Password of the user + * @param successCallback Function to be called at the event of successful authentication + * @param failureCallback Function to be called at the event of failed authentication + */ + publicMethods.login = function (username, password, successCallback, failureCallback) { + var carbonModule = require("carbon"); + var carbonServer = application.get("carbonServer"); + try { + // get tenant specific full user name. + username = username + "@" + carbonModule.server.tenantDomain(); + // check if the user is an authenticated user. + var isAuthenticated = carbonServer.authenticate(username, password); + if (isAuthenticated) { + var tenantUser = carbonModule.server.tenantUser(username); + session.put(constants.USER_SESSION_KEY, tenantUser); + successCallback(tenantUser); + } else { + failureCallback(); + } + } catch (e) { + throw e; + } + }; + + /** + * Register user to dc-user-store. + * + * @param username Username of the user + * @param firstname First name of the user + * @param lastname Last name of the user + * @param emailAddress Email address of the user + * @param password Password of the user + * @param userRoles Roles assigned to the user + * + * @returns {number} HTTP Status code 201 if succeeded, 409 if user already exists + */ + publicMethods.registerUser = function (username, firstname, lastname, emailAddress, password, userRoles) { + var carbon = require('carbon'); + var tenantId = carbon.server.tenantId(); + var url = carbon.server.address('https') + "/admin/services"; + var server = new carbon.server.Server(url); + var userManager = new carbon.user.UserManager(server, tenantId); + + try { + if (userManager.userExists(username)) { + if (log.isDebugEnabled()) { + log.debug("A user with name '" + username + "' already exists."); + } + // http status code 409 refers to - conflict. + return 409; + } else { + var defaultUserClaims = privateMethods.buildDefaultUserClaims(firstname, lastname, emailAddress); + + userManager.addUser(username, password, userRoles, defaultUserClaims, "default"); + if (log.isDebugEnabled()) { + log.debug("A new user with name '" + username + "' was created."); + } + // http status code 201 refers to - created. + return 201; + } + } catch (e) { + throw e; + } + }; + + /** + * Add user to dc-user-store. + * + * @param username Username of the user + * @param firstname First name of the user + * @param lastname Last name of the user + * @param emailAddress Email address of the user + * @param userRoles Roles assigned to the user + * + * @returns {number} HTTP Status code 201 if succeeded, 409 if user already exists + */ + publicMethods.addUser = function (username, firstname, lastname, emailAddress, userRoles) { + var carbon = require('carbon'); + var tenantId = carbon.server.tenantId(); + var url = carbon.server.address('https') + "/admin/services"; + var server = new carbon.server.Server(url); + var userManager = new carbon.user.UserManager(server, tenantId); + + try { + if (userManager.userExists(username)) { + if (log.isDebugEnabled()) { + log.debug("A user with name '" + username + "' already exists."); + } + // http status code 409 refers to - conflict. + return 409; + } else { + var initialUserPassword = privateMethods.generateInitialUserPassword(); + var defaultUserClaims = privateMethods.buildDefaultUserClaims(firstname, lastname, emailAddress); + + userManager.addUser(username, initialUserPassword, userRoles, defaultUserClaims, "default"); + privateMethods.inviteUserToEnroll(username, initialUserPassword); + if (log.isDebugEnabled()) { + log.debug("A new user with name '" + username + "' was created."); + } + // http status code 201 refers to - created. + return 201; + } + } catch (e) { + throw e; + } + }; + + /** + * Remove an existing user from mdm-user-store. + * + * @param username Username of the user + * @returns {number} HTTP Status code 200 if succeeded, 409 if the user does not exist + */ + publicMethods.removeUser = function (username) { + var carbon = require('carbon'); + var tenantId = carbon.server.tenantId(); + var url = carbon.server.address('https') + "/admin/services"; + var server = new carbon.server.Server(url); + var userManager = new carbon.user.UserManager(server, tenantId); + + try { + if (userManager.userExists(username)) { + userManager.removeUser(username); + if (log.isDebugEnabled()) { + log.debug("An existing user with name '" + username + "' was removed."); + } + // http status code 200 refers to - success. + return 200; + } else { + if (log.isDebugEnabled()) { + log.debug("A user with name '" + username + "' does not exist to remove."); + } + // http status code 409 refers to - conflict. + return 409; + } + } catch (e) { + throw e; + } + }; + + /** + * Private method to be used by addUser() to + * generate an initial user password for a user. + * This will be the password used by a user for his initial login to the system. + * + * @returns {string} Initial User Password + */ + privateMethods.generateInitialUserPassword = function () { + var passwordLength = 6; + //defining the pool of characters to be used for initial password generation + var lowerCaseCharset = "abcdefghijklmnopqrstuvwxyz"; + var upperCaseCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + var numericCharset = "0123456789"; + + var totalCharset = lowerCaseCharset + upperCaseCharset + numericCharset; + var totalCharsetLength = totalCharset.length; + + var initialUserPassword = ""; + for (var i = 0; i < passwordLength; ++i) { + initialUserPassword += totalCharset.charAt(Math.floor(Math.random() * totalCharsetLength)); + } + if (log.isDebugEnabled()) { + log.debug("Initial password created for new user : " + initialUserPassword); + } + return String(initialUserPassword); + }; + + /** + * Build default user claims. + * + * @param firstname First name of the user + * @param lastname Last name of the user + * @param emailAddress Email address of the user + * + * @returns {Object} Default user claims to be provided + */ + privateMethods.buildDefaultUserClaims = function (firstname, lastname, emailAddress) { + var defaultUserClaims = { + "http://wso2.org/claims/givenname": firstname, + "http://wso2.org/claims/lastname": lastname, + "http://wso2.org/claims/emailaddress": emailAddress + }; + if (log.isDebugEnabled()) { + log.debug("ClaimMap created for new user : " + stringify(defaultUserClaims)); + } + return defaultUserClaims; + }; + + publicMethods.addPermissions = function (permissionList, path, init) { + var carbonModule = require("carbon"); + var carbonServer = application.get("carbonServer"); + var options = {system: true}; + if (init == "login") { + var carbonUser = session.get(constants.USER_SESSION_KEY); + if (carbonUser) { + options.tenantId = carbonUser.tenantId; + } + } + var registry = new carbonModule.registry.Registry(carbonServer, options); + var i, permission, resource; + for (i = 0; i < permissionList.length; i++) { + permission = permissionList[i]; + resource = { + collection : true, + name : permission.name, + properties : { + name : permission.name + } + }; + registry.put("/_system/governance/permission/" + path + "/" + permission.key, resource); + } + }; + + //publicMethods.getUsers = function () { + // var carbon = require('carbon'); + // + // var carbonUser = session.get(constants.USER_SESSION_KEY); + // if (!carbonUser) { + // log.error("User object was not found in the session"); + // throw constants.ERRORS.USER_NOT_FOUND; + // } + // + // var userList; + // try{ + // userList = userManagementService.getUsersForTenant(carbonUser.tenantId); + // }catch(e){ + // log.error("Error occurred while reading all users"); + // return []; + // } + // + // var users = []; + // var i, userObject; + // for (i = 0; i < userList.size(); i++) { + // userObject = userList.get(i); + // users.push({ + // "username" : userObject.getUserName(), + // "email" : userObject.getEmail(), + // "name" : userObject.getFirstName() + " " + userObject.getLastName() + // }); + // } + // return users; + //}; + + publicMethods.isAuthorized = function (permission) { + var carbonModule = require("carbon"); + var carbonServer = application.get("carbonServer"); + var carbonUser = session.get(constants.USER_SESSION_KEY); + if (!carbonUser) { + log.error("User object was not found in the session"); + throw constants.ERRORS.USER_NOT_FOUND; + } + var userManager = new carbonModule.user.UserManager(carbonServer, carbonUser.tenantId); + var user = new carbonModule.user.User(userManager, carbonUser.username); + return user.isAuthorized(permission, "ui.execute"); + }; + + publicMethods.logout = function (successCallback) { + session.invalidate(); + successCallback(); + }; + + return publicMethods; +}(); + + diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/modules/utility.js b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/utility.js new file mode 100755 index 00000000..6286701b --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/modules/utility.js @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +var utility; +utility = function () { + //var JavaClass = Packages.java.lang.Class; + //var PrivilegedCarbonContext = Packages.org.wso2.carbon.context.PrivilegedCarbonContext; + + //var getOsgiService = function (className) { + // var log = new Log(); + // log.info("###### Current Class : "+className); + // return PrivilegedCarbonContext.getThreadLocalCarbonContext().getOSGiService(JavaClass.forName(className)); + //}; + + var publicMethods = {}; + + //publicMethods.getUserManagementService = function () { + // return getOsgiService('org.wso2.carbon.device.mgt.user.core.service.UserManagementService'); + //}; + + publicMethods.insertAppPermissions = function (userModule, type) { + userModule.addPermissions([{key: "device-mgt", name: "Device Management"}], "", type); + userModule.addPermissions([{key: "admin", name: "Device Management Admin"}], "device-mgt", type); + userModule.addPermissions([{key: "user", name: "Device Management User"}], "device-mgt", type); + + userModule.addPermissions([{key: "devices", name: "Devices"}], "device-mgt/admin", type); + userModule.addPermissions([{key: "devices/list", name: "List Devices"}], "device-mgt/admin", type); + userModule.addPermissions([{key: "devices/operation", name: "Perform Operation"}], "device-mgt/admin", type); + + userModule.addPermissions([{key: "users", name: "Users"}], "device-mgt/admin", type); + userModule.addPermissions([{key: "users/add", name: "Add New Users"}], "device-mgt/admin", type); + userModule.addPermissions([{key: "users/invite", name: "Invite Users"}], "device-mgt/admin", type); + userModule.addPermissions([{key: "users/list", name: "List Users"}], "device-mgt/admin", type); + userModule.addPermissions([{key: "users/remove", name: "Remove Users"}], "device-mgt/admin", type); + + userModule.addPermissions([{key: "devices", name: "Devices"}], "device-mgt/user", type); + userModule.addPermissions([{key: "devices/list", name: "List Devices"}], "device-mgt/user", type); + userModule.addPermissions([{key: "devices/operation", name: "Perform Operation"}], "device-mgt/user", "init"); + }; + + return publicMethods; +}(); + + diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/pages/index.hbs b/modules/distribution/src/repository/jaggeryapps/sensebot/pages/index.hbs new file mode 100755 index 00000000..c9b64db9 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/pages/index.hbs @@ -0,0 +1,8 @@ +{{layout "fluid"}} +{{#zone "title"}} + WSO2 DC | Device Cloud +{{/zone}} +{{#zone "body"}} + {{unit "appbar"}} + {{unit "mydevice"}} +{{/zone}} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/pages/mydevice.hbs b/modules/distribution/src/repository/jaggeryapps/sensebot/pages/mydevice.hbs new file mode 100755 index 00000000..3f8b077d --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/pages/mydevice.hbs @@ -0,0 +1,9 @@ +{{authorized}} +{{layout "fluid"}} +{{#zone "title"}} + WSO2 DC | FireAlarm +{{/zone}} +{{#zone "body"}} + {{unit "appbar"}} + {{unit "mydevice"}} +{{/zone}} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/test/testExecutor.jag b/modules/distribution/src/repository/jaggeryapps/sensebot/test/testExecutor.jag new file mode 100755 index 00000000..8701e7ba --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/test/testExecutor.jag @@ -0,0 +1,20 @@ +<% +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +require("jaggery-test").test.run(); +%> \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/tmp/cached_theme_less_base.css b/modules/distribution/src/repository/jaggeryapps/sensebot/tmp/cached_theme_less_base.css new file mode 100755 index 00000000..6edb4b23 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/tmp/cached_theme_less_base.css @@ -0,0 +1,6293 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333333; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #ffffff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-child(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-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-color ease-in-out .15s, box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999999; +} +.form-control::-webkit-input-placeholder { + color: #999999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; + opacity: 1; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm, +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm, +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +textarea.form-group-sm .form-control, +select[multiple].input-sm, +select[multiple].form-group-sm .form-control { + height: auto; +} +.input-lg, +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +select.input-lg, +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +textarea.form-group-lg .form-control, +select[multiple].input-lg, +select[multiple].form-group-lg .form-control { + height: auto; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.3px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default .badge { + color: #ffffff; + background-color: #333333; +} +.btn-primary { + color: #ffffff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #ffffff; +} +.btn-link { + color: #337ab7; + font-weight: normal; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; + visibility: hidden; +} +.collapse.in { + display: block; + visibility: visible; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #337ab7; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #777777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #dddddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.tab-content > .tab-pane { + display: none; + visibility: hidden; +} +.tab-content > .active { + display: block; + visibility: visible; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 70px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + visibility: visible !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 25px 15px; + font-size: 18px; + line-height: 20px; + height: 70px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 18px; + margin-bottom: 18px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 12.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 25px; + padding-bottom: 25px; + } +} +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-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); + margin-top: 18px; + margin-bottom: 18px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 18px; + margin-bottom: 18px; +} +.navbar-btn.btn-sm { + margin-top: 20px; + margin-bottom: 20px; +} +.navbar-btn.btn-xs { + margin-top: 24px; + margin-bottom: 24px; +} +.navbar-text { + margin-top: 25px; + margin-bottom: 25px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777777; +} +.navbar-default .navbar-nav > li > a { + color: #777777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #dddddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555555; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777777; +} +.navbar-default .navbar-link:hover { + color: #333333; +} +.navbar-default .btn-link { + color: #777777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #cccccc; +} +.navbar-inverse { + background-color: #222222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #080808; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #ffffff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #cccccc; +} +.breadcrumb > .active { + color: #777777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + line-height: 1.42857143; + text-decoration: none; + color: #337ab7; + background-color: #ffffff; + border: 1px solid #dddddd; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #23527c; + background-color: #eeeeee; + border-color: #dddddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + background-color: #337ab7; + border-color: #337ab7; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777777; + background-color: #ffffff; + border-color: #dddddd; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + background-color: #ffffff; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #777777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #ffffff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-left: auto; + margin-right: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + background-color: #fcf8e3; + border-color: #faebcc; + color: #8a6d3b; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #ffffff; + text-align: center; + background-color: #337ab7; + -webkit-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-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + 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: -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); + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + 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: -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-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + 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: -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-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + 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: -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-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + 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: -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); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item { + color: #555555; +} +a.list-group-item .list-group-item-heading { + color: #333333; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + color: #555555; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #eeeeee; + color: #777777; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #dddddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #dddddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} +.panel-default { + border-color: #dddddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dddddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dddddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #ffffff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} +.embed-responsive.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: absolute; + top: 0; + right: 0; + left: 0; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.42857143px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + visibility: visible; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + background-color: #ffffff; + background-clip: padding-box; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + transition: transform 0.6s ease-in-out; + backface-visibility: hidden; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +#wrap { + padding-top: 70px; +} +.navbar-nav.navbar-right:last-child { + margin-right: 0; +} diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.hbs b/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.hbs new file mode 100755 index 00000000..b4575ac8 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.hbs @@ -0,0 +1,141 @@ +{{#zone "main"}} + +
+
+ + +
+
+
+
Register

+
+ +
+
+
+ First Name +
+
+ +
+
+
+
+ Last Name +
+
+ +
+
+
+
+ Username +
+
+ +
+
+
+
+ Email +
+
+ +
+
+
+
+ Password +
+
+ +
+
+
+
+ Confirm Password +
+
+ +
+
+
+ + I Agree by Clicking register, you agree to the Terms and Conditions set out by this site +
+ +
+ + +
+
+
+ +
+ +
+
+ +{{/zone}} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.js new file mode 100755 index 00000000..be564964 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.js @@ -0,0 +1,19 @@ +function onRequest(context){ + var dcProps = require('/config/dc-props.js').config(); + if (dcProps.ssoConfiguration.enabled) { + response.sendRedirect(dcProps.appContext + "sso/login"); + exit(); + }else{ + context.loginPath = "api/user/login"; + } + + var constants = require("/modules/constants.js"); + var localLogoutURL = dcProps.appContext + "api/user/logout"; + var ssoLogoutURL = dcProps.appContext + "sso/logout"; + context.logoutURL = dcProps.ssoConfiguration.enabled? ssoLogoutURL : localLogoutURL; + context.user = session.get(constants.USER_SESSION_KEY); + + context.viewonly = !context.user; + + return context; +} diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.json b/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.json new file mode 100755 index 00000000..6240cff5 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/appbar.json @@ -0,0 +1,3 @@ +{ + "predicate": "false" +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/public/images/logo.png b/modules/distribution/src/repository/jaggeryapps/sensebot/units/appbar/public/images/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..91cc5d3f68ccd0e272ef8f0a05539373dbd34bfb GIT binary patch literal 5174 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.hbs b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.hbs new file mode 100755 index 00000000..97498a91 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.hbs @@ -0,0 +1,77 @@ +{{#zone "topCss"}} + + +{{/zone}} +{{#zone "topJs"}} + + + + + + +{{/zone}} +{{#zone "main"}} +
+
+
+
+

Sense Bot

+
+
+
+
+
+ + +
+
+ +
+ +
+
+

Temperature

+
+ +
+
+
+
+
+
+

Light

+
+ +
+
+
+
+
+

Motion

+
+ +
+
+
+
+
+

Sonar

+
+ +
+
+
+
+
+ + + + + + + +{{/zone}} diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.js new file mode 100755 index 00000000..fc57dc19 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.js @@ -0,0 +1,4 @@ +function onRequest(context){ + context.sketchPath = "api/device/sketch"; + return context; +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.json b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.json new file mode 100755 index 00000000..795898d0 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/mydevice.json @@ -0,0 +1,3 @@ +{ + "predicate": "true" +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/css/daterangepicker.css b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/css/daterangepicker.css new file mode 100755 index 00000000..030b3386 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/css/daterangepicker.css @@ -0,0 +1,232 @@ +.date-picker +{ + width:170px; + height:25px; + padding:0; + border:0; + line-height:25px; + padding-left:10px; + font-size:12px; + font-family:Arial; + font-weight:bold; + cursor:pointer; + color:#303030; + position:relative; + z-index:2; +} +.date-picker-wrapper +{ + position:absolute; + z-index:1; + border:1px solid #bfbfbf; + background-color:#efefef; + width:428px; + padding: 5px 12px; + font-size:12px; + line-height:20px; + color:#aaa; + font-family:Arial; + box-shadow:3px 3px 10px rgba(0,0,0,0.5); +} +.date-picker-wrapper.single-date { + width:auto; +} +.date-picker-wrapper.no-shortcuts { padding-bottom:12px;} +.date-picker-wrapper .footer +{ + font-size:11px; + padding-top: 3px; +} +.date-picker-wrapper b +{ + color:#666; + font-weight:700; +} +.date-picker-wrapper a +{ + color: rgb(107, 180, 214); + text-decoration:underline; +} +.date-picker-wrapper .month-name +{ + text-transform: uppercase; +} +.date-picker-wrapper .month-wrapper +{ + border:1px solid #bfbfbf; + border-radius:3px; + background-color:#fff; + padding:5px; + cursor:default; + position:relative; + _overflow:hidden; +} +.date-picker-wrapper .month-wrapper table +{ + width:190px; + float:left; +} +.date-picker-wrapper .month-wrapper table.month2 +{ + width:190px; + float:right; +} +.date-picker-wrapper .month-wrapper table th, +.date-picker-wrapper .month-wrapper table td +{ + vertical-align:middle; + text-align:center; + line-height:14px; + margin : 0px; + padding : 0px; +} +.date-picker-wrapper .month-wrapper table .day +{ + height:19px; + line-height:19px; + font-size:12px; + margin-bottom:1px; + color:#999; + cursor:default; +} +.date-picker-wrapper .month-wrapper table div.day.lastMonth, +.date-picker-wrapper .month-wrapper table div.day.nextMonth +{ + color:#999; + cursor:default; +} +.date-picker-wrapper .month-wrapper table .day.checked +{ + background-color: rgba(156, 219, 247, 0.5); +} +.date-picker-wrapper .month-wrapper table .week-name +{ + height:20px; + line-height:20px; + font-weight:100; + text-transform: uppercase; +} + +.date-picker-wrapper .month-wrapper table .day.has-tooltip { cursor:help !important;} + +.date-picker-wrapper .month-wrapper table .day.toMonth.valid +{ + color:#333; + cursor:pointer; +} + +.date-picker-wrapper .month-wrapper table .day.real-today { background-color: rgb(255, 230, 132); } +.date-picker-wrapper .month-wrapper table .day.real-today.checked { background-color: rgb(112, 204, 213); } + + +.date-picker-wrapper table .caption +{ + height:40px; +} +.date-picker-wrapper table .caption .next, +.date-picker-wrapper table .caption .prev +{ + padding:0 5px; + cursor:pointer; +} +.date-picker-wrapper table .caption .next:hover, +.date-picker-wrapper table .caption .prev:hover +{ + background-color:#ccc; + color:white; +} +.date-picker-wrapper .gap +{ + position:absolute; + display:none; + top:0px; + left:204px; + z-index: 1; + width:15px; + height: 100%; + background-color:red; + font-size:0; + line-height:0; +} +.date-picker-wrapper .gap .gap-lines { height: 100%; overflow:hidden; } +.date-picker-wrapper .gap .gap-line { height:15px;width:15px; position:relative; } +.date-picker-wrapper .gap .gap-line .gap-1 { z-index:1; height:0; border-left:8px solid white; border-top:8px solid #eee;border-bottom:8px solid #eee; } +.date-picker-wrapper .gap .gap-line .gap-2 { position:absolute; right:0; top:0px; z-index:2; height:0; border-left:8px solid transparent; border-top:8px solid white; } +.date-picker-wrapper .gap .gap-line .gap-3 { position:absolute; right:0; top:8px; z-index:2; height:0; border-left:8px solid transparent; border-bottom:8px solid white; } +.date-picker-wrapper .gap .gap-top-mask { width: 6px; height:1px; position:absolute; top: -1px; left: 1px; background-color: #eee; z-index:3; } +.date-picker-wrapper .gap .gap-bottom-mask { width: 6px; height:1px; position:absolute; bottom: -1px; left: 7px; background-color: #eee; z-index:3; } + +.date-picker-wrapper .selected-days +{ + display:none; +} +.date-picker-wrapper .drp_top-bar +{ + line-height:40px; + height:40px; + position:relative; +} +.date-picker-wrapper .drp_top-bar .error-top { display:none; } +.date-picker-wrapper .drp_top-bar .normal-top { display:none; } +.date-picker-wrapper .drp_top-bar .default-top { display:block; } + +.date-picker-wrapper .drp_top-bar.error .default-top { display:none; } +.date-picker-wrapper .drp_top-bar.error .error-top { display:block; color:red; } + +.date-picker-wrapper .drp_top-bar.normal .default-top { display:none; } +.date-picker-wrapper .drp_top-bar.normal .normal-top { display:block; } + +.date-picker-wrapper .drp_top-bar .apply-btn +{ + position:absolute; + right: 0px; + top: 6px; + padding:3px 5px; + margin:0; + font-size:12px; + border-radius:4px; + cursor:pointer; + + color: #d9eef7; + border: solid 1px #0076a3; + background: #0095cd; + background: -webkit-gradient(linear, left top, left bottom, from(#00adee), to(#0078a5)); + background: -moz-linear-gradient(top, #00adee, #0078a5); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00adee', endColorstr='#0078a5'); + color:white; +} + +.date-picker-wrapper .drp_top-bar .apply-btn.disabled +{ + cursor: pointer; + color: #606060; + border: solid 1px #b7b7b7; + background: #fff; + background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#ededed)); + background: -moz-linear-gradient(top, #fff, #ededed); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ededed'); +} +/*time styling*/ +.time { + position: relative; +} +.time input[type=range] { + vertical-align: middle; +} +.time1, .time2 { + width: 180px; + padding: 0 5px; + text-align: center; +} +.time1 { + float: left; +} +.time2 { + float: right; +} +.hour, .minute { + text-align: right; +} +.hide { + display: none; +} diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/css/nv.d3.css b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/css/nv.d3.css new file mode 100755 index 00000000..26453e88 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/css/nv.d3.css @@ -0,0 +1,645 @@ +/******************** + * SVG CSS + */ + + +svg { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + /* Trying to get SVG to act like a greedy block in all browsers */ + display: block; + width:100%; + height:100%; +} + +/******************** + Default CSS for an svg element nvd3 used +*/ +svg.nvd3-svg { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; + -moz-user-select: none; + user-select: none; + display: block; +} + +/******************** + Box shadow and border radius styling +*/ +.nvtooltip.with-3d-shadow, .with-3d-shadow .nvtooltip { + -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2); + -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2); + box-shadow: 0 5px 10px rgba(0,0,0,.2); + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +/******************** + * TOOLTIP CSS + */ + +.nvtooltip { + position: absolute; + background-color: rgba(255,255,255,1.0); + padding: 1px; + border: 1px solid rgba(0,0,0,.2); + z-index: 10000; + + font-family: Arial; + font-size: 13px; + text-align: left; + pointer-events: none; + + white-space: nowrap; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/*Give tooltips that old fade in transition by + putting a "with-transitions" class on the container div. +*/ +.nvtooltip.with-transitions, .with-transitions .nvtooltip { + transition: opacity 50ms linear; + -moz-transition: opacity 50ms linear; + -webkit-transition: opacity 50ms linear; + + transition-delay: 200ms; + -moz-transition-delay: 200ms; + -webkit-transition-delay: 200ms; +} + +.nvtooltip.x-nvtooltip, +.nvtooltip.y-nvtooltip { + padding: 8px; +} + +.nvtooltip h3 { + margin: 0; + padding: 4px 14px; + line-height: 18px; + font-weight: normal; + background-color: rgba(247,247,247,0.75); + text-align: center; + + border-bottom: 1px solid #ebebeb; + + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 1px 5px 0 0; +} + +.nvtooltip p { + margin: 0; + padding: 5px 14px; + text-align: center; +} + +.nvtooltip span { + display: inline-block; + margin: 2px 0; +} + +.nvtooltip table { + margin: 6px; + border-spacing:0; +} + + +.nvtooltip table td { + padding: 2px 9px 2px 0; + vertical-align: middle; +} + +.nvtooltip table td.key { + font-weight:normal; +} +.nvtooltip table td.value { + text-align: right; + font-weight: bold; +} + +.nvtooltip table tr.highlight td { + padding: 1px 9px 1px 0; + border-bottom-style: solid; + border-bottom-width: 1px; + border-top-style: solid; + border-top-width: 1px; +} + +.nvtooltip table td.legend-color-guide div { + width: 8px; + height: 8px; + vertical-align: middle; +} + +.nvtooltip .footer { + padding: 3px; + text-align: center; +} + +.nvtooltip-pending-removal { + position: absolute; + pointer-events: none; +} + +.nvd3 text { + font: normal 12px Arial; +} + +.nvd3 .title { + font: bold 14px Arial; +} + +.nvd3 .nv-background { + fill: white; + fill-opacity: 0; +} + +.nvd3.nv-noData { + font-size: 18px; + font-weight: bold; +} + + +/********** +* Brush +*/ + +.nv-brush .extent { + fill-opacity: .125; + shape-rendering: crispEdges; +} + + +/********** +* Legend +*/ + +.nvd3 .nv-legend .nv-series { + cursor: pointer; +} + +.nvd3 .nv-legend .nv-disabled circle { + fill-opacity: 0; +} + + +/********** +* Axes +*/ + +.axis { + opacity: 1; +} + +.axis.nv-disabled { + opacity: 0; +} + +.nvd3 .nv-axis { + pointer-events:none; +} + +.nvd3 .nv-axis path { + fill: none; + stroke: #000; + stroke-opacity: .75; + shape-rendering: crispEdges; +} + +.nvd3 .nv-axis path.domain { + stroke-opacity: .75; +} + +.nvd3 .nv-axis.nv-x path.domain { + stroke-opacity: 0; +} + +.nvd3 .nv-axis line { + fill: none; + stroke: #e5e5e5; + shape-rendering: crispEdges; +} + +.nvd3 .nv-axis .zero line, +/*this selector may not be necessary*/ .nvd3 .nv-axis line.zero { + stroke-opacity: .75; +} + +.nvd3 .nv-axis .nv-axisMaxMin text { + font-weight: bold; +} + +.nvd3 .x .nv-axis .nv-axisMaxMin text, +.nvd3 .x2 .nv-axis .nv-axisMaxMin text, +.nvd3 .x3 .nv-axis .nv-axisMaxMin text { + text-anchor: middle +} + + +/********** +* Brush +*/ + +.nv-brush .resize path { + fill: #eee; + stroke: #666; +} + + +/********** +* Bars +*/ + +.nvd3 .nv-bars .negative rect { + zfill: brown; +} + +.nvd3 .nv-bars rect { + zfill: steelblue; + fill-opacity: .75; + + transition: fill-opacity 250ms linear; + -moz-transition: fill-opacity 250ms linear; + -webkit-transition: fill-opacity 250ms linear; +} + +.nvd3 .nv-bars rect.hover { + fill-opacity: 1; +} + +.nvd3 .nv-bars .hover rect { + fill: lightblue; +} + +.nvd3 .nv-bars text { + fill: rgba(0,0,0,0); +} + +.nvd3 .nv-bars .hover text { + fill: rgba(0,0,0,1); +} + + +/********** +* Bars +*/ + +.nvd3 .nv-multibar .nv-groups rect, +.nvd3 .nv-multibarHorizontal .nv-groups rect, +.nvd3 .nv-discretebar .nv-groups rect { + stroke-opacity: 0; + + transition: fill-opacity 250ms linear; + -moz-transition: fill-opacity 250ms linear; + -webkit-transition: fill-opacity 250ms linear; +} + +.nvd3 .nv-multibar .nv-groups rect:hover, +.nvd3 .nv-multibarHorizontal .nv-groups rect:hover, +.nvd3 .nv-discretebar .nv-groups rect:hover { + fill-opacity: 1; +} + +.nvd3 .nv-discretebar .nv-groups text, +.nvd3 .nv-multibarHorizontal .nv-groups text { + font-weight: bold; + fill: rgba(0,0,0,1); + stroke: rgba(0,0,0,0); +} + +/*********** +* Pie Chart +*/ + +.nvd3.nv-pie path { + stroke-opacity: 0; + transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; + -moz-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; + -webkit-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; + +} + +.nvd3.nv-pie .nv-pie-title { + font-size: 24px; + fill: rgba(19, 196, 249, 0.59); +} + +.nvd3.nv-pie .nv-slice text { + stroke: #000; + stroke-width: 0; +} + +.nvd3.nv-pie path { + stroke: #fff; + stroke-width: 1px; + stroke-opacity: 1; +} + +.nvd3.nv-pie .hover path { + fill-opacity: .7; +} +.nvd3.nv-pie .nv-label { + pointer-events: none; +} +.nvd3.nv-pie .nv-label rect { + fill-opacity: 0; + stroke-opacity: 0; +} + +/********** +* Lines +*/ + +.nvd3 .nv-groups path.nv-line { + fill: none; + stroke-width: 1.5px; +} + +.nvd3 .nv-groups path.nv-line.nv-thin-line { + stroke-width: 1px; +} + + +.nvd3 .nv-groups path.nv-area { + stroke: none; +} + +.nvd3 .nv-line.hover path { + stroke-width: 6px; +} + +.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { + fill-opacity: 0; + stroke-opacity: 0; +} + +.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point { + fill-opacity: .5 !important; + stroke-opacity: .5 !important; +} + + +.with-transitions .nvd3 .nv-groups .nv-point { + transition: stroke-width 250ms linear, stroke-opacity 250ms linear; + -moz-transition: stroke-width 250ms linear, stroke-opacity 250ms linear; + -webkit-transition: stroke-width 250ms linear, stroke-opacity 250ms linear; + +} + +.nvd3.nv-scatter .nv-groups .nv-point.hover, +.nvd3 .nv-groups .nv-point.hover { + stroke-width: 7px; + fill-opacity: .95 !important; + stroke-opacity: .95 !important; +} + + +.nvd3 .nv-point-paths path { + stroke: #aaa; + stroke-opacity: 0; + fill: #eee; + fill-opacity: 0; +} + + + +.nvd3 .nv-indexLine { + cursor: ew-resize; +} + + +/********** +* Distribution +*/ + +.nvd3 .nv-distribution { + pointer-events: none; +} + + +/********** +* Scatter +*/ + +.nvd3 .nv-groups .nv-point.hover { + stroke-width: 20px; + stroke-opacity: .5; +} + +.nvd3 .nv-scatter .nv-point.hover { + fill-opacity: 1; +} + + +/********** +* Stacked Area +*/ + +.nvd3.nv-stackedarea path.nv-area { + fill-opacity: .7; + stroke-opacity: 0; + transition: fill-opacity 250ms linear, stroke-opacity 250ms linear; + -moz-transition: fill-opacity 250ms linear, stroke-opacity 250ms linear; + -webkit-transition: fill-opacity 250ms linear, stroke-opacity 250ms linear; +} + +.nvd3.nv-stackedarea path.nv-area.hover { + fill-opacity: .9; +} + + +.nvd3.nv-stackedarea .nv-groups .nv-point { + stroke-opacity: 0; + fill-opacity: 0; +} + + +/********** +* Line Plus Bar +*/ + +.nvd3.nv-linePlusBar .nv-bar rect { + fill-opacity: .75; +} + +.nvd3.nv-linePlusBar .nv-bar rect:hover { + fill-opacity: 1; +} + + +/********** +* Bullet +*/ + +.nvd3.nv-bullet { font: 10px sans-serif; } +.nvd3.nv-bullet .nv-measure { fill-opacity: .8; } +.nvd3.nv-bullet .nv-measure:hover { fill-opacity: 1; } +.nvd3.nv-bullet .nv-marker { stroke: #000; stroke-width: 2px; } +.nvd3.nv-bullet .nv-markerTriangle { stroke: #000; fill: #fff; stroke-width: 1.5px; } +.nvd3.nv-bullet .nv-tick line { stroke: #666; stroke-width: .5px; } +.nvd3.nv-bullet .nv-range.nv-s0 { fill: #eee; } +.nvd3.nv-bullet .nv-range.nv-s1 { fill: #ddd; } +.nvd3.nv-bullet .nv-range.nv-s2 { fill: #ccc; } +.nvd3.nv-bullet .nv-title { font-size: 14px; font-weight: bold; } +.nvd3.nv-bullet .nv-subtitle { fill: #999; } + + +.nvd3.nv-bullet .nv-range { + fill: #bababa; + fill-opacity: .4; +} +.nvd3.nv-bullet .nv-range:hover { + fill-opacity: .7; +} + + +/********** +* Sparkline +*/ + +.nvd3.nv-sparkline path { + fill: none; +} + +.nvd3.nv-sparklineplus g.nv-hoverValue { + pointer-events: none; +} + +.nvd3.nv-sparklineplus .nv-hoverValue line { + stroke: #333; + stroke-width: 1.5px; + } + +.nvd3.nv-sparklineplus, +.nvd3.nv-sparklineplus g { + pointer-events: all; +} + +.nvd3 .nv-hoverArea { + fill-opacity: 0; + stroke-opacity: 0; +} + +.nvd3.nv-sparklineplus .nv-xValue, +.nvd3.nv-sparklineplus .nv-yValue { + stroke-width: 0; + font-size: .9em; + font-weight: normal; +} + +.nvd3.nv-sparklineplus .nv-yValue { + stroke: #f66; +} + +.nvd3.nv-sparklineplus .nv-maxValue { + stroke: #2ca02c; + fill: #2ca02c; +} + +.nvd3.nv-sparklineplus .nv-minValue { + stroke: #d62728; + fill: #d62728; +} + +.nvd3.nv-sparklineplus .nv-currentValue { + font-weight: bold; + font-size: 1.1em; +} + +/********** +* historical stock +*/ + +.nvd3.nv-ohlcBar .nv-ticks .nv-tick { + stroke-width: 1px; +} + +.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover { + stroke-width: 2px; +} + +.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive { + stroke: #2ca02c; +} + +.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative { + stroke: #d62728; +} + +.nvd3.nv-historicalStockChart .nv-axis .nv-axislabel { + font-weight: bold; +} + +.nvd3.nv-historicalStockChart .nv-dragTarget { + fill-opacity: 0; + stroke: none; + cursor: move; +} + +.nvd3 .nv-brush .extent { + fill-opacity: 0 !important; +} + +.nvd3 .nv-brushBackground rect { + stroke: #000; + stroke-width: .4; + fill: #fff; + fill-opacity: .7; +} + + +/********** +* Parallel Coordinates +*/ + +.nvd3 .background path { + fill: none; + stroke: #EEE; + stroke-opacity: .4; + shape-rendering: crispEdges; +} + +.nvd3 .foreground path { + fill: none; + stroke-opacity: .7; +} + +.nvd3 .brush .extent { + fill-opacity: .3; + stroke: #fff; + shape-rendering: crispEdges; +} + +.nvd3 .axis line, .axis path { + fill: none; + stroke: #000; + shape-rendering: crispEdges; +} + +.nvd3 .axis text { + text-shadow: 0 1px 0 #fff; +} + +/**** +Interactive Layer +*/ +.nvd3 .nv-interactiveGuideLine { + pointer-events:none; +} +.nvd3 line.nv-guideline { + stroke: #ccc; +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/images/bulb-off.png b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/images/bulb-off.png new file mode 100755 index 0000000000000000000000000000000000000000..59f7aea5d8e432b710bd326554d850baa65e93d3 GIT binary patch literal 516 zcmV+f0{i`mP)%;iK%F4z1hf;7On^H9bOUcd@1#RIogDBh>7Q8oglwPfd-*$)W%qV(|J-ul z1=BQ@@YwQEtrzQuHJQ!IJX(H^ut9?o^^!obvH@Nz zZLzGT`_HeTf$KL4(I1)%_5f~ZvjD>~5PIsrSmYjJbD*{*lFh9b#`+YupqJ!BWK&6^ zvMAriCSgXD`zFTDA~ed9tPS8J6%7yE#bjN>`VA5m>+f8w_fcXiG~Wp9@d zWK`V@vKt#V7Y;$s>|u>bU62%KHY`pwrsi-Ea}GZHZd?VyB76gk%nK(R$n(eDQc?z_VN#?h6MuDSc}+i4A*X4$3}q_+L2DFmOyB^@S|a!s_q zpT21SM@z&$x8spZC0=I3VI&+V7!DLcRp4ZO%{;?&DEq%PA|nt*Bh?9`;O`x%1Z-5? zDkvFMP)da0!0`Vd)r>+|xJZ76$9BWocOr__5qB|$k<`=pGfE$Tc8cY6`dQ*JSkO^B z7iKr7?j>6BZQ$K~tTGi62Aca_G&ICku^DJc`VuvXodcMN&#w4~G@lR#G~EeBh8M+P t0u8?J4CnR*=2rtrLpP%t=bQf$U;qs8_nierh^+ts002ovPDHLkV1hymz54(F literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/images/fan.png b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/images/fan.png new file mode 100755 index 0000000000000000000000000000000000000000..04fdc33c325d17c2054d9fdc37ee7b95174e9627 GIT binary patch literal 650 zcmV;50(Jd~P)`cRsiN>FMJqrzkSS7$a@#Y@5t) z8DXw2E-j#VCJHqu9pN_xBQK@AM+Z9)jcpaPu7Wx2oo?4W-}V^7dO+BOGRvq~*GXB^HH8kSUC9*{LE zkfbu@7R=;eO$yQ;5tJeY%WzkYUhf!)i6Zq(NNYVJEmj!MPN|jbM5PPf(o0lK$gD}N z1v3}N4C^%_AeF>|frQebCsqW&jFjU#qH;@ehd{^x6At7V)_9tRxa&1N;!oP zV(;|D7J-_tkvBT9P7tLE=Jc9pTuPPfO}g}p_Z_6neW*gQxdm$VUN{2Rzq>*cs0G^r z5Flr_!zw)#|0Rg5u&nwJxmt-~$BfKP);`p%j(}he{gBqy3N$fX^5J>DaFqYgGqwO)YhmQ3->|x1DS*Sr zAW{%;H&;dqh=Q$2LBOFPw!#^c5twVA!iKGkOdu0joxt{obmV4`n4Xg{re$|X&oPh* zWCH(9z;-?%e3llVniQUsk&4VKZ@mtExNW(5x498X<{G*rBzoGig}i+;(G{2Qv5+BS zV2AN)M954jCCWsy^1|;6KvweUUfHV*}d}hbM zk}OaNwvHU$!KR{Q0Z7oizu>kUeCaf TzhUF200000NkvXXu0mjf>pYrW literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/bulb.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/bulb.js new file mode 100755 index 00000000..72c40fd7 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/bulb.js @@ -0,0 +1,10 @@ +function changeImage() { + var image = document.getElementById('myImage'); + if (image.src.match("bulb-on")) { + + image.src = "/iot/public/mydevice/images/bulb-off.png"; + } else { + + image.src = "/iot/public/mydevice/images/bulb-on.png"; + } +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/cumulativelinechart.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/cumulativelinechart.js new file mode 100755 index 00000000..e69de29b diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/d3.min.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/d3.min.js new file mode 100755 index 00000000..99b5c909 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/d3.min.js @@ -0,0 +1,5 @@ +!function(){function n(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function t(n){return null===n?0/0:+n}function e(n){return!isNaN(n)}function r(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function u(n){return n.length}function i(n){for(var t=1;n*t%1;)t*=10;return t}function o(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function a(){this._=Object.create(null)}function c(n){return(n+="")===da||n[0]===ma?ma+n:n}function l(n){return(n+="")[0]===ma?n.slice(1):n}function s(n){return c(n)in this._}function f(n){return(n=c(n))in this._&&delete this._[n]}function h(){var n=[];for(var t in this._)n.push(l(t));return n}function g(){var n=0;for(var t in this._)++n;return n}function p(){for(var n in this._)return!1;return!0}function v(){this._=Object.create(null)}function d(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function m(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=ya.length;r>e;++e){var u=ya[e]+t;if(u in n)return u}}function y(){}function M(){}function x(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function O(n){return xa(n,Aa),n}function Y(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var l=Ca.get(n);return l&&(n=l,c=V),a?t?u:r:t?y:i}function Z(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function V(n,t){var e=Z(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function X(){var n=".dragsuppress-"+ ++qa,t="click"+n,e=ta.select(oa).on("touchmove"+n,b).on("dragstart"+n,b).on("selectstart"+n,b);if(za){var r=ia.style,u=r[za];r[za]="none"}return function(i){if(e.on(n,null),za&&(r[za]=u),i){var o=function(){e.on(t,null)};e.on(t,function(){b(),o()},!0),setTimeout(o,0)}}}function $(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>La&&(oa.scrollX||oa.scrollY)){e=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();La=!(u.f||u.e),e.remove()}return La?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function B(){return ta.event.changedTouches[0].identifier}function W(){return ta.event.target}function J(){return oa}function G(n){return n>0?1:0>n?-1:0}function K(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function Q(n){return n>1?0:-1>n?Da:Math.acos(n)}function nt(n){return n>1?ja:-1>n?-ja:Math.asin(n)}function tt(n){return((n=Math.exp(n))-1/n)/2}function et(n){return((n=Math.exp(n))+1/n)/2}function rt(n){return((n=Math.exp(2*n))-1)/(n+1)}function ut(n){return(n=Math.sin(n/2))*n}function it(){}function ot(n,t,e){return this instanceof ot?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ot?new ot(n.h,n.s,n.l):xt(""+n,bt,ot):new ot(n,t,e)}function at(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new dt(u(n+120),u(n),u(n-120))}function ct(n,t,e){return this instanceof ct?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof ct?new ct(n.h,n.c,n.l):n instanceof st?ht(n.l,n.a,n.b):ht((n=_t((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new ct(n,t,e)}function lt(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new st(e,Math.cos(n*=Fa)*t,Math.sin(n)*t)}function st(n,t,e){return this instanceof st?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof st?new st(n.l,n.a,n.b):n instanceof ct?lt(n.h,n.c,n.l):_t((n=dt(n)).r,n.g,n.b):new st(n,t,e)}function ft(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=gt(u)*Ja,r=gt(r)*Ga,i=gt(i)*Ka,new dt(vt(3.2404542*u-1.5371385*r-.4985314*i),vt(-.969266*u+1.8760108*r+.041556*i),vt(.0556434*u-.2040259*r+1.0572252*i))}function ht(n,t,e){return n>0?new ct(Math.atan2(e,t)*Ha,Math.sqrt(t*t+e*e),n):new ct(0/0,0/0,n)}function gt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function pt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function vt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function dt(n,t,e){return this instanceof dt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof dt?new dt(n.r,n.g,n.b):xt(""+n,dt,at):new dt(n,t,e)}function mt(n){return new dt(n>>16,255&n>>8,255&n)}function yt(n){return mt(n)+""}function Mt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function xt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(St(u[0]),St(u[1]),St(u[2]))}return(i=tc.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function bt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new ot(r,u,c)}function _t(n,t,e){n=wt(n),t=wt(t),e=wt(e);var r=pt((.4124564*n+.3575761*t+.1804375*e)/Ja),u=pt((.2126729*n+.7151522*t+.072175*e)/Ga),i=pt((.0193339*n+.119192*t+.9503041*e)/Ka);return st(116*u-16,500*(r-u),200*(u-i))}function wt(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function St(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function kt(n){return"function"==typeof n?n:function(){return n}}function Et(n){return n}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Nt(t,e,n,r)}}function Nt(n,t,e,r){function u(){var n,t=c.status;if(!t&&zt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!oa.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(Ct(r))}function Ct(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function zt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qt(){var n=Lt(),t=Tt()-n;t>24?(isFinite(t)&&(clearTimeout(ic),ic=setTimeout(qt,t)),uc=0):(uc=1,ac(qt))}function Lt(){var n=Date.now();for(oc=ec;oc;)n>=oc.t&&(oc.f=oc.c(n-oc.t)),oc=oc.n;return n}function Tt(){for(var n,t=ec,e=1/0;t;)t.f?t=n?n.n=t.n:ec=t.n:(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:Et;return function(n){var e=lc.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=sc.get(g)||Ut;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new hc(e-1)),1),e}function i(n,e){return t(n=new hc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{hc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{hc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ht(n);return c.floor=c,c.round=Ht(r),c.ceil=Ht(u),c.offset=Ht(i),c.range=a,n}function Ht(n){return function(t,e){try{hc=jt;var r=new jt;return r._=t,n(r,e)._}finally{hc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++aa;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in pc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{hc=jt;var t=new hc;return t._=n,r(t)}finally{hc=Date}}var r=t(n);return e.parse=function(n){try{hc=jt;var t=r.parse(n);return t&&t._}finally{hc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var M=ta.map(),x=It(v),b=Zt(v),_=It(d),w=Zt(d),S=It(m),k=Zt(m),E=It(y),A=Zt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Yt(n.getDate(),t,2)},e:function(n,t){return Yt(n.getDate(),t,2)},H:function(n,t){return Yt(n.getHours(),t,2)},I:function(n,t){return Yt(n.getHours()%12||12,t,2)},j:function(n,t){return Yt(1+fc.dayOfYear(n),t,3)},L:function(n,t){return Yt(n.getMilliseconds(),t,3)},m:function(n,t){return Yt(n.getMonth()+1,t,2)},M:function(n,t){return Yt(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Yt(n.getSeconds(),t,2)},U:function(n,t){return Yt(fc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Yt(fc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Yt(n.getFullYear()%100,t,2)},Y:function(n,t){return Yt(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:s,S:re,U:Xt,w:Vt,W:$t,x:c,X:l,y:Wt,Y:Bt,Z:Jt,"%":oe};return t}function Yt(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function It(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Zt(n){for(var t=new a,e=-1,r=n.length;++e68?1900:2e3)}function Kt(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){vc.lastIndex=0;var r=vc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=0|va(t)/60,u=va(t)%60;return e+Yt(r,"0",2)+Yt(u,"0",2)}function oe(n,t,e){dc.lastIndex=0;var r=dc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);_c.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;wc.point=function(o,a){wc.point=n,r=(t=o)*Fa,u=Math.cos(a=(e=a)*Fa/2+Da/4),i=Math.sin(a)},wc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Me(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function xe(n){return[Math.atan2(n[1],n[0]),nt(n[2])]}function be(n,t){return va(n[0]-t[0])a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new qe(e,n,null,!0),l=new qe(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new qe(r,n,null,!1),l=new qe(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),ze(i),ze(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ze(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Te))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Fe(m,p);g.length?(b||(i.polygonStart(),b=!0),Ce(g,De,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Re(),x=t(M),b=!1;return y}}function Te(n){return n.length>1}function Re(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:y,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function De(n,t){return((n=n.x)[0]<0?n[1]-ja-Ta:ja-n[1])-((t=t.x)[0]<0?t[1]-ja-Ta:ja-t[1])}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Da:-Da,c=va(i-e);va(c-Da)0?ja:-ja),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Da&&(va(e-u)Ta?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*ja,r.point(-Da,u),r.point(0,u),r.point(Da,u),r.point(Da,0),r.point(Da,-u),r.point(0,-u),r.point(-Da,-u),r.point(-Da,0),r.point(-Da,u);else if(va(n[0]-t[0])>Ta){var i=n[0]a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+Da/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+Da/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>Da,k=p*M;if(_c.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*Pa:b,S^h>=e^m>=e){var E=de(pe(f),pe(n));Me(E);var A=de(u,E);Me(A);var N=(S^b>=0?-1:1)*nt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ta>i||Ta>i&&0>_c)^1&o}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Da:-Da),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(be(e,g)||be(p,g))&&(p[0]+=Ta,p[1]+=Ta,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&be(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),M=m*m-y*(ve(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=ye(d,(-m-x)/y);if(me(b,p),b=xe(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=va(A-Da)A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(va(b[0]-w)Da^(w<=b[0]&&b[0]<=S)){var z=ye(d,(-m+x)/y);return me(z,p),[b,xe(z)]}}}function u(t,e){var r=o?n:Da-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=va(i)>Ta,c=gr(n,6*Fa);return Le(t,e,c,o?[0,-n]:[-Da,n-Da])}function Oe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ye(n,t,e,r){function u(r,u){return va(r[0]-n)0?0:3:va(r[0]-e)0?2:1:va(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&K(l,i,n)>0&&++t:i[1]<=r&&K(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Uc,Math.min(Uc,n)),t=Math.max(-Uc,Math.min(Uc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=Re(),N=Oe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Ce(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ie(n){var t=0,e=Da/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Da/180,e=n[1]*Da/180):[180*(t/Da),180*(e/Da)]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,nt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){Fc+=u*n-r*t,r=n,u=t}var t,e,r,u;Zc.point=function(i,o){Zc.point=n,t=r=i,e=u=o},Zc.lineEnd=function(){n(t,e)}}function Xe(n,t){Hc>n&&(Hc=n),n>Yc&&(Yc=n),Oc>t&&(Oc=t),t>Ic&&(Ic=t)}function $e(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function We(n,t){Ec+=n,Ac+=t,++Nc}function Je(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);Cc+=o*(t+n)/2,zc+=o*(e+r)/2,qc+=o,We(t=n,e=r)}var t,e;Xc.point=function(r,u){Xc.point=n,We(t=r,e=u)}}function Ge(){Xc.point=We}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);Cc+=o*(r+n)/2,zc+=o*(u+t)/2,qc+=o,o=u*n-r*t,Lc+=o*(r+n),Tc+=o*(u+t),Rc+=3*o,We(r=n,u=t)}var t,e,r,u;Xc.point=function(i,o){Xc.point=n,We(t=r=i,e=u=o)},Xc.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Pa)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:y};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=va(va(w)-1)i||va((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Fa),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Ha,e*Ha])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*Fa,n[1]*Fa),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Ha,n[1]*Ha]}function r(){a=Ae(o=lr(m,y,M),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,M=0,x=Pc,b=Et,_=null,w=null;return t.stream=function(n){return s&&(s.valid=!1),s=or(x(o,f(b(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(x=null==n?(_=n,Pc):He((_=+n)*Fa),u()):_},t.clipExtent=function(n){return arguments.length?(w=n,b=n?Ye(n[0][0],n[0][1],n[1][0],n[1][1]):Et,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Fa,d=n[1]%360*Fa,r()):[v*Ha,d*Ha]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Fa,y=n[1]%360*Fa,M=n.length>2?n[2]%360*Fa:0,r()):[m*Ha,y*Ha,M*Ha]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*Fa,e*Fa)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>Da?n-Pa:-Da>n?n+Pa:n,t]}function lr(n,t,e){return n?t||e?Ae(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function sr(n){return function(t,e){return t+=n,[t>Da?t-Pa:-Da>t?t+Pa:t,e]}}function fr(n){var t=sr(n);return t.invert=sr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),nt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),nt(s*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*Pa)):(u=n+o*Pa,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=xe([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function pr(n,t){var e=pe(t);e[0]-=n,Me(e);var r=Q(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ta)%(2*Math.PI)}function vr(n,t,e){var r=ta.range(n,t-Ta,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=ta.range(n,t-Ta,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function Mr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(ut(r-t)+u*o*ut(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Ha,Math.atan2(o,Math.sqrt(r*r+u*u))*Ha]}:function(){return[n*Ha,t*Ha]};return p.distance=h,p}function xr(){function n(n,u){var i=Math.sin(u*=Fa),o=Math.cos(u),a=va((n*=Fa)-t),c=Math.cos(a);$c+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Bc.point=function(u,i){t=u*Fa,e=Math.sin(i*=Fa),r=Math.cos(i),Bc.point=n},Bc.lineEnd=function(){Bc.point=Bc.lineEnd=y}}function br(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function _r(n,t){function e(n,t){o>0?-ja+Ta>t&&(t=-ja+Ta):t>ja-Ta&&(t=ja-Ta);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(Da/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=G(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-ja]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return va(u)u;u++){for(;r>1&&K(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function zr(n,t){return n[0]-t[0]||n[1]-t[1]}function qr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Lr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Tr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=ol.pop()||new Rr;return t.site=n,t}function Pr(n){Xr(n),rl.remove(n),ol.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&va(e-c.circle.x)s;++s)l=a[s],c=a[s-1],Kr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Jr(c.site,l.site,null,u),Vr(c),Vr(l)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=rl._;a;)if(r=Fr(a,o)-i,r>Ta)a=a.L;else{if(u=i-Hr(a,o),!(u>Ta)){r>-Ta?(t=a.P,e=a):u>-Ta?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(rl.insert(t,c),t||e){if(t===e)return Xr(t),e=Dr(t.site),rl.insert(c,e),c.edge=e.edge=Jr(t.site,c.site),Vr(t),Vr(e),void 0;if(!e)return c.edge=Jr(t.site,c.site),void 0;Xr(t),Xr(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Kr(e.edge,l,p,x),c.edge=Jr(l,n,null,x),e.edge=Jr(n,p,null,x),Vr(t),Vr(e)}}function Fr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Hr(n,t){var e=n.N;if(e)return Fr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Yr(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=el,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(va(r-t)>Ta||va(u-e)>Ta)&&(a.splice(o,0,new Qr(Gr(i.site,s,va(r-f)Ta?{x:f,y:va(t-f)Ta?{x:va(e-p)Ta?{x:h,y:va(t-h)Ta?{x:va(e-g)=-Ra)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=al.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=il._;M;)if(m.yd||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.yg){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.xi||f>o||r>h||u>g)){if(p=n.point){var p,v=t-p[0],d=e-p[1],m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function gu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+Mt(Math.round(e+i*n))+Mt(Math.round(r+o*n))+Mt(Math.round(u+a*n))}}function pu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=mu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function vu(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function du(n,t){var e,r,u,i=ll.lastIndex=sl.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=ll.exec(n))&&(r=sl.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:vu(e,r)})),i=sl.lastIndex;return ir;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function mu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function yu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(mu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Mu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function bu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function wu(n){return n*n*n}function Su(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function ku(n){return function(t){return Math.pow(t,n)}}function Eu(n){return 1-Math.cos(n*ja)}function Au(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Cu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Pa*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Pa/t)}}function zu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Lu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return lt(e+i*n,r+o*n,u+a*n)+""}}function Tu(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return at(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ft(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Pu(n){var t=[n.a,n.b],e=[n.c,n.d],r=ju(t),u=Uu(t,e),i=ju(Fu(e,t,-u))||0;t[0]*e[1]180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:vu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:vu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:vu(g[0],p[0])},{i:e-2,x:vu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i=0;)e.push(u[r])}function Qu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++oe;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function si(n){return n.reduce(fi,0)}function fi(n,t){return n+t[1]}function hi(n,t){return gi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function gi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function pi(n){return[ta.min(n),ta.max(n)]}function vi(n,t){return n.value-t.value}function di(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function mi(n,t){n._pack_next=t,t._pack_prev=n}function yi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Mi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(xi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],wi(r,u,i),t(i),di(r,i),r._pack_prev=i,di(i,u),u=r._pack_next,o=3;l>o;o++){wi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(yi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!yi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.ro;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(bi)}}function xi(n){n._pack_next=n._pack_prev=n}function bi(n){delete n._pack_next,delete n._pack_prev}function _i(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Ci(n,t,e){return n.a.parent===t.parent?n.a:e}function zi(n){return 1+ta.max(n,function(n){return n.y})}function qi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Li(n){var t=n.children;return t&&t.length?Li(t[0]):n}function Ti(n){var t,e=n.children;return e&&(t=e.length)?Ti(e[t-1]):n}function Ri(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Di(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Pi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ui(n){return n.rangeExtent?n.rangeExtent():Pi(n.range())}function ji(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Fi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Hi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:bl}function Oi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Oi:ji,c=r?Yu:Ou;return o=u(n,t,c,e),a=u(t,n,c,mu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Du)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Xi(n,t)},i.tickFormat=function(t,e){return $i(n,t,e)},i.nice=function(t){return Zi(n,t),u()},i.copy=function(){return Yi(n,t,e,r)},u()}function Ii(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Zi(n,t){return Fi(n,Hi(Vi(n,t)[2]))}function Vi(n,t){null==t&&(t=10);var e=Pi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Xi(n,t){return ta.range.apply(ta,Vi(n,t))}function $i(n,t,e){var r=Vi(n,t);if(e){var u=lc.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(va(r[0]),va(r[1])));return u[7]||(u[7]="."+Bi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Wi(u[8],r)),e=u.join("")}else e=",."+Bi(r[2])+"f";return ta.format(e)}function Bi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Wi(n,t){var e=Bi(t[2]);return n in _l?Math.abs(e-Bi(Math.max(va(t[0]),va(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ji(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Fi(r.map(u),e?Math:Sl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Pi(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++0;h--)o.push(i(l)*h);for(l=0;o[l]c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return wl;arguments.length<2?t=wl:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ji(n.copy(),t,e,r)},Ii(o,n)}function Gi(n,t,e){function r(t){return n(u(t))}var u=Ki(t),i=Ki(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Xi(e,n)},r.tickFormat=function(n,t){return $i(e,n,t)},r.nice=function(n){return r.domain(Zi(e,n))},r.exponent=function(o){return arguments.length?(u=Ki(t=o),i=Ki(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Gi(n.copy(),t,e)},Ii(r,n)}function Ki(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new a;for(var i,o=-1,c=r.length;++on?[0/0,0/0]:[n>0?a[n-1]:r[0],nt?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return to(n,t,e)},u()}function eo(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return eo(n,t)},e}function ro(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Xi(n,t)},t.tickFormat=function(t,e){return $i(n,t,e)},t.copy=function(){return ro(n)},t}function uo(){return 0}function io(n){return n.innerRadius}function oo(n){return n.outerRadius}function ao(n){return n.startAngle}function co(n){return n.endAngle}function lo(n){return n&&n.padAngle}function so(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function fo(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function ho(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=kt(e),p=kt(r);++f1&&u.push("H",r[0]),u.join("")}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?go(n):n[0]+_o(n,Lo(n))}function Ro(n){for(var t,e,r,u=-1,i=n.length;++ur)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,o.event&&o.event.start.call(n,n.__data__,t),o.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return p.c=l(e||1)?Ne:l,1},0,c)}function l(e){if(i.active!==r)return 1;for(var u=e/f,a=h(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=o.delay,p=oc,v=[];return p.t=g+c,u>=g?a(u-g):(p.c=a,void 0)},0,c)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Wl,u);return i==Wl.length?[t.year,Vi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Wl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Pi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Ii(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.2"};Date.now||(Date.now=function(){return+new Date});var ea=[].slice,ra=function(n){return ea.call(n)},ua=document,ia=ua.documentElement,oa=window;try{ra(ia.childNodes)[0].nodeType}catch(aa){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{ua.createElement("div").style.setProperty("opacity",0,"")}catch(ca){var la=oa.Element.prototype,sa=la.setAttribute,fa=la.setAttributeNS,ha=oa.CSSStyleDeclaration.prototype,ga=ha.setProperty;la.setAttribute=function(n,t){sa.call(this,n,t+"")},la.setAttributeNS=function(n,t,e){fa.call(this,n,t,e+"")},ha.setProperty=function(n,t,e){ga.call(this,n,t+"",e)}}ta.ascending=n,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ur&&(e=r)}else{for(;++u=r){e=r;break}for(;++ur&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ue&&(e=r)}else{for(;++u=r){e=r;break}for(;++ue&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var r,u=0,i=n.length,o=-1;if(1===arguments.length)for(;++o1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var pa=r(n);ta.bisectLeft=pa.left,ta.bisect=ta.bisectRight=pa.right,ta.bisector=function(t){return r(1===t.length?function(e,r){return n(t(e),r)}:t)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=0|Math.random()*i--,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,u),e=new Array(t);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var va=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/e)throw new Error("infinite range");var r,u=[],o=i(va(e)),a=-1;if(n*=o,t*=o,e*=o,0>e)for(;(r=n+e*++a)>t;)u.push(r/o);else for(;(r=n+e*++a)=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var l,s,f,h,g=-1,p=o.length,v=i[c++],d=new a;++g=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new v;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},o(v,{has:s,add:function(n){return this._[c(n+="")]=!0,n},remove:f,values:h,size:g,empty:p,forEach:function(n){for(var t in this._)n.call(this,l(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(Ma,"\\$&")};var Ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,xa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ba=function(n,t){return t.querySelector(n)},_a=function(n,t){return t.querySelectorAll(n)},wa=ia.matches||ia[m(ia,"matchesSelector")],Sa=function(n,t){return wa.call(n,t)};"function"==typeof Sizzle&&(ba=function(n,t){return Sizzle(n,t)[0]||null},_a=Sizzle,Sa=Sizzle.matchesSelector),ta.selection=function(){return Na};var ka=ta.selection.prototype=[];ka.select=function(n){var t,e,r,u,i=[];n=k(n);for(var o=-1,a=this.length;++o=0&&(e=n.slice(0,t),n=n.slice(t+1)),Ea.hasOwnProperty(e)?{space:Ea[e],local:n}:n}},ka.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(A(t,n[t]));return this}return this.each(A(n,t))},ka.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=z(n)).length,u=-1;if(t=e.classList){for(;++ur){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(T(e,n[e],t));return this}if(2>r)return oa.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(T(n,t,e))},ka.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},ka.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},ka.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},ka.append=function(n){return n=D(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},ka.insert=function(n,t){return n=D(n),t=k(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},ka.remove=function(){return this.each(P)},ka.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new a,y=new Array(o);for(r=-1;++rr;++r)p[r]=U(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),l.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++ii;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return S(u)},ka.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},ka.sort=function(n){n=F.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},ka.size=function(){var n=0;return H(this,function(){++n}),n};var Aa=[];ta.selection.enter=O,ta.selection.enter.prototype=Aa,Aa.append=ka.append,Aa.empty=ka.empty,Aa.node=ka.node,Aa.call=ka.call,Aa.size=ka.size,Aa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(I(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(I(n,t,e))};var Ca=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});Ca.forEach(function(n){"on"+n in ua&&Ca.remove(n)});var za="onselectstart"in ua?null:m(ia.style,"userSelect"),qa=0;ta.mouse=function(n){return $(n,_())};var La=/WebKit/.test(oa.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=_().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return $(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",i)}function t(n,t,u,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=e.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(u()).on(i+d,a).on(o+d,c),y=X(),M=t(h,v);r?(l=r.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var e=w(n,"drag","dragstart","dragend"),r=null,u=t(y,ta.mouse,J,"mousemove","mouseup"),i=t(B,ta.touch,W,"touchmove","touchend");return n.origin=function(t){return arguments.length?(r=t,n):r},ta.rebind(n,e,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=_().touches),t?ra(t).map(function(t){var e=$(n,t);return e.identifier=t.identifier,e}):[]};var Ta=1e-6,Ra=Ta*Ta,Da=Math.PI,Pa=2*Da,Ua=Pa-Ta,ja=Da/2,Fa=Da/180,Ha=180/Da,Oa=Math.SQRT2,Ya=2,Ia=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=et(v),o=i/(Ya*h)*(e*rt(Oa*t+v)-tt(v));return[r+o*l,u+o*s,i*e/et(Oa*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Oa*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Ia*f)/(2*i*Ya*h),p=(c*c-i*i-Ia*f)/(2*c*Ya*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Oa;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(z,s).on(Xa+".zoom",h).on("dblclick.zoom",g).on(T,f)}function t(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function e(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function r(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=e(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function i(t,e,i,o){t.__chart__={x:k.x,y:k.y,k:k.k},r(Math.pow(2,o)),u(v=e,i),t=ta.select(t),N>0&&(t=t.transition().duration(N)),t.call(n.event)}function o(){x&&x.domain(M.range().map(function(n){return(n-k.x)/k.k}).map(M.invert)),S&&S.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function a(n){C++||n({type:"zoomstart"})}function c(n){o(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function l(n){--C||n({type:"zoomend"}),v=null}function s(){function n(){s=1,u(ta.mouse(r),h),c(o)}function e(){f.on(q,null).on(L,null),g(s&&ta.event.target===i),l(o)}var r=this,i=ta.event.target,o=R.of(r,arguments),s=0,f=ta.select(oa).on(q,n).on(L,e),h=t(ta.mouse(r)),g=X();Fl.call(r),a(o)}function f(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=t(n))}),n}function e(){var t=ta.event.target;ta.select(t).on(x,o).on(_,h),w.push(t);for(var e=ta.event.changedTouches,r=0,u=e.length;u>r;++r)d[e[r].identifier]=null;var a=n(),c=Date.now();if(1===a.length){if(500>c-y){var l=a[0];i(p,l,d[l.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),b()}y=c}else if(a.length>1){var l=a[0],s=a[1],f=l[0]-s[0],g=l[1]-s[1];m=f*f+g*g}}function o(){var n,t,e,i,o=ta.touches(p);Fl.call(p);for(var a=0,l=o.length;l>a;++a,i=null)if(e=o[a],i=d[e.identifier]){if(t)break;n=e,t=i}if(i){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*g)}y=null,u(n,t),c(v)}function h(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(w).on(M,null),S.on(z,s).on(T,f),E(),l(v)}var g,p=this,v=R.of(p,arguments),d={},m=0,M=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+M,_="touchend"+M,w=[],S=ta.select(p),E=X();e(),a(v),S.on(z,null).on(T,e)}function h(){var n=R.of(this,arguments);m?clearTimeout(m):(p=t(v=d||ta.mouse(this)),Fl.call(this),a(n)),m=setTimeout(function(){m=null,l(n)},50),b(),r(Math.pow(2,.002*Za())*k.k),u(v,p),c(n)}function g(){var n=ta.mouse(this),e=Math.log(k.k)/Math.LN2;i(this,n,t(n),ta.event.shiftKey?Math.ceil(e)-1:Math.floor(e)+1)}var p,v,d,m,y,M,x,_,S,k={x:0,y:0,k:1},E=[960,500],A=Va,N=250,C=0,z="mousedown.zoom",q="mousemove.zoom",L="mouseup.zoom",T="touchstart.zoom",R=w(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=R.of(this,arguments),t=k;Ul?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},a(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],u=v?v[0]:e/2,i=v?v[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){l(n)}).each("end.zoom",function(){l(n)}):(this.__chart__=k,a(n),c(n),l(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Va:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(d=t&&[+t[0],+t[1]],n):d},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(N=+t,n):N},n.x=function(t){return arguments.length?(x=t,M=t.copy(),k={x:0,y:0,k:1},n):x},n.y=function(t){return arguments.length?(S=t,_=t.copy(),k={x:0,y:0,k:1},n):S},ta.rebind(n,R,"on")};var Za,Va=[0,1/0],Xa="onwheel"in ua?(Za=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Za=function(){return ta.event.wheelDelta},"mousewheel"):(Za=function(){return-ta.event.detail},"MozMousePixelScroll");ta.color=it,it.prototype.toString=function(){return this.rgb()+""},ta.hsl=ot;var $a=ot.prototype=new it;$a.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ot(this.h,this.s,this.l/n)},$a.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ot(this.h,this.s,n*this.l)},$a.rgb=function(){return at(this.h,this.s,this.l)},ta.hcl=ct;var Ba=ct.prototype=new it;Ba.brighter=function(n){return new ct(this.h,this.c,Math.min(100,this.l+Wa*(arguments.length?n:1)))},Ba.darker=function(n){return new ct(this.h,this.c,Math.max(0,this.l-Wa*(arguments.length?n:1)))},Ba.rgb=function(){return lt(this.h,this.c,this.l).rgb()},ta.lab=st;var Wa=18,Ja=.95047,Ga=1,Ka=1.08883,Qa=st.prototype=new it;Qa.brighter=function(n){return new st(Math.min(100,this.l+Wa*(arguments.length?n:1)),this.a,this.b)},Qa.darker=function(n){return new st(Math.max(0,this.l-Wa*(arguments.length?n:1)),this.a,this.b)},Qa.rgb=function(){return ft(this.l,this.a,this.b)},ta.rgb=dt;var nc=dt.prototype=new it;nc.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new dt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new dt(u,u,u)},nc.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new dt(n*this.r,n*this.g,n*this.b)},nc.hsl=function(){return bt(this.r,this.g,this.b)},nc.toString=function(){return"#"+Mt(this.r)+Mt(this.g)+Mt(this.b)};var tc=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});tc.forEach(function(n,t){tc.set(n,mt(t))}),ta.functor=kt,ta.xhr=At(Et),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Nt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new v,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var ec,rc,uc,ic,oc,ac=oa[m(oa,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};rc?rc.n=i:ec=i,rc=i,uc||(ic=clearTimeout(ic),uc=1,ac(qt))},ta.timer.flush=function(){Lt(),Tt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var cc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),cc[8+e/3]};var lc=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,sc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),fc=ta.time={},hc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){gc.setUTCDate.apply(this._,arguments)},setDay:function(){gc.setUTCDay.apply(this._,arguments)},setFullYear:function(){gc.setUTCFullYear.apply(this._,arguments)},setHours:function(){gc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){gc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){gc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){gc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){gc.setUTCSeconds.apply(this._,arguments)},setTime:function(){gc.setTime.apply(this._,arguments)}};var gc=Date.prototype;fc.year=Ft(function(n){return n=fc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),fc.years=fc.year.range,fc.years.utc=fc.year.utc.range,fc.day=Ft(function(n){var t=new hc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),fc.days=fc.day.range,fc.days.utc=fc.day.utc.range,fc.dayOfYear=function(n){var t=fc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=fc[n]=Ft(function(n){return(n=fc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=fc.year(n).getDay();return Math.floor((fc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});fc[n+"s"]=e.range,fc[n+"s"].utc=e.utc.range,fc[n+"OfYear"]=function(n){var e=fc.year(n).getDay();return Math.floor((fc.dayOfYear(n)+(e+t)%7)/7)}}),fc.week=fc.sunday,fc.weeks=fc.sunday.range,fc.weeks.utc=fc.sunday.utc.range,fc.weekOfYear=fc.sundayOfYear;var pc={"-":"",_:" ",0:"0"},vc=/^\s*\d+/,dc=/^%/;ta.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var mc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=mc.numberFormat,ta.geo={},ce.prototype={s:0,t:0,add:function(n){le(n,this.t,yc),le(yc.s,this.s,this),this.s?this.t+=yc.t:this.s=yc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var yc=new ce;ta.geo.stream=function(n,t){n&&Mc.hasOwnProperty(n.type)?Mc[n.type](n,t):se(n,t)};var Mc={Feature:function(n,t){se(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*Da+n:n,wc.lineStart=wc.lineEnd=wc.point=y}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*Fa,e*Fa]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);Me(o),o=xe(o);var c=t-p,l=c>0?1:-1,v=o[0]*Ha*l,d=va(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Ha;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Ha;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=va(r)>180?r+(r>0?360:-360):r}else v=n,d=e;wc.point(n,e),t(n,e)}function i(){wc.lineStart()}function o(){u(v,d),wc.lineEnd(),va(y)>Ta&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n_c?(s=-(h=180),f=-(g=90)):y>Ta?g=90:-Ta>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){Sc=kc=Ec=Ac=Nc=Cc=zc=qc=Lc=Tc=Rc=0,ta.geo.stream(n,Dc);var t=Lc,e=Tc,r=Rc,u=t*t+e*e+r*r;return Ra>u&&(t=Cc,e=zc,r=qc,Ta>kc&&(t=Ec,e=Ac,r=Nc),u=t*t+e*e+r*r,Ra>u)?[0/0,0/0]:[Math.atan2(e,t)*Ha,nt(r/Math.sqrt(u))*Ha]};var Sc,kc,Ec,Ac,Nc,Cc,zc,qc,Lc,Tc,Rc,Dc={sphere:y,point:_e,lineStart:Se,lineEnd:ke,polygonStart:function(){Dc.lineStart=Ee},polygonEnd:function(){Dc.lineStart=Se}},Pc=Le(Ne,Pe,je,[-Da,-Da/2]),Uc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ye(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ie(Ze)}).raw=Ze,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ta,f+.12*l+Ta],[s-.214*l-Ta,f+.234*l-Ta]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ta,f+.166*l+Ta],[s-.115*l-Ta,f+.234*l-Ta]]).stream(c).point,n},n.scale(1070)};var jc,Fc,Hc,Oc,Yc,Ic,Zc={point:y,lineStart:y,lineEnd:y,polygonStart:function(){Fc=0,Zc.lineStart=Ve},polygonEnd:function(){Zc.lineStart=Zc.lineEnd=Zc.point=y,jc+=va(Fc/2)}},Vc={point:Xe,lineStart:y,lineEnd:y,polygonStart:y,polygonEnd:y},Xc={point:We,lineStart:Je,lineEnd:Ge,polygonStart:function(){Xc.lineStart=Ke},polygonEnd:function(){Xc.point=We,Xc.lineStart=Je,Xc.lineEnd=Ge}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return jc=0,ta.geo.stream(n,u(Zc)),jc},n.centroid=function(n){return Ec=Ac=Nc=Cc=zc=qc=Lc=Tc=Rc=0,ta.geo.stream(n,u(Xc)),Rc?[Lc/Rc,Tc/Rc]:qc?[Cc/qc,zc/qc]:Nc?[Ec/Nc,Ac/Nc]:[0/0,0/0]},n.bounds=function(n){return Yc=Ic=-(Hc=Oc=1/0),ta.geo.stream(n,u(Vc)),[[Hc,Oc],[Yc,Ic]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):Et,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new $e:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ur,ta.geo.projectionMutator=ir,(ta.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Fa,t[1]*Fa),t[0]*=Ha,t[1]*=Ha,t}return n=lr(n[0]%360*Fa,n[1]*Fa,n.length>2?n[2]*Fa:0),t.invert=function(t){return t=n.invert(t[0]*Fa,t[1]*Fa),t[0]*=Ha,t[1]*=Ha,t},t},cr.invert=ar,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=lr(-n[0]*Fa,-n[1]*Fa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ha,n[1]*=Ha}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*Fa,u*Fa),n):t},n.precision=function(r){return arguments.length?(e=gr(t*Fa,(u=+r)*Fa),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Fa,u=n[1]*Fa,i=t[1]*Fa,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return va(n%d)>Ta}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return va(n%m)>Ta}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=vr(a,o,90),f=dr(r,e,y),h=vr(l,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ta],[180,90-Ta]]).minorExtent([[-180,-80-Ta],[180,80+Ta]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return Mr(n[0]*Fa,n[1]*Fa,t[0]*Fa,t[1]*Fa)},ta.geo.length=function(n){return $c=0,ta.geo.stream(n,Bc),$c};var $c,Bc={sphere:y,point:y,lineStart:xr,lineEnd:y,polygonStart:y,polygonEnd:y},Wc=br(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ur(Wc)}).raw=Wc;var Jc=br(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},Et);(ta.geo.azimuthalEquidistant=function(){return ur(Jc)}).raw=Jc,(ta.geo.conicConformal=function(){return Ie(_r)}).raw=_r,(ta.geo.conicEquidistant=function(){return Ie(wr)}).raw=wr;var Gc=br(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ur(Gc)}).raw=Gc,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-ja]},(ta.geo.mercator=function(){return kr(Sr)}).raw=Sr;var Kc=br(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ur(Kc)}).raw=Kc;var Qc=br(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ur(Qc)}).raw=Qc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-ja]},(ta.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Er,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=kt(e),i=kt(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(zr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Cr(a),s=Cr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ta)*Ta,y:Math.round(o(n,t)/Ta)*Ta,i:t}})}var r=Ar,u=Nr,i=r,o=u,a=cl;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Ir),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=su()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=kt(a),x=kt(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.xm&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=su();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},k.find=function(n){return hu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=hl.get(e)||fl,r=gl.get(r)||Et,Mu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Lu,ta.interpolateHsl=Tu,ta.interpolateLab=Ru,ta.interpolateRound=Du,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Pu(e?e.matrix:pl)})(n)},Pu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var pl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Hu,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=vl,h=dl,g=-30,p=ml,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,M,x,b=m.length,_=y.length;for(e=0;_>e;++e)a=y[e],f=a.source,h=a.target,M=h.x-f.x,x=h.y-f.y,(p=M*M+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,M*=p,x*=p,h.x-=M*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=M*(d=1-d),f.y+=x*d);if((d=r*v)&&(M=l[0]/2,x=l[1]/2,e=-1,d))for(;++e0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;l>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++at;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(Et).on("dragstart.force",Xu).on("drag.force",t).on("dragend.force",$u)),arguments.length?(this.on("mouseover.force",Bu).on("mouseout.force",Wu).call(e),void 0):e},ta.rebind(a,c,"on")};var vl=20,dl=1,ml=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Qu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ei,e=ni,r=ti;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ku(t,function(n){n.children&&(n.value=0)}),Qu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++lf?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===yl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=yl,r=0,u=Pa,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var yl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=Et,e=ai,r=ci,u=oi,i=ui,o=ii;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:Ml.get(t)||ai,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:xl.get(t)||ci,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var Ml=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(li),i=n.map(si),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ai}),xl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ci});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=pi,u=hi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=kt(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return gi(n,t)}:kt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Qu(a,function(n){n.r=+s(n.value)}),Qu(a,Mi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Qu(a,function(n){n.r+=f}),Qu(a,Mi),Qu(a,function(n){n.r-=f})}return _i(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(vi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Gu(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Qu(h,e),h.parent.m=-h.z,Ku(h,r),l)Ku(f,i);else{var g=f,p=f,v=f;Ku(f,function(n){n.xp.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Ku(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ni(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ei(o),u=ki(u),o&&u;)c=ki(c),i=Ei(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ai(Ci(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ei(i)&&(i.t=o,i.m+=f-s),u&&!ki(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=Si,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Gu(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Qu(c,function(n){var t=n.children;t&&t.length?(n.x=qi(t),n.y=zi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Li(c),f=Ti(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Qu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=Si,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Gu(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++oe&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++ie.dx)&&(s=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var bl={floor:Et,ceil:Et};ta.scale.linear=function(){return Yi([0,1],[0,1],mu,!1)};var _l={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Ji(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var wl=ta.format(".0e"),Sl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Gi(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return Qi([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(kl)},ta.scale.category20=function(){return ta.scale.ordinal().range(El)},ta.scale.category20b=function(){return ta.scale.ordinal().range(Al)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Nl)};var kl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(yt),El=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(yt),Al=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(yt),Nl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(yt);ta.scale.quantile=function(){return no([],[])},ta.scale.quantize=function(){return to(0,1,[0,1])},ta.scale.threshold=function(){return eo([.5],[0,1])},ta.scale.identity=function(){return ro([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-ja,f=a.apply(this,arguments)-ja,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ua)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===Cl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=nt(d/l*Math.sin(m))),n&&(E=nt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=Da?0:1;if(A&&so(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=Da?0:1;if(E&&so(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Lr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=fo(null==S?[_,w]:[S,k],[y,M],l,H,g),Y=fo([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^so(O[1][0],O[1][1],Y[1][0],Y[1][1]),",",g," ",Y[1],"A",H,",",H," 0 0,",v," ",Y[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",Y[0])}else N.push("M",y,",",M);if(null!=S){var I=Math.min(p,(n-F)/(j-1)),Z=fo([y,M],[S,k],n,-I,g),V=fo([_,w],null==x?[y,M]:[x,b],n,-I,g);p===I?N.push("L",V[0],"A",I,",",I," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^so(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",I,",",I," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",I,",",I," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=io,r=oo,u=uo,i=Cl,o=ao,a=co,c=lo;return n.innerRadius=function(t){return arguments.length?(e=kt(t),n):e},n.outerRadius=function(t){return arguments.length?(r=kt(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=kt(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Cl?Cl:kt(t),n):i},n.startAngle=function(t){return arguments.length?(o=kt(t),n):o},n.endAngle=function(t){return arguments.length?(a=kt(t),n):a},n.padAngle=function(t){return arguments.length?(c=kt(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-ja;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Cl="auto";ta.svg.line=function(){return ho(Et)};var zl=ta.map({linear:go,"linear-closed":po,step:vo,"step-before":mo,"step-after":yo,basis:So,"basis-open":ko,"basis-closed":Eo,bundle:Ao,cardinal:bo,"cardinal-open":Mo,"cardinal-closed":xo,monotone:To});zl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var ql=[0,2/3,1/3,0],Ll=[0,1/3,2/3,0],Tl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=ho(Ro);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mo.reverse=yo,yo.reverse=mo,ta.svg.area=function(){return Do(Et)},ta.svg.area.radial=function(){var n=Do(Ro);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-ja,s=l.call(n,u,r)-ja;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Da)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Po,c=ao,l=co;return n.radius=function(t){return arguments.length?(a=kt(t),n):a},n.source=function(t){return arguments.length?(i=kt(t),n):i},n.target=function(t){return arguments.length?(o=kt(t),n):o},n.startAngle=function(t){return arguments.length?(c=kt(t),n):c},n.endAngle=function(t){return arguments.length?(l=kt(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Uo;return n.source=function(e){return arguments.length?(t=kt(e),n):t},n.target=function(t){return arguments.length?(e=kt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Uo,e=n.projection;return n.projection=function(n){return arguments.length?e(jo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(Rl.get(t.call(this,n,r))||Oo)(e.call(this,n,r))}var t=Ho,e=Fo;return n.type=function(e){return arguments.length?(t=kt(e),n):t},n.size=function(t){return arguments.length?(e=kt(t),n):e},n};var Rl=ta.map({circle:Oo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Pl)),e=t*Pl;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Dl),e=t*Dl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Dl),e=t*Dl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=Rl.keys();var Dl=Math.sqrt(3),Pl=Math.tan(30*Fa);ka.transition=function(n){for(var t,e,r=Ul||++Ol,u=Xo(n),i=[],o=jl||{time:Date.now(),ease:Su,delay:0,duration:250},a=-1,c=this.length;++ai;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Io(u,this.namespace,this.id)},Hl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):H(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Hl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:mu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Hl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Hl.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=oa.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=mu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Zo(this,"style."+n,t,u)},Hl.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,oa.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Hl.text=function(n){return Zo(this,"text",n,Vo)},Hl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Hl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),H(this,function(r){r[e][t].ease=n}))},Hl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:H(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Hl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:H(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Hl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=jl,i=Ul;try{Ul=e,H(this,function(t,u,i){jl=t[r][e],n.call(t,t.__data__,u,i)})}finally{jl=u,Ul=i}}else H(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Hl.transition=function(){for(var n,t,e,r,u=this.id,i=++Ol,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Io(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):Et:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ta),d=ta.transition(p.exit()).style("opacity",Ta).remove(),m=ta.transition(p.order()).style("opacity",1),y=Math.max(u,0)+o,M=Ui(f),x=l.selectAll(".domain").data([0]),b=(x.enter().append("path").attr("class","domain"),ta.transition(x));v.append("line"),v.append("text");var _,w,S,k,E=v.select("line"),A=m.select("line"),N=p.select("text").text(g),C=v.select("text"),z=m.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,_="x",S="y",w="x2",k="y2",N.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),b.attr("d","M"+M[0]+","+q*i+"V0H"+M[1]+"V"+q*i)):(n=Wo,_="y",S="x",w="y2",k="x2",N.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),b.attr("d","M"+q*i+","+M[0]+"H0V"+M[1]+"H"+q*i)),E.attr(k,q*u),C.attr(S,q*y),A.attr(w,0).attr(k,q*u),z.attr(_,0).attr(S,q*y),f.rangeBand){var L=f,T=L.rangeBand()/2;s=f=function(n){return L(n)+T}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=Yl,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Il?t+"":Yl,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Yl="bottom",Il={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(i){i.each(function(){var i=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,Et);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Zl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var s,f=ta.transition(i),h=ta.transition(o);c&&(s=Ui(c),h.attr("x",s[0]).attr("width",s[1]-s[0]),e(f)),l&&(s=Ui(l),h.attr("y",s[0]).attr("height",s[1]-s[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==ta.event.keyCode&&(N||(y=null,z[0]-=s[1],z[1]-=f[1],N=2),b())}function p(){32==ta.event.keyCode&&2==N&&(z[0]+=s[1],z[1]+=f[1],N=0,b())}function v(){var n=ta.mouse(x),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),N||(ta.event.altKey?(y||(y=[(s[0]+s[1])/2,(f[0]+f[1])/2]),z[0]=s[+(n[0]p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function m(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),C(),w({type:"brushend"})}var y,M,x=this,_=ta.select(ta.event.target),w=a.of(x,arguments),S=ta.select(x),k=_.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&l,N=_.classed("extent"),C=X(),z=ta.mouse(x),q=ta.select(oa).on("keydown.brush",u).on("keyup.brush",p);if(ta.event.changedTouches?q.on("touchmove.brush",v).on("touchend.brush",m):q.on("mousemove.brush",v).on("mouseup.brush",m),S.interrupt().selectAll("*").interrupt(),N)z[0]=s[0]-z[0],z[1]=f[0]-z[1];else if(k){var L=+/w$/.test(k),T=+/^n/.test(k);M=[s[1-L]-z[0],f[1-T]-z[1]],z[0]=s[L],z[1]=f[T]}else ta.event.altKey&&(y=z.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=w(n,"brushstart","brush","brushend"),c=null,l=null,s=[0,0],f=[0,0],h=!0,g=!0,p=Vl[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:s,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Ul?ta.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,s=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=yu(s,t.x),r=yu(f,t.y);return i=o=null,function(u){s=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Vl[!c<<1|!l],n):c},n.y=function(t){return arguments.length?(l=t,p=Vl[!c<<1|!l],n):l},n.clamp=function(t){return arguments.length?(c&&l?(h=!!t[0],g=!!t[1]):c?h=!!t:l&&(g=!!t),n):c&&l?[h,g]:c?h:l?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],l&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=s[0]||r!=s[1])&&(s=[e,r])),l&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],l.invert&&(u=l(u),a=l(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),l&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],l.invert&&(u=l.invert(u),a=l.invert(a)),u>a&&(h=u,u=a,a=h))),c&&l?[[e,u],[r,a]]:c?[e,r]:l&&[u,a])},n.clear=function(){return n.empty()||(s=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!l&&f[0]==f[1]},ta.rebind(n,a,"on")};var Zl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Vl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Xl=fc.format=mc.timeFormat,$l=Xl.utc,Bl=$l("%Y-%m-%dT%H:%M:%S.%LZ");Xl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:Bl,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=Bl.toString,fc.second=Ft(function(n){return new hc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),fc.seconds=fc.second.range,fc.seconds.utc=fc.second.utc.range,fc.minute=Ft(function(n){return new hc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),fc.minutes=fc.minute.range,fc.minutes.utc=fc.minute.utc.range,fc.hour=Ft(function(n){var t=n.getTimezoneOffset()/60;return new hc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),fc.hours=fc.hour.range,fc.hours.utc=fc.hour.utc.range,fc.month=Ft(function(n){return n=fc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),fc.months=fc.month.range,fc.months.utc=fc.month.utc.range;var Wl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Jl=[[fc.second,1],[fc.second,5],[fc.second,15],[fc.second,30],[fc.minute,1],[fc.minute,5],[fc.minute,15],[fc.minute,30],[fc.hour,1],[fc.hour,3],[fc.hour,6],[fc.hour,12],[fc.day,1],[fc.day,2],[fc.week,1],[fc.month,1],[fc.month,3],[fc.year,1]],Gl=Xl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Kl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:Et,ceil:Et};Jl.year=fc.year,fc.scale=function(){return Go(ta.scale.linear(),Jl,Gl)};var Ql=Jl.map(function(n){return[n[0].utc,n[1]]}),ns=$l.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);Ql.year=fc.year.utc,fc.scale.utc=function(){return Go(ta.scale.linear(),Ql,ns)},ta.text=At(function(n){return n.responseText}),ta.json=function(n,t){return Nt(n,"application/json",Qo,t)},ta.html=function(n,t){return Nt(n,"text/html",na,t)},ta.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}(); \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/date-range.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/date-range.js new file mode 100755 index 00000000..e69de29b diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/discretebarchart.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/discretebarchart.js new file mode 100755 index 00000000..e69de29b diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/graph_util.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/graph_util.js new file mode 100755 index 00000000..e0ab53c4 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/graph_util.js @@ -0,0 +1,116 @@ +var fromDate; +var toDate; + +var configObject = { + + format: 'DD.MM.YYYY HH:mm', + separator: ' to ', + language: 'auto', + startOfWeek: 'sunday',// or sunday + getValue: function () { + return this.value; + }, + setValue: function (s) { + this.value = s; + }, + startDate: false, + endDate: false, + minDays: 0, + maxDays: 0, + showShortcuts: true, + time: { + enabled: true + }, + shortcuts: { + //'prev-days': [1,3,5,7], + 'next-days': [3, 5, 7], + //'prev' : ['week','month','year'], + 'next': ['week', 'month', 'year'] + }, + customShortcuts: [], + inline: false, + container: 'body', + alwaysOpen: false, + singleDate: false, + batchMode: false, + stickyMonths: false +}; + +$('#date-range1').dateRangePicker(configObject) + .bind('datepicker-apply', function (event, dateRange) { + fromDate = dateRange.date1 != "Invalid Date" ? dateRange.date1.getTime() / 1000 : null; + toDate = dateRange.date2 != "Invalid Date" ? dateRange.date2.getTime() / 1000 : null; + }); + +$('#btn-draw-graphs').on('click', function () { + var deviceId = $('#device-id').val(); + getStats(deviceId, fromDate, toDate); +}); + +function getStats(deviceId, from, to) { + + var requestData = new Object(); + + requestData['deviceId'] = getUrlParameter('deviceId'); + + if (from) { + requestData['from'] = from; + } + + if (to) { + requestData['to'] = to; + } + + var getStatsRequest = $.ajax({ + url: "api/stats", + method: "GET", + data: requestData + }); + + getStatsRequest.done(function (stats) { + updateGraphs(JSON.parse(stats)); + }); + + getStatsRequest.fail(function (jqXHR, textStatus) { + alert("Request failed: " + textStatus); + }); + +} + +function getUrlParameter(paramName) { + var pageURL = window.location.search.substring(1); + var urlVariables = pageURL.split('&'); + for (var i = 0; i < urlVariables.length; i++) { + var parameterName = urlVariables[i].split('='); + if (parameterName[0] == paramName) { + return parameterName[1]; + } + } +} + +function updateGraphs(stats) { + + var temperatureData = stats['temperatureData']; + updateTemperatureGraph(convertStatsToGraphData(temperatureData)); + + var lightData = stats['lightData']; + updateLightGraph(convertStatsToGraphData(lightData)); + + var motionData = stats['motionData']; + updateMotionGraph(convertStatsToGraphData(motionData)); + + var sonarData = stats['sonarData']; + updateSonarGraph(convertStatsToGraphData(sonarData)); + +} + +function convertStatsToGraphData(stats) { + + var graphData = new Array(); + + for (var i = 0; i < stats.length; i++) { + graphData.push({x: parseInt(stats[i]['time']) * 1000, y: stats[i]['value']}) + } + + return graphData; +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/jquery.daterangepicker.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/jquery.daterangepicker.js new file mode 100755 index 00000000..0d8ee556 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/jquery.daterangepicker.js @@ -0,0 +1,1627 @@ +// daterangepicker.js +// version : 0.0.5 +// author : Chunlong Liu +// last updated at: 2014-05-27 +// license : MIT +// www.jszen.com + +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery', 'moment'], factory); + } else if (typeof exports === 'object' && typeof module !== 'undefined') { + // CommonJS. Register as a module + module.exports = factory(require('jquery'), require('moment')); + } else { + // Browser globals + factory(jQuery, moment); + } +}(function ($, moment) +{ + + $.dateRangePickerLanguages = + { + 'az': + { + 'selected': 'Seçildi:', + 'day':' gün', + 'days': ' gün', + 'apply': 'tətbiq', + 'week-1' : '1', + 'week-2' : '2', + 'week-3' : '3', + 'week-4' : '4', + 'week-5' : '5', + 'week-6' : '6', + 'week-7' : '7', + 'month-name': ['yanvar','fevral','mart','aprel','may','iyun','iyul','avqust','sentyabr','oktyabr','noyabr','dekabr'], + 'shortcuts' : 'Qısayollar', + 'past': 'Keçmiş', + 'following':'Növbəti', + 'previous' : '   ', + 'prev-week' : 'Öncəki həftə', + 'prev-month' : 'Öncəki ay', + 'prev-year' : 'Öncəki il', + 'next': '   ', + 'next-week':'Növbəti həftə', + 'next-month':'Növbəti ay', + 'next-year':'Növbəti il', + 'less-than' : 'Tarix aralığı %d gündən çox olmamalıdır', + 'more-than' : 'Tarix aralığı %d gündən az olmamalıdır', + 'default-more' : '%d gündən çox bir tarix seçin', + 'default-single' : 'Tarix seçin', + 'default-less' : '%d gündən az bir tarix seçin', + 'default-range' : '%d və %d gün aralığında tarixlər seçin', + 'default-default': 'Tarix aralığı seçin' + }, + 'cn': + { + 'selected': '已选择:', + 'day':'天', + 'days': '天', + 'apply': '确定', + 'week-1' : '一', + 'week-2' : '二', + 'week-3' : '三', + 'week-4' : '四', + 'week-5' : '五', + 'week-6' : '六', + 'week-7' : '日', + 'month-name': ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'], + 'shortcuts' : '快捷选择', + 'past': '过去', + 'following':'将来', + 'previous' : '   ', + 'prev-week' : '上周', + 'prev-month' : '上个月', + 'prev-year' : '去年', + 'next': '   ', + 'next-week':'下周', + 'next-month':'下个月', + 'next-year':'明年', + 'less-than' : '所选日期范围不能大于%d天', + 'more-than' : '所选日期范围不能小于%d天', + 'default-more' : '请选择大于%d天的日期范围', + 'default-less' : '请选择小于%d天的日期范围', + 'default-range' : '请选择%d天到%d天的日期范围', + 'default-single':'请选择一个日期', + 'default-default': '请选择一个日期范围' + }, + 'cz': + { + 'selected': 'Vybráno:', + 'day':'Den', + 'days': 'Dny', + 'apply': 'Zavřít', + 'week-1' : 'po', + 'week-2' : 'út', + 'week-3' : 'st', + 'week-4' : 'čt', + 'week-5' : 'pá', + 'week-6' : 'so', + 'week-7' : 'ne', + 'month-name': ['leden','únor','březen','duben','květen','červen','červenec','srpen','září','říjen','listopad','prosinec'], + 'shortcuts' : 'Zkratky', + 'past': 'po', + 'following':'následující', + 'previous' : 'předchozí', + 'prev-week' : 'týden', + 'prev-month' : 'měsíc', + 'prev-year' : 'rok', + 'next':'další', + 'next-week':'týden', + 'next-month':'měsíc', + 'next-year':'rok', + 'less-than' : 'Rozsah data by neměl být větší než %d dnů', + 'more-than' : 'Rozsah data by neměl být menší než %d dnů', + 'default-more' : 'Prosím zvolte rozsah data větší než %d dnů', + 'default-single' : 'Prosím zvolte datum', + 'default-less' : 'Prosím zvolte rozsah data menší než %d dnů', + 'default-range' : 'Prosím zvolte rozsah data mezi %d a %d dny', + 'default-default': 'Prosím zvolte rozsah data' + }, + 'en': + { + 'selected': 'Selected:', + 'day':'Day', + 'days': 'Days', + 'apply': 'Close', + 'week-1' : 'mo', + 'week-2' : 'tu', + 'week-3' : 'we', + 'week-4' : 'th', + 'week-5' : 'fr', + 'week-6' : 'sa', + 'week-7' : 'su', + 'month-name': ['january','february','march','april','may','june','july','august','september','october','november','december'], + 'shortcuts' : 'Shortcuts', + 'custom-values': 'Custom Values', + 'past': 'Past', + 'following':'Following', + 'previous' : 'Previous', + 'prev-week' : 'Week', + 'prev-month' : 'Month', + 'prev-year' : 'Year', + 'next':'Next', + 'next-week':'Week', + 'next-month':'Month', + 'next-year':'Year', + 'less-than' : 'Date range should not be more than %d days', + 'more-than' : 'Date range should not be less than %d days', + 'default-more' : 'Please select a date range longer than %d days', + 'default-single' : 'Please select a date', + 'default-less' : 'Please select a date range less than %d days', + 'default-range' : 'Please select a date range between %d and %d days', + 'default-default': 'Please select a date range' + }, + 'it': + { + 'selected': 'Selezionati:', + 'day':'Giorno', + 'days': 'Giorni', + 'apply': 'Chiudi', + 'week-1' : 'lu', + 'week-2' : 'ma', + 'week-3' : 'me', + 'week-4' : 'gi', + 'week-5' : 've', + 'week-6' : 'sa', + 'week-7' : 'do', + 'month-name': ['gennaio','febbraio','marzo','aprile','maggio','giugno','luglio','agosto','settembre','ottobre','novembre','dicembre'], + 'shortcuts' : 'Scorciatoie', + 'past': 'Scorso', + 'following':'Successivo', + 'previous' : 'Precedente', + 'prev-week' : 'Settimana', + 'prev-month' : 'Mese', + 'prev-year' : 'Anno', + 'next':'Prossimo', + 'next-week':'Settimana', + 'next-month':'Mese', + 'next-year':'Anno', + 'less-than' : 'L\'intervallo non dev\'essere maggiore di %d giorni', + 'more-than' : 'L\'intervallo non dev\'essere minore di %d giorni', + 'default-more' : 'Seleziona un intervallo maggiore di %d giorni', + 'default-single' : 'Seleziona una data', + 'default-less' : 'Seleziona un intervallo minore di %d giorni', + 'default-range' : 'Seleziona un intervallo compreso tra i %d e i %d giorni', + 'default-default': 'Seleziona un intervallo di date' + }, + 'es': + { + 'selected': 'Seleccionado:', + 'day':'Dia', + 'days': 'Dias', + 'apply': 'Cerrar', + 'week-1' : 'lu', + 'week-2' : 'ma', + 'week-3' : 'mi', + 'week-4' : 'ju', + 'week-5' : 'vi', + 'week-6' : 'sa', + 'week-7' : 'do', + 'month-name': ['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'], + 'shortcuts' : 'Accesos directos', + 'past': 'Pasado', + 'following':'Siguiente', + 'previous' : 'Anterior', + 'prev-week' : 'Semana', + 'prev-month' : 'Mes', + 'prev-year' : 'Año', + 'next':'Siguiente', + 'next-week':'Semana', + 'next-month':'Mes', + 'next-year':'Año', + 'less-than' : 'El rango no deberia ser mayor de %d dias', + 'more-than' : 'El rango no deberia ser menor de %d dias', + 'default-more' : 'Por favor selecciona un rango mayor a %d dias', + 'default-single' : 'Por favor selecciona un dia', + 'default-less' : 'Por favor selecciona un rango menor a %d dias', + 'default-range' : 'Por favor selecciona un rango entre %d y %d dias', + 'default-default': 'Por favor selecciona un rango de fechas.' + }, + 'de': + { + 'selected': 'Auswahl:', + 'day':'Tag', + 'days': 'Tage', + 'apply': 'Schließen', + 'week-1' : 'mo', + 'week-2' : 'di', + 'week-3' : 'mi', + 'week-4' : 'do', + 'week-5' : 'fr', + 'week-6' : 'sa', + 'week-7' : 'so', + 'month-name': ['januar','februar','märz','april','mai','juni','juli','august','september','oktober','november','dezember'], + 'shortcuts' : 'Schnellwahl', + 'past': 'Vorherige', + 'following':'Folgende', + 'previous' : 'Vorherige', + 'prev-week' : 'Woche', + 'prev-month' : 'Monat', + 'prev-year' : 'Jahr', + 'next':'Nächste', + 'next-week':'Woche', + 'next-month':'Monat', + 'next-year':'Jahr', + 'less-than' : 'Datumsbereich darf nicht größer sein als %d Tage', + 'more-than' : 'Datumsbereich darf nicht kleiner sein als %d Tage', + 'default-more' : 'Bitte mindestens %d Tage auswählen', + 'default-single' : 'Bitte ein Datum auswählen', + 'default-less' : 'Bitte weniger als %d Tage auswählen', + 'default-range' : 'Bitte einen Datumsbereich zwischen %d und %d Tagen auswählen', + 'default-default': 'Bitte ein Start- und Enddatum auswählen' + }, + 'ru': + { + 'selected': 'Выбрано:', + 'day': 'День', + 'days': 'Дней', + 'apply': 'Закрыть', + 'week-1': 'пн', + 'week-2': 'вт', + 'week-3': 'ср', + 'week-4': 'чт', + 'week-5': 'пт', + 'week-6': 'сб', + 'week-7': 'вс', + 'month-name': ['январь','февраль','март','апрель','май','июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь'], + 'shortcuts': 'Быстрый выбор', + 'past': 'Прошедшие', + 'following': 'Следующие', + 'previous': '   ', + 'prev-week': 'Неделя', + 'prev-month': 'Месяц', + 'prev-year': 'Год', + 'next': '   ', + 'next-week': 'Неделя', + 'next-month': 'Месяц', + 'next-year': 'Год', + 'less-than': 'Диапазон не может быть больше %d дней', + 'more-than': 'Диапазон не может быть меньше %d дней', + 'default-more': 'Пожалуйста выберите диапазон больше %d дней', + 'default-single': 'Пожалуйста выберите дату', + 'default-less': 'Пожалуйста выберите диапазон меньше %d дней', + 'default-range': 'Пожалуйста выберите диапазон между %d и %d днями', + 'default-default': 'Пожалуйста выберите диапазон' + }, + 'fr': + { + 'selected': 'Sélection:', + 'day':'Jour', + 'days': 'Jours', + 'apply': 'Fermer', + 'week-1' : 'lu', + 'week-2' : 'ma', + 'week-3' : 'me', + 'week-4' : 'je', + 'week-5' : 've', + 'week-6' : 'sa', + 'week-7' : 'di', + 'month-name': ['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'], + 'shortcuts' : 'Raccourcis', + 'past': 'Passé', + 'following':'Suivant', + 'previous' : 'Précédent', + 'prev-week' : 'Semaine', + 'prev-month' : 'Mois', + 'prev-year' : 'Année', + 'next':'Suivant', + 'next-week':'Semaine', + 'next-month':'Mois', + 'next-year':'Année', + 'less-than' : 'L\'intervalle ne doit pas être supérieure à %d jours', + 'more-than' : 'L\'intervalle ne doit pas être inférieure à %d jours', + 'default-more' : 'Merci de choisir une intervalle supérieure à %d jours', + 'default-single' : 'Merci de choisir une date', + 'default-less' : 'Merci de choisir une intervalle inférieure %d jours', + 'default-range' : 'Merci de choisir une intervalle comprise entre %d et %d jours', + 'default-default': 'Merci de choisir une date' + }, + 'hu': + { + 'selected': 'Kiválasztva:', + 'day':'Nap', + 'days': 'Nap', + 'apply': 'Ok', + 'week-1' : 'h', + 'week-2' : 'k', + 'week-3' : 'sz', + 'week-4' : 'cs', + 'week-5' : 'p', + 'week-6' : 'sz', + 'week-7' : 'v', + 'month-name': ['január','február','március','április','május','június','július','augusztus','szeptember','október','november','december'], + 'shortcuts' : 'Gyorsválasztó', + 'past': 'Múlt', + 'following':'Következő', + 'previous' : 'Előző', + 'prev-week' : 'Hét', + 'prev-month' : 'Hónap', + 'prev-year' : 'Év', + 'next':'Következő', + 'next-week':'Hét', + 'next-month':'Hónap', + 'next-year':'Év', + 'less-than' : 'A kiválasztás nem lehet több %d napnál', + 'more-than' : 'A kiválasztás nem lehet több %d napnál', + 'default-more' : 'Válassz ki egy időszakot ami hosszabb mint %d nap', + 'default-single' : 'Válassz egy napot', + 'default-less' : 'Válassz ki egy időszakot ami rövidebb mint %d nap', + 'default-range' : 'Válassz ki egy %d - %d nap hosszú időszakot', + 'default-default': 'Válassz ki egy időszakot' + } + }; + + $.fn.dateRangePicker = function(opt) + { + if (!opt) opt = {}; + opt = $.extend(true, + { + autoClose: false, + format: 'YYYY-MM-DD', + separator: ' to ', + language: 'auto', + startOfWeek: 'sunday',// or monday + getValue: function() + { + return $(this).val(); + }, + setValue: function(s) + { + if(!$(this).attr('readonly') && !$(this).is(':disabled')){ + $(this).val(s); + } + }, + startDate: false, + endDate: false, + time: { + enabled: false + }, + minDays: 0, + maxDays: 0, + showShortcuts: true, + shortcuts: + { + //'prev-days': [1,3,5,7], + 'next-days': [3,5,7], + //'prev' : ['week','month','year'], + 'next' : ['week','month','year'] + }, + customShortcuts : [], + inline:false, + container:'body', + alwaysOpen:false, + singleDate:false, + lookBehind: false, + batchMode: false, + duration: 200, + stickyMonths: false, + dayDivAttrs: [], + dayTdAttrs: [], + applyBtnClass: '' + },opt); + + opt.start = false; + opt.end = false; + + if (opt.startDate && typeof opt.startDate == 'string') opt.startDate = moment(opt.startDate,opt.format).toDate(); + if (opt.endDate && typeof opt.endDate == 'string') opt.endDate = moment(opt.endDate,opt.format).toDate(); + + var langs = getLanguages(); + var box; + var initiated = false; + var self = this; + var selfDom = $(self).get(0); + + $(this).unbind('.datepicker').bind('click.datepicker',function(evt) + { + var isOpen = box.is(':visible'); + $(document).trigger('click.datepicker'); + evt.stopPropagation(); + if(!isOpen) open(opt.duration); + }); + + init_datepicker.call(this); + + if (opt.alwaysOpen) + { + open(0); + } + + // expose some api + $(this).data('dateRangePicker', + { + setDateRange : function(d1,d2,silent) + { + if (typeof d1 == 'string' && typeof d2 == 'string') + { + d1 = moment(d1,opt.format).toDate(); + d2 = moment(d2,opt.format).toDate(); + } + setDateRange(d1,d2,silent); + }, + clear: clearSelection, + close: closeDatePicker, + open: open, + getDatePicker: getDatePicker, + destroy: function() + { + $(self).unbind('.datepicker'); + $(self).data('dateRangePicker',''); + box.remove(); + $(window).unbind('resize.datepicker',calcPosition); + $(document).unbind('click.datepicker',closeDatePicker); + } + }); + + $(window).bind('resize.datepicker',calcPosition); + + return this; + + + function init_datepicker() + { + var self = this; + + if ($(this).data('date-picker-opened')) + { + closeDatePicker(); + return; + } + $(this).data('date-picker-opened',true); + + + box = createDom().hide(); + $(opt.container).append(box); + + if (!opt.inline) + { + calcPosition(); + } + else + { + box.addClass("inline-wrapper").css({position:'static'}); + } + + if (opt.alwaysOpen) + { + box.find('.apply-btn').hide(); + } + + var defaultTime = opt.defaultTime ? opt.defaultTime : new Date(); + if (opt.lookBehind) { + if (opt.startDate && compare_month(defaultTime, opt.startDate) < 0 ) defaultTime = nextMonth(moment(opt.startDate).toDate()); + if (opt.endDate && compare_month(defaultTime,opt.endDate) > 0 ) defaultTime = moment(opt.endDate).toDate(); + + showMonth(prevMonth(defaultTime),'month1'); + showMonth(defaultTime,'month2'); + + } else { + if (opt.startDate && compare_month(defaultTime,opt.startDate) < 0 ) defaultTime = moment(opt.startDate).toDate(); + if (opt.endDate && compare_month(nextMonth(defaultTime),opt.endDate) > 0 ) defaultTime = prevMonth(moment(opt.endDate).toDate()); + + showMonth(defaultTime,'month1'); + showMonth(nextMonth(defaultTime),'month2'); + } + + if (opt.time.enabled) { + if ((opt.startDate && opt.endDate) || (opt.start && opt.end)) { + showTime(moment(opt.start || opt.startDate).toDate(),'time1'); + showTime(moment(opt.end || opt.endDate).toDate(),'time2'); + } else { + showTime(defaultTime,'time1'); + showTime(defaultTime,'time2'); + } + } + + //showSelectedInfo(); + + + var defaultTopText = ''; + if (opt.singleDate) + defaultTopText = lang('default-single'); + else if (opt.minDays && opt.maxDays) + defaultTopText = lang('default-range'); + else if (opt.minDays) + defaultTopText = lang('default-more'); + else if (opt.maxDays) + defaultTopText = lang('default-less'); + else + defaultTopText = lang('default-default'); + + box.find('.default-top').html( defaultTopText.replace(/\%d/,opt.minDays).replace(/\%d/,opt.maxDays)); + + + setTimeout(function() + { + initiated = true; + },0); + + box.click(function(evt) + { + evt.stopPropagation(); + }); + + $(document).bind('click.datepicker',closeDatePicker); + + box.find('.next').click(function() + { + if(!opt.stickyMonths) gotoNextMonth(this); + else gotoNextMonth_stickily(this) + }); + + function gotoNextMonth(self) { + var isMonth2 = $(self).parents('table').hasClass('month2'); + var month = isMonth2 ? opt.month2 : opt.month1; + month = nextMonth(month); + if (!opt.singleDate && !isMonth2 && compare_month(month,opt.month2) >= 0 || isMonthOutOfBounds(month)) return; + showMonth(month,isMonth2 ? 'month2' : 'month1'); + showGap(); + } + + function gotoNextMonth_stickily(self) { + var nextMonth1 = nextMonth(opt.month1); + + var nextMonth2 = nextMonth(opt.month2); + + if(isMonthOutOfBounds(nextMonth2)) return; + if (!opt.singleDate && compare_month(nextMonth1,nextMonth2) >= 0) return; + showMonth(nextMonth1, 'month1'); + showMonth(nextMonth2, 'month2'); + } + + + box.find('.prev').click(function() + { + if(!opt.stickyMonths) gotoPrevMonth(this); + else gotoPrevMonth_stickily(this); + }); + + function gotoPrevMonth(self) { + var isMonth2 = $(self).parents('table').hasClass('month2'); + var month = isMonth2 ? opt.month2 : opt.month1; + month = prevMonth(month); + //if (isMonth2 && month.getFullYear()+''+month.getMonth() <= opt.month1.getFullYear()+''+opt.month1.getMonth()) return; + if (isMonth2 && compare_month(month,opt.month1) <= 0 || isMonthOutOfBounds(month)) return; + showMonth(month,isMonth2 ? 'month2' : 'month1'); + showGap(); + } + + function gotoPrevMonth_stickily(self) { + var prevMonth1 = prevMonth(opt.month1); + + var prevMonth2 = prevMonth(opt.month2); + + if(isMonthOutOfBounds(prevMonth1)) return; + if(!opt.singleDate && compare_month(prevMonth2,prevMonth1) <= 0) return; + showMonth(prevMonth2, 'month2'); + showMonth(prevMonth1, 'month1'); + } + + + box.bind('click',function(evt) + { + if ($(evt.target).hasClass('day')) + { + dayClicked($(evt.target)); + } + }); + + box.attr('unselectable', 'on') + .css('user-select', 'none') + .bind('selectstart', function(e) + { + e.preventDefault(); return false; + }); + + box.find('.apply-btn').click(function() + { + closeDatePicker(); + var dateRange = getDateString(new Date(opt.start))+ opt.separator +getDateString(new Date(opt.end)); + $(self).trigger('datepicker-apply', + { + 'value': dateRange, + 'date1' : new Date(opt.start), + 'date2' : new Date(opt.end) + }); + }); + + box.find('[custom]').click(function() + { + var valueName = $(this).attr('custom'); + opt.start = false; + opt.end = false; + box.find('.day.checked').removeClass('checked'); + opt.setValue.call(selfDom, valueName); + checkSelectionValid(); + showSelectedInfo(true); + showSelectedDays(); + if (opt.autoClose) closeDatePicker(); + }); + + box.find('[shortcut]').click(function() + { + var shortcut = $(this).attr('shortcut'); + var end = new Date(),start = false; + if (shortcut.indexOf('day') != -1) + { + var day = parseInt(shortcut.split(',',2)[1],10); + start = new Date(new Date().getTime() + 86400000*day); + end = new Date(end.getTime() + 86400000*(day>0?1:-1) ); + } + else if (shortcut.indexOf('week')!= -1) + { + var dir = shortcut.indexOf('prev,') != -1 ? -1 : 1; + + if (dir == 1) + var stopDay = opt.startOfWeek == 'monday' ? 1 : 0; + else + var stopDay = opt.startOfWeek == 'monday' ? 0 : 6; + + end = new Date(end.getTime() - 86400000); + while(end.getDay() != stopDay) end = new Date(end.getTime() + dir*86400000); + start = new Date(end.getTime() + dir*86400000*6); + } + else if (shortcut.indexOf('month') != -1) + { + var dir = shortcut.indexOf('prev,') != -1 ? -1 : 1; + if (dir == 1) + start = nextMonth(end); + else + start = prevMonth(end); + start.setDate(1); + end = nextMonth(start); + end.setDate(1); + end = new Date(end.getTime() - 86400000); + } + else if (shortcut.indexOf('year') != -1) + { + var dir = shortcut.indexOf('prev,') != -1 ? -1 : 1; + start = new Date(); + start.setFullYear(end.getFullYear() + dir); + start.setMonth(0); + start.setDate(1); + end.setFullYear(end.getFullYear() + dir); + end.setMonth(11); + end.setDate(31); + } + else if (shortcut == 'custom') + { + var name = $(this).html(); + if (opt.customShortcuts && opt.customShortcuts.length > 0) + { + for(var i=0;i=2)) + { + var ___format = opt.format; + if (___format.match(/Do/)) + { + + ___format = ___format.replace(/Do/,'D'); + defaults[0] = defaults[0].replace(/(\d+)(th|nd|st)/,'$1'); + if(defaults.length >= 2){ + defaults[1] = defaults[1].replace(/(\d+)(th|nd|st)/,'$1'); + } + } + // set initiated to avoid triggerring datepicker-change event + initiated = false; + if(defaults.length >= 2){ + setDateRange(moment(defaults[0], ___format, moment.locale(opt.language)).toDate(),moment(defaults[1], ___format, moment.locale(opt.language)).toDate()); + } + else if(defaults.length==1 && opt.singleDate){ + setSingleDate(moment(defaults[0], ___format, moment.locale(opt.language)).toDate()); + } + + initiated = true; + } + box.slideDown(animationTime, function(){ + $(self).trigger('datepicker-opened', {relatedTarget: box}); + }); + $(self).trigger('datepicker-open', {relatedTarget: box}); + } + + + function renderTime (name, date) { + box.find("." + name + " input[type=range].hour-range").val(moment(date).hours()); + box.find("." + name + " input[type=range].minute-range").val(moment(date).minutes()); + setTime(name, moment(date).format("HH"), moment(date).format("mm")); + } + + function changeTime (name, date) { + opt[name] = parseInt( + moment(parseInt(date)) + .startOf('day') + .add(moment(opt[name + "Time"]).format("HH"), 'h') + .add(moment(opt[name + "Time"]).format("mm"), 'm').valueOf() + ); + } + + function swapTime () { + renderTime("time1", opt.start); + renderTime("time2", opt.end); + } + + function setTime (name, hour, minute) { + hour && (box.find("." + name + " .hour-val").text(hour)); + minute && (box.find("." + name + " .minute-val").text(minute)); + switch (name) { + case "time1": + if (opt.start) { + setRange("start", moment(opt.start)); + } + setRange("startTime", moment(opt.startTime || moment().valueOf())); + break; + case "time2": + if (opt.end) { + setRange("end", moment(opt.end)); + } + setRange("endTime", moment(opt.endTime || moment().valueOf())); + break; + } + function setRange(name, timePoint) { + var h = timePoint.format("HH"), + m = timePoint.format("mm"); + opt[name] = timePoint + .startOf('day') + .add(hour || h, "h") + .add(minute || m, "m") + .valueOf(); + } + checkSelectionValid(); + showSelectedInfo(); + showSelectedDays(); + } + + function clearSelection() + { + opt.start = false; + opt.end = false; + box.find('.day.checked').removeClass('checked'); + opt.setValue.call(selfDom, ''); + checkSelectionValid(); + showSelectedInfo(); + showSelectedDays(); + } + + function handleStart(time) + { + var r = time; + if (opt.batchMode === 'week-range') { + if (opt.startOfWeek === 'monday') { + r = moment(parseInt(time)).startOf('isoweek').valueOf(); + } else { + r = moment(parseInt(time)).startOf('week').valueOf(); + } + } else if (opt.batchMode === 'month-range') { + r = moment(parseInt(time)).startOf('month').valueOf(); + } + + return r; + } + + function handleEnd(time) + { + var r = time; + if (opt.batchMode === 'week-range') { + if (opt.startOfWeek === 'monday') { + r = moment(parseInt(time)).endOf('isoweek').valueOf(); + } else { + r = moment(parseInt(time)).endOf('week').valueOf(); + } + } else if (opt.batchMode === 'month') { + r = moment(parseInt(time)).endOf('month').valueOf(); + } + + return r; + } + + + function dayClicked(day) + { + if (day.hasClass('invalid')) return; + var time = day.attr('time'); + day.addClass('checked'); + if ( opt.singleDate ) + { + opt.start = time; + opt.end = false; + if (opt.time.enabled) { + changeTime("start", opt.start); + } + } + else if (opt.batchMode === 'week') + { + if (opt.startOfWeek === 'monday') { + opt.start = moment(parseInt(time)).startOf('isoweek').valueOf(); + opt.end = moment(parseInt(time)).endOf('isoweek').valueOf(); + } else { + opt.end = moment(parseInt(time)).endOf('week').valueOf(); + opt.start = moment(parseInt(time)).startOf('week').valueOf(); + } + } + else if (opt.batchMode === 'month') + { + opt.start = moment(parseInt(time)).startOf('month').valueOf(); + opt.end = moment(parseInt(time)).endOf('month').valueOf(); + } + else if ((opt.start && opt.end) || (!opt.start && !opt.end) ) + { + opt.start = handleStart(time); + opt.end = false; + if (opt.time.enabled) { + changeTime("start", opt.start); + } + } + else if (opt.start) + { + opt.end = handleEnd(time); + if (opt.time.enabled) { + changeTime("end", opt.end); + } + } + + if (!opt.singleDate && opt.start && opt.end && opt.start > opt.end) + { + var tmp = opt.end; + opt.end = handleEnd(opt.start); + opt.start = handleStart(tmp); + if (opt.time.enabled) { + swapTime(); + } + } + + opt.start = parseInt(opt.start); + opt.end = parseInt(opt.end); + + checkSelectionValid(); + showSelectedInfo(); + showSelectedDays(); + autoclose(); + } + + function autoclose () { + if (opt.singleDate === true) { + if (initiated && opt.start ) + { + if (opt.autoClose) closeDatePicker(); + } + } else { + if (initiated && opt.start && opt.end) + { + if (opt.autoClose) closeDatePicker(); + } + } + } + + function checkSelectionValid() + { + var days = Math.ceil( (opt.end - opt.start) / 86400000 ) + 1; + if (opt.singleDate) { // Validate if only start is there + if (opt.start && !opt.end) + box.find('.drp_top-bar').removeClass('error').addClass('normal'); + else + box.find('.drp_top-bar').removeClass('error').removeClass('normal'); + } + else if ( opt.maxDays && days > opt.maxDays) + { + opt.start = false; + opt.end = false; + box.find('.day').removeClass('checked'); + box.find('.drp_top-bar').removeClass('normal').addClass('error').find('.error-top').html( lang('less-than').replace('%d',opt.maxDays) ); + } + else if ( opt.minDays && days < opt.minDays) + { + opt.start = false; + opt.end = false; + box.find('.day').removeClass('checked'); + box.find('.drp_top-bar').removeClass('normal').addClass('error').find('.error-top').html( lang('more-than').replace('%d',opt.minDays) ); + } + else + { + if (opt.start || opt.end) + box.find('.drp_top-bar').removeClass('error').addClass('normal'); + else + box.find('.drp_top-bar').removeClass('error').removeClass('normal'); + } + + if ( (opt.singleDate && opt.start && !opt.end) || (!opt.singleDate && opt.start && opt.end) ) + { + box.find('.apply-btn').removeClass('disabled'); + } + else + { + box.find('.apply-btn').addClass('disabled'); + } + + if (opt.batchMode) + { + if ( (opt.start && opt.startDate && compare_day(opt.start, opt.startDate) < 0) + || (opt.end && opt.endDate && compare_day(opt.end, opt.endDate) > 0) ) + { + opt.start = false; + opt.end = false; + box.find('.day').removeClass('checked'); + } + } + } + + function showSelectedInfo(forceValid,silent) + { + box.find('.start-day').html('...'); + box.find('.end-day').html('...'); + box.find('.selected-days').hide(); + if (opt.start) + { + box.find('.start-day').html(getDateString(new Date(parseInt(opt.start)))); + } + if (opt.end) + { + box.find('.end-day').html(getDateString(new Date(parseInt(opt.end)))); + } + + if (opt.start && opt.singleDate) + { + box.find('.apply-btn').removeClass('disabled'); + var dateRange = getDateString(new Date(opt.start)); + opt.setValue.call(selfDom, dateRange, getDateString(new Date(opt.start)), getDateString(new Date(opt.end))); + + if (initiated) + { + $(self).trigger('datepicker-change', + { + 'value': dateRange, + 'date1' : new Date(opt.start) + }); + } + } + else if (opt.start && opt.end) + { + box.find('.selected-days').show().find('.selected-days-num').html(Math.round((opt.end-opt.start)/86400000)+1); + box.find('.apply-btn').removeClass('disabled'); + var dateRange = getDateString(new Date(opt.start))+ opt.separator +getDateString(new Date(opt.end)); + opt.setValue.call(selfDom,dateRange, getDateString(new Date(opt.start)), getDateString(new Date(opt.end))); + if (initiated && !silent) + { + $(self).trigger('datepicker-change', + { + 'value': dateRange, + 'date1' : new Date(opt.start), + 'date2' : new Date(opt.end) + }); + } + } + else if (forceValid) + { + box.find('.apply-btn').removeClass('disabled'); + } + else + { + box.find('.apply-btn').addClass('disabled'); + } + } + + function setDateRange(date1,date2,silent) + { + if (date1.getTime() > date2.getTime()) + { + var tmp = date2; + date2 = date1; + date1 = tmp; + tmp = null; + } + var valid = true; + if (opt.startDate && compare_day(date1,opt.startDate) < 0) valid = false; + if (opt.endDate && compare_day(date2,opt.endDate) > 0) valid = false; + if (!valid) + { + showMonth(opt.startDate,'month1'); + showMonth(nextMonth(opt.startDate),'month2'); + showGap(); + return; + } + + opt.start = date1.getTime(); + opt.end = date2.getTime(); + if (opt.stickyMonths || (compare_day(date1,date2) > 0 && compare_month(date1,date2) == 0)) + { + if (opt.lookBehind) { + date1 = prevMonth(date2); + } else { + date2 = nextMonth(date1); + } + } + + if(opt.stickyMonths && compare_month(date2,opt.endDate) > 0) { + date1 = prevMonth(date1); + date2 = prevMonth(date2); + } + + if (!opt.stickyMonths) { + if (compare_month(date1,date2) == 0) + { + if (opt.lookBehind) { + date1 = prevMonth(date2); + } else { + date2 = nextMonth(date1); + } + } + } + + if (opt.time.enabled) { + renderTime("time1", date1); + renderTime("time2", date2); + } + showMonth(date1,'month1'); + showMonth(date2,'month2'); + showGap(); + showSelectedInfo(false,silent); + autoclose(); + } + + function setSingleDate(date1) + { + + var valid = true; + if (opt.startDate && compare_day(date1,opt.startDate) < 0) valid = false; + if (opt.endDate && compare_day(date1,opt.endDate) > 0) valid = false; + if (!valid) + { + showMonth(opt.startDate,'month1'); + + //showGap(); + return; + } + + opt.start = date1.getTime(); + + + if (opt.time.enabled) { + renderTime("time1", date1); + + } + showMonth(date1,'month1'); + //showMonth(date2,'month2'); + showGap(); + showSelectedInfo(); + autoclose(); + } + + function showSelectedDays() + { + if (!opt.start && !opt.end) return; + box.find('.day').each(function() + { + var time = parseInt($(this).attr('time')), + start = opt.start, + end = opt.end; + if (opt.time.enabled) { + time = moment(time).startOf('day').valueOf(); + start = moment(start || moment().valueOf()).startOf('day').valueOf(); + end = moment(end || moment().valueOf()).startOf('day').valueOf(); + } + if ( + (opt.start && opt.end && end >= time && start <= time ) + || ( opt.start && !opt.end && moment(start).format('YYYY-MM-DD') == moment(time).format('YYYY-MM-DD') ) + ) + { + $(this).addClass('checked'); + } + else + { + $(this).removeClass('checked'); + } + }); + } + + function showMonth(date,month) + { + date = moment(date).toDate(); + var monthName = nameMonth(date.getMonth()); + box.find('.'+month+' .month-name').html(monthName+' '+date.getFullYear()); + box.find('.'+month+' tbody').html(createMonthHTML(date)); + opt[month] = date; + } + + function showTime(date,name) + { + box.find('.' + name).append(getTimeHTML()); + renderTime(name, date); + } + + function nameMonth(m) + { + return lang('month-name')[m]; + } + + function getDateString(d) + { + return moment(d).format(opt.format); + } + + function showGap() + { + showSelectedDays(); + var m1 = parseInt(moment(opt.month1).format('YYYYMM')); + var m2 = parseInt(moment(opt.month2).format('YYYYMM')); + var p = Math.abs(m1 - m2); + var shouldShow = (p > 1 && p !=89); + if (shouldShow) + box.find('.gap').show(); + else + box.find('.gap').hide(); + } + + function closeDatePicker() + { + if (opt.alwaysOpen) return; + $(box).slideUp(opt.duration,function() + { + $(self).data('date-picker-opened',false); + $(self).trigger('datepicker-closed', {relatedTarget: box}); + }); + //$(document).unbind('.datepicker'); + $(self).trigger('datepicker-close', {relatedTarget: box}); + } + + function compare_month(m1,m2) + { + var p = parseInt(moment(m1).format('YYYYMM')) - parseInt(moment(m2).format('YYYYMM')); + if (p > 0 ) return 1; + if (p == 0) return 0; + return -1; + } + + function compare_day(m1,m2) + { + var p = parseInt(moment(m1).format('YYYYMMDD')) - parseInt(moment(m2).format('YYYYMMDD')); + if (p > 0 ) return 1; + if (p == 0) return 0; + return -1; + } + + function nextMonth(month) + { + month = moment(month).toDate(); + var toMonth = month.getMonth(); + while(month.getMonth() == toMonth) month = new Date(month.getTime()+86400000); + return month; + } + + function prevMonth(month) + { + month = moment(month).toDate(); + var toMonth = month.getMonth(); + while(month.getMonth() == toMonth) month = new Date(month.getTime()-86400000); + return month; + } + + function getTimeHTML() + { + var timeHtml = '
' + +'Time: 00:00' + +'
' + +'
' + +'' + +'
' + +'
' + +'' + +'
'; + return timeHtml; + } + + function createDom() + { + var html = '
' + +'
\ +
\ + '+lang('selected')+' ...' + if ( ! opt.singleDate ) { + html += ' '+opt.separator+' ... (3 '+lang('days')+')' + } + html += '
\ +
error
\ +
default
\ + \ +
' + +'
' + +''+getWeekHead()+'
<January, 2011' + (opt.singleDate || !opt.stickyMonths ? '>': '') + '
' + if ( ! opt.singleDate ) { + html += '
'+getGapHTML()+'
' + +''+getWeekHead()+'
' + (!opt.stickyMonths ? '<': '') + 'January, 2011>
' + } + //+'
' + html += '
' + +'
' + +'
' + if ( ! opt.singleDate ) { + html += '
' + } + html += '
' + +'
' + +'
'; + + html += ''; + + + return $(html); + } + + function getApplyBtnClass() + { + klass = '' + if (opt.autoClose === true) { + klass += ' hide'; + } + if (opt.applyBtnClass !== '') { + klass += ' ' + opt.applyBtnClass; + } + return klass; + } + + function getWeekHead() + { + if (opt.startOfWeek == 'monday') + { + return ''+lang('week-1')+'\ + '+lang('week-2')+'\ + '+lang('week-3')+'\ + '+lang('week-4')+'\ + '+lang('week-5')+'\ + '+lang('week-6')+'\ + '+lang('week-7')+''; + } + else + { + return ''+lang('week-7')+'\ + '+lang('week-1')+'\ + '+lang('week-2')+'\ + '+lang('week-3')+'\ + '+lang('week-4')+'\ + '+lang('week-5')+'\ + '+lang('week-6')+''; + } + } + function isMonthOutOfBounds(month) + { + var month = moment(month); + if (opt.startDate && month.endOf('month').isBefore(opt.startDate)) + { + return true; + } + if (opt.endDate && month.startOf('month').isAfter(opt.endDate)) + { + return true; + } + return false; + } + + function getGapHTML() + { + var html = ['
']; + for(var i=0;i<20;i++) + { + html.push('
\ +
\ +
\ +
\ +
'); + } + html.push('
'); + return html.join(''); + } + + function attributesCallbacks(initialObject,callbacksArray,today) + { + var resultObject = jQuery.extend(true, {}, initialObject); + + callbacksArray.forEach(function(cbAttr,cbAttrIndex,cbAttrArray){ + var addAttributes = cbAttr(this); + for(var attr in addAttributes){ + if(resultObject.hasOwnProperty(attr)){ + resultObject[attr] += addAttributes[attr]; + }else{ + resultObject[attr] = addAttributes[attr]; + } + } + },today); + + attrString = ''; + + for(var attr in resultObject){ + if(resultObject.hasOwnProperty(attr)){ + attrString += attr + '="' + resultObject[attr] + '" '; + } + } + + return attrString; + } + + function createMonthHTML(d) + { + var days = []; + d.setDate(1); + var lastMonth = new Date(d.getTime() - 86400000); + var now = new Date(); + + var dayOfWeek = d.getDay(); + if((dayOfWeek == 0) && (opt.startOfWeek == 'monday')) { + // add one week + dayOfWeek = 7; + } + + if (dayOfWeek > 0) + { + for (var i = dayOfWeek; i > 0; i--) + { + var day = new Date(d.getTime() - 86400000*i); + var valid = true; + if (opt.startDate && compare_day(day,opt.startDate) < 0) valid = false; + if (opt.endDate && compare_day(day,opt.endDate) > 0) valid = false; + days.push({type:'lastMonth',day: day.getDate(),time:day.getTime(), valid:valid }); + } + } + var toMonth = d.getMonth(); + for(var i=0; i<40; i++) + { + var today = moment(d).add(i, 'days').toDate(); + var valid = true; + if (opt.startDate && compare_day(today,opt.startDate) < 0) valid = false; + if (opt.endDate && compare_day(today,opt.endDate) > 0) valid = false; + days.push({type: today.getMonth() == toMonth ? 'toMonth' : 'nextMonth',day: today.getDate(),time:today.getTime(), valid:valid }); + } + var html = []; + for(var week=0; week<6; week++) + { + if (days[week*7].type == 'nextMonth') break; + html.push(''); + for(var day = 0; day<7; day++) + { + var _day = (opt.startOfWeek == 'monday') ? day+1 : day; + var today = days[week*7+_day]; + var highlightToday = moment(today.time).format('L') == moment(now).format('L'); + today.extraClass = ''; + today.tooltip = ''; + if(opt.beforeShowDay && typeof opt.beforeShowDay == 'function') + { + var _r = opt.beforeShowDay(moment(today.time).toDate()); + today.valid = _r[0]; + today.extraClass = _r[1] || ''; + today.tooltip = _r[2] || ''; + if (today.tooltip != '') today.extraClass += ' has-tooltip '; + } + + todayDivAttr = { + time: today.time, + title: today.tooltip, + 'class': 'day '+today.type+' '+today.extraClass+' '+(today.valid ? 'valid' : 'invalid')+' '+(highlightToday?'real-today':'') + }; + + html.push('
'+today.day+'
'); + } + html.push(''); + } + return html.join(''); + } + + function getLanguages() + { + if (opt.language == 'auto') + { + var language = navigator.language ? navigator.language : navigator.browserLanguage; + if (!language) return $.dateRangePickerLanguages['en']; + var language = language.toLowerCase(); + for(var key in $.dateRangePickerLanguages) + { + if (language.indexOf(key) != -1) + { + return $.dateRangePickerLanguages[key]; + } + } + return $.dateRangePickerLanguages['en']; + } + else if ( opt.language && opt.language in $.dateRangePickerLanguages) + { + return $.dateRangePickerLanguages[opt.language]; + } + else + { + return $.dateRangePickerLanguages['en']; + } + } + + function lang(t) + { + return (t in langs)? langs[t] : t; + } + + + }; +})); diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/light_graph.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/light_graph.js new file mode 100755 index 00000000..a20420a2 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/light_graph.js @@ -0,0 +1,60 @@ +var lightChart; + +nv.addGraph(function () { + + lightChart = nv.models.lineChart() + .interpolate("linear") + .options({ + transitionDuration: 300, + useInteractiveGuideline: true + }) + ; + + lightChart.xScale(d3.time.scale()); + + // chart sub-models (ie. xAxis, yAxis, etc) when accessed directly, return themselves, not the parent chart, so need to chain separately + lightChart.xAxis + .axisLabel("Date/Time") + .ticks(d3.time.seconds) + .tickFormat(function (d) { + return d3.time.format('%m/%d/%Y %I:%M:%S %p')(new Date(d)) + }) + .staggerLabels(true) + ; + + lightChart.yAxis + .axisLabel('Light') + ; + + d3.select('.chart2 svg') + .datum(getLightChartData()) + .call(lightChart); + + nv.utils.windowResize(lightChart.update); + + return lightChart; +}); + +function getLightChartData() { + + return [ + { + area: true, + values: [], + key: "Light", + color: "#34500e" + } + ]; + +} + +function updateLightGraph(lightData) { + + var chartData = getLightChartData(); + chartData[0]['values'] = lightData; + + d3.select('.chart2 svg') + .datum(chartData) + .transition().duration(500) + .call(lightChart); +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/linewithfocuschart.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/linewithfocuschart.js new file mode 100755 index 00000000..e69de29b diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/moment.min.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/moment.min.js new file mode 100755 index 00000000..d0b48f73 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.10.2 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return Ac.apply(null,arguments)}function b(a){Ac=a}function c(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function d(a){return"[object Array]"===Object.prototype.toString.call(a)}function e(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function f(a,b){var c,d=[];for(c=0;c0)for(c in Cc)d=Cc[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function m(b){l(this,b),this._d=new Date(+b._d),Dc===!1&&(Dc=!0,a.updateOffset(this),Dc=!1)}function n(a){return a instanceof m||null!=a&&g(a,"_isAMomentObject")}function o(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function p(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&o(a[d])!==o(b[d]))&&g++;return g+f}function q(){}function r(a){return a?a.toLowerCase().replace("_","-"):a}function s(a){for(var b,c,d,e,f=0;f0;){if(d=t(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&p(e,c,!0)>=b-1)break;b--}f++}return null}function t(a){var b=null;if(!Ec[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=Bc._abbr,require("./locale/"+a),u(b)}catch(c){}return Ec[a]}function u(a,b){var c;return a&&(c="undefined"==typeof b?w(a):v(a,b),c&&(Bc=c)),Bc._abbr}function v(a,b){return null!==b?(b.abbr=a,Ec[a]||(Ec[a]=new q),Ec[a].set(b),u(a),Ec[a]):(delete Ec[a],null)}function w(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return Bc;if(!d(a)){if(b=t(a))return b;a=[a]}return s(a)}function x(a,b){var c=a.toLowerCase();Fc[c]=Fc[c+"s"]=Fc[b]=a}function y(a){return"string"==typeof a?Fc[a]||Fc[a.toLowerCase()]:void 0}function z(a){var b,c,d={};for(c in a)g(a,c)&&(b=y(c),b&&(d[b]=a[c]));return d}function A(b,c){return function(d){return null!=d?(C(this,b,d),a.updateOffset(this,c),this):B(this,b)}}function B(a,b){return a._d["get"+(a._isUTC?"UTC":"")+b]()}function C(a,b,c){return a._d["set"+(a._isUTC?"UTC":"")+b](c)}function D(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else if(a=y(a),"function"==typeof this[a])return this[a](b);return this}function E(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthb;b++)d[b]=Jc[d[b]]?Jc[d[b]]:G(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function I(a,b){return a.isValid()?(b=J(b,a.localeData()),Ic[b]||(Ic[b]=H(b)),Ic[b](a)):a.localeData().invalidDate()}function J(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Hc.lastIndex=0;d>=0&&Hc.test(a);)a=a.replace(Hc,c),Hc.lastIndex=0,d-=1;return a}function K(a,b,c){Yc[a]="function"==typeof b?b:function(a){return a&&c?c:b}}function L(a,b){return g(Yc,a)?Yc[a](b._strict,b._locale):new RegExp(M(a))}function M(a){return a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function N(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=o(a)}),c=0;cd;d++){if(e=i([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function U(a,b){var c;return"string"==typeof b&&(b=a.localeData().monthsParse(b),"number"!=typeof b)?a:(c=Math.min(a.date(),Q(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a)}function V(b){return null!=b?(U(this,b),a.updateOffset(this,!0),this):B(this,"Month")}function W(){return Q(this.year(),this.month())}function X(a){var b,c=a._a;return c&&-2===a._pf.overflow&&(b=c[_c]<0||c[_c]>11?_c:c[ad]<1||c[ad]>Q(c[$c],c[_c])?ad:c[bd]<0||c[bd]>24||24===c[bd]&&(0!==c[cd]||0!==c[dd]||0!==c[ed])?bd:c[cd]<0||c[cd]>59?cd:c[dd]<0||c[dd]>59?dd:c[ed]<0||c[ed]>999?ed:-1,a._pf._overflowDayOfYear&&($c>b||b>ad)&&(b=ad),a._pf.overflow=b),a}function Y(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function Z(a,b){var c=!0;return h(function(){return c&&(Y(a),c=!1),b.apply(this,arguments)},b)}function $(a,b){hd[a]||(Y(b),hd[a]=!0)}function _(a){var b,c,d=a._i,e=id.exec(d);if(e){for(a._pf.iso=!0,b=0,c=jd.length;c>b;b++)if(jd[b][1].exec(d)){a._f=jd[b][0]+(e[6]||" ");break}for(b=0,c=kd.length;c>b;b++)if(kd[b][1].exec(d)){a._f+=kd[b][0];break}d.match(Vc)&&(a._f+="Z"),sa(a)}else a._isValid=!1}function aa(b){var c=ld.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(_(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}function ba(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function ca(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function da(a){return ea(a)?366:365}function ea(a){return a%4===0&&a%100!==0||a%400===0}function fa(){return ea(this.year())}function ga(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=za(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function ha(a){return ga(a,this._week.dow,this._week.doy).week}function ia(){return this._week.dow}function ja(){return this._week.doy}function ka(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function la(a){var b=ga(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function ma(a,b,c,d,e){var f,g,h=ca(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:da(a-1)+g}}function na(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function oa(a,b,c){return null!=a?a:null!=b?b:c}function pa(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function qa(a){var b,c,d,e,f=[];if(!a._d){for(d=pa(a),a._w&&null==a._a[ad]&&null==a._a[_c]&&ra(a),a._dayOfYear&&(e=oa(a._a[$c],d[$c]),a._dayOfYear>da(e)&&(a._pf._overflowDayOfYear=!0),c=ca(e,0,a._dayOfYear),a._a[_c]=c.getUTCMonth(),a._a[ad]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[bd]&&0===a._a[cd]&&0===a._a[dd]&&0===a._a[ed]&&(a._nextDay=!0,a._a[bd]=0),a._d=(a._useUTC?ca:ba).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[bd]=24)}}function ra(a){var b,c,d,e,f,g,h;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=oa(b.GG,a._a[$c],ga(za(),1,4).year),d=oa(b.W,1),e=oa(b.E,1)):(f=a._locale._week.dow,g=a._locale._week.doy,c=oa(b.gg,a._a[$c],ga(za(),f,g).year),d=oa(b.w,1),null!=b.d?(e=b.d,f>e&&++d):e=null!=b.e?b.e+f:f),h=ma(c,d,e,g,f),a._a[$c]=h.year,a._dayOfYear=h.dayOfYear}function sa(b){if(b._f===a.ISO_8601)return void _(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=J(b._f,b._locale).match(Gc)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Jc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),P(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[bd]<=12&&(b._pf.bigHour=void 0),b._a[bd]=ta(b._locale,b._a[bd],b._meridiem),qa(b),X(b)}function ta(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function ua(a){var b,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,d=b));h(a,d||b)}function va(a){if(!a._d){var b=z(a._i);a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],qa(a)}}function wa(a){var b,c=a._i,e=a._f;return a._locale=a._locale||w(a._l),null===c||void 0===e&&""===c?k({nullInput:!0}):("string"==typeof c&&(a._i=c=a._locale.preparse(c)),n(c)?new m(X(c)):(d(e)?ua(a):e?sa(a):xa(a),b=new m(X(a)),b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b))}function xa(b){var c=b._i;void 0===c?b._d=new Date:e(c)?b._d=new Date(+c):"string"==typeof c?aa(b):d(c)?(b._a=f(c.slice(0),function(a){return parseInt(a,10)}),qa(b)):"object"==typeof c?va(b):"number"==typeof c?b._d=new Date(c):a.createFromInputFallback(b)}function ya(a,b,d,e,f){var g={};return"boolean"==typeof d&&(e=d,d=void 0),g._isAMomentObject=!0,g._useUTC=g._isUTC=f,g._l=d,g._i=a,g._f=b,g._strict=e,g._pf=c(),wa(g)}function za(a,b,c,d){return ya(a,b,c,d,!1)}function Aa(a,b){var c,e;if(1===b.length&&d(b[0])&&(b=b[0]),!b.length)return za();for(c=b[0],e=1;ea&&(a=-a,c="-"),c+E(~~(a/60),2)+b+E(~~a%60,2)})}function Ga(a){var b=(a||"").match(Vc)||[],c=b[b.length-1]||[],d=(c+"").match(qd)||["-",0,0],e=+(60*d[1])+o(d[2]);return"+"===d[0]?e:-e}function Ha(b,c){var d,f;return c._isUTC?(d=c.clone(),f=(n(b)||e(b)?+b:+za(b))-+d,d._d.setTime(+d._d+f),a.updateOffset(d,!1),d):za(b).local();return c._isUTC?za(b).zone(c._offset||0):za(b).local()}function Ia(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Ja(b,c){var d,e=this._offset||0;return null!=b?("string"==typeof b&&(b=Ga(b)),Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Ia(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?Za(this,Ua(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Ia(this)}function Ka(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function La(a){return this.utcOffset(0,a)}function Ma(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Ia(this),"m")),this}function Na(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Ga(this._i)),this}function Oa(a){return a=a?za(a).utcOffset():0,(this.utcOffset()-a)%60===0}function Pa(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Qa(){if(this._a){var a=this._isUTC?i(this._a):za(this._a);return this.isValid()&&p(this._a,a.toArray())>0}return!1}function Ra(){return!this._isUTC}function Sa(){return this._isUTC}function Ta(){return this._isUTC&&0===this._offset}function Ua(a,b){var c,d,e,f=a,h=null;return Ea(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=rd.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:o(h[ad])*c,h:o(h[bd])*c,m:o(h[cd])*c,s:o(h[dd])*c,ms:o(h[ed])*c}):(h=sd.exec(a))?(c="-"===h[1]?-1:1,f={y:Va(h[2],c),M:Va(h[3],c),d:Va(h[4],c),h:Va(h[5],c),m:Va(h[6],c),s:Va(h[7],c),w:Va(h[8],c)}):null==f?f={}:"object"==typeof f&&("from"in f||"to"in f)&&(e=Xa(za(f.from),za(f.to)),f={},f.ms=e.milliseconds,f.M=e.months),d=new Da(f),Ea(a)&&g(a,"_locale")&&(d._locale=a._locale),d}function Va(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function Wa(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Xa(a,b){var c;return b=Ha(b,a),a.isBefore(b)?c=Wa(a,b):(c=Wa(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c}function Ya(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||($(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Ua(c,d),Za(this,e,a),this}}function Za(b,c,d,e){var f=c._milliseconds,g=c._days,h=c._months;e=null==e?!0:e,f&&b._d.setTime(+b._d+f*d),g&&C(b,"Date",B(b,"Date")+g*d),h&&U(b,B(b,"Month")+h*d),e&&a.updateOffset(b,g||h)}function $a(a){var b=a||za(),c=Ha(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,za(b)))}function _a(){return new m(this)}function ab(a,b){var c;return b=y("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=n(a)?a:za(a),+this>+a):(c=n(a)?+a:+za(a),c<+this.clone().startOf(b))}function bb(a,b){var c;return b=y("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=n(a)?a:za(a),+a>+this):(c=n(a)?+a:+za(a),+this.clone().endOf(b)a?Math.ceil(a):Math.floor(a)}function fb(a,b,c){var d,e,f=Ha(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=y(b),"year"===b||"month"===b||"quarter"===b?(e=gb(this,f),"quarter"===b?e/=3:"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:eb(e)}function gb(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function hb(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ib(){var a=this.clone().utc();return 0b;b++)if(this._weekdaysParse[b]||(c=za([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b}function Jb(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Eb(a,this.localeData()),this.add(a-b,"d")):b}function Kb(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Lb(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)}function Mb(a,b){F(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function Nb(a,b){return b._meridiemParse}function Ob(a){return"p"===(a+"").toLowerCase().charAt(0)}function Pb(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Qb(a){F(0,[a,3],0,"millisecond")}function Rb(){return this._isUTC?"UTC":""}function Sb(){return this._isUTC?"Coordinated Universal Time":""}function Tb(a){return za(1e3*a)}function Ub(){return za.apply(null,arguments).parseZone()}function Vb(a,b,c){var d=this._calendar[a];return"function"==typeof d?d.call(b,c):d}function Wb(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b}function Xb(){return this._invalidDate}function Yb(a){return this._ordinal.replace("%d",a)}function Zb(a){return a}function $b(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)}function _b(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)}function ac(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function bc(a,b,c,d){var e=w(),f=i().set(d,b);return e[c](f,a)}function cc(a,b,c,d,e){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return bc(a,b,c,e);var f,g=[];for(f=0;d>f;f++)g[f]=bc(a,f,c,e);return g}function dc(a,b){return cc(a,b,"months",12,"month")}function ec(a,b){return cc(a,b,"monthsShort",12,"month")}function fc(a,b){return cc(a,b,"weekdays",7,"day")}function gc(a,b){return cc(a,b,"weekdaysShort",7,"day")}function hc(a,b){return cc(a,b,"weekdaysMin",7,"day")}function ic(){var a=this._data;return this._milliseconds=Od(this._milliseconds),this._days=Od(this._days),this._months=Od(this._months),a.milliseconds=Od(a.milliseconds),a.seconds=Od(a.seconds),a.minutes=Od(a.minutes),a.hours=Od(a.hours),a.months=Od(a.months),a.years=Od(a.years),this}function jc(a,b,c,d){var e=Ua(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function kc(a,b){return jc(this,a,b,1)}function lc(a,b){return jc(this,a,b,-1)}function mc(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;return g.milliseconds=d%1e3,a=eb(d/1e3),g.seconds=a%60,b=eb(a/60),g.minutes=b%60,c=eb(b/60),g.hours=c%24,e+=eb(c/24),h=eb(nc(e)),e-=eb(oc(h)),f+=eb(e/30),e%=30,h+=eb(f/12),f%=12,g.days=e,g.months=f,g.years=h,this}function nc(a){return 400*a/146097}function oc(a){return 146097*a/400}function pc(a){var b,c,d=this._milliseconds;if(a=y(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+12*nc(b),"month"===a?c:c/12;switch(b=this._days+Math.round(oc(this._months/12)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 24*b*60+d/6e4;case"second":return 24*b*60*60+d/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+d;default:throw new Error("Unknown unit "+a)}}function qc(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*o(this._months/12)}function rc(a){return function(){return this.as(a)}}function sc(a){return a=y(a),this[a+"s"]()}function tc(a){return function(){return this._data[a]}}function uc(){return eb(this.days()/7)}function vc(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function wc(a,b,c){var d=Ua(a).abs(),e=ce(d.as("s")),f=ce(d.as("m")),g=ce(d.as("h")),h=ce(d.as("d")),i=ce(d.as("M")),j=ce(d.as("y")),k=e0,k[4]=c,vc.apply(null,k)}function xc(a,b){return void 0===de[a]?!1:void 0===b?de[a]:(de[a]=b,!0)}function yc(a){var b=this.localeData(),c=wc(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function zc(){var a=ee(this.years()),b=ee(this.months()),c=ee(this.days()),d=ee(this.hours()),e=ee(this.minutes()),f=ee(this.seconds()+this.milliseconds()/1e3),g=this.asSeconds();return g?(0>g?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"}var Ac,Bc,Cc=a.momentProperties=[],Dc=!1,Ec={},Fc={},Gc=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,Hc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ic={},Jc={},Kc=/\d/,Lc=/\d\d/,Mc=/\d{3}/,Nc=/\d{4}/,Oc=/[+-]?\d{6}/,Pc=/\d\d?/,Qc=/\d{1,3}/,Rc=/\d{1,4}/,Sc=/[+-]?\d{1,6}/,Tc=/\d+/,Uc=/[+-]?\d+/,Vc=/Z|[+-]\d\d:?\d\d/gi,Wc=/[+-]?\d+(\.\d{1,3})?/,Xc=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Yc={},Zc={},$c=0,_c=1,ad=2,bd=3,cd=4,dd=5,ed=6;F("M",["MM",2],"Mo",function(){return this.month()+1}),F("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),F("MMMM",0,0,function(a){return this.localeData().months(this,a)}),x("month","M"),K("M",Pc),K("MM",Pc,Lc),K("MMM",Xc),K("MMMM",Xc),N(["M","MM"],function(a,b){b[_c]=o(a)-1}),N(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[_c]=e:c._pf.invalidMonth=a});var fd="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),gd="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),hd={};a.suppressDeprecationWarnings=!1;var id=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,jd=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],kd=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],ld=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=Z("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),F(0,["YY",2],0,function(){return this.year()%100}),F(0,["YYYY",4],0,"year"),F(0,["YYYYY",5],0,"year"),F(0,["YYYYYY",6,!0],0,"year"),x("year","y"),K("Y",Uc),K("YY",Pc,Lc),K("YYYY",Rc,Nc),K("YYYYY",Sc,Oc),K("YYYYYY",Sc,Oc),N(["YYYY","YYYYY","YYYYYY"],$c),N("YY",function(b,c){c[$c]=a.parseTwoDigitYear(b)}),a.parseTwoDigitYear=function(a){return o(a)+(o(a)>68?1900:2e3)};var md=A("FullYear",!1);F("w",["ww",2],"wo","week"),F("W",["WW",2],"Wo","isoWeek"),x("week","w"),x("isoWeek","W"),K("w",Pc),K("ww",Pc,Lc),K("W",Pc),K("WW",Pc,Lc),O(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=o(a)});var nd={dow:0,doy:6};F("DDD",["DDDD",3],"DDDo","dayOfYear"),x("dayOfYear","DDD"),K("DDD",Qc),K("DDDD",Mc),N(["DDD","DDDD"],function(a,b,c){c._dayOfYear=o(a)}),a.ISO_8601=function(){};var od=Z("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var a=za.apply(null,arguments);return this>a?this:a}),pd=Z("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var a=za.apply(null,arguments);return a>this?this:a});Fa("Z",":"),Fa("ZZ",""),K("Z",Vc),K("ZZ",Vc),N(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Ga(a)});var qd=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var rd=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,sd=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;Ua.fn=Da.prototype;var td=Ya(1,"add"),ud=Ya(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var vd=Z("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});F(0,["gg",2],0,function(){return this.weekYear()%100}),F(0,["GG",2],0,function(){return this.isoWeekYear()%100}),xb("gggg","weekYear"),xb("ggggg","weekYear"),xb("GGGG","isoWeekYear"),xb("GGGGG","isoWeekYear"),x("weekYear","gg"),x("isoWeekYear","GG"),K("G",Uc),K("g",Uc),K("GG",Pc,Lc),K("gg",Pc,Lc),K("GGGG",Rc,Nc),K("gggg",Rc,Nc),K("GGGGG",Sc,Oc),K("ggggg",Sc,Oc),O(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=o(a)}),O(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),F("Q",0,0,"quarter"),x("quarter","Q"),K("Q",Kc),N("Q",function(a,b){b[_c]=3*(o(a)-1)}),F("D",["DD",2],"Do","date"),x("date","D"),K("D",Pc),K("DD",Pc,Lc),K("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),N(["D","DD"],ad),N("Do",function(a,b){b[ad]=o(a.match(Pc)[0],10)});var wd=A("Date",!0);F("d",0,"do","day"),F("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),F("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),F("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),F("e",0,0,"weekday"),F("E",0,0,"isoWeekday"),x("day","d"),x("weekday","e"),x("isoWeekday","E"),K("d",Pc),K("e",Pc),K("E",Pc),K("dd",Xc),K("ddd",Xc),K("dddd",Xc),O(["dd","ddd","dddd"],function(a,b,c){var d=c._locale.weekdaysParse(a);null!=d?b.d=d:c._pf.invalidWeekday=a}),O(["d","e","E"],function(a,b,c,d){b[d]=o(a)});var xd="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),yd="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),zd="Su_Mo_Tu_We_Th_Fr_Sa".split("_");F("H",["HH",2],0,"hour"),F("h",["hh",2],0,function(){return this.hours()%12||12}),Mb("a",!0),Mb("A",!1),x("hour","h"),K("a",Nb),K("A",Nb),K("H",Pc),K("h",Pc),K("HH",Pc,Lc),K("hh",Pc,Lc),N(["H","HH"],bd),N(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),N(["h","hh"],function(a,b,c){b[bd]=o(a),c._pf.bigHour=!0});var Ad=/[ap]\.?m?\.?/i,Bd=A("Hours",!0);F("m",["mm",2],0,"minute"),x("minute","m"),K("m",Pc),K("mm",Pc,Lc),N(["m","mm"],cd);var Cd=A("Minutes",!1);F("s",["ss",2],0,"second"),x("second","s"),K("s",Pc),K("ss",Pc,Lc),N(["s","ss"],dd);var Dd=A("Seconds",!1);F("S",0,0,function(){return~~(this.millisecond()/100)}),F(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),Qb("SSS"),Qb("SSSS"),x("millisecond","ms"),K("S",Qc,Kc),K("SS",Qc,Lc),K("SSS",Qc,Mc),K("SSSS",Tc),N(["S","SS","SSS","SSSS"],function(a,b){b[ed]=o(1e3*("0."+a))});var Ed=A("Milliseconds",!1);F("z",0,0,"zoneAbbr"),F("zz",0,0,"zoneName");var Fd=m.prototype;Fd.add=td,Fd.calendar=$a,Fd.clone=_a,Fd.diff=fb,Fd.endOf=pb,Fd.format=jb,Fd.from=kb,Fd.fromNow=lb,Fd.get=D,Fd.invalidAt=wb,Fd.isAfter=ab,Fd.isBefore=bb,Fd.isBetween=cb,Fd.isSame=db,Fd.isValid=ub,Fd.lang=vd,Fd.locale=mb,Fd.localeData=nb,Fd.max=pd,Fd.min=od,Fd.parsingFlags=vb,Fd.set=D,Fd.startOf=ob,Fd.subtract=ud,Fd.toArray=tb,Fd.toDate=sb,Fd.toISOString=ib,Fd.toJSON=ib,Fd.toString=hb,Fd.unix=rb,Fd.valueOf=qb,Fd.year=md,Fd.isLeapYear=fa,Fd.weekYear=zb,Fd.isoWeekYear=Ab,Fd.quarter=Fd.quarters=Db,Fd.month=V,Fd.daysInMonth=W,Fd.week=Fd.weeks=ka,Fd.isoWeek=Fd.isoWeeks=la,Fd.weeksInYear=Cb,Fd.isoWeeksInYear=Bb,Fd.date=wd,Fd.day=Fd.days=Jb,Fd.weekday=Kb,Fd.isoWeekday=Lb,Fd.dayOfYear=na,Fd.hour=Fd.hours=Bd,Fd.minute=Fd.minutes=Cd,Fd.second=Fd.seconds=Dd,Fd.millisecond=Fd.milliseconds=Ed,Fd.utcOffset=Ja,Fd.utc=La,Fd.local=Ma,Fd.parseZone=Na,Fd.hasAlignedHourOffset=Oa,Fd.isDST=Pa,Fd.isDSTShifted=Qa,Fd.isLocal=Ra,Fd.isUtcOffset=Sa,Fd.isUtc=Ta,Fd.isUTC=Ta,Fd.zoneAbbr=Rb,Fd.zoneName=Sb,Fd.dates=Z("dates accessor is deprecated. Use date instead.",wd),Fd.months=Z("months accessor is deprecated. Use month instead",V),Fd.years=Z("years accessor is deprecated. Use year instead",md),Fd.zone=Z("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Ka);var Gd=Fd,Hd={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Id={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},Jd="Invalid date",Kd="%d",Ld=/\d{1,2}/,Md={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Nd=q.prototype;Nd._calendar=Hd,Nd.calendar=Vb,Nd._longDateFormat=Id,Nd.longDateFormat=Wb,Nd._invalidDate=Jd,Nd.invalidDate=Xb,Nd._ordinal=Kd,Nd.ordinal=Yb,Nd._ordinalParse=Ld, +Nd.preparse=Zb,Nd.postformat=Zb,Nd._relativeTime=Md,Nd.relativeTime=$b,Nd.pastFuture=_b,Nd.set=ac,Nd.months=R,Nd._months=fd,Nd.monthsShort=S,Nd._monthsShort=gd,Nd.monthsParse=T,Nd.week=ha,Nd._week=nd,Nd.firstDayOfYear=ja,Nd.firstDayOfWeek=ia,Nd.weekdays=Fb,Nd._weekdays=xd,Nd.weekdaysMin=Hb,Nd._weekdaysMin=zd,Nd.weekdaysShort=Gb,Nd._weekdaysShort=yd,Nd.weekdaysParse=Ib,Nd.isPM=Ob,Nd._meridiemParse=Ad,Nd.meridiem=Pb,u("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===o(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=Z("moment.lang is deprecated. Use moment.locale instead.",u),a.langData=Z("moment.langData is deprecated. Use moment.localeData instead.",w);var Od=Math.abs,Pd=rc("ms"),Qd=rc("s"),Rd=rc("m"),Sd=rc("h"),Td=rc("d"),Ud=rc("w"),Vd=rc("M"),Wd=rc("y"),Xd=tc("milliseconds"),Yd=tc("seconds"),Zd=tc("minutes"),$d=tc("hours"),_d=tc("days"),ae=tc("months"),be=tc("years"),ce=Math.round,de={s:45,m:45,h:22,d:26,M:11},ee=Math.abs,fe=Da.prototype;fe.abs=ic,fe.add=kc,fe.subtract=lc,fe.as=pc,fe.asMilliseconds=Pd,fe.asSeconds=Qd,fe.asMinutes=Rd,fe.asHours=Sd,fe.asDays=Td,fe.asWeeks=Ud,fe.asMonths=Vd,fe.asYears=Wd,fe.valueOf=qc,fe._bubble=mc,fe.get=sc,fe.milliseconds=Xd,fe.seconds=Yd,fe.minutes=Zd,fe.hours=$d,fe.days=_d,fe.weeks=uc,fe.months=ae,fe.years=be,fe.humanize=yc,fe.toISOString=zc,fe.toString=zc,fe.toJSON=zc,fe.locale=mb,fe.localeData=nb,fe.toIsoString=Z("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",zc),fe.lang=vd,F("X",0,0,"unix"),F("x",0,0,"valueOf"),K("x",Uc),K("X",Wc),N("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),N("x",function(a,b,c){c._d=new Date(o(a))}),a.version="2.10.2",b(za),a.fn=Gd,a.min=Ba,a.max=Ca,a.utc=i,a.unix=Tb,a.months=dc,a.isDate=e,a.locale=u,a.invalid=k,a.duration=Ua,a.isMoment=n,a.weekdays=fc,a.parseZone=Ub,a.localeData=w,a.isDuration=Ea,a.monthsShort=ec,a.weekdaysMin=hc,a.defineLocale=v,a.weekdaysShort=gc,a.normalizeUnits=y,a.relativeTimeThreshold=xc;var ge=a;return ge}); \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/motion_graph.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/motion_graph.js new file mode 100755 index 00000000..7b91a456 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/motion_graph.js @@ -0,0 +1,60 @@ +var motionChart; + +nv.addGraph(function () { + + motionChart = nv.models.lineChart() + .interpolate("linear") + .options({ + transitionDuration: 300, + useInteractiveGuideline: true + }) + ; + + motionChart.xScale(d3.time.scale()); + + // chart sub-models (ie. xAxis, yAxis, etc) when accessed directly, return themselves, not the parent chart, so need to chain separately + motionChart.xAxis + .axisLabel("Date/Time") + .ticks(d3.time.seconds) + .tickFormat(function (d) { + return d3.time.format('%m/%d/%Y %I:%M:%S %p')(new Date(d)) + }) + .staggerLabels(true) + ; + + motionChart.yAxis + .axisLabel('Motion') + ; + + d3.select('.chart3 svg') + .datum(getMotionChartData()) + .call(motionChart); + + nv.utils.windowResize(motionChart.update); + + return motionChart; +}); + +function getMotionChartData() { + + return [ + { + area: true, + values: [], + key: "Motion", + color: "#34500e" + } + ]; + +} + +function updateMotionGraph(motionData) { + + var chartData = getMotionChartData(); + chartData[0]['values'] = motionData; + + d3.select('.chart3 svg') + .datum(chartData) + .transition().duration(500) + .call(motionChart); +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/nv.d3.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/nv.d3.js new file mode 100755 index 00000000..a302d512 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/nv.d3.js @@ -0,0 +1,11357 @@ +/* nvd3 version 1.7.1(https://github.com/novus/nvd3) 2015-02-08 */ +(function(){ + +// set up main nv object on window +var nv = window.nv || {}; +window.nv = nv; + +// the major global objects under the nv namespace +nv.dev = false; //set false when in production +nv.tooltip = nv.tooltip || {}; // For the tooltip system +nv.utils = nv.utils || {}; // Utility subsystem +nv.models = nv.models || {}; //stores all the possible models/components +nv.charts = {}; //stores all the ready to use charts +nv.graphs = []; //stores all the graphs currently on the page +nv.logs = {}; //stores some statistics and potential error messages + +nv.dispatch = d3.dispatch('render_start', 'render_end'); + +// Function bind polyfill +// Needed ONLY for phantomJS as it's missing until version 2.0 which is unreleased as of this comment +// https://github.com/ariya/phantomjs/issues/10522 +// http://kangax.github.io/compat-table/es5/#Function.prototype.bind +// phantomJS is used for running the test suite +if (!Function.prototype.bind) { + Function.prototype.bind = function (oThis) { + if (typeof this !== "function") { + // closest thing possible to the ECMAScript 5 internal IsCallable function + throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function () {}, + fBound = function () { + return fToBind.apply(this instanceof fNOP && oThis + ? this + : oThis, + aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + fNOP.prototype = this.prototype; + fBound.prototype = new fNOP(); + return fBound; + }; +} + +// Development render timers - disabled if dev = false +if (nv.dev) { + nv.dispatch.on('render_start', function(e) { + nv.logs.startTime = +new Date(); + }); + + nv.dispatch.on('render_end', function(e) { + nv.logs.endTime = +new Date(); + nv.logs.totalTime = nv.logs.endTime - nv.logs.startTime; + nv.log('total', nv.logs.totalTime); // used for development, to keep track of graph generation times + }); +} + +// Logs all arguments, and returns the last so you can test things in place +// Note: in IE8 console.log is an object not a function, and if modernizr is used +// then calling Function.prototype.bind with with anything other than a function +// causes a TypeError to be thrown. +nv.log = function() { + if (nv.dev && window.console && console.log && console.log.apply) + console.log.apply(console, arguments); + else if (nv.dev && window.console && typeof console.log == "function" && Function.prototype.bind) { + var log = Function.prototype.bind.call(console.log, console); + log.apply(console, arguments); + } + return arguments[arguments.length - 1]; +}; + +// print console warning, should be used by deprecated functions +nv.deprecated = function(name) { + if (nv.dev && console && console.warn) { + console.warn('`' + name + '` has been deprecated.'); + } +}; + +// render function is used to queue up chart rendering +// in non-blocking timeout functions +nv.render = function render(step) { + // number of graphs to generate in each timeout loop + step = step || 1; + + nv.render.active = true; + nv.dispatch.render_start(); + + setTimeout(function() { + var chart, graph; + + for (var i = 0; i < step && (graph = nv.render.queue[i]); i++) { + chart = graph.generate(); + if (typeof graph.callback == typeof(Function)) graph.callback(chart); + nv.graphs.push(chart); + } + + nv.render.queue.splice(0, i); + + if (nv.render.queue.length) setTimeout(arguments.callee, 0); + else { + nv.dispatch.render_end(); + nv.render.active = false; + } + }, 0); +}; + +nv.render.active = false; +nv.render.queue = []; + +// main function to use when adding a new graph, see examples +nv.addGraph = function(obj) { + if (typeof arguments[0] === typeof(Function)) { + obj = {generate: arguments[0], callback: arguments[1]}; + } + + nv.render.queue.push(obj); + + if (!nv.render.active) { + nv.render(); + } +};/* Utility class to handle creation of an interactive layer. + This places a rectangle on top of the chart. When you mouse move over it, it sends a dispatch + containing the X-coordinate. It can also render a vertical line where the mouse is located. + + dispatch.elementMousemove is the important event to latch onto. It is fired whenever the mouse moves over + the rectangle. The dispatch is given one object which contains the mouseX/Y location. + It also has 'pointXValue', which is the conversion of mouseX to the x-axis scale. + */ +nv.interactiveGuideline = function() { + "use strict"; + + var tooltip = nv.models.tooltip(); + + //Public settings + var width = null; + var height = null; + + //Please pass in the bounding chart's top and left margins + //This is important for calculating the correct mouseX/Y positions. + var margin = {left: 0, top: 0} + , xScale = d3.scale.linear() + , yScale = d3.scale.linear() + , dispatch = d3.dispatch('elementMousemove', 'elementMouseout', 'elementClick', 'elementDblclick') + , showGuideLine = true; + //Must pass in the bounding chart's container. + //The mousemove event is attached to this container. + var svgContainer = null; + + // check if IE by looking for activeX + var isMSIE = "ActiveXObject" in window; + + + function layer(selection) { + selection.each(function(data) { + var container = d3.select(this); + var availableWidth = (width || 960), availableHeight = (height || 400); + var wrap = container.selectAll("g.nv-wrap.nv-interactiveLineLayer") + .data([data]); + var wrapEnter = wrap.enter() + .append("g").attr("class", " nv-wrap nv-interactiveLineLayer"); + wrapEnter.append("g").attr("class","nv-interactiveGuideLine"); + + if (!svgContainer) { + return; + } + + function mouseHandler() { + var d3mouse = d3.mouse(this); + var mouseX = d3mouse[0]; + var mouseY = d3mouse[1]; + var subtractMargin = true; + var mouseOutAnyReason = false; + if (isMSIE) { + /* + D3.js (or maybe SVG.getScreenCTM) has a nasty bug in Internet Explorer 10. + d3.mouse() returns incorrect X,Y mouse coordinates when mouse moving + over a rect in IE 10. + However, d3.event.offsetX/Y also returns the mouse coordinates + relative to the triggering . So we use offsetX/Y on IE. + */ + mouseX = d3.event.offsetX; + mouseY = d3.event.offsetY; + + /* + On IE, if you attach a mouse event listener to the container, + it will actually trigger it for all the child elements (like , , etc). + When this happens on IE, the offsetX/Y is set to where ever the child element + is located. + As a result, we do NOT need to subtract margins to figure out the mouse X/Y + position under this scenario. Removing the line below *will* cause + the interactive layer to not work right on IE. + */ + if(d3.event.target.tagName !== "svg") { + subtractMargin = false; + } + + if (d3.event.target.className.baseVal.match("nv-legend")) { + mouseOutAnyReason = true; + } + + } + + if(subtractMargin) { + mouseX -= margin.left; + mouseY -= margin.top; + } + + /* If mouseX/Y is outside of the chart's bounds, + trigger a mouseOut event. + */ + if (mouseX < 0 || mouseY < 0 + || mouseX > availableWidth || mouseY > availableHeight + || (d3.event.relatedTarget && d3.event.relatedTarget.ownerSVGElement === undefined) + || mouseOutAnyReason + ) { + + if (isMSIE) { + if (d3.event.relatedTarget + && d3.event.relatedTarget.ownerSVGElement === undefined + && d3.event.relatedTarget.className.match(tooltip.nvPointerEventsClass)) { + + return; + } + } + dispatch.elementMouseout({ + mouseX: mouseX, + mouseY: mouseY + }); + layer.renderGuideLine(null); //hide the guideline + return; + } + + var pointXValue = xScale.invert(mouseX); + dispatch.elementMousemove({ + mouseX: mouseX, + mouseY: mouseY, + pointXValue: pointXValue + }); + + //If user double clicks the layer, fire a elementDblclick + if (d3.event.type === "dblclick") { + dispatch.elementDblclick({ + mouseX: mouseX, + mouseY: mouseY, + pointXValue: pointXValue + }); + } + + // if user single clicks the layer, fire elementClick + if (d3.event.type === 'click') { + dispatch.elementClick({ + mouseX: mouseX, + mouseY: mouseY, + pointXValue: pointXValue + }); + } + } + + svgContainer + .on("mousemove",mouseHandler, true) + .on("mouseout" ,mouseHandler,true) + .on("dblclick" ,mouseHandler) + .on("click", mouseHandler) + ; + + //Draws a vertical guideline at the given X postion. + layer.renderGuideLine = function(x) { + if (!showGuideLine) return; + var line = wrap.select(".nv-interactiveGuideLine") + .selectAll("line") + .data((x != null) ? [nv.utils.NaNtoZero(x)] : [], String); + + line.enter() + .append("line") + .attr("class", "nv-guideline") + .attr("x1", function(d) { return d;}) + .attr("x2", function(d) { return d;}) + .attr("y1", availableHeight) + .attr("y2",0) + ; + line.exit().remove(); + + } + }); + } + + layer.dispatch = dispatch; + layer.tooltip = tooltip; + + layer.margin = function(_) { + if (!arguments.length) return margin; + margin.top = typeof _.top != 'undefined' ? _.top : margin.top; + margin.left = typeof _.left != 'undefined' ? _.left : margin.left; + return layer; + }; + + layer.width = function(_) { + if (!arguments.length) return width; + width = _; + return layer; + }; + + layer.height = function(_) { + if (!arguments.length) return height; + height = _; + return layer; + }; + + layer.xScale = function(_) { + if (!arguments.length) return xScale; + xScale = _; + return layer; + }; + + layer.showGuideLine = function(_) { + if (!arguments.length) return showGuideLine; + showGuideLine = _; + return layer; + }; + + layer.svgContainer = function(_) { + if (!arguments.length) return svgContainer; + svgContainer = _; + return layer; + }; + + return layer; +}; + +/* Utility class that uses d3.bisect to find the index in a given array, where a search value can be inserted. + This is different from normal bisectLeft; this function finds the nearest index to insert the search value. + + For instance, lets say your array is [1,2,3,5,10,30], and you search for 28. + Normal d3.bisectLeft will return 4, because 28 is inserted after the number 10. But interactiveBisect will return 5 + because 28 is closer to 30 than 10. + + Unit tests can be found in: interactiveBisectTest.html + + Has the following known issues: + * Will not work if the data points move backwards (ie, 10,9,8,7, etc) or if the data points are in random order. + * Won't work if there are duplicate x coordinate values. + */ +nv.interactiveBisect = function (values, searchVal, xAccessor) { + "use strict"; + if (! (values instanceof Array)) { + return null; + } + if (typeof xAccessor !== 'function') { + xAccessor = function(d,i) { + return d.x; + } + } + + var bisect = d3.bisector(xAccessor).left; + var index = d3.max([0, bisect(values,searchVal) - 1]); + var currentValue = xAccessor(values[index], index); + + if (typeof currentValue === 'undefined') { + currentValue = index; + } + + if (currentValue === searchVal) { + return index; //found exact match + } + + var nextIndex = d3.min([index+1, values.length - 1]); + var nextValue = xAccessor(values[nextIndex], nextIndex); + + if (typeof nextValue === 'undefined') { + nextValue = nextIndex; + } + + if (Math.abs(nextValue - searchVal) >= Math.abs(currentValue - searchVal)) { + return index; + } else { + return nextIndex + } +}; + +/* + Returns the index in the array "values" that is closest to searchVal. + Only returns an index if searchVal is within some "threshold". + Otherwise, returns null. + */ +nv.nearestValueIndex = function (values, searchVal, threshold) { + "use strict"; + var yDistMax = Infinity, indexToHighlight = null; + values.forEach(function(d,i) { + var delta = Math.abs(searchVal - d); + if ( delta <= yDistMax && delta < threshold) { + yDistMax = delta; + indexToHighlight = i; + } + }); + return indexToHighlight; +}; +/* Tooltip rendering model for nvd3 charts. + window.nv.models.tooltip is the updated,new way to render tooltips. + + window.nv.tooltip.show is the old tooltip code. + window.nv.tooltip.* also has various helper methods. + */ +(function() { + "use strict"; + window.nv.tooltip = {}; + + /* Model which can be instantiated to handle tooltip rendering. + Example usage: + var tip = nv.models.tooltip().gravity('w').distance(23) + .data(myDataObject); + + tip(); //just invoke the returned function to render tooltip. + */ + window.nv.models.tooltip = function() { + //HTML contents of the tooltip. If null, the content is generated via the data variable. + var content = null; + + /* + Tooltip data. If data is given in the proper format, a consistent tooltip is generated. + Example Format of data: + { + key: "Date", + value: "August 2009", + series: [ + {key: "Series 1", value: "Value 1", color: "#000"}, + {key: "Series 2", value: "Value 2", color: "#00f"} + ] + } + */ + var data = null; + + var gravity = 'w' //Can be 'n','s','e','w'. Determines how tooltip is positioned. + ,distance = 50 //Distance to offset tooltip from the mouse location. + ,snapDistance = 25 //Tolerance allowed before tooltip is moved from its current position (creates 'snapping' effect) + , fixedTop = null //If not null, this fixes the top position of the tooltip. + , classes = null //Attaches additional CSS classes to the tooltip DIV that is created. + , chartContainer = null //Parent DIV, of the SVG Container that holds the chart. + , tooltipElem = null //actual DOM element representing the tooltip. + , position = {left: null, top: null} //Relative position of the tooltip inside chartContainer. + , enabled = true; //True -> tooltips are rendered. False -> don't render tooltips. + + //Generates a unique id when you create a new tooltip() object + var id = "nvtooltip-" + Math.floor(Math.random() * 100000); + + //CSS class to specify whether element should not have mouse events. + var nvPointerEventsClass = "nv-pointer-events-none"; + + //Format function for the tooltip values column + var valueFormatter = function(d,i) { + return d; + }; + + //Format function for the tooltip header value. + var headerFormatter = function(d) { + return d; + }; + + //By default, the tooltip model renders a beautiful table inside a DIV. + //You can override this function if a custom tooltip is desired. + var contentGenerator = function(d) { + if (content != null) { + return content; + } + + if (d == null) { + return ''; + } + + var table = d3.select(document.createElement("table")); + var theadEnter = table.selectAll("thead") + .data([d]) + .enter().append("thead"); + + theadEnter.append("tr") + .append("td") + .attr("colspan",3) + .append("strong") + .classed("x-value",true) + .html(headerFormatter(d.value)); + + var tbodyEnter = table.selectAll("tbody") + .data([d]) + .enter().append("tbody"); + + var trowEnter = tbodyEnter.selectAll("tr") + .data(function(p) { return p.series}) + .enter() + .append("tr") + .classed("highlight", function(p) { return p.highlight}); + + trowEnter.append("td") + .classed("legend-color-guide",true) + .append("div") + .style("background-color", function(p) { return p.color}); + + trowEnter.append("td") + .classed("key",true) + .html(function(p) {return p.key}); + + trowEnter.append("td") + .classed("value",true) + .html(function(p,i) { return valueFormatter(p.value,i) }); + + + trowEnter.selectAll("td").each(function(p) { + if (p.highlight) { + var opacityScale = d3.scale.linear().domain([0,1]).range(["#fff",p.color]); + var opacity = 0.6; + d3.select(this) + .style("border-bottom-color", opacityScale(opacity)) + .style("border-top-color", opacityScale(opacity)) + ; + } + }); + + var html = table.node().outerHTML; + if (d.footer !== undefined) + html += ""; + return html; + + }; + + var dataSeriesExists = function(d) { + if (d && d.series && d.series.length > 0) { + return true; + } + return false; + }; + + //In situations where the chart is in a 'viewBox', re-position the tooltip based on how far chart is zoomed. + function convertViewBoxRatio() { + if (chartContainer) { + var svg = d3.select(chartContainer); + if (svg.node().tagName !== "svg") { + svg = svg.select("svg"); + } + var viewBox = (svg.node()) ? svg.attr('viewBox') : null; + if (viewBox) { + viewBox = viewBox.split(' '); + var ratio = parseInt(svg.style('width')) / viewBox[2]; + + position.left = position.left * ratio; + position.top = position.top * ratio; + } + } + } + + //Creates new tooltip container, or uses existing one on DOM. + function getTooltipContainer(newContent) { + var body; + if (chartContainer) { + body = d3.select(chartContainer); + } else { + body = d3.select("body"); + } + + var container = body.select(".nvtooltip"); + if (container.node() === null) { + //Create new tooltip div if it doesn't exist on DOM. + container = body.append("div") + .attr("class", "nvtooltip " + (classes? classes: "xy-tooltip")) + .attr("id",id) + ; + } + + container.node().innerHTML = newContent; + container.style("top",0).style("left",0).style("opacity",0); + container.selectAll("div, table, td, tr").classed(nvPointerEventsClass,true) + container.classed(nvPointerEventsClass,true); + return container.node(); + } + + //Draw the tooltip onto the DOM. + function nvtooltip() { + if (!enabled) return; + if (!dataSeriesExists(data)) return; + + convertViewBoxRatio(); + + var left = position.left; + var top = (fixedTop != null) ? fixedTop : position.top; + var container = getTooltipContainer(contentGenerator(data)); + tooltipElem = container; + if (chartContainer) { + var svgComp = chartContainer.getElementsByTagName("svg")[0]; + var boundRect = (svgComp) ? svgComp.getBoundingClientRect() : chartContainer.getBoundingClientRect(); + var svgOffset = {left:0,top:0}; + if (svgComp) { + var svgBound = svgComp.getBoundingClientRect(); + var chartBound = chartContainer.getBoundingClientRect(); + var svgBoundTop = svgBound.top; + + //Defensive code. Sometimes, svgBoundTop can be a really negative + // number, like -134254. That's a bug. + // If such a number is found, use zero instead. FireFox bug only + if (svgBoundTop < 0) { + var containerBound = chartContainer.getBoundingClientRect(); + svgBoundTop = (Math.abs(svgBoundTop) > containerBound.height) ? 0 : svgBoundTop; + } + svgOffset.top = Math.abs(svgBoundTop - chartBound.top); + svgOffset.left = Math.abs(svgBound.left - chartBound.left); + } + //If the parent container is an overflow
with scrollbars, subtract the scroll offsets. + //You need to also add any offset between the element and its containing
+ //Finally, add any offset of the containing
on the whole page. + left += chartContainer.offsetLeft + svgOffset.left - 2*chartContainer.scrollLeft; + top += chartContainer.offsetTop + svgOffset.top - 2*chartContainer.scrollTop; + } + + if (snapDistance && snapDistance > 0) { + top = Math.floor(top/snapDistance) * snapDistance; + } + + nv.tooltip.calcTooltipPosition([left,top], gravity, distance, container); + return nvtooltip; + } + + nvtooltip.nvPointerEventsClass = nvPointerEventsClass; + + nvtooltip.content = function(_) { + if (!arguments.length) return content; + content = _; + return nvtooltip; + }; + + //Returns tooltipElem...not able to set it. + nvtooltip.tooltipElem = function() { + return tooltipElem; + }; + + nvtooltip.contentGenerator = function(_) { + if (!arguments.length) return contentGenerator; + if (typeof _ === 'function') { + contentGenerator = _; + } + return nvtooltip; + }; + + nvtooltip.data = function(_) { + if (!arguments.length) return data; + data = _; + return nvtooltip; + }; + + nvtooltip.gravity = function(_) { + if (!arguments.length) return gravity; + gravity = _; + return nvtooltip; + }; + + nvtooltip.distance = function(_) { + if (!arguments.length) return distance; + distance = _; + return nvtooltip; + }; + + nvtooltip.snapDistance = function(_) { + if (!arguments.length) return snapDistance; + snapDistance = _; + return nvtooltip; + }; + + nvtooltip.classes = function(_) { + if (!arguments.length) return classes; + classes = _; + return nvtooltip; + }; + + nvtooltip.chartContainer = function(_) { + if (!arguments.length) return chartContainer; + chartContainer = _; + return nvtooltip; + }; + + nvtooltip.position = function(_) { + if (!arguments.length) return position; + position.left = (typeof _.left !== 'undefined') ? _.left : position.left; + position.top = (typeof _.top !== 'undefined') ? _.top : position.top; + return nvtooltip; + }; + + nvtooltip.fixedTop = function(_) { + if (!arguments.length) return fixedTop; + fixedTop = _; + return nvtooltip; + }; + + nvtooltip.enabled = function(_) { + if (!arguments.length) return enabled; + enabled = _; + return nvtooltip; + }; + + nvtooltip.valueFormatter = function(_) { + if (!arguments.length) return valueFormatter; + if (typeof _ === 'function') { + valueFormatter = _; + } + return nvtooltip; + }; + + nvtooltip.headerFormatter = function(_) { + if (!arguments.length) return headerFormatter; + if (typeof _ === 'function') { + headerFormatter = _; + } + return nvtooltip; + }; + + //id() is a read-only function. You can't use it to set the id. + nvtooltip.id = function() { + return id; + }; + + return nvtooltip; + }; + + //Original tooltip.show function. Kept for backward compatibility. + // pos = [left,top] + nv.tooltip.show = function(pos, content, gravity, dist, parentContainer, classes) { + + //Create new tooltip div if it doesn't exist on DOM. + var container = document.createElement('div'); + container.className = 'nvtooltip ' + (classes ? classes : 'xy-tooltip'); + + var body = parentContainer; + if ( !parentContainer || parentContainer.tagName.match(/g|svg/i)) { + //If the parent element is an SVG element, place tooltip in the element. + body = document.getElementsByTagName('body')[0]; + } + + container.style.left = 0; + container.style.top = 0; + container.style.opacity = 0; + // Content can also be dom element + if (typeof content !== 'string') + container.appendChild(content); + else + container.innerHTML = content; + body.appendChild(container); + + //If the parent container is an overflow
with scrollbars, subtract the scroll offsets. + if (parentContainer) { + pos[0] = pos[0] - parentContainer.scrollLeft; + pos[1] = pos[1] - parentContainer.scrollTop; + } + nv.tooltip.calcTooltipPosition(pos, gravity, dist, container); + }; + + //Looks up the ancestry of a DOM element, and returns the first NON-svg node. + nv.tooltip.findFirstNonSVGParent = function(Elem) { + while(Elem.tagName.match(/^g|svg$/i) !== null) { + Elem = Elem.parentNode; + } + return Elem; + }; + + //Finds the total offsetTop of a given DOM element. + //Looks up the entire ancestry of an element, up to the first relatively positioned element. + nv.tooltip.findTotalOffsetTop = function ( Elem, initialTop ) { + var offsetTop = initialTop; + + do { + if( !isNaN( Elem.offsetTop ) ) { + offsetTop += (Elem.offsetTop); + } + } while( Elem = Elem.offsetParent ); + return offsetTop; + }; + + //Finds the total offsetLeft of a given DOM element. + //Looks up the entire ancestry of an element, up to the first relatively positioned element. + nv.tooltip.findTotalOffsetLeft = function ( Elem, initialLeft) { + var offsetLeft = initialLeft; + + do { + if( !isNaN( Elem.offsetLeft ) ) { + offsetLeft += (Elem.offsetLeft); + } + } while( Elem = Elem.offsetParent ); + return offsetLeft; + }; + + //Global utility function to render a tooltip on the DOM. + //pos = [left,top] coordinates of where to place the tooltip, relative to the SVG chart container. + //gravity = how to orient the tooltip + //dist = how far away from the mouse to place tooltip + //container = tooltip DIV + nv.tooltip.calcTooltipPosition = function(pos, gravity, dist, container) { + + var height = parseInt(container.offsetHeight), + width = parseInt(container.offsetWidth), + windowWidth = nv.utils.windowSize().width, + windowHeight = nv.utils.windowSize().height, + scrollTop = window.pageYOffset, + scrollLeft = window.pageXOffset, + left, top; + + windowHeight = window.innerWidth >= document.body.scrollWidth ? windowHeight : windowHeight - 16; + windowWidth = window.innerHeight >= document.body.scrollHeight ? windowWidth : windowWidth - 16; + + gravity = gravity || 's'; + dist = dist || 20; + + var tooltipTop = function ( Elem ) { + return nv.tooltip.findTotalOffsetTop(Elem, top); + }; + + var tooltipLeft = function ( Elem ) { + return nv.tooltip.findTotalOffsetLeft(Elem,left); + }; + + switch (gravity) { + case 'e': + left = pos[0] - width - dist; + top = pos[1] - (height / 2); + var tLeft = tooltipLeft(container); + var tTop = tooltipTop(container); + if (tLeft < scrollLeft) left = pos[0] + dist > scrollLeft ? pos[0] + dist : scrollLeft - tLeft + left; + if (tTop < scrollTop) top = scrollTop - tTop + top; + if (tTop + height > scrollTop + windowHeight) top = scrollTop + windowHeight - tTop + top - height; + break; + case 'w': + left = pos[0] + dist; + top = pos[1] - (height / 2); + var tLeft = tooltipLeft(container); + var tTop = tooltipTop(container); + if (tLeft + width > windowWidth) left = pos[0] - width - dist; + if (tTop < scrollTop) top = scrollTop + 5; + if (tTop + height > scrollTop + windowHeight) top = scrollTop + windowHeight - tTop + top - height; + break; + case 'n': + left = pos[0] - (width / 2) - 5; + top = pos[1] + dist; + var tLeft = tooltipLeft(container); + var tTop = tooltipTop(container); + if (tLeft < scrollLeft) left = scrollLeft + 5; + if (tLeft + width > windowWidth) left = left - width/2 + 5; + if (tTop + height > scrollTop + windowHeight) top = scrollTop + windowHeight - tTop + top - height; + break; + case 's': + left = pos[0] - (width / 2); + top = pos[1] - height - dist; + var tLeft = tooltipLeft(container); + var tTop = tooltipTop(container); + if (tLeft < scrollLeft) left = scrollLeft + 5; + if (tLeft + width > windowWidth) left = left - width/2 + 5; + if (scrollTop > tTop) top = scrollTop; + break; + case 'none': + left = pos[0]; + top = pos[1] - dist; + var tLeft = tooltipLeft(container); + var tTop = tooltipTop(container); + break; + } + + container.style.left = left+'px'; + container.style.top = top+'px'; + container.style.opacity = 1; + container.style.position = 'absolute'; + + return container; + }; + + //Global utility function to remove tooltips from the DOM. + nv.tooltip.cleanup = function() { + + // Find the tooltips, mark them for removal by this class (so others cleanups won't find it) + var tooltips = document.getElementsByClassName('nvtooltip'); + var purging = []; + while(tooltips.length) { + purging.push(tooltips[0]); + tooltips[0].style.transitionDelay = '0 !important'; + tooltips[0].style.opacity = 0; + tooltips[0].className = 'nvtooltip-pending-removal'; + } + + setTimeout(function() { + + while (purging.length) { + var removeMe = purging.pop(); + removeMe.parentNode.removeChild(removeMe); + } + }, 500); + }; + +})(); + + +/* +Gets the browser window size + +Returns object with height and width properties + */ +nv.utils.windowSize = function() { + // Sane defaults + var size = {width: 640, height: 480}; + + // Earlier IE uses Doc.body + if (document.body && document.body.offsetWidth) { + size.width = document.body.offsetWidth; + size.height = document.body.offsetHeight; + } + + // IE can use depending on mode it is in + if (document.compatMode=='CSS1Compat' && + document.documentElement && + document.documentElement.offsetWidth ) { + + size.width = document.documentElement.offsetWidth; + size.height = document.documentElement.offsetHeight; + } + + // Most recent browsers use + if (window.innerWidth && window.innerHeight) { + size.width = window.innerWidth; + size.height = window.innerHeight; + } + return (size); +}; + + +/* +Binds callback function to run when window is resized + */ +nv.utils.windowResize = function(handler) { + if (window.addEventListener) { + window.addEventListener('resize', handler); + } else { + nv.log("ERROR: Failed to bind to window.resize with: ", handler); + } + // return object with clear function to remove the single added callback. + return { + callback: handler, + clear: function() { + window.removeEventListener('resize', handler); + } + } +}; + + +/* +Backwards compatible way to implement more d3-like coloring of graphs. +If passed an array, wrap it in a function which implements the old behavior +Else return what was passed in +*/ +nv.utils.getColor = function(color) { + //if you pass in nothing, get default colors back + if (!arguments.length) { + return nv.utils.defaultColor(); + + //if passed an array, wrap it in a function + } else if(color instanceof Array) { + return function(d, i) { return d.color || color[i % color.length]; }; + + //if passed a function, return the function, or whatever it may be + //external libs, such as angularjs-nvd3-directives use this + } else { + //can't really help it if someone passes rubbish as color + return color; + } +}; + + +/* +Default color chooser uses the index of an object as before. + */ +nv.utils.defaultColor = function() { + var colors = d3.scale.category20().range(); + return function(d, i) { + return d.color || colors[i % colors.length] + }; +}; + + +/* +Returns a color function that takes the result of 'getKey' for each series and +looks for a corresponding color from the dictionary +*/ +nv.utils.customTheme = function(dictionary, getKey, defaultColors) { + // use default series.key if getKey is undefined + getKey = getKey || function(series) { return series.key }; + defaultColors = defaultColors || d3.scale.category20().range(); + + // start at end of default color list and walk back to index 0 + var defIndex = defaultColors.length; + + return function(series, index) { + var key = getKey(series); + if (typeof dictionary[key] === 'function') { + return dictionary[key](); + } else if (dictionary[key] !== undefined) { + return dictionary[key]; + } else { + // no match in dictionary, use a default color + if (!defIndex) { + // used all the default colors, start over + defIndex = defaultColors.length; + } + defIndex = defIndex - 1; + return defaultColors[defIndex]; + } + }; +}; + + +/* +From the PJAX example on d3js.org, while this is not really directly needed +it's a very cool method for doing pjax, I may expand upon it a little bit, +open to suggestions on anything that may be useful +*/ +nv.utils.pjax = function(links, content) { + + var load = function(href) { + d3.html(href, function(fragment) { + var target = d3.select(content).node(); + target.parentNode.replaceChild( + d3.select(fragment).select(content).node(), + target); + nv.utils.pjax(links, content); + }); + }; + + d3.selectAll(links).on("click", function() { + history.pushState(this.href, this.textContent, this.href); + load(this.href); + d3.event.preventDefault(); + }); + + d3.select(window).on("popstate", function() { + if (d3.event.state) { + load(d3.event.state); + } + }); +}; + + +/* +For when we want to approximate the width in pixels for an SVG:text element. +Most common instance is when the element is in a display:none; container. +Forumla is : text.length * font-size * constant_factor +*/ +nv.utils.calcApproxTextWidth = function (svgTextElem) { + if (typeof svgTextElem.style === 'function' + && typeof svgTextElem.text === 'function') { + + var fontSize = parseInt(svgTextElem.style("font-size").replace("px","")); + var textLength = svgTextElem.text().length; + return textLength * fontSize * 0.5; + } + return 0; +}; + + +/* +Numbers that are undefined, null or NaN, convert them to zeros. +*/ +nv.utils.NaNtoZero = function(n) { + if (typeof n !== 'number' + || isNaN(n) + || n === null + || n === Infinity + || n === -Infinity) { + + return 0; + } + return n; +}; + +/* +Add a way to watch for d3 transition ends to d3 +*/ +d3.selection.prototype.watchTransition = function(renderWatch){ + var args = [this].concat([].slice.call(arguments, 1)); + return renderWatch.transition.apply(renderWatch, args); +}; + + +/* +Helper object to watch when d3 has rendered something +*/ +nv.utils.renderWatch = function(dispatch, duration) { + if (!(this instanceof nv.utils.renderWatch)) { + return new nv.utils.renderWatch(dispatch, duration); + } + + var _duration = duration !== undefined ? duration : 250; + var renderStack = []; + var self = this; + + this.models = function(models) { + models = [].slice.call(arguments, 0); + models.forEach(function(model){ + model.__rendered = false; + (function(m){ + m.dispatch.on('renderEnd', function(arg){ + m.__rendered = true; + self.renderEnd('model'); + }); + })(model); + + if (renderStack.indexOf(model) < 0) { + renderStack.push(model); + } + }); + return this; + }; + + this.reset = function(duration) { + if (duration !== undefined) { + _duration = duration; + } + renderStack = []; + }; + + this.transition = function(selection, args, duration) { + args = arguments.length > 1 ? [].slice.call(arguments, 1) : []; + + if (args.length > 1) { + duration = args.pop(); + } else { + duration = _duration !== undefined ? _duration : 250; + } + selection.__rendered = false; + + if (renderStack.indexOf(selection) < 0) { + renderStack.push(selection); + } + + if (duration === 0) { + selection.__rendered = true; + selection.delay = function() { return this; }; + selection.duration = function() { return this; }; + return selection; + } else { + if (selection.length === 0) { + selection.__rendered = true; + } else if (selection.every( function(d){ return !d.length; } )) { + selection.__rendered = true; + } else { + selection.__rendered = false; + } + + var n = 0; + return selection + .transition() + .duration(duration) + .each(function(){ ++n; }) + .each('end', function(d, i) { + if (--n === 0) { + selection.__rendered = true; + self.renderEnd.apply(this, args); + } + }); + } + }; + + this.renderEnd = function() { + if (renderStack.every( function(d){ return d.__rendered; } )) { + renderStack.forEach( function(d){ d.__rendered = false; }); + dispatch.renderEnd.apply(this, arguments); + } + } + +}; + + +/* +Takes multiple objects and combines them into the first one (dst) +example: nv.utils.deepExtend({a: 1}, {a: 2, b: 3}, {c: 4}); +gives: {a: 2, b: 3, c: 4} +*/ +nv.utils.deepExtend = function(dst){ + var sources = arguments.length > 1 ? [].slice.call(arguments, 1) : []; + sources.forEach(function(source) { + for (key in source) { + var isArray = dst[key] instanceof Array; + var isObject = typeof dst[key] === 'object'; + var srcObj = typeof source[key] === 'object'; + + if (isObject && !isArray && srcObj) { + nv.utils.deepExtend(dst[key], source[key]); + } else { + dst[key] = source[key]; + } + } + }); +}; + + +/* +state utility object, used to track d3 states in the models +*/ +nv.utils.state = function(){ + if (!(this instanceof nv.utils.state)) { + return new nv.utils.state(); + } + var state = {}; + var _self = this; + var _setState = function(){}; + var _getState = function(){ return {}; }; + var init = null; + var changed = null; + + this.dispatch = d3.dispatch('change', 'set'); + + this.dispatch.on('set', function(state){ + _setState(state, true); + }); + + this.getter = function(fn){ + _getState = fn; + return this; + }; + + this.setter = function(fn, callback) { + if (!callback) { + callback = function(){}; + } + _setState = function(state, update){ + fn(state); + if (update) { + callback(); + } + }; + return this; + }; + + this.init = function(state){ + init = init || {}; + nv.utils.deepExtend(init, state); + }; + + var _set = function(){ + var settings = _getState(); + + if (JSON.stringify(settings) === JSON.stringify(state)) { + return false; + } + + for (var key in settings) { + if (state[key] === undefined) { + state[key] = {}; + } + state[key] = settings[key]; + changed = true; + } + return true; + }; + + this.update = function(){ + if (init) { + _setState(init, false); + init = null; + } + if (_set.call(this)) { + this.dispatch.change(state); + } + }; + +}; + + +/* +Snippet of code you can insert into each nv.models.* to give you the ability to +do things like: +chart.options({ + showXAxis: true, + tooltips: true +}); + +To enable in the chart: +chart.options = nv.utils.optionsFunc.bind(chart); +*/ +nv.utils.optionsFunc = function(args) { + nv.deprecated('nv.utils.optionsFunc'); + if (args) { + d3.map(args).forEach((function(key,value) { + if (typeof this[key] === "function") { + this[key](value); + } + }).bind(this)); + } + return this; +}; + + +/* +numTicks: requested number of ticks +data: the chart data + +returns the number of ticks to actually use on X axis, based on chart data +to avoid duplicate ticks with the same value +*/ +nv.utils.calcTicksX = function(numTicks, data) { + // find max number of values from all data streams + var numValues = 1; + var i = 0; + for (i; i < data.length; i += 1) { + var stream_len = data[i] && data[i].values ? data[i].values.length : 0; + numValues = stream_len > numValues ? stream_len : numValues; + } + nv.log("Requested number of ticks: ", numTicks); + nv.log("Calculated max values to be: ", numValues); + // make sure we don't have more ticks than values to avoid duplicates + numTicks = numTicks > numValues ? numTicks = numValues - 1 : numTicks; + // make sure we have at least one tick + numTicks = numTicks < 1 ? 1 : numTicks; + // make sure it's an integer + numTicks = Math.floor(numTicks); + nv.log("Calculating tick count as: ", numTicks); + return numTicks; +}; + + +/* +returns number of ticks to actually use on Y axis, based on chart data +*/ +nv.utils.calcTicksY = function(numTicks, data) { + // currently uses the same logic but we can adjust here if needed later + return nv.utils.calcTicksX(numTicks, data); +}; + + +/* +Add a particular option from an options object onto chart +Options exposed on a chart are a getter/setter function that returns chart +on set to mimic typical d3 option chaining, e.g. svg.option1('a').option2('b'); + +option objects should be generated via Object.create() to provide +the option of manipulating data via get/set functions. +*/ +nv.utils.initOption = function(chart, name) { + // if it's a call option, just call it directly, otherwise do get/set + if (chart._calls && chart._calls[name]) { + chart[name] = chart._calls[name]; + } else { + chart[name] = function (_) { + if (!arguments.length) return chart._options[name]; + chart._options[name] = _; + return chart; + }; + } +}; + + +/* +Add all options in an options object to the chart +*/ +nv.utils.initOptions = function(chart) { + var ops = Object.getOwnPropertyNames(chart._options || {}); + var calls = Object.getOwnPropertyNames(chart._calls || {}); + ops = ops.concat(calls); + for (var i in ops) { + nv.utils.initOption(chart, ops[i]); + } +}; + + +/* +Inherit options from a D3 object +d3.rebind makes calling the function on target actually call it on source +Also use _d3options so we can track what we inherit for documentation and chained inheritance +*/ +nv.utils.inheritOptionsD3 = function(target, d3_source, oplist) { + target._d3options = oplist.concat(target._d3options || []); + oplist.unshift(d3_source); + oplist.unshift(target); + d3.rebind.apply(this, oplist); +}; + + +/* +Remove duplicates from an array +*/ +nv.utils.arrayUnique = function(a) { + return a.sort().filter(function(item, pos) { + return !pos || item != a[pos - 1]; + }); +}; + + +/* +Keeps a list of custom symbols to draw from in addition to d3.svg.symbol +Necessary since d3 doesn't let you extend its list -_- +Add new symbols by doing nv.utils.symbols.set('name', function(size){...}); +*/ +nv.utils.symbolMap = d3.map(); + + +/* +Replaces d3.svg.symbol so that we can look both there and our own map + */ +nv.utils.symbol = function() { + var type, + size = 64; + function symbol(d,i) { + var t = type.call(this,d,i); + var s = size.call(this,d,i); + if (d3.svg.symbolTypes.indexOf(t) !== -1) { + return d3.svg.symbol().type(t).size(s)(); + } else { + return nv.utils.symbolMap.get(t)(s); + } + } + symbol.type = function(_) { + if (!arguments.length) return type; + type = d3.functor(_); + return symbol; + }; + symbol.size = function(_) { + if (!arguments.length) return size; + size = d3.functor(_); + return symbol; + }; + return symbol; +}; + + +/* +Inherit option getter/setter functions from source to target +d3.rebind makes calling the function on target actually call it on source +Also track via _inherited and _d3options so we can track what we inherit +for documentation generation purposes and chained inheritance +*/ +nv.utils.inheritOptions = function(target, source) { + // inherit all the things + var ops = Object.getOwnPropertyNames(source._options || {}); + var calls = Object.getOwnPropertyNames(source._calls || {}); + var inherited = source._inherited || []; + var d3ops = source._d3options || []; + var args = ops.concat(calls).concat(inherited).concat(d3ops); + args.unshift(source); + args.unshift(target); + d3.rebind.apply(this, args); + // pass along the lists to keep track of them, don't allow duplicates + target._inherited = nv.utils.arrayUnique(ops.concat(calls).concat(inherited).concat(ops).concat(target._inherited || [])); + target._d3options = nv.utils.arrayUnique(d3ops.concat(target._d3options || [])); +}; + + +/* +Runs common initialize code on the svg before the chart builds +*/ +nv.utils.initSVG = function(svg) { + svg.classed({'nvd3-svg':true}); +};nv.models.axis = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var axis = d3.svg.axis(); + var scale = d3.scale.linear(); + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = 75 //only used for tickLabel currently + , height = 60 //only used for tickLabel currently + , axisLabelText = null + , showMaxMin = true //TODO: showMaxMin should be disabled on all ordinal scaled axes + , highlightZero = true + , rotateLabels = 0 + , rotateYLabel = true + , staggerLabels = false + , isOrdinal = false + , ticks = null + , axisLabelDistance = 0 + , duration = 250 + , dispatch = d3.dispatch('renderEnd') + , axisRendered = false + , maxMinRendered = false + ; + axis + .scale(scale) + .orient('bottom') + .tickFormat(function(d) { return d }) + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var scale0; + var renderWatch = nv.utils.renderWatch(dispatch, duration); + + function chart(selection) { + renderWatch.reset(); + selection.each(function(data) { + var container = d3.select(this); + nv.utils.initSVG(container); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-axis').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-axis'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g') + + if (ticks !== null) + axis.ticks(ticks); + else if (axis.orient() == 'top' || axis.orient() == 'bottom') + axis.ticks(Math.abs(scale.range()[1] - scale.range()[0]) / 100); + + //TODO: consider calculating width/height based on whether or not label is added, for reference in charts using this component + g.watchTransition(renderWatch, 'axis').call(axis); + + scale0 = scale0 || axis.scale(); + + var fmt = axis.tickFormat(); + if (fmt == null) { + fmt = scale0.tickFormat(); + } + + var axisLabel = g.selectAll('text.nv-axislabel') + .data([axisLabelText || null]); + axisLabel.exit().remove(); + + switch (axis.orient()) { + case 'top': + axisLabel.enter().append('text').attr('class', 'nv-axislabel'); + var w; + if (scale.range().length < 2) { + w = 0; + } else if (scale.range().length === 2) { + w = scale.range()[1]; + } else { + w = scale.range()[scale.range().length-1]+(scale.range()[1]-scale.range()[0]); + } + axisLabel + .attr('text-anchor', 'middle') + .attr('y', 0) + .attr('x', w/2); + if (showMaxMin) { + var axisMaxMin = wrap.selectAll('g.nv-axisMaxMin') + .data(scale.domain()); + axisMaxMin.enter().append('g').attr('class', 'nv-axisMaxMin').append('text'); + axisMaxMin.exit().remove(); + axisMaxMin + .attr('transform', function(d,i) { + return 'translate(' + nv.utils.NaNtoZero(scale(d)) + ',0)' + }) + .select('text') + .attr('dy', '-0.5em') + .attr('y', -axis.tickPadding()) + .attr('text-anchor', 'middle') + .text(function(d,i) { + var v = fmt(d); + return ('' + v).match('NaN') ? '' : v; + }); + axisMaxMin.watchTransition(renderWatch, 'min-max top') + .attr('transform', function(d,i) { + return 'translate(' + nv.utils.NaNtoZero(scale.range()[i]) + ',0)' + }); + } + break; + case 'bottom': + var xLabelMargin = axisLabelDistance + 36; + var maxTextWidth = 30; + var xTicks = g.selectAll('g').select("text"); + if (rotateLabels%360) { + //Calculate the longest xTick width + xTicks.each(function(d,i){ + var width = this.getBoundingClientRect().width; + if(width > maxTextWidth) maxTextWidth = width; + }); + //Convert to radians before calculating sin. Add 30 to margin for healthy padding. + var sin = Math.abs(Math.sin(rotateLabels*Math.PI/180)); + var xLabelMargin = (sin ? sin*maxTextWidth : maxTextWidth)+30; + //Rotate all xTicks + xTicks + .attr('transform', function(d,i,j) { return 'rotate(' + rotateLabels + ' 0,0)' }) + .style('text-anchor', rotateLabels%360 > 0 ? 'start' : 'end'); + } + axisLabel.enter().append('text').attr('class', 'nv-axislabel'); + var w; + if (scale.range().length < 2) { + w = 0; + } else if (scale.range().length === 2) { + w = scale.range()[1]; + } else { + w = scale.range()[scale.range().length-1]+(scale.range()[1]-scale.range()[0]); + } + axisLabel + .attr('text-anchor', 'middle') + .attr('y', xLabelMargin) + .attr('x', w/2); + if (showMaxMin) { + //if (showMaxMin && !isOrdinal) { + var axisMaxMin = wrap.selectAll('g.nv-axisMaxMin') + //.data(scale.domain()) + .data([scale.domain()[0], scale.domain()[scale.domain().length - 1]]); + axisMaxMin.enter().append('g').attr('class', 'nv-axisMaxMin').append('text'); + axisMaxMin.exit().remove(); + axisMaxMin + .attr('transform', function(d,i) { + return 'translate(' + nv.utils.NaNtoZero((scale(d) + (isOrdinal ? scale.rangeBand() / 2 : 0))) + ',0)' + }) + .select('text') + .attr('dy', '.71em') + .attr('y', axis.tickPadding()) + .attr('transform', function(d,i,j) { return 'rotate(' + rotateLabels + ' 0,0)' }) + .style('text-anchor', rotateLabels ? (rotateLabels%360 > 0 ? 'start' : 'end') : 'middle') + .text(function(d,i) { + var v = fmt(d); + return ('' + v).match('NaN') ? '' : v; + }); + axisMaxMin.watchTransition(renderWatch, 'min-max bottom') + .attr('transform', function(d,i) { + return 'translate(' + nv.utils.NaNtoZero((scale(d) + (isOrdinal ? scale.rangeBand() / 2 : 0))) + ',0)' + }); + } + if (staggerLabels) + xTicks + .attr('transform', function(d,i) { + return 'translate(0,' + (i % 2 == 0 ? '0' : '12') + ')' + }); + + break; + case 'right': + axisLabel.enter().append('text').attr('class', 'nv-axislabel'); + axisLabel + .style('text-anchor', rotateYLabel ? 'middle' : 'begin') + .attr('transform', rotateYLabel ? 'rotate(90)' : '') + .attr('y', rotateYLabel ? (-Math.max(margin.right,width) + 12) : -10) //TODO: consider calculating this based on largest tick width... OR at least expose this on chart + .attr('x', rotateYLabel ? (scale.range()[0] / 2) : axis.tickPadding()); + if (showMaxMin) { + var axisMaxMin = wrap.selectAll('g.nv-axisMaxMin') + .data(scale.domain()); + axisMaxMin.enter().append('g').attr('class', 'nv-axisMaxMin').append('text') + .style('opacity', 0); + axisMaxMin.exit().remove(); + axisMaxMin + .attr('transform', function(d,i) { + return 'translate(0,' + nv.utils.NaNtoZero(scale(d)) + ')' + }) + .select('text') + .attr('dy', '.32em') + .attr('y', 0) + .attr('x', axis.tickPadding()) + .style('text-anchor', 'start') + .text(function(d,i) { + var v = fmt(d); + return ('' + v).match('NaN') ? '' : v; + }); + axisMaxMin.watchTransition(renderWatch, 'min-max right') + .attr('transform', function(d,i) { + return 'translate(0,' + nv.utils.NaNtoZero(scale.range()[i]) + ')' + }) + .select('text') + .style('opacity', 1); + } + break; + case 'left': + /* + //For dynamically placing the label. Can be used with dynamically-sized chart axis margins + var yTicks = g.selectAll('g').select("text"); + yTicks.each(function(d,i){ + var labelPadding = this.getBoundingClientRect().width + axis.tickPadding() + 16; + if(labelPadding > width) width = labelPadding; + }); + */ + axisLabel.enter().append('text').attr('class', 'nv-axislabel'); + axisLabel + .style('text-anchor', rotateYLabel ? 'middle' : 'end') + .attr('transform', rotateYLabel ? 'rotate(-90)' : '') + .attr('y', rotateYLabel ? (-Math.max(margin.left,width) + 25 - (axisLabelDistance || 0)) : -10) + .attr('x', rotateYLabel ? (-scale.range()[0] / 2) : -axis.tickPadding()); + if (showMaxMin) { + var axisMaxMin = wrap.selectAll('g.nv-axisMaxMin') + .data(scale.domain()); + axisMaxMin.enter().append('g').attr('class', 'nv-axisMaxMin').append('text') + .style('opacity', 0); + axisMaxMin.exit().remove(); + axisMaxMin + .attr('transform', function(d,i) { + return 'translate(0,' + nv.utils.NaNtoZero(scale0(d)) + ')' + }) + .select('text') + .attr('dy', '.32em') + .attr('y', 0) + .attr('x', -axis.tickPadding()) + .attr('text-anchor', 'end') + .text(function(d,i) { + var v = fmt(d); + return ('' + v).match('NaN') ? '' : v; + }); + axisMaxMin.watchTransition(renderWatch, 'min-max right') + .attr('transform', function(d,i) { + return 'translate(0,' + nv.utils.NaNtoZero(scale.range()[i]) + ')' + }) + .select('text') + .style('opacity', 1); + } + break; + } + axisLabel.text(function(d) { return d }); + + if (showMaxMin && (axis.orient() === 'left' || axis.orient() === 'right')) { + //check if max and min overlap other values, if so, hide the values that overlap + g.selectAll('g') // the g's wrapping each tick + .each(function(d,i) { + d3.select(this).select('text').attr('opacity', 1); + if (scale(d) < scale.range()[1] + 10 || scale(d) > scale.range()[0] - 10) { // 10 is assuming text height is 16... if d is 0, leave it! + if (d > 1e-10 || d < -1e-10) // accounts for minor floating point errors... though could be problematic if the scale is EXTREMELY SMALL + d3.select(this).attr('opacity', 0); + + d3.select(this).select('text').attr('opacity', 0); // Don't remove the ZERO line!! + } + }); + + //if Max and Min = 0 only show min, Issue #281 + if (scale.domain()[0] == scale.domain()[1] && scale.domain()[0] == 0) { + wrap.selectAll('g.nv-axisMaxMin').style('opacity', function (d, i) { + return !i ? 1 : 0 + }); + } + } + + if (showMaxMin && (axis.orient() === 'top' || axis.orient() === 'bottom')) { + var maxMinRange = []; + wrap.selectAll('g.nv-axisMaxMin') + .each(function(d,i) { + try { + if (i) // i== 1, max position + maxMinRange.push(scale(d) - this.getBoundingClientRect().width - 4) //assuming the max and min labels are as wide as the next tick (with an extra 4 pixels just in case) + else // i==0, min position + maxMinRange.push(scale(d) + this.getBoundingClientRect().width + 4) + }catch (err) { + if (i) // i== 1, max position + maxMinRange.push(scale(d) - 4); //assuming the max and min labels are as wide as the next tick (with an extra 4 pixels just in case) + else // i==0, min position + maxMinRange.push(scale(d) + 4); + } + }); + // the g's wrapping each tick + g.selectAll('g').each(function(d,i) { + if (scale(d) < maxMinRange[0] || scale(d) > maxMinRange[1]) { + if (d > 1e-10 || d < -1e-10) // accounts for minor floating point errors... though could be problematic if the scale is EXTREMELY SMALL + d3.select(this).remove(); + else + d3.select(this).select('text').remove(); // Don't remove the ZERO line!! + } + }); + } + + //highlight zero line ... Maybe should not be an option and should just be in CSS? + if (highlightZero) { + g.selectAll('.tick') + .filter(function (d) { + return !parseFloat(Math.round(this.__data__ * 100000) / 1000000) && (this.__data__ !== undefined) + }) //this is because sometimes the 0 tick is a very small fraction, TODO: think of cleaner technique + .classed('zero', true); + } + //store old scales for use in transitions on update + scale0 = scale.copy(); + + }); + + renderWatch.renderEnd('axis immediate'); + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.axis = axis; + chart.dispatch = dispatch; + + chart.options = nv.utils.optionsFunc.bind(chart); + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + axisLabelDistance: {get: function(){return axisLabelDistance;}, set: function(_){axisLabelDistance=_;}}, + staggerLabels: {get: function(){return staggerLabels;}, set: function(_){staggerLabels=_;}}, + rotateLabels: {get: function(){return rotateLabels;}, set: function(_){rotateLabels=_;}}, + rotateYLabel: {get: function(){return rotateYLabel;}, set: function(_){rotateYLabel=_;}}, + highlightZero: {get: function(){return highlightZero;}, set: function(_){highlightZero=_;}}, + showMaxMin: {get: function(){return showMaxMin;}, set: function(_){showMaxMin=_;}}, + axisLabel: {get: function(){return axisLabelText;}, set: function(_){axisLabelText=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + ticks: {get: function(){return ticks;}, set: function(_){ticks=_;}}, + width: {get: function(){return width;}, set: function(_){width=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration=_; + renderWatch.reset(duration); + }}, + scale: {get: function(){return scale;}, set: function(_){ + scale = _; + axis.scale(scale); + isOrdinal = typeof scale.rangeBands === 'function'; + nv.utils.inheritOptionsD3(chart, scale, ['domain', 'range', 'rangeBand', 'rangeBands']); + }} + }); + + nv.utils.initOptions(chart); + nv.utils.inheritOptionsD3(chart, axis, ['orient', 'tickValues', 'tickSubdivide', 'tickSize', 'tickPadding', 'tickFormat']); + nv.utils.inheritOptionsD3(chart, scale, ['domain', 'range', 'rangeBand', 'rangeBands']); + + return chart; +}; + +// Chart design based on the recommendations of Stephen Few. Implementation +// based on the work of Clint Ivy, Jamie Love, and Jason Davies. +// http://projects.instantcognition.com/protovis/bulletchart/ + +nv.models.bullet = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , orient = 'left' // TODO top & bottom + , reverse = false + , ranges = function(d) { return d.ranges } + , markers = function(d) { return d.markers ? d.markers : [0] } + , measures = function(d) { return d.measures } + , rangeLabels = function(d) { return d.rangeLabels ? d.rangeLabels : [] } + , markerLabels = function(d) { return d.markerLabels ? d.markerLabels : [] } + , measureLabels = function(d) { return d.measureLabels ? d.measureLabels : [] } + , forceX = [0] // List of numbers to Force into the X scale (ie. 0, or a max / min, etc.) + , width = 380 + , height = 30 + , tickFormat = null + , color = nv.utils.getColor(['#1f77b4']) + , dispatch = d3.dispatch('elementMouseover', 'elementMouseout') + ; + + function chart(selection) { + selection.each(function(d, i) { + var availableWidth = width - margin.left - margin.right, + availableHeight = height - margin.top - margin.bottom, + container = d3.select(this); + nv.utils.initSVG(container); + + var rangez = ranges.call(this, d, i).slice().sort(d3.descending), + markerz = markers.call(this, d, i).slice().sort(d3.descending), + measurez = measures.call(this, d, i).slice().sort(d3.descending), + rangeLabelz = rangeLabels.call(this, d, i).slice(), + markerLabelz = markerLabels.call(this, d, i).slice(), + measureLabelz = measureLabels.call(this, d, i).slice(); + + // Setup Scales + // Compute the new x-scale. + var x1 = d3.scale.linear() + .domain( d3.extent(d3.merge([forceX, rangez])) ) + .range(reverse ? [availableWidth, 0] : [0, availableWidth]); + + // Retrieve the old x-scale, if this is an update. + var x0 = this.__chart__ || d3.scale.linear() + .domain([0, Infinity]) + .range(x1.range()); + + // Stash the new scale. + this.__chart__ = x1; + + var rangeMin = d3.min(rangez), //rangez[2] + rangeMax = d3.max(rangez), //rangez[0] + rangeAvg = rangez[1]; + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-bullet').data([d]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bullet'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('rect').attr('class', 'nv-range nv-rangeMax'); + gEnter.append('rect').attr('class', 'nv-range nv-rangeAvg'); + gEnter.append('rect').attr('class', 'nv-range nv-rangeMin'); + gEnter.append('rect').attr('class', 'nv-measure'); + gEnter.append('path').attr('class', 'nv-markerTriangle'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + var w0 = function(d) { return Math.abs(x0(d) - x0(0)) }, // TODO: could optimize by precalculating x0(0) and x1(0) + w1 = function(d) { return Math.abs(x1(d) - x1(0)) }; + var xp0 = function(d) { return d < 0 ? x0(d) : x0(0) }, + xp1 = function(d) { return d < 0 ? x1(d) : x1(0) }; + + g.select('rect.nv-rangeMax') + .attr('height', availableHeight) + .attr('width', w1(rangeMax > 0 ? rangeMax : rangeMin)) + .attr('x', xp1(rangeMax > 0 ? rangeMax : rangeMin)) + .datum(rangeMax > 0 ? rangeMax : rangeMin) + + g.select('rect.nv-rangeAvg') + .attr('height', availableHeight) + .attr('width', w1(rangeAvg)) + .attr('x', xp1(rangeAvg)) + .datum(rangeAvg) + + g.select('rect.nv-rangeMin') + .attr('height', availableHeight) + .attr('width', w1(rangeMax)) + .attr('x', xp1(rangeMax)) + .attr('width', w1(rangeMax > 0 ? rangeMin : rangeMax)) + .attr('x', xp1(rangeMax > 0 ? rangeMin : rangeMax)) + .datum(rangeMax > 0 ? rangeMin : rangeMax) + + g.select('rect.nv-measure') + .style('fill', color) + .attr('height', availableHeight / 3) + .attr('y', availableHeight / 3) + .attr('width', measurez < 0 ? + x1(0) - x1(measurez[0]) + : x1(measurez[0]) - x1(0)) + .attr('x', xp1(measurez)) + .on('mouseover', function() { + dispatch.elementMouseover({ + value: measurez[0], + label: measureLabelz[0] || 'Current', + pos: [x1(measurez[0]), availableHeight/2] + }) + }) + .on('mouseout', function() { + dispatch.elementMouseout({ + value: measurez[0], + label: measureLabelz[0] || 'Current' + }) + }); + + var h3 = availableHeight / 6; + if (markerz[0]) { + g.selectAll('path.nv-markerTriangle') + .attr('transform', function(d) { return 'translate(' + x1(markerz[0]) + ',' + (availableHeight / 2) + ')' }) + .attr('d', 'M0,' + h3 + 'L' + h3 + ',' + (-h3) + ' ' + (-h3) + ',' + (-h3) + 'Z') + .on('mouseover', function() { + dispatch.elementMouseover({ + value: markerz[0], + label: markerLabelz[0] || 'Previous', + pos: [x1(markerz[0]), availableHeight/2] + }) + }) + .on('mouseout', function() { + dispatch.elementMouseout({ + value: markerz[0], + label: markerLabelz[0] || 'Previous' + }) + }); + } else { + g.selectAll('path.nv-markerTriangle').remove(); + } + + wrap.selectAll('.nv-range') + .on('mouseover', function(d,i) { + var label = rangeLabelz[i] || (!i ? "Maximum" : i == 1 ? "Mean" : "Minimum"); + + dispatch.elementMouseover({ + value: d, + label: label, + pos: [x1(d), availableHeight/2] + }) + }) + .on('mouseout', function(d,i) { + var label = rangeLabelz[i] || (!i ? "Maximum" : i == 1 ? "Mean" : "Minimum"); + + dispatch.elementMouseout({ + value: d, + label: label + }) + }); + }); + + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + ranges: {get: function(){return ranges;}, set: function(_){ranges=_;}}, // ranges (bad, satisfactory, good) + markers: {get: function(){return markers;}, set: function(_){markers=_;}}, // markers (previous, goal) + measures: {get: function(){return measures;}, set: function(_){measures=_;}}, // measures (actual, forecast) + forceX: {get: function(){return forceX;}, set: function(_){forceX=_;}}, + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + tickFormat: {get: function(){return tickFormat;}, set: function(_){tickFormat=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + orient: {get: function(){return orient;}, set: function(_){ // left, right, top, bottom + orient = _; + reverse = orient == 'right' || orient == 'bottom'; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }} + }); + + nv.utils.initOptions(chart); + return chart; +}; + + + +// Chart design based on the recommendations of Stephen Few. Implementation +// based on the work of Clint Ivy, Jamie Love, and Jason Davies. +// http://projects.instantcognition.com/protovis/bulletchart/ +nv.models.bulletChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var bullet = nv.models.bullet() + ; + + var orient = 'left' // TODO top & bottom + , reverse = false + , margin = {top: 5, right: 40, bottom: 20, left: 120} + , ranges = function(d) { return d.ranges } + , markers = function(d) { return d.markers ? d.markers : [0] } + , measures = function(d) { return d.measures } + , width = null + , height = 55 + , tickFormat = null + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + x + '

' + + '

' + y + '

' + } + , noData = 'No Data Available.' + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ) + margin.left, + top = e.pos[1] + ( offsetElement.offsetTop || 0) + margin.top, + content = tooltip(e.key, e.label, e.value, e, chart); + + nv.tooltip.show([left, top], content, e.value < 0 ? 'e' : 'w', null, offsetElement); + }; + + function chart(selection) { + selection.each(function(d, i) { + var container = d3.select(this); + nv.utils.initSVG(container); + + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = height - margin.top - margin.bottom, + that = this; + + chart.update = function() { chart(selection) }; + chart.container = this; + + // Display No Data message if there's nothing to show. + if (!d || !ranges.call(this, d, i)) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', 18 + margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + var rangez = ranges.call(this, d, i).slice().sort(d3.descending), + markerz = markers.call(this, d, i).slice().sort(d3.descending), + measurez = measures.call(this, d, i).slice().sort(d3.descending); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-bulletChart').data([d]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bulletChart'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-bulletWrap'); + gEnter.append('g').attr('class', 'nv-titles'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + // Compute the new x-scale. + var x1 = d3.scale.linear() + .domain([0, Math.max(rangez[0], markerz[0], measurez[0])]) // TODO: need to allow forceX and forceY, and xDomain, yDomain + .range(reverse ? [availableWidth, 0] : [0, availableWidth]); + + // Retrieve the old x-scale, if this is an update. + var x0 = this.__chart__ || d3.scale.linear() + .domain([0, Infinity]) + .range(x1.range()); + + // Stash the new scale. + this.__chart__ = x1; + + var w0 = function(d) { return Math.abs(x0(d) - x0(0)) }, // TODO: could optimize by precalculating x0(0) and x1(0) + w1 = function(d) { return Math.abs(x1(d) - x1(0)) }; + + var title = gEnter.select('.nv-titles').append('g') + .attr('text-anchor', 'end') + .attr('transform', 'translate(-6,' + (height - margin.top - margin.bottom) / 2 + ')'); + title.append('text') + .attr('class', 'nv-title') + .text(function(d) { return d.title; }); + + title.append('text') + .attr('class', 'nv-subtitle') + .attr('dy', '1em') + .text(function(d) { return d.subtitle; }); + + bullet + .width(availableWidth) + .height(availableHeight) + + var bulletWrap = g.select('.nv-bulletWrap'); + d3.transition(bulletWrap).call(bullet); + + // Compute the tick format. + var format = tickFormat || x1.tickFormat( availableWidth / 100 ); + + // Update the tick groups. + var tick = g.selectAll('g.nv-tick') + .data(x1.ticks( availableWidth / 50 ), function(d) { + return this.textContent || format(d); + }); + + // Initialize the ticks with the old scale, x0. + var tickEnter = tick.enter().append('g') + .attr('class', 'nv-tick') + .attr('transform', function(d) { return 'translate(' + x0(d) + ',0)' }) + .style('opacity', 1e-6); + + tickEnter.append('line') + .attr('y1', availableHeight) + .attr('y2', availableHeight * 7 / 6); + + tickEnter.append('text') + .attr('text-anchor', 'middle') + .attr('dy', '1em') + .attr('y', availableHeight * 7 / 6) + .text(format); + + // Transition the updating ticks to the new scale, x1. + var tickUpdate = d3.transition(tick) + .attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' }) + .style('opacity', 1); + + tickUpdate.select('line') + .attr('y1', availableHeight) + .attr('y2', availableHeight * 7 / 6); + + tickUpdate.select('text') + .attr('y', availableHeight * 7 / 6); + + // Transition the exiting ticks to the new scale, x1. + d3.transition(tick.exit()) + .attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' }) + .style('opacity', 1e-6) + .remove(); + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + dispatch.on('tooltipShow', function(e) { + e.key = d.title; + if (tooltips) showTooltip(e, that.parentNode); + }); + + }); + + d3.timer.flush(); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + bullet.dispatch.on('elementMouseover.tooltip', function(e) { + dispatch.tooltipShow(e); + }); + + bullet.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.bullet = bullet; + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + ranges: {get: function(){return ranges;}, set: function(_){ranges=_;}}, // ranges (bad, satisfactory, good) + markers: {get: function(){return markers;}, set: function(_){markers=_;}}, // markers (previous, goal) + measures: {get: function(){return measures;}, set: function(_){measures=_;}}, // measures (actual, forecast) + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + tickFormat: {get: function(){return tickFormat;}, set: function(_){tickFormat=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + orient: {get: function(){return orient;}, set: function(_){ // left, right, top, bottom + orient = _; + reverse = orient == 'right' || orient == 'bottom'; + }} + }); + + nv.utils.inheritOptions(chart, bullet); + nv.utils.initOptions(chart); + + return chart; +}; + + + +nv.models.cumulativeLineChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var lines = nv.models.line() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + , legend = nv.models.legend() + , controls = nv.models.legend() + , interactiveLayer = nv.interactiveGuideline() + ; + + var margin = {top: 30, right: 30, bottom: 50, left: 60} + , color = nv.utils.defaultColor() + , width = null + , height = null + , showLegend = true + , showXAxis = true + , showYAxis = true + , rightAlignYAxis = false + , tooltips = true + , showControls = true + , useInteractiveGuideline = false + , rescaleY = true + , tooltip = function(key, x, y, e, graph) { + return '

' + key + '

' + + '

' + y + ' at ' + x + '

' + } + , x //can be accessed via chart.xScale() + , y //can be accessed via chart.yScale() + , id = lines.id() + , state = nv.utils.state() + , defaultState = null + , noData = 'No Data Available.' + , average = function(d) { return d.average } + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd') + , transitionDuration = 250 + , duration = 250 + , noErrorCheck = false //if set to TRUE, will bypass an error check in the indexify function. + ; + + state.index = 0; + state.rescaleY = rescaleY; + + xAxis + .orient('bottom') + .tickPadding(7) + ; + yAxis + .orient((rightAlignYAxis) ? 'right' : 'left') + ; + + controls.updateState(false); + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var dx = d3.scale.linear() + , index = {i: 0, x: 0} + , renderWatch = nv.utils.renderWatch(dispatch, duration) + ; + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(lines.x()(e.point, e.pointIndex)), + y = yAxis.tickFormat()(lines.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, null, null, offsetElement); + }; + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }), + index: index.i, + rescaleY: rescaleY + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.index !== undefined) + index.i = state.index; + if (state.rescaleY !== undefined) + rescaleY = state.rescaleY; + if (state.active !== undefined) + data.forEach(function(series,i) { + series.disabled = !state.active[i]; + }); + } + }; + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(lines); + if (showXAxis) renderWatch.models(xAxis); + if (showYAxis) renderWatch.models(yAxis); + selection.each(function(data) { + var container = d3.select(this); + nv.utils.initSVG(container); + container.classed('nv-chart-' + id, true); + var that = this; + + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + chart.update = function() { + if (duration === 0) + container.call(chart); + else + container.transition().duration(duration).call(chart) + }; + chart.container = this; + + state + .setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + // DEPRECATED set state.disableddisabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + var indexDrag = d3.behavior.drag() + .on('dragstart', dragStart) + .on('drag', dragMove) + .on('dragend', dragEnd); + + + function dragStart(d,i) { + d3.select(chart.container) + .style('cursor', 'ew-resize'); + } + + function dragMove(d,i) { + index.x = d3.event.x; + index.i = Math.round(dx.invert(index.x)); + updateZero(); + } + + function dragEnd(d,i) { + d3.select(chart.container) + .style('cursor', 'auto'); + + // update state and send stateChange with new index + state.index = index.i; + dispatch.stateChange(state); + } + + // Display No Data message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + x = lines.xScale(); + y = lines.yScale(); + + if (!rescaleY) { + var seriesDomains = data + .filter(function(series) { return !series.disabled }) + .map(function(series,i) { + var initialDomain = d3.extent(series.values, lines.y()); + + //account for series being disabled when losing 95% or more + if (initialDomain[0] < -.95) initialDomain[0] = -.95; + + return [ + (initialDomain[0] - initialDomain[1]) / (1 + initialDomain[1]), + (initialDomain[1] - initialDomain[0]) / (1 + initialDomain[0]) + ]; + }); + + var completeDomain = [ + d3.min(seriesDomains, function(d) { return d[0] }), + d3.max(seriesDomains, function(d) { return d[1] }) + ]; + + lines.yDomain(completeDomain); + } else { + lines.yDomain(null); + } + + dx.domain([0, data[0].values.length - 1]) //Assumes all series have same length + .range([0, availableWidth]) + .clamp(true); + + var data = indexify(index.i, data); + + // Setup containers and skeleton of chart + var interactivePointerEvents = (useInteractiveGuideline) ? "none" : "all"; + var wrap = container.selectAll('g.nv-wrap.nv-cumulativeLine').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-cumulativeLine').append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-interactive'); + gEnter.append('g').attr('class', 'nv-x nv-axis').style("pointer-events","none"); + gEnter.append('g').attr('class', 'nv-y nv-axis'); + gEnter.append('g').attr('class', 'nv-background'); + gEnter.append('g').attr('class', 'nv-linesWrap').style("pointer-events",interactivePointerEvents); + gEnter.append('g').attr('class', 'nv-avgLinesWrap').style("pointer-events","none"); + gEnter.append('g').attr('class', 'nv-legendWrap'); + gEnter.append('g').attr('class', 'nv-controlsWrap'); + + // Legend + if (showLegend) { + legend.width(availableWidth); + + g.select('.nv-legendWrap') + .datum(data) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + g.select('.nv-legendWrap') + .attr('transform', 'translate(0,' + (-margin.top) +')') + } + + // Controls + if (showControls) { + var controlsData = [ + { key: 'Re-scale y-axis', disabled: !rescaleY } + ]; + + controls + .width(140) + .color(['#444', '#444', '#444']) + .rightAlign(false) + .margin({top: 5, right: 0, bottom: 5, left: 20}) + ; + + g.select('.nv-controlsWrap') + .datum(controlsData) + .attr('transform', 'translate(0,' + (-margin.top) +')') + .call(controls); + } + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + if (rightAlignYAxis) { + g.select(".nv-y.nv-axis") + .attr("transform", "translate(" + availableWidth + ",0)"); + } + + // Show error if series goes below 100% + var tempDisabled = data.filter(function(d) { return d.tempDisabled }); + + wrap.select('.tempDisabled').remove(); //clean-up and prevent duplicates + if (tempDisabled.length) { + wrap.append('text').attr('class', 'tempDisabled') + .attr('x', availableWidth / 2) + .attr('y', '-.71em') + .style('text-anchor', 'end') + .text(tempDisabled.map(function(d) { return d.key }).join(', ') + ' values cannot be calculated for this time period.'); + } + + //Set up interactive layer + if (useInteractiveGuideline) { + interactiveLayer + .width(availableWidth) + .height(availableHeight) + .margin({left:margin.left,top:margin.top}) + .svgContainer(container) + .xScale(x); + wrap.select(".nv-interactive").call(interactiveLayer); + } + + gEnter.select('.nv-background') + .append('rect'); + + g.select('.nv-background rect') + .attr('width', availableWidth) + .attr('height', availableHeight); + + lines + //.x(function(d) { return d.x }) + .y(function(d) { return d.display.y }) + .width(availableWidth) + .height(availableHeight) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled && !data[i].tempDisabled; })); + + var linesWrap = g.select('.nv-linesWrap') + .datum(data.filter(function(d) { return !d.disabled && !d.tempDisabled })); + + linesWrap.call(lines); + + //Store a series index number in the data array. + data.forEach(function(d,i) { + d.seriesIndex = i; + }); + + var avgLineData = data.filter(function(d) { + return !d.disabled && !!average(d); + }); + + var avgLines = g.select(".nv-avgLinesWrap").selectAll("line") + .data(avgLineData, function(d) { return d.key; }); + + var getAvgLineY = function(d) { + //If average lines go off the svg element, clamp them to the svg bounds. + var yVal = y(average(d)); + if (yVal < 0) return 0; + if (yVal > availableHeight) return availableHeight; + return yVal; + }; + + avgLines.enter() + .append('line') + .style('stroke-width',2) + .style('stroke-dasharray','10,10') + .style('stroke',function (d,i) { + return lines.color()(d,d.seriesIndex); + }) + .attr('x1',0) + .attr('x2',availableWidth) + .attr('y1', getAvgLineY) + .attr('y2', getAvgLineY); + + avgLines + .style('stroke-opacity',function(d){ + //If average lines go offscreen, make them transparent + var yVal = y(average(d)); + if (yVal < 0 || yVal > availableHeight) return 0; + return 1; + }) + .attr('x1',0) + .attr('x2',availableWidth) + .attr('y1', getAvgLineY) + .attr('y2', getAvgLineY); + + avgLines.exit().remove(); + + //Create index line + var indexLine = linesWrap.selectAll('.nv-indexLine') + .data([index]); + indexLine.enter().append('rect').attr('class', 'nv-indexLine') + .attr('width', 3) + .attr('x', -2) + .attr('fill', 'red') + .attr('fill-opacity', .5) + .style("pointer-events","all") + .call(indexDrag); + + indexLine + .attr('transform', function(d) { return 'translate(' + dx(d.i) + ',0)' }) + .attr('height', availableHeight); + + // Setup Axes + if (showXAxis) { + xAxis + .scale(x) + .ticks( nv.utils.calcTicksX(availableWidth/70, data) ) + .tickSize(-availableHeight, 0); + + g.select('.nv-x.nv-axis') + .attr('transform', 'translate(0,' + y.range()[0] + ')'); + g.select('.nv-x.nv-axis') + .call(xAxis); + } + + if (showYAxis) { + yAxis + .scale(y) + .ticks( nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize( -availableWidth, 0); + + g.select('.nv-y.nv-axis') + .call(yAxis); + } + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + function updateZero() { + indexLine + .data([index]); + + //When dragging the index line, turn off line transitions. + // Then turn them back on when done dragging. + var oldDuration = chart.duration(); + chart.duration(0); + chart.update(); + chart.duration(oldDuration); + } + + g.select('.nv-background rect') + .on('click', function() { + index.x = d3.mouse(this)[0]; + index.i = Math.round(dx.invert(index.x)); + + // update state and send stateChange with new index + state.index = index.i; + dispatch.stateChange(state); + + updateZero(); + }); + + lines.dispatch.on('elementClick', function(e) { + index.i = e.pointIndex; + index.x = dx(index.i); + + // update state and send stateChange with new index + state.index = index.i; + dispatch.stateChange(state); + + updateZero(); + }); + + controls.dispatch.on('legendClick', function(d,i) { + d.disabled = !d.disabled; + rescaleY = !d.disabled; + + state.rescaleY = rescaleY; + dispatch.stateChange(state); + chart.update(); + }); + + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) + state[key] = newState[key]; + dispatch.stateChange(state); + chart.update(); + }); + + interactiveLayer.dispatch.on('elementMousemove', function(e) { + lines.clearHighlights(); + var singlePoint, pointIndex, pointXLocation, allData = []; + + data + .filter(function(series, i) { + series.seriesIndex = i; + return !series.disabled; + }) + .forEach(function(series,i) { + pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x()); + lines.highlightPoint(i, pointIndex, true); + var point = series.values[pointIndex]; + if (typeof point === 'undefined') return; + if (typeof singlePoint === 'undefined') singlePoint = point; + if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point,pointIndex)); + allData.push({ + key: series.key, + value: chart.y()(point, pointIndex), + color: color(series,series.seriesIndex) + }); + }); + + //Highlight the tooltip entry based on which point the mouse is closest to. + if (allData.length > 2) { + var yValue = chart.yScale().invert(e.mouseY); + var domainExtent = Math.abs(chart.yScale().domain()[0] - chart.yScale().domain()[1]); + var threshold = 0.03 * domainExtent; + var indexToHighlight = nv.nearestValueIndex(allData.map(function(d){return d.value}),yValue,threshold); + if (indexToHighlight !== null) + allData[indexToHighlight].highlight = true; + } + + var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex), pointIndex); + interactiveLayer.tooltip + .position({left: pointXLocation + margin.left, top: e.mouseY + margin.top}) + .chartContainer(that.parentNode) + .enabled(tooltips) + .valueFormatter(function(d,i) { + return yAxis.tickFormat()(d); + }) + .data( + { + value: xValue, + series: allData + } + )(); + + interactiveLayer.renderGuideLine(pointXLocation); + }); + + interactiveLayer.dispatch.on("elementMouseout",function(e) { + dispatch.tooltipHide(); + lines.clearHighlights(); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + // Update chart from a state object passed to event handler + dispatch.on('changeState', function(e) { + + if (typeof e.disabled !== 'undefined') { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + + state.disabled = e.disabled; + } + + if (typeof e.index !== 'undefined') { + index.i = e.index; + index.x = dx(index.i); + + state.index = e.index; + + indexLine + .data([index]); + } + + if (typeof e.rescaleY !== 'undefined') { + rescaleY = e.rescaleY; + } + + chart.update(); + }); + + }); + + renderWatch.renderEnd('cumulativeLineChart immediate'); + + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + lines.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + lines.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Functions + //------------------------------------------------------------ + + var indexifyYGetter = null; + /* Normalize the data according to an index point. */ + function indexify(idx, data) { + if (!indexifyYGetter) indexifyYGetter = lines.y(); + return data.map(function(line, i) { + if (!line.values) { + return line; + } + var indexValue = line.values[idx]; + if (indexValue == null) { + return line; + } + var v = indexifyYGetter(indexValue, idx); + + //TODO: implement check below, and disable series if series loses 100% or more cause divide by 0 issue + if (v < -.95 && !noErrorCheck) { + //if a series loses more than 100%, calculations fail.. anything close can cause major distortion (but is mathematically correct till it hits 100) + + line.tempDisabled = true; + return line; + } + + line.tempDisabled = false; + + line.values = line.values.map(function(point, pointIndex) { + point.display = {'y': (indexifyYGetter(point, pointIndex) - v) / (1 + v) }; + return point; + }); + + return line; + }) + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.lines = lines; + chart.legend = legend; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + chart.interactiveLayer = interactiveLayer; + chart.state = state; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + rescaleY: {get: function(){return rescaleY;}, set: function(_){rescaleY=_;}}, + showControls: {get: function(){return showControls;}, set: function(_){showControls=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + average: {get: function(){return average;}, set: function(_){average=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}}, + showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}}, + noErrorCheck: {get: function(){return noErrorCheck;}, set: function(_){noErrorCheck=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + }}, + useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){ + useInteractiveGuideline = _; + if (_ === true) { + chart.interactive(false); + chart.useVoronoi(false); + } + }}, + rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){ + rightAlignYAxis = _; + yAxis.orient( (_) ? 'right' : 'left'); + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + lines.duration(duration); + xAxis.duration(duration); + yAxis.duration(duration); + renderWatch.reset(duration); + }} + }); + + nv.utils.inheritOptions(chart, lines); + nv.utils.initOptions(chart); + + return chart; +};//TODO: consider deprecating by adding necessary features to multiBar model +nv.models.discreteBar = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = 960 + , height = 500 + , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one + , x = d3.scale.ordinal() + , y = d3.scale.linear() + , getX = function(d) { return d.x } + , getY = function(d) { return d.y } + , forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do chart.forceY([]) to remove + , color = nv.utils.defaultColor() + , showValues = false + , valueFormat = d3.format(',.2f') + , xDomain + , yDomain + , xRange + , yRange + , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout','renderEnd') + , rectClass = 'discreteBar' + , duration = 250 + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var x0, y0; + var renderWatch = nv.utils.renderWatch(dispatch, duration); + + function chart(selection) { + renderWatch.reset(); + selection.each(function(data) { + var availableWidth = width - margin.left - margin.right, + availableHeight = height - margin.top - margin.bottom, + container = d3.select(this); + nv.utils.initSVG(container); + + //add series index to each data point for reference + data.forEach(function(series, i) { + series.values.forEach(function(point) { + point.series = i; + }); + }); + + // Setup Scales + // remap and flatten the data for use in calculating the scales' domains + var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate + data.map(function(d) { + return d.values.map(function(d,i) { + return { x: getX(d,i), y: getY(d,i), y0: d.y0 } + }) + }); + + x .domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x })) + .rangeBands(xRange || [0, availableWidth], .1); + y .domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return d.y }).concat(forceY))); + + // If showValues, pad the Y axis range to account for label height + if (showValues) y.range(yRange || [availableHeight - (y.domain()[0] < 0 ? 12 : 0), y.domain()[1] > 0 ? 12 : 0]); + else y.range(yRange || [availableHeight, 0]); + + //store old scales if they exist + x0 = x0 || x; + y0 = y0 || y.copy().range([y(0),y(0)]); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-discretebar').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-discretebar'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-groups'); + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + //TODO: by definition, the discrete bar should not have multiple groups, will modify/remove later + var groups = wrap.select('.nv-groups').selectAll('.nv-group') + .data(function(d) { return d }, function(d) { return d.key }); + groups.enter().append('g') + .style('stroke-opacity', 1e-6) + .style('fill-opacity', 1e-6); + groups.exit() + .watchTransition(renderWatch, 'discreteBar: exit groups') + .style('stroke-opacity', 1e-6) + .style('fill-opacity', 1e-6) + .remove(); + groups + .attr('class', function(d,i) { return 'nv-group nv-series-' + i }) + .classed('hover', function(d) { return d.hover }); + groups + .watchTransition(renderWatch, 'discreteBar: groups') + .style('stroke-opacity', 1) + .style('fill-opacity', .75); + + var bars = groups.selectAll('g.nv-bar') + .data(function(d) { return d.values }); + bars.exit().remove(); + + var barsEnter = bars.enter().append('g') + .attr('transform', function(d,i,j) { + return 'translate(' + (x(getX(d,i)) + x.rangeBand() * .05 ) + ', ' + y(0) + ')' + }) + .on('mouseover', function(d,i) { //TODO: figure out why j works above, but not here + d3.select(this).classed('hover', true); + dispatch.elementMouseover({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [x(getX(d,i)) + (x.rangeBand() * (d.series + .5) / data.length), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + }) + .on('mouseout', function(d,i) { + d3.select(this).classed('hover', false); + dispatch.elementMouseout({ + value: getY(d,i), + point: d, + series: data[d.series], + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + }) + .on('click', function(d,i) { + dispatch.elementClick({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [x(getX(d,i)) + (x.rangeBand() * (d.series + .5) / data.length), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + d3.event.stopPropagation(); + }) + .on('dblclick', function(d,i) { + dispatch.elementDblClick({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [x(getX(d,i)) + (x.rangeBand() * (d.series + .5) / data.length), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + d3.event.stopPropagation(); + }); + + barsEnter.append('rect') + .attr('height', 0) + .attr('width', x.rangeBand() * .9 / data.length ) + + if (showValues) { + barsEnter.append('text') + .attr('text-anchor', 'middle') + ; + + bars.select('text') + .text(function(d,i) { return valueFormat(getY(d,i)) }) + .watchTransition(renderWatch, 'discreteBar: bars text') + .attr('x', x.rangeBand() * .9 / 2) + .attr('y', function(d,i) { return getY(d,i) < 0 ? y(getY(d,i)) - y(0) + 12 : -4 }) + + ; + } else { + bars.selectAll('text').remove(); + } + + bars + .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive' }) + .style('fill', function(d,i) { return d.color || color(d,i) }) + .style('stroke', function(d,i) { return d.color || color(d,i) }) + .select('rect') + .attr('class', rectClass) + .watchTransition(renderWatch, 'discreteBar: bars rect') + .attr('width', x.rangeBand() * .9 / data.length); + bars.watchTransition(renderWatch, 'discreteBar: bars') + //.delay(function(d,i) { return i * 1200 / data[0].values.length }) + .attr('transform', function(d,i) { + var left = x(getX(d,i)) + x.rangeBand() * .05, + top = getY(d,i) < 0 ? + y(0) : + y(0) - y(getY(d,i)) < 1 ? + y(0) - 1 : //make 1 px positive bars show up above y=0 + y(getY(d,i)); + + return 'translate(' + left + ', ' + top + ')' + }) + .select('rect') + .attr('height', function(d,i) { + return Math.max(Math.abs(y(getY(d,i)) - y((yDomain && yDomain[0]) || 0)) || 1) + }); + + + //store old scales for use in transitions on update + x0 = x.copy(); + y0 = y.copy(); + + }); + + renderWatch.renderEnd('discreteBar immediate'); + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + forceY: {get: function(){return forceY;}, set: function(_){forceY=_;}}, + showValues: {get: function(){return showValues;}, set: function(_){showValues=_;}}, + x: {get: function(){return getX;}, set: function(_){getX=_;}}, + y: {get: function(){return getY;}, set: function(_){getY=_;}}, + xScale: {get: function(){return x;}, set: function(_){x=_;}}, + yScale: {get: function(){return y;}, set: function(_){y=_;}}, + xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}}, + yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}}, + xRange: {get: function(){return xRange;}, set: function(_){xRange=_;}}, + yRange: {get: function(){return yRange;}, set: function(_){yRange=_;}}, + valueFormat: {get: function(){return valueFormat;}, set: function(_){valueFormat=_;}}, + id: {get: function(){return id;}, set: function(_){id=_;}}, + rectClass: {get: function(){return rectClass;}, set: function(_){rectClass=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + }} + }); + + nv.utils.initOptions(chart); + + return chart; +}; + +nv.models.discreteBarChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var discretebar = nv.models.discreteBar() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + ; + + var margin = {top: 15, right: 10, bottom: 50, left: 60} + , width = null + , height = null + , color = nv.utils.getColor() + , showXAxis = true + , showYAxis = true + , rightAlignYAxis = false + , staggerLabels = false + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + x + '

' + + '

' + y + '

' + } + , x + , y + , noData = "No Data Available." + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'beforeUpdate','renderEnd') + , duration = 250 + ; + + xAxis + .orient('bottom') + .highlightZero(false) + .showMaxMin(false) + .tickFormat(function(d) { return d }) + ; + yAxis + .orient((rightAlignYAxis) ? 'right' : 'left') + .tickFormat(d3.format(',.1f')) + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(discretebar.x()(e.point, e.pointIndex)), + y = yAxis.tickFormat()(discretebar.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's', null, offsetElement); + }; + + var renderWatch = nv.utils.renderWatch(dispatch, duration); + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(discretebar); + if (showXAxis) renderWatch.models(xAxis); + if (showYAxis) renderWatch.models(yAxis); + + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + chart.update = function() { + dispatch.beforeUpdate(); + container.transition().duration(duration).call(chart); + }; + chart.container = this; + + // Display No Data message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + x = discretebar.xScale(); + y = discretebar.yScale().clamp(true); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-discreteBarWithAxes').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-discreteBarWithAxes').append('g'); + var defsEnter = gEnter.append('defs'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-x nv-axis'); + gEnter.append('g').attr('class', 'nv-y nv-axis') + .append('g').attr('class', 'nv-zeroLine') + .append('line'); + + gEnter.append('g').attr('class', 'nv-barsWrap'); + + g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + if (rightAlignYAxis) { + g.select(".nv-y.nv-axis") + .attr("transform", "translate(" + availableWidth + ",0)"); + } + + // Main Chart Component(s) + discretebar + .width(availableWidth) + .height(availableHeight); + + var barsWrap = g.select('.nv-barsWrap') + .datum(data.filter(function(d) { return !d.disabled })) + + barsWrap.transition().call(discretebar); + + + defsEnter.append('clipPath') + .attr('id', 'nv-x-label-clip-' + discretebar.id()) + .append('rect'); + + g.select('#nv-x-label-clip-' + discretebar.id() + ' rect') + .attr('width', x.rangeBand() * (staggerLabels ? 2 : 1)) + .attr('height', 16) + .attr('x', -x.rangeBand() / (staggerLabels ? 1 : 2 )); + + // Setup Axes + if (showXAxis) { + xAxis + .scale(x) + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize(-availableHeight, 0); + + g.select('.nv-x.nv-axis') + .attr('transform', 'translate(0,' + (y.range()[0] + ((discretebar.showValues() && y.domain()[0] < 0) ? 16 : 0)) + ')'); + g.select('.nv-x.nv-axis').call(xAxis); + + var xTicks = g.select('.nv-x.nv-axis').selectAll('g'); + if (staggerLabels) { + xTicks + .selectAll('text') + .attr('transform', function(d,i,j) { return 'translate(0,' + (j % 2 == 0 ? '5' : '17') + ')' }) + } + } + + if (showYAxis) { + yAxis + .scale(y) + .ticks( nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize( -availableWidth, 0); + + g.select('.nv-y.nv-axis').call(yAxis); + } + + // Zero line + g.select(".nv-zeroLine line") + .attr("x1",0) + .attr("x2",availableWidth) + .attr("y1", y(0)) + .attr("y2", y(0)) + ; + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + }); + + renderWatch.renderEnd('discreteBar chart immediate'); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + discretebar.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + discretebar.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.discretebar = discretebar; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + staggerLabels: {get: function(){return staggerLabels;}, set: function(_){staggerLabels=_;}}, + showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}}, + showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + discretebar.duration(duration); + xAxis.duration(duration); + yAxis.duration(duration); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + discretebar.color(color); + }}, + rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){ + rightAlignYAxis = _; + yAxis.orient( (_) ? 'right' : 'left'); + }} + }); + + nv.utils.inheritOptions(chart, discretebar); + nv.utils.initOptions(chart); + + return chart; +} + +nv.models.distribution = function() { + "use strict"; + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = 400 //technically width or height depending on x or y.... + , size = 8 + , axis = 'x' // 'x' or 'y'... horizontal or vertical + , getData = function(d) { return d[axis] } // defaults d.x or d.y + , color = nv.utils.defaultColor() + , scale = d3.scale.linear() + , domain + , duration = 250 + , dispatch = d3.dispatch('renderEnd') + ; + + //============================================================ + + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var scale0; + var renderWatch = nv.utils.renderWatch(dispatch, duration); + + //============================================================ + + + function chart(selection) { + renderWatch.reset(); + selection.each(function(data) { + var availableLength = width - (axis === 'x' ? margin.left + margin.right : margin.top + margin.bottom), + naxis = axis == 'x' ? 'y' : 'x', + container = d3.select(this); + nv.utils.initSVG(container); + + //------------------------------------------------------------ + // Setup Scales + + scale0 = scale0 || scale; + + //------------------------------------------------------------ + + + //------------------------------------------------------------ + // Setup containers and skeleton of chart + + var wrap = container.selectAll('g.nv-distribution').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-distribution'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')') + + //------------------------------------------------------------ + + + var distWrap = g.selectAll('g.nv-dist') + .data(function(d) { return d }, function(d) { return d.key }); + + distWrap.enter().append('g'); + distWrap + .attr('class', function(d,i) { return 'nv-dist nv-series-' + i }) + .style('stroke', function(d,i) { return color(d, i) }); + + var dist = distWrap.selectAll('line.nv-dist' + axis) + .data(function(d) { return d.values }) + dist.enter().append('line') + .attr(axis + '1', function(d,i) { return scale0(getData(d,i)) }) + .attr(axis + '2', function(d,i) { return scale0(getData(d,i)) }) + renderWatch.transition(distWrap.exit().selectAll('line.nv-dist' + axis), 'dist exit') + // .transition() + .attr(axis + '1', function(d,i) { return scale(getData(d,i)) }) + .attr(axis + '2', function(d,i) { return scale(getData(d,i)) }) + .style('stroke-opacity', 0) + .remove(); + dist + .attr('class', function(d,i) { return 'nv-dist' + axis + ' nv-dist' + axis + '-' + i }) + .attr(naxis + '1', 0) + .attr(naxis + '2', size); + renderWatch.transition(dist, 'dist') + // .transition() + .attr(axis + '1', function(d,i) { return scale(getData(d,i)) }) + .attr(axis + '2', function(d,i) { return scale(getData(d,i)) }) + + + scale0 = scale.copy(); + + }); + renderWatch.renderEnd('distribution immediate'); + return chart; + } + + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + chart.options = nv.utils.optionsFunc.bind(chart); + chart.dispatch = dispatch; + + chart.margin = function(_) { + if (!arguments.length) return margin; + margin.top = typeof _.top != 'undefined' ? _.top : margin.top; + margin.right = typeof _.right != 'undefined' ? _.right : margin.right; + margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom; + margin.left = typeof _.left != 'undefined' ? _.left : margin.left; + return chart; + }; + + chart.width = function(_) { + if (!arguments.length) return width; + width = _; + return chart; + }; + + chart.axis = function(_) { + if (!arguments.length) return axis; + axis = _; + return chart; + }; + + chart.size = function(_) { + if (!arguments.length) return size; + size = _; + return chart; + }; + + chart.getData = function(_) { + if (!arguments.length) return getData; + getData = d3.functor(_); + return chart; + }; + + chart.scale = function(_) { + if (!arguments.length) return scale; + scale = _; + return chart; + }; + + chart.color = function(_) { + if (!arguments.length) return color; + color = nv.utils.getColor(_); + return chart; + }; + + chart.duration = function(_) { + if (!arguments.length) return duration; + duration = _; + renderWatch.reset(duration); + return chart; + }; + //============================================================ + + + return chart; +} +//TODO: consider deprecating and using multibar with single series for this +nv.models.historicalBar = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = null + , height = null + , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one + , x = d3.scale.linear() + , y = d3.scale.linear() + , getX = function(d) { return d.x } + , getY = function(d) { return d.y } + , forceX = [] + , forceY = [0] + , padData = false + , clipEdge = true + , color = nv.utils.defaultColor() + , xDomain + , yDomain + , xRange + , yRange + , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'renderEnd') + , interactive = true + ; + + var renderWatch = nv.utils.renderWatch(dispatch, 0); + + function chart(selection) { + selection.each(function(data) { + renderWatch.reset(); + + var container = d3.select(this); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right; + var availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + nv.utils.initSVG(container); + + // Setup Scales + x.domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX) )); + + if (padData) + x.range(xRange || [availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5) / data[0].values.length ]); + else + x.range(xRange || [0, availableWidth]); + + y.domain(yDomain || d3.extent(data[0].values.map(getY).concat(forceY) )) + .range(yRange || [availableHeight, 0]); + + // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point + if (x.domain()[0] === x.domain()[1]) + x.domain()[0] ? + x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01]) + : x.domain([-1,1]); + + if (y.domain()[0] === y.domain()[1]) + y.domain()[0] ? + y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01]) + : y.domain([-1,1]); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-historicalBar-' + id).data([data[0].values]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-historicalBar-' + id); + var defsEnter = wrapEnter.append('defs'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-bars'); + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + container + .on('click', function(d,i) { + dispatch.chartClick({ + data: d, + index: i, + pos: d3.event, + id: id + }); + }); + + defsEnter.append('clipPath') + .attr('id', 'nv-chart-clip-path-' + id) + .append('rect'); + + wrap.select('#nv-chart-clip-path-' + id + ' rect') + .attr('width', availableWidth) + .attr('height', availableHeight); + + g.attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : ''); + + var bars = wrap.select('.nv-bars').selectAll('.nv-bar') + .data(function(d) { return d }, function(d,i) {return getX(d,i)}); + bars.exit().remove(); + + var barsEnter = bars.enter().append('rect') + .attr('x', 0 ) + .attr('y', function(d,i) { return nv.utils.NaNtoZero(y(Math.max(0, getY(d,i)))) }) + .attr('height', function(d,i) { return nv.utils.NaNtoZero(Math.abs(y(getY(d,i)) - y(0))) }) + .attr('transform', function(d,i) { return 'translate(' + (x(getX(d,i)) - availableWidth / data[0].values.length * .45) + ',0)'; }) + .on('mouseover', function(d,i) { + if (!interactive) return; + d3.select(this).classed('hover', true); + dispatch.elementMouseover({ + point: d, + series: data[0], + pos: [x(getX(d,i)), y(getY(d,i))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: 0, + e: d3.event + }); + + }) + .on('mouseout', function(d,i) { + if (!interactive) return; + d3.select(this).classed('hover', false); + dispatch.elementMouseout({ + point: d, + series: data[0], + pointIndex: i, + seriesIndex: 0, + e: d3.event + }); + }) + .on('click', function(d,i) { + if (!interactive) return; + dispatch.elementClick({ + //label: d[label], + value: getY(d,i), + data: d, + index: i, + pos: [x(getX(d,i)), y(getY(d,i))], + e: d3.event, + id: id + }); + d3.event.stopPropagation(); + }) + .on('dblclick', function(d,i) { + if (!interactive) return; + dispatch.elementDblClick({ + //label: d[label], + value: getY(d,i), + data: d, + index: i, + pos: [x(getX(d,i)), y(getY(d,i))], + e: d3.event, + id: id + }); + d3.event.stopPropagation(); + }); + + bars + .attr('fill', function(d,i) { return color(d, i); }) + .attr('class', function(d,i,j) { return (getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive') + ' nv-bar-' + j + '-' + i }) + .watchTransition(renderWatch, 'bars') + .attr('transform', function(d,i) { return 'translate(' + (x(getX(d,i)) - availableWidth / data[0].values.length * .45) + ',0)'; }) + //TODO: better width calculations that don't assume always uniform data spacing;w + .attr('width', (availableWidth / data[0].values.length) * .9 ); + + bars.watchTransition(renderWatch, 'bars') + .attr('y', function(d,i) { + var rval = getY(d,i) < 0 ? + y(0) : + y(0) - y(getY(d,i)) < 1 ? + y(0) - 1 : + y(getY(d,i)); + return nv.utils.NaNtoZero(rval); + }) + .attr('height', function(d,i) { return nv.utils.NaNtoZero(Math.max(Math.abs(y(getY(d,i)) - y(0)),1)) }); + + }); + + renderWatch.renderEnd('historicalBar immediate'); + return chart; + } + + //Create methods to allow outside functions to highlight a specific bar. + chart.highlightPoint = function(pointIndex, isHoverOver) { + d3.select(".nv-historicalBar-" + id) + .select(".nv-bars .nv-bar-0-" + pointIndex) + .classed("hover", isHoverOver) + ; + }; + + chart.clearHighlights = function() { + d3.select(".nv-historicalBar-" + id) + .select(".nv-bars .nv-bar.hover") + .classed("hover", false) + ; + }; + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + forceX: {get: function(){return forceX;}, set: function(_){forceX=_;}}, + forceY: {get: function(){return forceY;}, set: function(_){forceY=_;}}, + padData: {get: function(){return padData;}, set: function(_){padData=_;}}, + x: {get: function(){return getX;}, set: function(_){getX=_;}}, + y: {get: function(){return getY;}, set: function(_){getY=_;}}, + xScale: {get: function(){return x;}, set: function(_){x=_;}}, + yScale: {get: function(){return y;}, set: function(_){y=_;}}, + xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}}, + yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}}, + xRange: {get: function(){return xRange;}, set: function(_){xRange=_;}}, + yRange: {get: function(){return yRange;}, set: function(_){yRange=_;}}, + clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}}, + id: {get: function(){return id;}, set: function(_){id=_;}}, + interactive: {get: function(){return interactive;}, set: function(_){interactive=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }} + }); + + nv.utils.initOptions(chart); + + return chart; +}; + +nv.models.historicalBarChart = function(bar_model) { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var bars = bar_model || nv.models.historicalBar() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + , legend = nv.models.legend() + , interactiveLayer = nv.interactiveGuideline() + ; + + + var margin = {top: 30, right: 90, bottom: 50, left: 90} + , color = nv.utils.defaultColor() + , width = null + , height = null + , showLegend = false + , showXAxis = true + , showYAxis = true + , rightAlignYAxis = false + , useInteractiveGuideline = false + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + key + '

' + + '

' + y + ' at ' + x + '

' + } + , x + , y + , state = {} + , defaultState = null + , noData = 'No Data Available.' + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd') + , transitionDuration = 250 + ; + + xAxis + .orient('bottom') + .tickPadding(7) + ; + yAxis + .orient( (rightAlignYAxis) ? 'right' : 'left') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var showTooltip = function(e, offsetElement) { + + // New addition to calculate position if SVG is scaled with viewBox, may move TODO: consider implementing everywhere else + if (offsetElement) { + var svg = d3.select(offsetElement).select('svg'); + var viewBox = (svg.node()) ? svg.attr('viewBox') : null; + if (viewBox) { + viewBox = viewBox.split(' '); + var ratio = parseInt(svg.style('width')) / viewBox[2]; + e.pos[0] = e.pos[0] * ratio; + e.pos[1] = e.pos[1] * ratio; + } + } + + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(bars.x()(e.point, e.pointIndex)), + y = yAxis.tickFormat()(bars.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, null, null, offsetElement); + }; + var renderWatch = nv.utils.renderWatch(dispatch, 0); + + function chart(selection) { + selection.each(function(data) { + renderWatch.reset(); + renderWatch.models(bars); + if (showXAxis) renderWatch.models(xAxis); + if (showYAxis) renderWatch.models(yAxis); + + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + + chart.update = function() { container.transition().duration(transitionDuration).call(chart) }; + chart.container = this; + + //set state.disabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display noData message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + x = bars.xScale(); + y = bars.yScale(); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-historicalBarChart').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-historicalBarChart').append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-x nv-axis'); + gEnter.append('g').attr('class', 'nv-y nv-axis'); + gEnter.append('g').attr('class', 'nv-barsWrap'); + gEnter.append('g').attr('class', 'nv-legendWrap'); + gEnter.append('g').attr('class', 'nv-interactive'); + + // Legend + if (showLegend) { + legend.width(availableWidth); + + g.select('.nv-legendWrap') + .datum(data) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + wrap.select('.nv-legendWrap') + .attr('transform', 'translate(0,' + (-margin.top) +')') + } + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + if (rightAlignYAxis) { + g.select(".nv-y.nv-axis") + .attr("transform", "translate(" + availableWidth + ",0)"); + } + + //Set up interactive layer + if (useInteractiveGuideline) { + interactiveLayer + .width(availableWidth) + .height(availableHeight) + .margin({left:margin.left, top:margin.top}) + .svgContainer(container) + .xScale(x); + wrap.select(".nv-interactive").call(interactiveLayer); + } + bars + .width(availableWidth) + .height(availableHeight) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled })); + + var barsWrap = g.select('.nv-barsWrap') + .datum(data.filter(function(d) { return !d.disabled })); + barsWrap.transition().call(bars); + + // Setup Axes + if (showXAxis) { + xAxis + .scale(x) + .tickSize(-availableHeight, 0); + + g.select('.nv-x.nv-axis') + .attr('transform', 'translate(0,' + y.range()[0] + ')'); + g.select('.nv-x.nv-axis') + .transition() + .call(xAxis); + } + + if (showYAxis) { + yAxis + .scale(y) + .ticks( nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize( -availableWidth, 0); + + g.select('.nv-y.nv-axis') + .transition() + .call(yAxis); + } + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + interactiveLayer.dispatch.on('elementMousemove', function(e) { + bars.clearHighlights(); + + var singlePoint, pointIndex, pointXLocation, allData = []; + data + .filter(function(series, i) { + series.seriesIndex = i; + return !series.disabled; + }) + .forEach(function(series,i) { + pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x()); + bars.highlightPoint(pointIndex,true); + var point = series.values[pointIndex]; + if (typeof point === 'undefined') return; + if (typeof singlePoint === 'undefined') singlePoint = point; + if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point,pointIndex)); + allData.push({ + key: series.key, + value: chart.y()(point, pointIndex), + color: color(series,series.seriesIndex), + data: series.values[pointIndex] + }); + }); + + var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex)); + interactiveLayer.tooltip + .position({left: pointXLocation + margin.left, top: e.mouseY + margin.top}) + .chartContainer(that.parentNode) + .enabled(tooltips) + .valueFormatter(function(d,i) { + return yAxis.tickFormat()(d); + }) + .data( + { + value: xValue, + series: allData + } + )(); + + interactiveLayer.renderGuideLine(pointXLocation); + + }); + + interactiveLayer.dispatch.on("elementMouseout",function(e) { + dispatch.tooltipHide(); + bars.clearHighlights(); + }); + + legend.dispatch.on('legendClick', function(d,i) { + d.disabled = !d.disabled; + + if (!data.filter(function(d) { return !d.disabled }).length) { + data.map(function(d) { + d.disabled = false; + wrap.selectAll('.nv-series').classed('disabled', false); + return d; + }); + } + + state.disabled = data.map(function(d) { return !!d.disabled }); + dispatch.stateChange(state); + + selection.transition().call(chart); + }); + + legend.dispatch.on('legendDblclick', function(d) { + //Double clicking should always enable current series, and disabled all others. + data.forEach(function(d) { + d.disabled = true; + }); + d.disabled = false; + + state.disabled = data.map(function(d) { return !!d.disabled }); + dispatch.stateChange(state); + chart.update(); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + dispatch.on('changeState', function(e) { + + if (typeof e.disabled !== 'undefined') { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + + state.disabled = e.disabled; + } + + chart.update(); + }); + }); + + renderWatch.renderEnd('historicalBarChart immediate'); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + bars.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + bars.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.bars = bars; + chart.legend = legend; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + chart.interactiveLayer = interactiveLayer; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}}, + showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + bars.color(color); + }}, + duration: {get: function(){return transitionDuration;}, set: function(_){ + transitionDuration=_; + renderWatch.reset(transitionDuration); + yAxis.duration(transitionDuration); + xAxis.duration(transitionDuration); + }}, + rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){ + rightAlignYAxis = _; + yAxis.orient( (_) ? 'right' : 'left'); + }}, + useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){ + useInteractiveGuideline = _; + if (_ === true) { + chart.interactive(false); + } + }} + }); + + nv.utils.inheritOptions(chart, bars); + nv.utils.initOptions(chart); + + return chart; +}; + + +// ohlcChart is just a historical chart with oclc bars and some tweaks +nv.models.ohlcBarChart = function() { + var chart = nv.models.historicalBarChart(nv.models.ohlcBar()); + + // special default tooltip since we show multiple values per x + chart.useInteractiveGuideline(true); + chart.interactiveLayer.tooltip.contentGenerator(function(data) { + // we assume only one series exists for this chart + var d = data.series[0].data; + // match line colors as defined in nv.d3.css + var color = d.open < d.close ? "2ca02c" : "d62728"; + return '' + + '

' + data.value + '

' + + '' + + '' + + '' + + '' + + '' + + '
open:' + chart.yAxis.tickFormat()(d.open) + '
close:' + chart.yAxis.tickFormat()(d.close) + '
high' + chart.yAxis.tickFormat()(d.high) + '
low:' + chart.yAxis.tickFormat()(d.low) + '
'; + }); + return chart; +};nv.models.legend = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 5, right: 0, bottom: 5, left: 0} + , width = 400 + , height = 20 + , getKey = function(d) { return d.key } + , color = nv.utils.defaultColor() + , align = true + , rightAlign = true + , updateState = true //If true, legend will update data.disabled and trigger a 'stateChange' dispatch. + , radioButtonMode = false //If true, clicking legend items will cause it to behave like a radio button. (only one can be selected at a time) + , dispatch = d3.dispatch('legendClick', 'legendDblclick', 'legendMouseover', 'legendMouseout', 'stateChange') + ; + + function chart(selection) { + selection.each(function(data) { + var availableWidth = width - margin.left - margin.right, + container = d3.select(this); + nv.utils.initSVG(container); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-legend').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-legend').append('g'); + var g = wrap.select('g'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + var series = g.selectAll('.nv-series') + .data(function(d) { return d }); + var seriesEnter = series.enter().append('g').attr('class', 'nv-series') + .on('mouseover', function(d,i) { + dispatch.legendMouseover(d,i); //TODO: Make consistent with other event objects + }) + .on('mouseout', function(d,i) { + dispatch.legendMouseout(d,i); + }) + .on('click', function(d,i) { + dispatch.legendClick(d,i); + if (updateState) { + if (radioButtonMode) { + //Radio button mode: set every series to disabled, + // and enable the clicked series. + data.forEach(function(series) { series.disabled = true}); + d.disabled = false; + } + else { + d.disabled = !d.disabled; + if (data.every(function(series) { return series.disabled})) { + //the default behavior of NVD3 legends is, if every single series + // is disabled, turn all series' back on. + data.forEach(function(series) { series.disabled = false}); + } + } + dispatch.stateChange({ + disabled: data.map(function(d) { return !!d.disabled }) + }); + } + }) + .on('dblclick', function(d,i) { + dispatch.legendDblclick(d,i); + if (updateState) { + //the default behavior of NVD3 legends, when double clicking one, + // is to set all other series' to false, and make the double clicked series enabled. + data.forEach(function(series) { + series.disabled = true; + }); + d.disabled = false; + dispatch.stateChange({ + disabled: data.map(function(d) { return !!d.disabled }) + }); + } + }); + seriesEnter.append('circle') + .style('stroke-width', 2) + .attr('class','nv-legend-symbol') + .attr('r', 5); + seriesEnter.append('text') + .attr('text-anchor', 'start') + .attr('class','nv-legend-text') + .attr('dy', '.32em') + .attr('dx', '8'); + series.classed('nv-disabled', function(d) { return d.disabled }); + series.exit().remove(); + series.select('circle') + .style('fill', function(d,i) { return d.color || color(d,i)}) + .style('stroke', function(d,i) { return d.color || color(d, i) }); + series.select('text').text(getKey); + + //TODO: implement fixed-width and max-width options (max-width is especially useful with the align option) + // NEW ALIGNING CODE, TODO: clean up + if (align) { + + var seriesWidths = []; + series.each(function(d,i) { + var legendText = d3.select(this).select('text'); + var nodeTextLength; + try { + nodeTextLength = legendText.node().getComputedTextLength(); + // If the legendText is display:none'd (nodeTextLength == 0), simulate an error so we approximate, instead + if(nodeTextLength <= 0) throw Error(); + } + catch(e) { + nodeTextLength = nv.utils.calcApproxTextWidth(legendText); + } + + seriesWidths.push(nodeTextLength + 28); // 28 is ~ the width of the circle plus some padding + }); + + var seriesPerRow = 0; + var legendWidth = 0; + var columnWidths = []; + + while ( legendWidth < availableWidth && seriesPerRow < seriesWidths.length) { + columnWidths[seriesPerRow] = seriesWidths[seriesPerRow]; + legendWidth += seriesWidths[seriesPerRow++]; + } + if (seriesPerRow === 0) seriesPerRow = 1; //minimum of one series per row + + while ( legendWidth > availableWidth && seriesPerRow > 1 ) { + columnWidths = []; + seriesPerRow--; + + for (var k = 0; k < seriesWidths.length; k++) { + if (seriesWidths[k] > (columnWidths[k % seriesPerRow] || 0) ) + columnWidths[k % seriesPerRow] = seriesWidths[k]; + } + + legendWidth = columnWidths.reduce(function(prev, cur, index, array) { + return prev + cur; + }); + } + + var xPositions = []; + for (var i = 0, curX = 0; i < seriesPerRow; i++) { + xPositions[i] = curX; + curX += columnWidths[i]; + } + + series + .attr('transform', function(d, i) { + return 'translate(' + xPositions[i % seriesPerRow] + ',' + (5 + Math.floor(i / seriesPerRow) * 20) + ')'; + }); + + //position legend as far right as possible within the total width + if (rightAlign) { + g.attr('transform', 'translate(' + (width - margin.right - legendWidth) + ',' + margin.top + ')'); + } + else { + g.attr('transform', 'translate(0' + ',' + margin.top + ')'); + } + + height = margin.top + margin.bottom + (Math.ceil(seriesWidths.length / seriesPerRow) * 20); + + } else { + + var ypos = 5, + newxpos = 5, + maxwidth = 0, + xpos; + series + .attr('transform', function(d, i) { + var length = d3.select(this).select('text').node().getComputedTextLength() + 28; + xpos = newxpos; + + if (width < margin.left + margin.right + xpos + length) { + newxpos = xpos = 5; + ypos += 20; + } + + newxpos += length; + if (newxpos > maxwidth) maxwidth = newxpos; + + return 'translate(' + xpos + ',' + ypos + ')'; + }); + + //position legend as far right as possible within the total width + g.attr('transform', 'translate(' + (width - margin.right - maxwidth) + ',' + margin.top + ')'); + + height = margin.top + margin.bottom + ypos + 15; + } + }); + + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + key: {get: function(){return getKey;}, set: function(_){getKey=_;}}, + align: {get: function(){return align;}, set: function(_){align=_;}}, + rightAlign: {get: function(){return rightAlign;}, set: function(_){rightAlign=_;}}, + updateState: {get: function(){return updateState;}, set: function(_){updateState=_;}}, + radioButtonMode: {get: function(){return radioButtonMode;}, set: function(_){radioButtonMode=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }} + }); + + nv.utils.initOptions(chart); + + return chart; +}; + +nv.models.line = function() { + "use strict"; + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var scatter = nv.models.scatter() + ; + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = 960 + , height = 500 + , color = nv.utils.defaultColor() // a function that returns a color + , getX = function(d) { return d.x } // accessor to get the x value from a data point + , getY = function(d) { return d.y } // accessor to get the y value from a data point + , defined = function(d,i) { return !isNaN(getY(d,i)) && getY(d,i) !== null } // allows a line to be not continuous when it is not defined + , isArea = function(d) { return d.area } // decides if a line is an area or just a line + , clipEdge = false // if true, masks lines within x and y scale + , x //can be accessed via chart.xScale() + , y //can be accessed via chart.yScale() + , interpolate = "linear" // controls the line interpolation + , duration = 250 + , dispatch = d3.dispatch('elementClick', 'elementMouseover', 'elementMouseout', 'renderEnd') + ; + + scatter + .pointSize(16) // default size + .pointDomain([16,256]) //set to speed up calculation, needs to be unset if there is a custom size accessor + ; + + //============================================================ + + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var x0, y0 //used to store previous scales + , renderWatch = nv.utils.renderWatch(dispatch, duration) + ; + + //============================================================ + + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(scatter); + selection.each(function(data) { + var availableWidth = width - margin.left - margin.right, + availableHeight = height - margin.top - margin.bottom, + container = d3.select(this); + nv.utils.initSVG(container); + + // Setup Scales + x = scatter.xScale(); + y = scatter.yScale(); + + x0 = x0 || x; + y0 = y0 || y; + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-line').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-line'); + var defsEnter = wrapEnter.append('defs'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-groups'); + gEnter.append('g').attr('class', 'nv-scatterWrap'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + scatter + .width(availableWidth) + .height(availableHeight); + + var scatterWrap = wrap.select('.nv-scatterWrap'); + scatterWrap.call(scatter); + + defsEnter.append('clipPath') + .attr('id', 'nv-edge-clip-' + scatter.id()) + .append('rect'); + + wrap.select('#nv-edge-clip-' + scatter.id() + ' rect') + .attr('width', availableWidth) + .attr('height', (availableHeight > 0) ? availableHeight : 0); + + g .attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + scatter.id() + ')' : ''); + scatterWrap + .attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + scatter.id() + ')' : ''); + + var groups = wrap.select('.nv-groups').selectAll('.nv-group') + .data(function(d) { return d }, function(d) { return d.key }); + groups.enter().append('g') + .style('stroke-opacity', 1e-6) + .style('fill-opacity', 1e-6); + + groups.exit().remove(); + + groups + .attr('class', function(d,i) { return 'nv-group nv-series-' + i }) + .classed('hover', function(d) { return d.hover }) + .style('fill', function(d,i){ return color(d, i) }) + .style('stroke', function(d,i){ return color(d, i)}); + groups.watchTransition(renderWatch, 'line: groups') + .style('stroke-opacity', 1) + .style('fill-opacity', .5); + + var areaPaths = groups.selectAll('path.nv-area') + .data(function(d) { return isArea(d) ? [d] : [] }); // this is done differently than lines because I need to check if series is an area + areaPaths.enter().append('path') + .attr('class', 'nv-area') + .attr('d', function(d) { + return d3.svg.area() + .interpolate(interpolate) + .defined(defined) + .x(function(d,i) { return nv.utils.NaNtoZero(x0(getX(d,i))) }) + .y0(function(d,i) { return nv.utils.NaNtoZero(y0(getY(d,i))) }) + .y1(function(d,i) { return y0( y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0] ) }) + //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this + .apply(this, [d.values]) + }); + groups.exit().selectAll('path.nv-area') + .remove(); + + areaPaths.watchTransition(renderWatch, 'line: areaPaths') + .attr('d', function(d) { + return d3.svg.area() + .interpolate(interpolate) + .defined(defined) + .x(function(d,i) { return nv.utils.NaNtoZero(x(getX(d,i))) }) + .y0(function(d,i) { return nv.utils.NaNtoZero(y(getY(d,i))) }) + .y1(function(d,i) { return y( y.domain()[0] <= 0 ? y.domain()[1] >= 0 ? 0 : y.domain()[1] : y.domain()[0] ) }) + //.y1(function(d,i) { return y0(0) }) //assuming 0 is within y domain.. may need to tweak this + .apply(this, [d.values]) + }); + + var linePaths = groups.selectAll('path.nv-line') + .data(function(d) { return [d.values] }); + linePaths.enter().append('path') + .attr('class', 'nv-line') + .attr('d', + d3.svg.line() + .interpolate(interpolate) + .defined(defined) + .x(function(d,i) { return nv.utils.NaNtoZero(x0(getX(d,i))) }) + .y(function(d,i) { return nv.utils.NaNtoZero(y0(getY(d,i))) }) + ); + + linePaths.watchTransition(renderWatch, 'line: linePaths') + .attr('d', + d3.svg.line() + .interpolate(interpolate) + .defined(defined) + .x(function(d,i) { return nv.utils.NaNtoZero(x(getX(d,i))) }) + .y(function(d,i) { return nv.utils.NaNtoZero(y(getY(d,i))) }) + ); + + //store old scales for use in transitions on update + x0 = x.copy(); + y0 = y.copy(); + }); + renderWatch.renderEnd('line immediate'); + return chart; + } + + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.scatter = scatter; + // Pass through events + scatter.dispatch.on('elementClick', function(){ dispatch.elementClick.apply(this, arguments); }) + scatter.dispatch.on('elementMouseover', function(){ dispatch.elementMouseover.apply(this, arguments); }) + scatter.dispatch.on('elementMouseout', function(){ dispatch.elementMouseout.apply(this, arguments); }) + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + defined: {get: function(){return defined;}, set: function(_){defined=_;}}, + interpolate: {get: function(){return interpolate;}, set: function(_){interpolate=_;}}, + clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + scatter.duration(duration); + }}, + isArea: {get: function(){return isArea;}, set: function(_){ + isArea = d3.functor(_); + }}, + x: {get: function(){return getX;}, set: function(_){ + getX = _; + scatter.x(_); + }}, + y: {get: function(){return getY;}, set: function(_){ + getY = _; + scatter.y(_); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + scatter.color(color); + }} + }); + + nv.utils.inheritOptions(chart, scatter); + nv.utils.initOptions(chart); + + return chart; +}; +nv.models.lineChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var lines = nv.models.line() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + , legend = nv.models.legend() + , interactiveLayer = nv.interactiveGuideline() + ; + + var margin = {top: 30, right: 20, bottom: 50, left: 60} + , color = nv.utils.defaultColor() + , width = null + , height = null + , showLegend = true + , showXAxis = true + , showYAxis = true + , rightAlignYAxis = false + , useInteractiveGuideline = false + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + key + '

' + + '

' + y + ' at ' + x + '

' + } + , x + , y + , state = nv.utils.state() + , defaultState = null + , noData = 'No Data Available.' + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd') + , duration = 250 + ; + + xAxis + .orient('bottom') + .tickPadding(7) + ; + yAxis + .orient((rightAlignYAxis) ? 'right' : 'left') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(lines.x()(e.point, e.pointIndex)), + y = yAxis.tickFormat()(lines.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, null, null, offsetElement); + }; + + var renderWatch = nv.utils.renderWatch(dispatch, duration); + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }) + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.active !== undefined) + data.forEach(function(series,i) { + series.disabled = !state.active[i]; + }); + } + }; + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(lines); + if (showXAxis) renderWatch.models(xAxis); + if (showYAxis) renderWatch.models(yAxis); + + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + + chart.update = function() { + if (duration === 0) + container.call(chart); + else + container.transition().duration(duration).call(chart) + }; + chart.container = this; + + state + .setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + // DEPRECATED set state.disableddisabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display noData message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + + // Setup Scales + x = lines.xScale(); + y = lines.yScale(); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-lineChart').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-lineChart').append('g'); + var g = wrap.select('g'); + + gEnter.append("rect").style("opacity",0); + gEnter.append('g').attr('class', 'nv-x nv-axis'); + gEnter.append('g').attr('class', 'nv-y nv-axis'); + gEnter.append('g').attr('class', 'nv-linesWrap'); + gEnter.append('g').attr('class', 'nv-legendWrap'); + gEnter.append('g').attr('class', 'nv-interactive'); + + g.select("rect") + .attr("width",availableWidth) + .attr("height",(availableHeight > 0) ? availableHeight : 0); + + // Legend + if (showLegend) { + legend.width(availableWidth); + + g.select('.nv-legendWrap') + .datum(data) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + wrap.select('.nv-legendWrap') + .attr('transform', 'translate(0,' + (-margin.top) +')') + } + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + if (rightAlignYAxis) { + g.select(".nv-y.nv-axis") + .attr("transform", "translate(" + availableWidth + ",0)"); + } + + //Set up interactive layer + if (useInteractiveGuideline) { + interactiveLayer + .width(availableWidth) + .height(availableHeight) + .margin({left:margin.left, top:margin.top}) + .svgContainer(container) + .xScale(x); + wrap.select(".nv-interactive").call(interactiveLayer); + } + + lines + .width(availableWidth) + .height(availableHeight) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled })); + + + var linesWrap = g.select('.nv-linesWrap') + .datum(data.filter(function(d) { return !d.disabled })); + + linesWrap.call(lines); + + // Setup Axes + if (showXAxis) { + xAxis + .scale(x) + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize(-availableHeight, 0); + + g.select('.nv-x.nv-axis') + .attr('transform', 'translate(0,' + y.range()[0] + ')'); + g.select('.nv-x.nv-axis') + .call(xAxis); + } + + if (showYAxis) { + yAxis + .scale(y) + .ticks( nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize( -availableWidth, 0); + + g.select('.nv-y.nv-axis') + .call(yAxis); + } + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) + state[key] = newState[key]; + dispatch.stateChange(state); + chart.update(); + }); + + interactiveLayer.dispatch.on('elementMousemove', function(e) { + lines.clearHighlights(); + var singlePoint, pointIndex, pointXLocation, allData = []; + data + .filter(function(series, i) { + series.seriesIndex = i; + return !series.disabled; + }) + .forEach(function(series,i) { + pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x()); + lines.highlightPoint(i, pointIndex, true); + var point = series.values[pointIndex]; + if (typeof point === 'undefined') return; + if (typeof singlePoint === 'undefined') singlePoint = point; + if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point,pointIndex)); + allData.push({ + key: series.key, + value: chart.y()(point, pointIndex), + color: color(series,series.seriesIndex) + }); + }); + //Highlight the tooltip entry based on which point the mouse is closest to. + if (allData.length > 2) { + var yValue = chart.yScale().invert(e.mouseY); + var domainExtent = Math.abs(chart.yScale().domain()[0] - chart.yScale().domain()[1]); + var threshold = 0.03 * domainExtent; + var indexToHighlight = nv.nearestValueIndex(allData.map(function(d){return d.value}),yValue,threshold); + if (indexToHighlight !== null) + allData[indexToHighlight].highlight = true; + } + + var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex)); + interactiveLayer.tooltip + .position({left: pointXLocation + margin.left, top: e.mouseY + margin.top}) + .chartContainer(that.parentNode) + .enabled(tooltips) + .valueFormatter(function(d,i) { + return yAxis.tickFormat()(d); + }) + .data( + { + value: xValue, + series: allData + } + )(); + + interactiveLayer.renderGuideLine(pointXLocation); + + }); + + interactiveLayer.dispatch.on('elementClick', function(e) { + var pointXLocation, allData = []; + + data.filter(function(series, i) { + series.seriesIndex = i; + return !series.disabled; + }).forEach(function(series) { + var pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x()); + var point = series.values[pointIndex]; + if (typeof point === 'undefined') return; + if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point,pointIndex)); + var yPos = chart.yScale()(chart.y()(point,pointIndex)); + allData.push({ + point: point, + pointIndex: pointIndex, + pos: [pointXLocation, yPos], + seriesIndex: series.seriesIndex, + series: series + }); + }); + + lines.dispatch.elementClick(allData); + }); + + interactiveLayer.dispatch.on("elementMouseout",function(e) { + dispatch.tooltipHide(); + lines.clearHighlights(); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + dispatch.on('changeState', function(e) { + + if (typeof e.disabled !== 'undefined' && data.length === e.disabled.length) { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + + state.disabled = e.disabled; + } + + chart.update(); + }); + + }); + + renderWatch.renderEnd('lineChart immediate'); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + lines.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + lines.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.lines = lines; + chart.legend = legend; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + chart.interactiveLayer = interactiveLayer; + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}}, + showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + lines.duration(duration); + xAxis.duration(duration); + yAxis.duration(duration); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + lines.color(color); + }}, + rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){ + rightAlignYAxis = _; + yAxis.orient( rightAlignYAxis ? 'right' : 'left'); + }}, + useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){ + useInteractiveGuideline = _; + if (useInteractiveGuideline) { + lines.interactive(false); + lines.useVoronoi(false); + } + }} + }); + + nv.utils.inheritOptions(chart, lines); + nv.utils.initOptions(chart); + + return chart; +}; +nv.models.linePlusBarChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var lines = nv.models.line() + , lines2 = nv.models.line() + , bars = nv.models.historicalBar() + , bars2 = nv.models.historicalBar() + , xAxis = nv.models.axis() + , x2Axis = nv.models.axis() + , y1Axis = nv.models.axis() + , y2Axis = nv.models.axis() + , y3Axis = nv.models.axis() + , y4Axis = nv.models.axis() + , legend = nv.models.legend() + , brush = d3.svg.brush() + ; + + var margin = {top: 30, right: 30, bottom: 30, left: 60} + , margin2 = {top: 0, right: 30, bottom: 20, left: 60} + , width = null + , height = null + , getX = function(d) { return d.x } + , getY = function(d) { return d.y } + , color = nv.utils.defaultColor() + , showLegend = true + , focusEnable = true + , focusShowAxisY = false + , focusShowAxisX = true + , focusHeight = 50 + , extent + , brushExtent = null + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + key + '

' + + '

' + y + ' at ' + x + '

'; + } + , x + , x2 + , y1 + , y2 + , y3 + , y4 + , noData = "No Data Available." + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'brush', 'stateChange', 'changeState') + , transitionDuration = 0 + , state = nv.utils.state() + , defaultState = null + , legendLeftAxisHint = ' (left axis)' + , legendRightAxisHint = ' (right axis)' + ; + + lines + .clipEdge(true) + ; + lines2 + .interactive(false) + ; + xAxis + .orient('bottom') + .tickPadding(5) + ; + y1Axis + .orient('left') + ; + y2Axis + .orient('right') + ; + x2Axis + .orient('bottom') + .tickPadding(5) + ; + y3Axis + .orient('left') + ; + y4Axis + .orient('right') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var showTooltip = function(e, offsetElement) { + if (extent) { + e.pointIndex += Math.ceil(extent[0]); + } + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(lines.x()(e.point, e.pointIndex)), + y = (e.series.bar ? y1Axis : y2Axis).tickFormat()(lines.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's', null, offsetElement); + }; + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }) + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.active !== undefined) + data.forEach(function(series,i) { + series.disabled = !state.active[i]; + }); + } + }; + + function chart(selection) { + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight1 = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom - (focusEnable ? focusHeight : 0) , + availableHeight2 = focusHeight - margin2.top - margin2.bottom; + + chart.update = function() { container.transition().duration(transitionDuration).call(chart); }; + chart.container = this; + + state + .setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + // DEPRECATED set state.disableddisabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display No Data message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight1 / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + var dataBars = data.filter(function(d) { return !d.disabled && d.bar }); + var dataLines = data.filter(function(d) { return !d.bar }); // removed the !d.disabled clause here to fix Issue #240 + + x = bars.xScale(); + x2 = x2Axis.scale(); + y1 = bars.yScale(); + y2 = lines.yScale(); + y3 = bars2.yScale(); + y4 = lines2.yScale(); + + var series1 = data + .filter(function(d) { return !d.disabled && d.bar }) + .map(function(d) { + return d.values.map(function(d,i) { + return { x: getX(d,i), y: getY(d,i) } + }) + }); + + var series2 = data + .filter(function(d) { return !d.disabled && !d.bar }) + .map(function(d) { + return d.values.map(function(d,i) { + return { x: getX(d,i), y: getY(d,i) } + }) + }); + + x.range([0, availableWidth]); + + x2 .domain(d3.extent(d3.merge(series1.concat(series2)), function(d) { return d.x } )) + .range([0, availableWidth]); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-linePlusBar').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-linePlusBar').append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-legendWrap'); + + // this is the main chart + var focusEnter = gEnter.append('g').attr('class', 'nv-focus'); + focusEnter.append('g').attr('class', 'nv-x nv-axis'); + focusEnter.append('g').attr('class', 'nv-y1 nv-axis'); + focusEnter.append('g').attr('class', 'nv-y2 nv-axis'); + focusEnter.append('g').attr('class', 'nv-barsWrap'); + focusEnter.append('g').attr('class', 'nv-linesWrap'); + + // context chart is where you can focus in + var contextEnter = gEnter.append('g').attr('class', 'nv-context'); + contextEnter.append('g').attr('class', 'nv-x nv-axis'); + contextEnter.append('g').attr('class', 'nv-y1 nv-axis'); + contextEnter.append('g').attr('class', 'nv-y2 nv-axis'); + contextEnter.append('g').attr('class', 'nv-barsWrap'); + contextEnter.append('g').attr('class', 'nv-linesWrap'); + contextEnter.append('g').attr('class', 'nv-brushBackground'); + contextEnter.append('g').attr('class', 'nv-x nv-brush'); + + //============================================================ + // Legend + //------------------------------------------------------------ + + if (showLegend) { + legend.width( availableWidth / 2 ); + + g.select('.nv-legendWrap') + .datum(data.map(function(series) { + series.originalKey = series.originalKey === undefined ? series.key : series.originalKey; + series.key = series.originalKey + (series.bar ? legendLeftAxisHint : legendRightAxisHint); + return series; + })) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight1 = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom - focusHeight; + } + + g.select('.nv-legendWrap') + .attr('transform', 'translate(' + ( availableWidth / 2 ) + ',' + (-margin.top) +')'); + } + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + //============================================================ + // Context chart (focus chart) components + //------------------------------------------------------------ + + // hide or show the focus context chart + g.select('.nv-context').style('display', focusEnable ? 'initial' : 'none'); + + bars2 + .width(availableWidth) + .height(availableHeight2) + .color(data.map(function (d, i) { + return d.color || color(d, i); + }).filter(function (d, i) { + return !data[i].disabled && data[i].bar + })); + lines2 + .width(availableWidth) + .height(availableHeight2) + .color(data.map(function (d, i) { + return d.color || color(d, i); + }).filter(function (d, i) { + return !data[i].disabled && !data[i].bar + })); + + var bars2Wrap = g.select('.nv-context .nv-barsWrap') + .datum(dataBars.length ? dataBars : [ + {values: []} + ]); + var lines2Wrap = g.select('.nv-context .nv-linesWrap') + .datum(!dataLines[0].disabled ? dataLines : [ + {values: []} + ]); + + g.select('.nv-context') + .attr('transform', 'translate(0,' + ( availableHeight1 + margin.bottom + margin2.top) + ')'); + + bars2Wrap.transition().call(bars2); + lines2Wrap.transition().call(lines2); + + // context (focus chart) axis controls + if (focusShowAxisX) { + x2Axis + .ticks(nv.utils.calcTicksX(availableWidth / 100, data)) + .tickSize(-availableHeight2, 0); + g.select('.nv-context .nv-x.nv-axis') + .attr('transform', 'translate(0,' + y3.range()[0] + ')'); + g.select('.nv-context .nv-x.nv-axis').transition() + .call(x2Axis); + } + + if (focusShowAxisY) { + y3Axis + .scale(y3) + .ticks( availableHeight2 / 36 ) + .tickSize( -availableWidth, 0); + y4Axis + .scale(y4) + .ticks( availableHeight2 / 36 ) + .tickSize(dataBars.length ? 0 : -availableWidth, 0); // Show the y2 rules only if y1 has none + + g.select('.nv-context .nv-y3.nv-axis') + .style('opacity', dataBars.length ? 1 : 0) + .attr('transform', 'translate(0,' + x2.range()[0] + ')'); + g.select('.nv-context .nv-y2.nv-axis') + .style('opacity', dataLines.length ? 1 : 0) + .attr('transform', 'translate(' + x2.range()[1] + ',0)'); + + g.select('.nv-context .nv-y1.nv-axis').transition() + .call(y3Axis); + g.select('.nv-context .nv-y2.nv-axis').transition() + .call(y4Axis); + } + + // Setup Brush + brush.x(x2).on('brush', onBrush); + + if (brushExtent) brush.extent(brushExtent); + + var brushBG = g.select('.nv-brushBackground').selectAll('g') + .data([brushExtent || brush.extent()]); + + var brushBGenter = brushBG.enter() + .append('g'); + + brushBGenter.append('rect') + .attr('class', 'left') + .attr('x', 0) + .attr('y', 0) + .attr('height', availableHeight2); + + brushBGenter.append('rect') + .attr('class', 'right') + .attr('x', 0) + .attr('y', 0) + .attr('height', availableHeight2); + + var gBrush = g.select('.nv-x.nv-brush') + .call(brush); + gBrush.selectAll('rect') + //.attr('y', -5) + .attr('height', availableHeight2); + gBrush.selectAll('.resize').append('path').attr('d', resizePath); + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) + state[key] = newState[key]; + dispatch.stateChange(state); + chart.update(); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + // Update chart from a state object passed to event handler + dispatch.on('changeState', function(e) { + if (typeof e.disabled !== 'undefined') { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + state.disabled = e.disabled; + } + chart.update(); + }); + + //============================================================ + // Functions + //------------------------------------------------------------ + + // Taken from crossfilter (http://square.github.com/crossfilter/) + function resizePath(d) { + var e = +(d == 'e'), + x = e ? 1 : -1, + y = availableHeight2 / 3; + return 'M' + (.5 * x) + ',' + y + + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6) + + 'V' + (2 * y - 6) + + 'A6,6 0 0 ' + e + ' ' + (.5 * x) + ',' + (2 * y) + + 'Z' + + 'M' + (2.5 * x) + ',' + (y + 8) + + 'V' + (2 * y - 8) + + 'M' + (4.5 * x) + ',' + (y + 8) + + 'V' + (2 * y - 8); + } + + + function updateBrushBG() { + if (!brush.empty()) brush.extent(brushExtent); + brushBG + .data([brush.empty() ? x2.domain() : brushExtent]) + .each(function(d,i) { + var leftWidth = x2(d[0]) - x2.range()[0], + rightWidth = x2.range()[1] - x2(d[1]); + d3.select(this).select('.left') + .attr('width', leftWidth < 0 ? 0 : leftWidth); + + d3.select(this).select('.right') + .attr('x', x2(d[1])) + .attr('width', rightWidth < 0 ? 0 : rightWidth); + }); + } + + function onBrush() { + brushExtent = brush.empty() ? null : brush.extent(); + extent = brush.empty() ? x2.domain() : brush.extent(); + dispatch.brush({extent: extent, brush: brush}); + updateBrushBG(); + + // Prepare Main (Focus) Bars and Lines + bars + .width(availableWidth) + .height(availableHeight1) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled && data[i].bar })); + + lines + .width(availableWidth) + .height(availableHeight1) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled && !data[i].bar })); + + var focusBarsWrap = g.select('.nv-focus .nv-barsWrap') + .datum(!dataBars.length ? [{values:[]}] : + dataBars + .map(function(d,i) { + return { + key: d.key, + values: d.values.filter(function(d,i) { + return bars.x()(d,i) >= extent[0] && bars.x()(d,i) <= extent[1]; + }) + } + }) + ); + + var focusLinesWrap = g.select('.nv-focus .nv-linesWrap') + .datum(dataLines[0].disabled ? [{values:[]}] : + dataLines + .map(function(d,i) { + return { + key: d.key, + values: d.values.filter(function(d,i) { + return lines.x()(d,i) >= extent[0] && lines.x()(d,i) <= extent[1]; + }) + } + }) + ); + + // Update Main (Focus) X Axis + if (dataBars.length) { + x = bars.xScale(); + } else { + x = lines.xScale(); + } + + xAxis + .scale(x) + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize(-availableHeight1, 0); + + xAxis.domain([Math.ceil(extent[0]), Math.floor(extent[1])]); + + g.select('.nv-x.nv-axis').transition().duration(transitionDuration) + .call(xAxis); + + // Update Main (Focus) Bars and Lines + focusBarsWrap.transition().duration(transitionDuration).call(bars); + focusLinesWrap.transition().duration(transitionDuration).call(lines); + + // Setup and Update Main (Focus) Y Axes + g.select('.nv-focus .nv-x.nv-axis') + .attr('transform', 'translate(0,' + y1.range()[0] + ')'); + + y1Axis + .scale(y1) + .ticks( nv.utils.calcTicksY(availableHeight1/36, data) ) + .tickSize(-availableWidth, 0); + y2Axis + .scale(y2) + .ticks( nv.utils.calcTicksY(availableHeight1/36, data) ) + .tickSize(dataBars.length ? 0 : -availableWidth, 0); // Show the y2 rules only if y1 has none + + g.select('.nv-focus .nv-y1.nv-axis') + .style('opacity', dataBars.length ? 1 : 0); + g.select('.nv-focus .nv-y2.nv-axis') + .style('opacity', dataLines.length && !dataLines[0].disabled ? 1 : 0) + .attr('transform', 'translate(' + x.range()[1] + ',0)'); + + g.select('.nv-focus .nv-y1.nv-axis').transition().duration(transitionDuration) + .call(y1Axis); + g.select('.nv-focus .nv-y2.nv-axis').transition().duration(transitionDuration) + .call(y2Axis); + } + + onBrush(); + + }); + + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + lines.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + lines.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + bars.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + bars.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.legend = legend; + chart.lines = lines; + chart.lines2 = lines2; + chart.bars = bars; + chart.bars2 = bars2; + chart.xAxis = xAxis; + chart.x2Axis = x2Axis; + chart.y1Axis = y1Axis; + chart.y2Axis = y2Axis; + chart.y3Axis = y3Axis; + chart.y4Axis = y4Axis; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + brushExtent: {get: function(){return brushExtent;}, set: function(_){brushExtent=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + focusEnable: {get: function(){return focusEnable;}, set: function(_){focusEnable=_;}}, + focusHeight: {get: function(){return focusHeight;}, set: function(_){focusHeight=_;}}, + focusShowAxisX: {get: function(){return focusShowAxisX;}, set: function(_){focusShowAxisX=_;}}, + focusShowAxisY: {get: function(){return focusShowAxisY;}, set: function(_){focusShowAxisY=_;}}, + legendLeftAxisHint: {get: function(){return legendLeftAxisHint;}, set: function(_){legendLeftAxisHint=_;}}, + legendRightAxisHint: {get: function(){return legendRightAxisHint;}, set: function(_){legendRightAxisHint=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return transitionDuration;}, set: function(_){ + transitionDuration = _; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + }}, + x: {get: function(){return getX;}, set: function(_){ + getX = _; + lines.x(_); + lines2.x(_); + bars.x(_); + bars2.x(_); + }}, + y: {get: function(){return getY;}, set: function(_){ + getY = _; + lines.y(_); + lines2.y(_); + bars.y(_); + bars2.y(_); + }} + }); + + nv.utils.inheritOptions(chart, lines); + nv.utils.initOptions(chart); + + return chart; +}; +nv.models.lineWithFocusChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var lines = nv.models.line() + , lines2 = nv.models.line() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + , x2Axis = nv.models.axis() + , y2Axis = nv.models.axis() + , legend = nv.models.legend() + , brush = d3.svg.brush() + ; + + var margin = {top: 30, right: 30, bottom: 30, left: 60} + , margin2 = {top: 0, right: 30, bottom: 20, left: 60} + , color = nv.utils.defaultColor() + , width = null + , height = null + , height2 = 100 + , x + , y + , x2 + , y2 + , showLegend = true + , brushExtent = null + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + key + '

' + + '

' + y + ' at ' + x + '

' + } + , noData = "No Data Available." + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'brush', 'stateChange', 'changeState') + , transitionDuration = 250 + , state = nv.utils.state() + , defaultState = null + ; + + lines + .clipEdge(true) + ; + lines2 + .interactive(false) + ; + xAxis + .orient('bottom') + .tickPadding(5) + ; + yAxis + .orient('left') + ; + x2Axis + .orient('bottom') + .tickPadding(5) + ; + y2Axis + .orient('left') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(lines.x()(e.point, e.pointIndex)), + y = yAxis.tickFormat()(lines.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, null, null, offsetElement); + }; + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }) + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.active !== undefined) + data.forEach(function(series,i) { + series.disabled = !state.active[i]; + }); + } + }; + + function chart(selection) { + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight1 = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom - height2, + availableHeight2 = height2 - margin2.top - margin2.bottom; + + chart.update = function() { container.transition().duration(transitionDuration).call(chart) }; + chart.container = this; + + state + .setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + // DEPRECATED set state.disableddisabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display No Data message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight1 / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + x = lines.xScale(); + y = lines.yScale(); + x2 = lines2.xScale(); + y2 = lines2.yScale(); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-lineWithFocusChart').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-lineWithFocusChart').append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-legendWrap'); + + var focusEnter = gEnter.append('g').attr('class', 'nv-focus'); + focusEnter.append('g').attr('class', 'nv-x nv-axis'); + focusEnter.append('g').attr('class', 'nv-y nv-axis'); + focusEnter.append('g').attr('class', 'nv-linesWrap'); + + var contextEnter = gEnter.append('g').attr('class', 'nv-context'); + contextEnter.append('g').attr('class', 'nv-x nv-axis'); + contextEnter.append('g').attr('class', 'nv-y nv-axis'); + contextEnter.append('g').attr('class', 'nv-linesWrap'); + contextEnter.append('g').attr('class', 'nv-brushBackground'); + contextEnter.append('g').attr('class', 'nv-x nv-brush'); + + // Legend + if (showLegend) { + legend.width(availableWidth); + + g.select('.nv-legendWrap') + .datum(data) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight1 = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom - height2; + } + + g.select('.nv-legendWrap') + .attr('transform', 'translate(0,' + (-margin.top) +')') + } + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + // Main Chart Component(s) + lines + .width(availableWidth) + .height(availableHeight1) + .color( + data + .map(function(d,i) { + return d.color || color(d, i); + }) + .filter(function(d,i) { + return !data[i].disabled; + }) + ); + + lines2 + .defined(lines.defined()) + .width(availableWidth) + .height(availableHeight2) + .color( + data + .map(function(d,i) { + return d.color || color(d, i); + }) + .filter(function(d,i) { + return !data[i].disabled; + }) + ); + + g.select('.nv-context') + .attr('transform', 'translate(0,' + ( availableHeight1 + margin.bottom + margin2.top) + ')') + + var contextLinesWrap = g.select('.nv-context .nv-linesWrap') + .datum(data.filter(function(d) { return !d.disabled })) + + d3.transition(contextLinesWrap).call(lines2); + + // Setup Main (Focus) Axes + xAxis + .scale(x) + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize(-availableHeight1, 0); + + yAxis + .scale(y) + .ticks( nv.utils.calcTicksY(availableHeight1/36, data) ) + .tickSize( -availableWidth, 0); + + g.select('.nv-focus .nv-x.nv-axis') + .attr('transform', 'translate(0,' + availableHeight1 + ')'); + + // Setup Brush + brush + .x(x2) + .on('brush', function() { + //When brushing, turn off transitions because chart needs to change immediately. + var oldTransition = chart.duration(); + chart.duration(0); + onBrush(); + chart.duration(oldTransition); + }); + + if (brushExtent) brush.extent(brushExtent); + + var brushBG = g.select('.nv-brushBackground').selectAll('g') + .data([brushExtent || brush.extent()]) + + var brushBGenter = brushBG.enter() + .append('g'); + + brushBGenter.append('rect') + .attr('class', 'left') + .attr('x', 0) + .attr('y', 0) + .attr('height', availableHeight2); + + brushBGenter.append('rect') + .attr('class', 'right') + .attr('x', 0) + .attr('y', 0) + .attr('height', availableHeight2); + + var gBrush = g.select('.nv-x.nv-brush') + .call(brush); + gBrush.selectAll('rect') + //.attr('y', -5) + .attr('height', availableHeight2); + gBrush.selectAll('.resize').append('path').attr('d', resizePath); + + onBrush(); + + // Setup Secondary (Context) Axes + x2Axis + .scale(x2) + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize(-availableHeight2, 0); + + g.select('.nv-context .nv-x.nv-axis') + .attr('transform', 'translate(0,' + y2.range()[0] + ')'); + d3.transition(g.select('.nv-context .nv-x.nv-axis')) + .call(x2Axis); + + y2Axis + .scale(y2) + .ticks( nv.utils.calcTicksY(availableHeight2/36, data) ) + .tickSize( -availableWidth, 0); + + d3.transition(g.select('.nv-context .nv-y.nv-axis')) + .call(y2Axis); + + g.select('.nv-context .nv-x.nv-axis') + .attr('transform', 'translate(0,' + y2.range()[0] + ')'); + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) + state[key] = newState[key]; + dispatch.stateChange(state); + chart.update(); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + dispatch.on('changeState', function(e) { + if (typeof e.disabled !== 'undefined') { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + } + chart.update(); + }); + + //============================================================ + // Functions + //------------------------------------------------------------ + + // Taken from crossfilter (http://square.github.com/crossfilter/) + function resizePath(d) { + var e = +(d == 'e'), + x = e ? 1 : -1, + y = availableHeight2 / 3; + return 'M' + (.5 * x) + ',' + y + + 'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6) + + 'V' + (2 * y - 6) + + 'A6,6 0 0 ' + e + ' ' + (.5 * x) + ',' + (2 * y) + + 'Z' + + 'M' + (2.5 * x) + ',' + (y + 8) + + 'V' + (2 * y - 8) + + 'M' + (4.5 * x) + ',' + (y + 8) + + 'V' + (2 * y - 8); + } + + + function updateBrushBG() { + if (!brush.empty()) brush.extent(brushExtent); + brushBG + .data([brush.empty() ? x2.domain() : brushExtent]) + .each(function(d,i) { + var leftWidth = x2(d[0]) - x.range()[0], + rightWidth = x.range()[1] - x2(d[1]); + d3.select(this).select('.left') + .attr('width', leftWidth < 0 ? 0 : leftWidth); + + d3.select(this).select('.right') + .attr('x', x2(d[1])) + .attr('width', rightWidth < 0 ? 0 : rightWidth); + }); + } + + + function onBrush() { + brushExtent = brush.empty() ? null : brush.extent(); + var extent = brush.empty() ? x2.domain() : brush.extent(); + + //The brush extent cannot be less than one. If it is, don't update the line chart. + if (Math.abs(extent[0] - extent[1]) <= 1) { + return; + } + + dispatch.brush({extent: extent, brush: brush}); + + + updateBrushBG(); + + // Update Main (Focus) + var focusLinesWrap = g.select('.nv-focus .nv-linesWrap') + .datum( + data + .filter(function(d) { return !d.disabled }) + .map(function(d,i) { + return { + key: d.key, + area: d.area, + values: d.values.filter(function(d,i) { + return lines.x()(d,i) >= extent[0] && lines.x()(d,i) <= extent[1]; + }) + } + }) + ); + focusLinesWrap.transition().duration(transitionDuration).call(lines); + + + // Update Main (Focus) Axes + g.select('.nv-focus .nv-x.nv-axis').transition().duration(transitionDuration) + .call(xAxis); + g.select('.nv-focus .nv-y.nv-axis').transition().duration(transitionDuration) + .call(yAxis); + } + }); + + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + lines.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + lines.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.legend = legend; + chart.lines = lines; + chart.lines2 = lines2; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + chart.x2Axis = x2Axis; + chart.y2Axis = y2Axis; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + focusHeight: {get: function(){return height2;}, set: function(_){height2=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + brushExtent: {get: function(){return brushExtent;}, set: function(_){brushExtent=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + // line color is handled above? + }}, + interpolate: {get: function(){return lines.interpolate();}, set: function(_){ + lines.interpolate(_); + lines2.interpolate(_); + }}, + xTickFormat: {get: function(){return xAxis.xTickFormat();}, set: function(_){ + xAxis.xTickFormat(_); + x2Axis.xTickFormat(_); + }}, + yTickFormat: {get: function(){return yAxis.yTickFormat();}, set: function(_){ + yAxis.yTickFormat(_); + y2Axis.yTickFormat(_); + }}, + duration: {get: function(){return transitionDuration;}, set: function(_){ + transitionDuration=_; + yAxis.duration(transitionDuration); + xAxis.duration(transitionDuration); + }}, + x: {get: function(){return lines.x();}, set: function(_){ + lines.x(_); + lines2.x(_); + }}, + y: {get: function(){return lines.y();}, set: function(_){ + lines.y(_); + lines2.y(_); + }} + }); + + nv.utils.inheritOptions(chart, lines); + nv.utils.initOptions(chart); + + return chart; +}; + +nv.models.multiBar = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = 960 + , height = 500 + , x = d3.scale.ordinal() + , y = d3.scale.linear() + , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one + , getX = function(d) { return d.x } + , getY = function(d) { return d.y } + , forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do chart.forceY([]) to remove + , clipEdge = true + , stacked = false + , stackOffset = 'zero' // options include 'silhouette', 'wiggle', 'expand', 'zero', or a custom function + , color = nv.utils.defaultColor() + , hideable = false + , barColor = null // adding the ability to set the color for each rather than the whole group + , disabled // used in conjunction with barColor to communicate from multiBarHorizontalChart what series are disabled + , duration = 500 + , xDomain + , yDomain + , xRange + , yRange + , groupSpacing = 0.1 + , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'renderEnd') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var x0, y0 //used to store previous scales + , renderWatch = nv.utils.renderWatch(dispatch, duration) + ; + + var last_datalength = 0; + + function chart(selection) { + renderWatch.reset(); + selection.each(function(data) { + var availableWidth = width - margin.left - margin.right, + availableHeight = height - margin.top - margin.bottom, + container = d3.select(this); + nv.utils.initSVG(container); + + // This function defines the requirements for render complete + var endFn = function(d, i) { + if (d.series === data.length - 1 && i === data[0].values.length - 1) + return true; + return false; + }; + + if(hideable && data.length) hideable = [{ + values: data[0].values.map(function(d) { + return { + x: d.x, + y: 0, + series: d.series, + size: 0.01 + };} + )}]; + + if (stacked) + data = d3.layout.stack() + .offset(stackOffset) + .values(function(d){ return d.values }) + .y(getY) + (!data.length && hideable ? hideable : data); + + + //add series index to each data point for reference + data.forEach(function(series, i) { + series.values.forEach(function(point) { + point.series = i; + }); + }); + + // HACK for negative value stacking + if (stacked) + data[0].values.map(function(d,i) { + var posBase = 0, negBase = 0; + data.map(function(d) { + var f = d.values[i] + f.size = Math.abs(f.y); + if (f.y<0) { + f.y1 = negBase; + negBase = negBase - f.size; + } else + { + f.y1 = f.size + posBase; + posBase = posBase + f.size; + } + }); + }); + + // Setup Scales + // remap and flatten the data for use in calculating the scales' domains + var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate + data.map(function(d) { + return d.values.map(function(d,i) { + return { x: getX(d,i), y: getY(d,i), y0: d.y0, y1: d.y1 } + }) + }); + + x.domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x })) + .rangeBands(xRange || [0, availableWidth], groupSpacing); + + y.domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return stacked ? (d.y > 0 ? d.y1 : d.y1 + d.y ) : d.y }).concat(forceY))) + .range(yRange || [availableHeight, 0]); + + // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point + if (x.domain()[0] === x.domain()[1]) + x.domain()[0] ? + x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01]) + : x.domain([-1,1]); + + if (y.domain()[0] === y.domain()[1]) + y.domain()[0] ? + y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01]) + : y.domain([-1,1]); + + x0 = x0 || x; + y0 = y0 || y; + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-multibar').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multibar'); + var defsEnter = wrapEnter.append('defs'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g') + + gEnter.append('g').attr('class', 'nv-groups'); + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + defsEnter.append('clipPath') + .attr('id', 'nv-edge-clip-' + id) + .append('rect'); + wrap.select('#nv-edge-clip-' + id + ' rect') + .attr('width', availableWidth) + .attr('height', availableHeight); + + g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : ''); + + var groups = wrap.select('.nv-groups').selectAll('.nv-group') + .data(function(d) { return d }, function(d,i) { return i }); + groups.enter().append('g') + .style('stroke-opacity', 1e-6) + .style('fill-opacity', 1e-6); + + var exitTransition = renderWatch + .transition(groups.exit().selectAll('rect.nv-bar'), 'multibarExit', Math.min(100, duration)) + .attr('y', function(d) { return (stacked ? y0(d.y0) : y0(0)) || 0 }) + .attr('height', 0) + .remove(); + if (exitTransition.delay) + exitTransition.delay(function(d,i) { + var delay = i * (duration / (last_datalength + 1)) - i; + return delay; + }); + groups + .attr('class', function(d,i) { return 'nv-group nv-series-' + i }) + .classed('hover', function(d) { return d.hover }) + .style('fill', function(d,i){ return color(d, i) }) + .style('stroke', function(d,i){ return color(d, i) }); + groups + .style('stroke-opacity', 1) + .style('fill-opacity', 0.75); + + var bars = groups.selectAll('rect.nv-bar') + .data(function(d) { return (hideable && !data.length) ? hideable.values : d.values }); + bars.exit().remove(); + + var barsEnter = bars.enter().append('rect') + .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive'}) + .attr('x', function(d,i,j) { + return stacked ? 0 : (j * x.rangeBand() / data.length ) + }) + .attr('y', function(d) { return y0(stacked ? d.y0 : 0) || 0 }) + .attr('height', 0) + .attr('width', x.rangeBand() / (stacked ? 1 : data.length) ) + .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',0)'; }) + ; + bars + .style('fill', function(d,i,j){ return color(d, j, i); }) + .style('stroke', function(d,i,j){ return color(d, j, i); }) + .on('mouseover', function(d,i) { //TODO: figure out why j works above, but not here + d3.select(this).classed('hover', true); + dispatch.elementMouseover({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length), y(getY(d,i) + (stacked ? d.y0 : 0))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + }) + .on('mouseout', function(d,i) { + d3.select(this).classed('hover', false); + dispatch.elementMouseout({ + value: getY(d,i), + point: d, + series: data[d.series], + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + }) + .on('click', function(d,i) { + dispatch.elementClick({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length), y(getY(d,i) + (stacked ? d.y0 : 0))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + d3.event.stopPropagation(); + }) + .on('dblclick', function(d,i) { + dispatch.elementDblClick({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length), y(getY(d,i) + (stacked ? d.y0 : 0))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + d3.event.stopPropagation(); + }); + bars + .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive'}) + .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',0)'; }) + + if (barColor) { + if (!disabled) disabled = data.map(function() { return true }); + bars + .style('fill', function(d,i,j) { return d3.rgb(barColor(d,i)).darker( disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i] })[j] ).toString(); }) + .style('stroke', function(d,i,j) { return d3.rgb(barColor(d,i)).darker( disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i] })[j] ).toString(); }); + } + + var barSelection = + bars.watchTransition(renderWatch, 'multibar', Math.min(250, duration)) + .delay(function(d,i) { + return i * duration / data[0].values.length; + }); + if (stacked) + barSelection + .attr('y', function(d,i) { + return y((stacked ? d.y1 : 0)); + }) + .attr('height', function(d,i) { + return Math.max(Math.abs(y(d.y + (stacked ? d.y0 : 0)) - y((stacked ? d.y0 : 0))),1); + }) + .attr('x', function(d,i) { + return stacked ? 0 : (d.series * x.rangeBand() / data.length ) + }) + .attr('width', x.rangeBand() / (stacked ? 1 : data.length) ); + else + barSelection + .attr('x', function(d,i) { + return d.series * x.rangeBand() / data.length + }) + .attr('width', x.rangeBand() / data.length) + .attr('y', function(d,i) { + return getY(d,i) < 0 ? + y(0) : + y(0) - y(getY(d,i)) < 1 ? + y(0) - 1 : + y(getY(d,i)) || 0; + }) + .attr('height', function(d,i) { + return Math.max(Math.abs(y(getY(d,i)) - y(0)),1) || 0; + }); + + //store old scales for use in transitions on update + x0 = x.copy(); + y0 = y.copy(); + + // keep track of the last data value length for transition calculations + if (data[0] && data[0].values) { + last_datalength = data[0].values.length; + } + + }); + + renderWatch.renderEnd('multibar immediate'); + + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + x: {get: function(){return getX;}, set: function(_){getX=_;}}, + y: {get: function(){return getY;}, set: function(_){getY=_;}}, + xScale: {get: function(){return x;}, set: function(_){x=_;}}, + yScale: {get: function(){return y;}, set: function(_){y=_;}}, + xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}}, + yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}}, + xRange: {get: function(){return xRange;}, set: function(_){xRange=_;}}, + yRange: {get: function(){return yRange;}, set: function(_){yRange=_;}}, + forceY: {get: function(){return forceY;}, set: function(_){forceY=_;}}, + stacked: {get: function(){return stacked;}, set: function(_){stacked=_;}}, + stackOffset: {get: function(){return stackOffset;}, set: function(_){stackOffset=_;}}, + clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}}, + disabled: {get: function(){return disabled;}, set: function(_){disabled=_;}}, + id: {get: function(){return id;}, set: function(_){id=_;}}, + hideable: {get: function(){return hideable;}, set: function(_){hideable=_;}}, + groupSpacing:{get: function(){return groupSpacing;}, set: function(_){groupSpacing=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }}, + barColor: {get: function(){return barColor;}, set: function(_){ + barColor = nv.utils.getColor(_); + }} + }); + + nv.utils.initOptions(chart); + + return chart; +}; + +nv.models.multiBarChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var multibar = nv.models.multiBar() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + , legend = nv.models.legend() + , controls = nv.models.legend() + ; + + var margin = {top: 30, right: 20, bottom: 50, left: 60} + , width = null + , height = null + , color = nv.utils.defaultColor() + , showControls = true + , controlLabels = {} + , showLegend = true + , showXAxis = true + , showYAxis = true + , rightAlignYAxis = false + , reduceXTicks = true // if false a tick will show for every data point + , staggerLabels = false + , rotateLabels = 0 + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + key + '

' + + '

' + y + ' on ' + x + '

' + } + , x //can be accessed via chart.xScale() + , y //can be accessed via chart.yScale() + , state = nv.utils.state() + , defaultState = null + , noData = "No Data Available." + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd') + , controlWidth = function() { return showControls ? 180 : 0 } + , duration = 250 + ; + + state.stacked = false // DEPRECATED Maintained for backward compatibility + + multibar + .stacked(false) + ; + xAxis + .orient('bottom') + .tickPadding(7) + .highlightZero(true) + .showMaxMin(false) + .tickFormat(function(d) { return d }) + ; + yAxis + .orient((rightAlignYAxis) ? 'right' : 'left') + .tickFormat(d3.format(',.1f')) + ; + + controls.updateState(false); + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var renderWatch = nv.utils.renderWatch(dispatch); + var stacked = false; + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(multibar.x()(e.point, e.pointIndex)), + y = yAxis.tickFormat()(multibar.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's', null, offsetElement); + }; + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }), + stacked: stacked + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.stacked !== undefined) + stacked = state.stacked; + if (state.active !== undefined) + data.forEach(function(series,i) { + series.disabled = !state.active[i]; + }); + } + }; + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(multibar); + if (showXAxis) renderWatch.models(xAxis); + if (showYAxis) renderWatch.models(yAxis); + + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + chart.update = function() { + if (duration === 0) + container.call(chart); + else + container.transition() + .duration(duration) + .call(chart); + }; + chart.container = this; + + state + .setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + // DEPRECATED set state.disableddisabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display noData message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + x = multibar.xScale(); + y = multibar.yScale(); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-multiBarWithLegend').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multiBarWithLegend').append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-x nv-axis'); + gEnter.append('g').attr('class', 'nv-y nv-axis'); + gEnter.append('g').attr('class', 'nv-barsWrap'); + gEnter.append('g').attr('class', 'nv-legendWrap'); + gEnter.append('g').attr('class', 'nv-controlsWrap'); + + // Legend + if (showLegend) { + legend.width(availableWidth - controlWidth()); + + if (multibar.barColor()) + data.forEach(function(series,i) { + series.color = d3.rgb('#ccc').darker(i * 1.5).toString(); + }); + + g.select('.nv-legendWrap') + .datum(data) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + g.select('.nv-legendWrap') + .attr('transform', 'translate(' + controlWidth() + ',' + (-margin.top) +')'); + } + + // Controls + if (showControls) { + var controlsData = [ + { key: controlLabels.grouped || 'Grouped', disabled: multibar.stacked() }, + { key: controlLabels.stacked || 'Stacked', disabled: !multibar.stacked() } + ]; + + controls.width(controlWidth()).color(['#444', '#444', '#444']); + g.select('.nv-controlsWrap') + .datum(controlsData) + .attr('transform', 'translate(0,' + (-margin.top) +')') + .call(controls); + } + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + if (rightAlignYAxis) { + g.select(".nv-y.nv-axis") + .attr("transform", "translate(" + availableWidth + ",0)"); + } + + // Main Chart Component(s) + multibar + .disabled(data.map(function(series) { return series.disabled })) + .width(availableWidth) + .height(availableHeight) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled })); + + + var barsWrap = g.select('.nv-barsWrap') + .datum(data.filter(function(d) { return !d.disabled })); + + barsWrap.call(multibar); + + // Setup Axes + if (showXAxis) { + xAxis + .scale(x) + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize(-availableHeight, 0); + + g.select('.nv-x.nv-axis') + .attr('transform', 'translate(0,' + y.range()[0] + ')'); + g.select('.nv-x.nv-axis') + .call(xAxis); + + var xTicks = g.select('.nv-x.nv-axis > g').selectAll('g'); + + xTicks + .selectAll('line, text') + .style('opacity', 1) + + if (staggerLabels) { + var getTranslate = function(x,y) { + return "translate(" + x + "," + y + ")"; + }; + + var staggerUp = 5, staggerDown = 17; //pixels to stagger by + // Issue #140 + xTicks + .selectAll("text") + .attr('transform', function(d,i,j) { + return getTranslate(0, (j % 2 == 0 ? staggerUp : staggerDown)); + }); + + var totalInBetweenTicks = d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length; + g.selectAll(".nv-x.nv-axis .nv-axisMaxMin text") + .attr("transform", function(d,i) { + return getTranslate(0, (i === 0 || totalInBetweenTicks % 2 !== 0) ? staggerDown : staggerUp); + }); + } + + if (reduceXTicks) + xTicks + .filter(function(d,i) { + return i % Math.ceil(data[0].values.length / (availableWidth / 100)) !== 0; + }) + .selectAll('text, line') + .style('opacity', 0); + + if(rotateLabels) + xTicks + .selectAll('.tick text') + .attr('transform', 'rotate(' + rotateLabels + ' 0,0)') + .style('text-anchor', rotateLabels > 0 ? 'start' : 'end'); + + g.select('.nv-x.nv-axis').selectAll('g.nv-axisMaxMin text') + .style('opacity', 1); + } + + if (showYAxis) { + yAxis + .scale(y) + .ticks( nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize( -availableWidth, 0); + + g.select('.nv-y.nv-axis') + .call(yAxis); + } + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) + state[key] = newState[key]; + dispatch.stateChange(state); + chart.update(); + }); + + controls.dispatch.on('legendClick', function(d,i) { + if (!d.disabled) return; + controlsData = controlsData.map(function(s) { + s.disabled = true; + return s; + }); + d.disabled = false; + + switch (d.key) { + case 'Grouped': + multibar.stacked(false); + break; + case 'Stacked': + multibar.stacked(true); + break; + } + + state.stacked = multibar.stacked(); + dispatch.stateChange(state); + + chart.update(); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode) + }); + + // Update chart from a state object passed to event handler + dispatch.on('changeState', function(e) { + + if (typeof e.disabled !== 'undefined') { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + + state.disabled = e.disabled; + } + + if (typeof e.stacked !== 'undefined') { + multibar.stacked(e.stacked); + state.stacked = e.stacked; + stacked = e.stacked; + } + + chart.update(); + }); + }); + + renderWatch.renderEnd('multibarchart immediate'); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + multibar.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + multibar.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.multibar = multibar; + chart.legend = legend; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + chart.state = state; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + showControls: {get: function(){return showControls;}, set: function(_){showControls=_;}}, + controlLabels: {get: function(){return controlLabels;}, set: function(_){controlLabels=_;}}, + showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}}, + showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + reduceXTicks: {get: function(){return reduceXTicks;}, set: function(_){reduceXTicks=_;}}, + rotateLabels: {get: function(){return rotateLabels;}, set: function(_){rotateLabels=_;}}, + staggerLabels: {get: function(){return staggerLabels;}, set: function(_){staggerLabels=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + multibar.duration(duration); + xAxis.duration(duration); + yAxis.duration(duration); + renderWatch.reset(duration); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + }}, + rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){ + rightAlignYAxis = _; + yAxis.orient( rightAlignYAxis ? 'right' : 'left'); + }} + }); + + nv.utils.inheritOptions(chart, multibar); + nv.utils.initOptions(chart); + + return chart; +}; + +nv.models.multiBarHorizontal = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = 960 + , height = 500 + , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one + , x = d3.scale.ordinal() + , y = d3.scale.linear() + , getX = function(d) { return d.x } + , getY = function(d) { return d.y } + , getYerr = function(d) { return d.yErr } + , forceY = [0] // 0 is forced by default.. this makes sense for the majority of bar graphs... user can always do chart.forceY([]) to remove + , color = nv.utils.defaultColor() + , barColor = null // adding the ability to set the color for each rather than the whole group + , disabled // used in conjunction with barColor to communicate from multiBarHorizontalChart what series are disabled + , stacked = false + , showValues = false + , showBarLabels = false + , valuePadding = 60 + , valueFormat = d3.format(',.2f') + , delay = 1200 + , xDomain + , yDomain + , xRange + , yRange + , duration = 250 + , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout','renderEnd') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var x0, y0; //used to store previous scales + var renderWatch = nv.utils.renderWatch(dispatch, duration); + + function chart(selection) { + renderWatch.reset(); + selection.each(function(data) { + var availableWidth = width - margin.left - margin.right, + availableHeight = height - margin.top - margin.bottom, + container = d3.select(this); + nv.utils.initSVG(container); + + if (stacked) + data = d3.layout.stack() + .offset('zero') + .values(function(d){ return d.values }) + .y(getY) + (data); + + //add series index to each data point for reference + data.forEach(function(series, i) { + series.values.forEach(function(point) { + point.series = i; + }); + }); + + // HACK for negative value stacking + if (stacked) + data[0].values.map(function(d,i) { + var posBase = 0, negBase = 0; + data.map(function(d) { + var f = d.values[i] + f.size = Math.abs(f.y); + if (f.y<0) { + f.y1 = negBase - f.size; + negBase = negBase - f.size; + } else + { + f.y1 = posBase; + posBase = posBase + f.size; + } + }); + }); + + // Setup Scales + // remap and flatten the data for use in calculating the scales' domains + var seriesData = (xDomain && yDomain) ? [] : // if we know xDomain and yDomain, no need to calculate + data.map(function(d) { + return d.values.map(function(d,i) { + return { x: getX(d,i), y: getY(d,i), y0: d.y0, y1: d.y1 } + }) + }); + + x.domain(xDomain || d3.merge(seriesData).map(function(d) { return d.x })) + .rangeBands(xRange || [0, availableHeight], .1); + + y.domain(yDomain || d3.extent(d3.merge(seriesData).map(function(d) { return stacked ? (d.y > 0 ? d.y1 + d.y : d.y1 ) : d.y }).concat(forceY))) + + if (showValues && !stacked) + y.range(yRange || [(y.domain()[0] < 0 ? valuePadding : 0), availableWidth - (y.domain()[1] > 0 ? valuePadding : 0) ]); + else + y.range(yRange || [0, availableWidth]); + + x0 = x0 || x; + y0 = y0 || d3.scale.linear().domain(y.domain()).range([y(0),y(0)]); + + // Setup containers and skeleton of chart + var wrap = d3.select(this).selectAll('g.nv-wrap.nv-multibarHorizontal').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multibarHorizontal'); + var defsEnter = wrapEnter.append('defs'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-groups'); + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + var groups = wrap.select('.nv-groups').selectAll('.nv-group') + .data(function(d) { return d }, function(d,i) { return i }); + groups.enter().append('g') + .style('stroke-opacity', 1e-6) + .style('fill-opacity', 1e-6); + groups.exit().watchTransition(renderWatch, 'multibarhorizontal: exit groups') + .style('stroke-opacity', 1e-6) + .style('fill-opacity', 1e-6) + .remove(); + groups + .attr('class', function(d,i) { return 'nv-group nv-series-' + i }) + .classed('hover', function(d) { return d.hover }) + .style('fill', function(d,i){ return color(d, i) }) + .style('stroke', function(d,i){ return color(d, i) }); + groups.watchTransition(renderWatch, 'multibarhorizontal: groups') + .style('stroke-opacity', 1) + .style('fill-opacity', .75); + + var bars = groups.selectAll('g.nv-bar') + .data(function(d) { return d.values }); + bars.exit().remove(); + + var barsEnter = bars.enter().append('g') + .attr('transform', function(d,i,j) { + return 'translate(' + y0(stacked ? d.y0 : 0) + ',' + (stacked ? 0 : (j * x.rangeBand() / data.length ) + x(getX(d,i))) + ')' + }); + + barsEnter.append('rect') + .attr('width', 0) + .attr('height', x.rangeBand() / (stacked ? 1 : data.length) ) + + bars + .on('mouseover', function(d,i) { //TODO: figure out why j works above, but not here + d3.select(this).classed('hover', true); + dispatch.elementMouseover({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [ y(getY(d,i) + (stacked ? d.y0 : 0)), x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length) ], + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + }) + .on('mouseout', function(d,i) { + d3.select(this).classed('hover', false); + dispatch.elementMouseout({ + value: getY(d,i), + point: d, + series: data[d.series], + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + }) + .on('click', function(d,i) { + dispatch.elementClick({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length), y(getY(d,i) + (stacked ? d.y0 : 0))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + d3.event.stopPropagation(); + }) + .on('dblclick', function(d,i) { + dispatch.elementDblClick({ + value: getY(d,i), + point: d, + series: data[d.series], + pos: [x(getX(d,i)) + (x.rangeBand() * (stacked ? data.length / 2 : d.series + .5) / data.length), y(getY(d,i) + (stacked ? d.y0 : 0))], // TODO: Figure out why the value appears to be shifted + pointIndex: i, + seriesIndex: d.series, + e: d3.event + }); + d3.event.stopPropagation(); + }); + + if (getYerr(data[0],0)) { + barsEnter.append('polyline'); + + bars.select('polyline') + .attr('fill', 'none') + .attr('points', function(d,i) { + var xerr = getYerr(d,i) + , mid = 0.8 * x.rangeBand() / ((stacked ? 1 : data.length) * 2); + xerr = xerr.length ? xerr : [-Math.abs(xerr), Math.abs(xerr)]; + xerr = xerr.map(function(e) { return y(e) - y(0); }); + var a = [[xerr[0],-mid], [xerr[0],mid], [xerr[0],0], [xerr[1],0], [xerr[1],-mid], [xerr[1],mid]]; + return a.map(function (path) { return path.join(',') }).join(' '); + }) + .attr('transform', function(d,i) { + var mid = x.rangeBand() / ((stacked ? 1 : data.length) * 2); + return 'translate(' + (getY(d,i) < 0 ? 0 : y(getY(d,i)) - y(0)) + ', ' + mid + ')' + }); + } + + barsEnter.append('text'); + + if (showValues && !stacked) { + bars.select('text') + .attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'end' : 'start' }) + .attr('y', x.rangeBand() / (data.length * 2)) + .attr('dy', '.32em') + .html(function(d,i) { + var t = valueFormat(getY(d,i)) + , yerr = getYerr(d,i); + if (yerr === undefined) + return t; + if (!yerr.length) + return t + '±' + valueFormat(Math.abs(yerr)); + return t + '+' + valueFormat(Math.abs(yerr[1])) + '-' + valueFormat(Math.abs(yerr[0])); + }); + bars.watchTransition(renderWatch, 'multibarhorizontal: bars') + .select('text') + .attr('x', function(d,i) { return getY(d,i) < 0 ? -4 : y(getY(d,i)) - y(0) + 4 }) + } else { + bars.selectAll('text').text(''); + } + + if (showBarLabels && !stacked) { + barsEnter.append('text').classed('nv-bar-label',true); + bars.select('text.nv-bar-label') + .attr('text-anchor', function(d,i) { return getY(d,i) < 0 ? 'start' : 'end' }) + .attr('y', x.rangeBand() / (data.length * 2)) + .attr('dy', '.32em') + .text(function(d,i) { return getX(d,i) }); + bars.watchTransition(renderWatch, 'multibarhorizontal: bars') + .select('text.nv-bar-label') + .attr('x', function(d,i) { return getY(d,i) < 0 ? y(0) - y(getY(d,i)) + 4 : -4 }); + } + else { + bars.selectAll('text.nv-bar-label').text(''); + } + + bars + .attr('class', function(d,i) { return getY(d,i) < 0 ? 'nv-bar negative' : 'nv-bar positive'}) + + if (barColor) { + if (!disabled) disabled = data.map(function() { return true }); + bars + .style('fill', function(d,i,j) { return d3.rgb(barColor(d,i)).darker( disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i] })[j] ).toString(); }) + .style('stroke', function(d,i,j) { return d3.rgb(barColor(d,i)).darker( disabled.map(function(d,i) { return i }).filter(function(d,i){ return !disabled[i] })[j] ).toString(); }); + } + + if (stacked) + bars.watchTransition(renderWatch, 'multibarhorizontal: bars') + .attr('transform', function(d,i) { + return 'translate(' + y(d.y1) + ',' + x(getX(d,i)) + ')' + }) + .select('rect') + .attr('width', function(d,i) { + return Math.abs(y(getY(d,i) + d.y0) - y(d.y0)) + }) + .attr('height', x.rangeBand() ); + else + bars.watchTransition(renderWatch, 'multibarhorizontal: bars') + .attr('transform', function(d,i) { + //TODO: stacked must be all positive or all negative, not both? + return 'translate(' + + (getY(d,i) < 0 ? y(getY(d,i)) : y(0)) + + ',' + + (d.series * x.rangeBand() / data.length + + + x(getX(d,i)) ) + + ')' + }) + .select('rect') + .attr('height', x.rangeBand() / data.length ) + .attr('width', function(d,i) { + return Math.max(Math.abs(y(getY(d,i)) - y(0)),1) + }); + + //store old scales for use in transitions on update + x0 = x.copy(); + y0 = y.copy(); + + }); + + renderWatch.renderEnd('multibarHorizontal immediate'); + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + x: {get: function(){return getX;}, set: function(_){getX=_;}}, + y: {get: function(){return getY;}, set: function(_){getY=_;}}, + yErr: {get: function(){return getYerr;}, set: function(_){getYerr=_;}}, + xScale: {get: function(){return x;}, set: function(_){x=_;}}, + yScale: {get: function(){return y;}, set: function(_){y=_;}}, + xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}}, + yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}}, + xRange: {get: function(){return xRange;}, set: function(_){xRange=_;}}, + yRange: {get: function(){return yRange;}, set: function(_){yRange=_;}}, + forceY: {get: function(){return forceY;}, set: function(_){forceY=_;}}, + stacked: {get: function(){return stacked;}, set: function(_){stacked=_;}}, + showValues: {get: function(){return showValues;}, set: function(_){showValues=_;}}, + // this shows the group name, seems pointless? + //showBarLabels: {get: function(){return showBarLabels;}, set: function(_){showBarLabels=_;}}, + disabled: {get: function(){return disabled;}, set: function(_){disabled=_;}}, + id: {get: function(){return id;}, set: function(_){id=_;}}, + valueFormat: {get: function(){return valueFormat;}, set: function(_){valueFormat=_;}}, + valuePadding: {get: function(){return valuePadding;}, set: function(_){valuePadding=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }}, + barColor: {get: function(){return color;}, set: function(_){ + barColor = nv.utils.getColor(_); + }} + }); + + nv.utils.initOptions(chart); + + return chart; +}; +nv.models.multiBarHorizontalChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var multibar = nv.models.multiBarHorizontal() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + , legend = nv.models.legend().height(30) + , controls = nv.models.legend().height(30) + ; + + var margin = {top: 30, right: 20, bottom: 50, left: 60} + , width = null + , height = null + , color = nv.utils.defaultColor() + , showControls = true + , controlLabels = {} + , showLegend = true + , showXAxis = true + , showYAxis = true + , stacked = false + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + key + ' - ' + x + '

' + + '

' + y + '

' + } + , x //can be accessed via chart.xScale() + , y //can be accessed via chart.yScale() + , state = nv.utils.state() + , defaultState = null + , noData = 'No Data Available.' + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState','renderEnd') + , controlWidth = function() { return showControls ? 180 : 0 } + , duration = 250 + ; + + state.stacked = false; // DEPRECATED Maintained for backward compatibility + + multibar + .stacked(stacked) + ; + xAxis + .orient('left') + .tickPadding(5) + .highlightZero(false) + .showMaxMin(false) + .tickFormat(function(d) { return d }) + ; + yAxis + .orient('bottom') + .tickFormat(d3.format(',.1f')) + ; + + controls.updateState(false); + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(multibar.x()(e.point, e.pointIndex)), + y = yAxis.tickFormat()(multibar.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, e.value < 0 ? 'e' : 'w', null, offsetElement); + }; + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }), + stacked: stacked + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.stacked !== undefined) + stacked = state.stacked; + if (state.active !== undefined) + data.forEach(function(series,i) { + series.disabled = !state.active[i]; + }); + } + }; + + var renderWatch = nv.utils.renderWatch(dispatch, duration); + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(multibar); + if (showXAxis) renderWatch.models(xAxis); + if (showYAxis) renderWatch.models(yAxis); + + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + chart.update = function() { container.transition().duration(duration).call(chart) }; + chart.container = this; + + stacked = multibar.stacked(); + + state + .setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + // DEPRECATED set state.disableddisabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display No Data message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + x = multibar.xScale(); + y = multibar.yScale(); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-multiBarHorizontalChart').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-multiBarHorizontalChart').append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-x nv-axis'); + gEnter.append('g').attr('class', 'nv-y nv-axis') + .append('g').attr('class', 'nv-zeroLine') + .append('line'); + gEnter.append('g').attr('class', 'nv-barsWrap'); + gEnter.append('g').attr('class', 'nv-legendWrap'); + gEnter.append('g').attr('class', 'nv-controlsWrap'); + + // Legend + if (showLegend) { + legend.width(availableWidth - controlWidth()); + + if (multibar.barColor()) + data.forEach(function(series,i) { + series.color = d3.rgb('#ccc').darker(i * 1.5).toString(); + }); + + g.select('.nv-legendWrap') + .datum(data) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + g.select('.nv-legendWrap') + .attr('transform', 'translate(' + controlWidth() + ',' + (-margin.top) +')'); + } + + // Controls + if (showControls) { + var controlsData = [ + { key: controlLabels.grouped || 'Grouped', disabled: multibar.stacked() }, + { key: controlLabels.stacked || 'Stacked', disabled: !multibar.stacked() } + ]; + + controls.width(controlWidth()).color(['#444', '#444', '#444']); + g.select('.nv-controlsWrap') + .datum(controlsData) + .attr('transform', 'translate(0,' + (-margin.top) +')') + .call(controls); + } + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + // Main Chart Component(s) + multibar + .disabled(data.map(function(series) { return series.disabled })) + .width(availableWidth) + .height(availableHeight) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled })); + + var barsWrap = g.select('.nv-barsWrap') + .datum(data.filter(function(d) { return !d.disabled })); + + barsWrap.transition().call(multibar); + + // Setup Axes + if (showXAxis) { + xAxis + .scale(x) + .ticks( nv.utils.calcTicksY(availableHeight/24, data) ) + .tickSize(-availableWidth, 0); + + g.select('.nv-x.nv-axis').call(xAxis); + + var xTicks = g.select('.nv-x.nv-axis').selectAll('g'); + + xTicks + .selectAll('line, text'); + } + + if (showYAxis) { + yAxis + .scale(y) + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize( -availableHeight, 0); + + g.select('.nv-y.nv-axis') + .attr('transform', 'translate(0,' + availableHeight + ')'); + g.select('.nv-y.nv-axis').call(yAxis); + } + + // Zero line + g.select(".nv-zeroLine line") + .attr("x1", y(0)) + .attr("x2", y(0)) + .attr("y1", 0) + .attr("y2", -availableHeight) + ; + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) + state[key] = newState[key]; + dispatch.stateChange(state); + chart.update(); + }); + + controls.dispatch.on('legendClick', function(d,i) { + if (!d.disabled) return; + controlsData = controlsData.map(function(s) { + s.disabled = true; + return s; + }); + d.disabled = false; + + switch (d.key) { + case 'Grouped': + multibar.stacked(false); + break; + case 'Stacked': + multibar.stacked(true); + break; + } + + state.stacked = multibar.stacked(); + dispatch.stateChange(state); + stacked = multibar.stacked(); + + chart.update(); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + // Update chart from a state object passed to event handler + dispatch.on('changeState', function(e) { + + if (typeof e.disabled !== 'undefined') { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + + state.disabled = e.disabled; + } + + if (typeof e.stacked !== 'undefined') { + multibar.stacked(e.stacked); + state.stacked = e.stacked; + stacked = e.stacked; + } + + chart.update(); + }); + }); + renderWatch.renderEnd('multibar horizontal chart immediate'); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + multibar.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + multibar.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.multibar = multibar; + chart.legend = legend; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + chart.state = state; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + showControls: {get: function(){return showControls;}, set: function(_){showControls=_;}}, + controlLabels: {get: function(){return controlLabels;}, set: function(_){controlLabels=_;}}, + showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}}, + showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + multibar.duration(duration); + xAxis.duration(duration); + yAxis.duration(duration); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + }} + }); + + nv.utils.inheritOptions(chart, multibar); + nv.utils.initOptions(chart); + + return chart; +}; +nv.models.multiChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 30, right: 20, bottom: 50, left: 60}, + color = nv.utils.defaultColor(), + width = null, + height = null, + showLegend = true, + tooltips = true, + tooltip = function(key, x, y, e, graph) { + return '

' + key + '

' + + '

' + y + ' at ' + x + '

' + }, + x, + y, + noData = 'No Data Available.', + yDomain1, + yDomain2, + getX = function(d) { return d.x }, + getY = function(d) { return d.y}, + interpolate = 'monotone' + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var x = d3.scale.linear(), + yScale1 = d3.scale.linear(), + yScale2 = d3.scale.linear(), + + lines1 = nv.models.line().yScale(yScale1), + lines2 = nv.models.line().yScale(yScale2), + + bars1 = nv.models.multiBar().stacked(false).yScale(yScale1), + bars2 = nv.models.multiBar().stacked(false).yScale(yScale2), + + stack1 = nv.models.stackedArea().yScale(yScale1), + stack2 = nv.models.stackedArea().yScale(yScale2), + + xAxis = nv.models.axis().scale(x).orient('bottom').tickPadding(5), + yAxis1 = nv.models.axis().scale(yScale1).orient('left'), + yAxis2 = nv.models.axis().scale(yScale2).orient('right'), + + legend = nv.models.legend().height(30), + dispatch = d3.dispatch('tooltipShow', 'tooltipHide'); + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(lines1.x()(e.point, e.pointIndex)), + y = ((e.series.yAxis == 2) ? yAxis2 : yAxis1).tickFormat()(lines1.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, undefined, undefined, offsetElement.offsetParent); + }; + + function chart(selection) { + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + + chart.update = function() { container.transition().call(chart); }; + chart.container = this; + + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + var dataLines1 = data.filter(function(d) {return d.type == 'line' && d.yAxis == 1}); + var dataLines2 = data.filter(function(d) {return d.type == 'line' && d.yAxis == 2}); + var dataBars1 = data.filter(function(d) {return d.type == 'bar' && d.yAxis == 1}); + var dataBars2 = data.filter(function(d) {return d.type == 'bar' && d.yAxis == 2}); + var dataStack1 = data.filter(function(d) {return d.type == 'area' && d.yAxis == 1}); + var dataStack2 = data.filter(function(d) {return d.type == 'area' && d.yAxis == 2}); + + // Display noData message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + var series1 = data.filter(function(d) {return !d.disabled && d.yAxis == 1}) + .map(function(d) { + return d.values.map(function(d,i) { + return { x: d.x, y: d.y } + }) + }); + + var series2 = data.filter(function(d) {return !d.disabled && d.yAxis == 2}) + .map(function(d) { + return d.values.map(function(d,i) { + return { x: d.x, y: d.y } + }) + }); + + x .domain(d3.extent(d3.merge(series1.concat(series2)), function(d) { return d.x } )) + .range([0, availableWidth]); + + var wrap = container.selectAll('g.wrap.multiChart').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'wrap nvd3 multiChart').append('g'); + + gEnter.append('g').attr('class', 'x axis'); + gEnter.append('g').attr('class', 'y1 axis'); + gEnter.append('g').attr('class', 'y2 axis'); + gEnter.append('g').attr('class', 'lines1Wrap'); + gEnter.append('g').attr('class', 'lines2Wrap'); + gEnter.append('g').attr('class', 'bars1Wrap'); + gEnter.append('g').attr('class', 'bars2Wrap'); + gEnter.append('g').attr('class', 'stack1Wrap'); + gEnter.append('g').attr('class', 'stack2Wrap'); + gEnter.append('g').attr('class', 'legendWrap'); + + var g = wrap.select('g'); + + var color_array = data.map(function(d,i) { + return data[i].color || color(d, i); + }); + + if (showLegend) { + legend.color(color_array); + legend.width( availableWidth / 2 ); + + g.select('.legendWrap') + .datum(data.map(function(series) { + series.originalKey = series.originalKey === undefined ? series.key : series.originalKey; + series.key = series.originalKey + (series.yAxis == 1 ? '' : ' (right axis)'); + return series; + })) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + g.select('.legendWrap') + .attr('transform', 'translate(' + ( availableWidth / 2 ) + ',' + (-margin.top) +')'); + } + + lines1 + .width(availableWidth) + .height(availableHeight) + .interpolate(interpolate) + .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'line'})); + lines2 + .width(availableWidth) + .height(availableHeight) + .interpolate(interpolate) + .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'line'})); + bars1 + .width(availableWidth) + .height(availableHeight) + .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'bar'})); + bars2 + .width(availableWidth) + .height(availableHeight) + .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'bar'})); + stack1 + .width(availableWidth) + .height(availableHeight) + .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'area'})); + stack2 + .width(availableWidth) + .height(availableHeight) + .color(color_array.filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'area'})); + + g.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + var lines1Wrap = g.select('.lines1Wrap') + .datum( + dataLines1.filter(function(d){return !d.disabled}) + ); + var bars1Wrap = g.select('.bars1Wrap') + .datum( + dataBars1.filter(function(d){return !d.disabled}) + ); + var stack1Wrap = g.select('.stack1Wrap') + .datum( + dataStack1.filter(function(d){return !d.disabled}) + ); + + var lines2Wrap = g.select('.lines2Wrap') + .datum( + dataLines2.filter(function(d){return !d.disabled}) + ); + var bars2Wrap = g.select('.bars2Wrap') + .datum( + dataBars2.filter(function(d){return !d.disabled}) + ); + var stack2Wrap = g.select('.stack2Wrap') + .datum( + dataStack2.filter(function(d){return !d.disabled}) + ); + + var extraValue1 = dataStack1.length ? dataStack1.map(function(a){return a.values}).reduce(function(a,b){ + return a.map(function(aVal,i){return {x: aVal.x, y: aVal.y + b[i].y}}) + }).concat([{x:0, y:0}]) : [] + var extraValue2 = dataStack2.length ? dataStack2.map(function(a){return a.values}).reduce(function(a,b){ + return a.map(function(aVal,i){return {x: aVal.x, y: aVal.y + b[i].y}}) + }).concat([{x:0, y:0}]) : [] + + yScale1 .domain(yDomain1 || d3.extent(d3.merge(series1).concat(extraValue1), function(d) { return d.y } )) + .range([0, availableHeight]) + + yScale2 .domain(yDomain2 || d3.extent(d3.merge(series2).concat(extraValue2), function(d) { return d.y } )) + .range([0, availableHeight]) + + lines1.yDomain(yScale1.domain()) + bars1.yDomain(yScale1.domain()) + stack1.yDomain(yScale1.domain()) + + lines2.yDomain(yScale2.domain()) + bars2.yDomain(yScale2.domain()) + stack2.yDomain(yScale2.domain()) + + if(dataStack1.length){d3.transition(stack1Wrap).call(stack1);} + if(dataStack2.length){d3.transition(stack2Wrap).call(stack2);} + + if(dataBars1.length){d3.transition(bars1Wrap).call(bars1);} + if(dataBars2.length){d3.transition(bars2Wrap).call(bars2);} + + if(dataLines1.length){d3.transition(lines1Wrap).call(lines1);} + if(dataLines2.length){d3.transition(lines2Wrap).call(lines2);} + + xAxis + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize(-availableHeight, 0); + + g.select('.x.axis') + .attr('transform', 'translate(0,' + availableHeight + ')'); + d3.transition(g.select('.x.axis')) + .call(xAxis); + + yAxis1 + .ticks( nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize( -availableWidth, 0); + + + d3.transition(g.select('.y1.axis')) + .call(yAxis1); + + yAxis2 + .ticks( nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize( -availableWidth, 0); + + d3.transition(g.select('.y2.axis')) + .call(yAxis2); + + g.select('.y1.axis') + .classed('nv-disabled', series1.length ? false : true) + .attr('transform', 'translate(' + x.range()[0] + ',0)'); + + g.select('.y2.axis') + .classed('nv-disabled', series2.length ? false : true) + .attr('transform', 'translate(' + x.range()[1] + ',0)'); + + legend.dispatch.on('stateChange', function(newState) { + chart.update(); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + }); + + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + lines1.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + lines1.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + lines2.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + lines2.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + bars1.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + bars1.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + bars2.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + bars2.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + stack1.dispatch.on('tooltipShow', function(e) { + //disable tooltips when value ~= 0 + //// TODO: consider removing points from voronoi that have 0 value instead of this hack + if (!Math.round(stack1.y()(e.point) * 100)) { // 100 will not be good for very small numbers... will have to think about making this valu dynamic, based on data range + setTimeout(function() { d3.selectAll('.point.hover').classed('hover', false) }, 0); + return false; + } + + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top], + dispatch.tooltipShow(e); + }); + + stack1.dispatch.on('tooltipHide', function(e) { + dispatch.tooltipHide(e); + }); + + stack2.dispatch.on('tooltipShow', function(e) { + //disable tooltips when value ~= 0 + //// TODO: consider removing points from voronoi that have 0 value instead of this hack + if (!Math.round(stack2.y()(e.point) * 100)) { // 100 will not be good for very small numbers... will have to think about making this valu dynamic, based on data range + setTimeout(function() { d3.selectAll('.point.hover').classed('hover', false) }, 0); + return false; + } + + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top], + dispatch.tooltipShow(e); + }); + + stack2.dispatch.on('tooltipHide', function(e) { + dispatch.tooltipHide(e); + }); + + lines1.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + lines1.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + lines2.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + lines2.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Global getters and setters + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.lines1 = lines1; + chart.lines2 = lines2; + chart.bars1 = bars1; + chart.bars2 = bars2; + chart.stack1 = stack1; + chart.stack2 = stack2; + chart.xAxis = xAxis; + chart.yAxis1 = yAxis1; + chart.yAxis2 = yAxis2; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + yDomain1: {get: function(){return yDomain1;}, set: function(_){yDomain1=_;}}, + yDomain2: {get: function(){return yDomain2;}, set: function(_){yDomain2=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + interpolate: {get: function(){return interpolate;}, set: function(_){interpolate=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }}, + x: {get: function(){return getX;}, set: function(_){ + getX = _; + lines1.x(_); + bars1.x(_); + }}, + y: {get: function(){return getY;}, set: function(_){ + getY = _; + lines1.y(_); + bars1.y(_); + }} + }); + + nv.utils.initOptions(chart); + + return chart; +}; + + +nv.models.ohlcBar = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = null + , height = null + , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one + , x = d3.scale.linear() + , y = d3.scale.linear() + , getX = function(d) { return d.x } + , getY = function(d) { return d.y } + , getOpen = function(d) { return d.open } + , getClose = function(d) { return d.close } + , getHigh = function(d) { return d.high } + , getLow = function(d) { return d.low } + , forceX = [] + , forceY = [] + , padData = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar chart + , clipEdge = true + , color = nv.utils.defaultColor() + , interactive = false + , xDomain + , yDomain + , xRange + , yRange + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd', 'chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + function chart(selection) { + selection.each(function(data) { + var container = d3.select(this); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right; + var availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + nv.utils.initSVG(container); + + // Setup Scales + x.domain(xDomain || d3.extent(data[0].values.map(getX).concat(forceX) )); + + if (padData) + x.range(xRange || [availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5) / data[0].values.length ]); + else + x.range(xRange || [0, availableWidth]); + + y.domain(yDomain || [ + d3.min(data[0].values.map(getLow).concat(forceY)), + d3.max(data[0].values.map(getHigh).concat(forceY)) + ] + ).range(yRange || [availableHeight, 0]); + + // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point + if (x.domain()[0] === x.domain()[1]) + x.domain()[0] ? + x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01]) + : x.domain([-1,1]); + + if (y.domain()[0] === y.domain()[1]) + y.domain()[0] ? + y.domain([y.domain()[0] + y.domain()[0] * 0.01, y.domain()[1] - y.domain()[1] * 0.01]) + : y.domain([-1,1]); + + // Setup containers and skeleton of chart + var wrap = d3.select(this).selectAll('g.nv-wrap.nv-ohlcBar').data([data[0].values]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-ohlcBar'); + var defsEnter = wrapEnter.append('defs'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-ticks'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + container + .on('click', function(d,i) { + dispatch.chartClick({ + data: d, + index: i, + pos: d3.event, + id: id + }); + }); + + defsEnter.append('clipPath') + .attr('id', 'nv-chart-clip-path-' + id) + .append('rect'); + + wrap.select('#nv-chart-clip-path-' + id + ' rect') + .attr('width', availableWidth) + .attr('height', availableHeight); + + g .attr('clip-path', clipEdge ? 'url(#nv-chart-clip-path-' + id + ')' : ''); + + var ticks = wrap.select('.nv-ticks').selectAll('.nv-tick') + .data(function(d) { return d }); + ticks.exit().remove(); + + var ticksEnter = ticks.enter().append('path') + .attr('class', function(d,i,j) { return (getOpen(d,i) > getClose(d,i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-' + i }) + .attr('d', function(d,i) { + var w = (availableWidth / data[0].values.length) * .9; + return 'm0,0l0,' + + (y(getOpen(d,i)) + - y(getHigh(d,i))) + + 'l' + + (-w/2) + + ',0l' + + (w/2) + + ',0l0,' + + (y(getLow(d,i)) - y(getOpen(d,i))) + + 'l0,' + + (y(getClose(d,i)) + - y(getLow(d,i))) + + 'l' + + (w/2) + + ',0l' + + (-w/2) + + ',0z'; + }) + .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',' + y(getHigh(d,i)) + ')'; }) + .attr('fill', function(d,i) { return color[0]; }) + .attr('stroke', function(d,i) { return color[0]; }) + .attr('x', 0 ) + .attr('y', function(d,i) { return y(Math.max(0, getY(d,i))) }) + .attr('height', function(d,i) { return Math.abs(y(getY(d,i)) - y(0)) }); + + // the bar colors are controlled by CSS currently + ticks.attr('class', function(d,i,j) { + return (getOpen(d,i) > getClose(d,i) ? 'nv-tick negative' : 'nv-tick positive') + ' nv-tick-' + j + '-' + i; + }); + + d3.transition(ticks) + .attr('transform', function(d,i) { return 'translate(' + x(getX(d,i)) + ',' + y(getHigh(d,i)) + ')'; }) + .attr('d', function(d,i) { + var w = (availableWidth / data[0].values.length) * .9; + return 'm0,0l0,' + + (y(getOpen(d,i)) + - y(getHigh(d,i))) + + 'l' + + (-w/2) + + ',0l' + + (w/2) + + ',0l0,' + + (y(getLow(d,i)) + - y(getOpen(d,i))) + + 'l0,' + + (y(getClose(d,i)) + - y(getLow(d,i))) + + 'l' + + (w/2) + + ',0l' + + (-w/2) + + ',0z'; + }); + }); + + return chart; + } + + + //Create methods to allow outside functions to highlight a specific bar. + chart.highlightPoint = function(pointIndex, isHoverOver) { + chart.clearHighlights(); + d3.select(".nv-ohlcBar .nv-tick-0-" + pointIndex) + .classed("hover", isHoverOver) + ; + }; + + chart.clearHighlights = function() { + d3.select(".nv-ohlcBar .nv-tick.hover") + .classed("hover", false) + ; + }; + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + xScale: {get: function(){return x;}, set: function(_){x=_;}}, + yScale: {get: function(){return y;}, set: function(_){y=_;}}, + xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}}, + yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}}, + xRange: {get: function(){return xRange;}, set: function(_){xRange=_;}}, + yRange: {get: function(){return yRange;}, set: function(_){yRange=_;}}, + forceX: {get: function(){return forceX;}, set: function(_){forceX=_;}}, + forceY: {get: function(){return forceY;}, set: function(_){forceY=_;}}, + padData: {get: function(){return padData;}, set: function(_){padData=_;}}, + clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}}, + id: {get: function(){return id;}, set: function(_){id=_;}}, + interactive: {get: function(){return interactive;}, set: function(_){interactive=_;}}, + + x: {get: function(){return getX;}, set: function(_){getX=_;}}, + y: {get: function(){return getY;}, set: function(_){getY=_;}}, + open: {get: function(){return getOpen();}, set: function(_){getOpen=_;}}, + close: {get: function(){return getClose();}, set: function(_){getClose=_;}}, + high: {get: function(){return getHigh;}, set: function(_){getHigh=_;}}, + low: {get: function(){return getLow;}, set: function(_){getLow=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top != undefined ? _.top : margin.top; + margin.right = _.right != undefined ? _.right : margin.right; + margin.bottom = _.bottom != undefined ? _.bottom : margin.bottom; + margin.left = _.left != undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }} + }); + + nv.utils.initOptions(chart); + return chart; +}; + +// Code adapted from Jason Davies' "Parallel Coordinates" +// http://bl.ocks.org/jasondavies/1341281 + +nv.models.parallelCoordinates = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 30, right: 10, bottom: 10, left: 10} + , width = null + , height = null + , x = d3.scale.ordinal() + , y = {} + , dimensions = [] + , color = nv.utils.defaultColor() + , filters = [] + , active = [] + , dispatch = d3.dispatch('brush') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + function chart(selection) { + selection.each(function(data) { + var container = d3.select(this); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right; + var availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + nv.utils.initSVG(container); + + active = data; //set all active before first brush call + + //This is a placeholder until this chart is made resizeable + chart.update = function() { }; + + // Setup Scales + x.rangePoints([0, availableWidth], 1).domain(dimensions); + + // Extract the list of dimensions and create a scale for each. + dimensions.forEach(function(d) { + y[d] = d3.scale.linear() + .domain(d3.extent(data, function(p) { return +p[d]; })) + .range([availableHeight, 0]); + + y[d].brush = d3.svg.brush().y(y[d]).on('brush', brush); + + return d != 'name'; + }); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-parallelCoordinates').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-parallelCoordinates'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-parallelCoordinatesWrap'); + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + var line = d3.svg.line(), + axis = d3.svg.axis().orient('left'), + background, + foreground; + + // Add grey background lines for context. + background = gEnter.append('g') + .attr('class', 'background') + .selectAll('path') + .data(data) + .enter().append('path') + .attr('d', path) + ; + + // Add blue foreground lines for focus. + foreground = gEnter.append('g') + .attr('class', 'foreground') + .selectAll('path') + .data(data) + .enter().append('path') + .attr('d', path) + .attr('stroke', color) + ; + + // Add a group element for each dimension. + var dimension = g.selectAll('.dimension') + .data(dimensions) + .enter().append('g') + .attr('class', 'dimension') + .attr('transform', function(d) { return 'translate(' + x(d) + ',0)'; }); + + // Add an axis and title. + dimension.append('g') + .attr('class', 'axis') + .each(function(d) { d3.select(this).call(axis.scale(y[d])); }) + .append('text') + .attr('text-anchor', 'middle') + .attr('y', -9) + .text(String); + + // Add and store a brush for each axis. + dimension.append('g') + .attr('class', 'brush') + .each(function(d) { d3.select(this).call(y[d].brush); }) + .selectAll('rect') + .attr('x', -8) + .attr('width', 16); + + // Returns the path for a given data point. + function path(d) { + return line(dimensions.map(function(p) { return [x(p), y[p](d[p])]; })); + } + + // Handles a brush event, toggling the display of foreground lines. + function brush() { + var actives = dimensions.filter(function(p) { return !y[p].brush.empty(); }), + extents = actives.map(function(p) { return y[p].brush.extent(); }); + + filters = []; //erase current filters + actives.forEach(function(d,i) { + filters[i] = { + dimension: d, + extent: extents[i] + } + }); + + active = []; //erase current active list + foreground.style('display', function(d) { + var isActive = actives.every(function(p, i) { + return extents[i][0] <= d[p] && d[p] <= extents[i][1]; + }); + if (isActive) active.push(d); + return isActive ? null : 'none'; + }); + + dispatch.brush({ + filters: filters, + active: active + }); + } + }); + + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + dimensions: {get: function(){return dimensions;}, set: function(_){dimensions=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = typeof _.top != 'undefined' ? _.top : margin.top; + margin.right = typeof _.right != 'undefined' ? _.right : margin.right; + margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom; + margin.left = typeof _.left != 'undefined' ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }} + }); + + nv.utils.initOptions(chart); + return chart; +}; +nv.models.pie = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = 500 + , height = 500 + , getX = function(d) { return d.x } + , getY = function(d) { return d.y } + , id = Math.floor(Math.random() * 10000) //Create semi-unique ID in case user doesn't select one + , color = nv.utils.defaultColor() + , valueFormat = d3.format(',.2f') + , labelFormat = d3.format('%') + , showLabels = true + , pieLabelsOutside = true + , donutLabelsOutside = false + , labelType = "key" + , labelThreshold = .02 //if slice percentage is under this, don't show label + , donut = false + , title = false + , growOnHover = true + , titleOffset = 0 + , labelSunbeamLayout = false + , startAngle = false + , padAngle = false + , endAngle = false + , cornerRadius = 0 + , donutRatio = 0.5 + , duration = 250 + , dispatch = d3.dispatch('chartClick', 'elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'renderEnd') + ; + + + //============================================================ + // chart function + //------------------------------------------------------------ + + var renderWatch = nv.utils.renderWatch(dispatch); + + function chart(selection) { + renderWatch.reset(); + selection.each(function(data) { + var availableWidth = width - margin.left - margin.right + ,availableHeight = height - margin.top - margin.bottom + ,radius = Math.min(availableWidth, availableHeight) / 2 + ,arcRadius = radius-(radius / 5) + ,container = d3.select(this) + ; + nv.utils.initSVG(container); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('.nv-wrap.nv-pie').data(data); + var wrapEnter = wrap.enter().append('g').attr('class','nvd3 nv-wrap nv-pie nv-chart-' + id); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + var g_pie = gEnter.append('g').attr('class', 'nv-pie'); + gEnter.append('g').attr('class', 'nv-pieLabels'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + g.select('.nv-pie').attr('transform', 'translate(' + availableWidth / 2 + ',' + availableHeight / 2 + ')'); + g.select('.nv-pieLabels').attr('transform', 'translate(' + availableWidth / 2 + ',' + availableHeight / 2 + ')'); + + // + container.on('click', function(d,i) { + dispatch.chartClick({ + data: d, + index: i, + pos: d3.event, + id: id + }); + }); + + + var arc = d3.svg.arc().outerRadius(arcRadius); + var arcOver = d3.svg.arc().outerRadius(arcRadius + 5); + + if (startAngle) { + arc.startAngle(startAngle); + arcOver.startAngle(startAngle); + } + if (endAngle) { + arc.endAngle(endAngle); + arcOver.endAngle(endAngle); + } + if (donut) { + arc.innerRadius(radius * donutRatio); + arcOver.innerRadius(radius * donutRatio); + } + + // Setup the Pie chart and choose the data element + var pie = d3.layout.pie() + .sort(null) + .value(function(d) { return d.disabled ? 0 : getY(d) }); + + // padAngle added in d3 3.5 + if (pie.padAngle && padAngle) { + pie.padAngle(padAngle); + } + + if (arc.cornerRadius && cornerRadius) { + arc.cornerRadius(cornerRadius); + arcOver.cornerRadius(cornerRadius); + } + + // if title is specified and donut, put it in the middle + if (donut && title) { + var title_g = g_pie.append('g').attr('class', 'nv-pie'); + + title_g.append("text") + .style("text-anchor", "middle") + .attr('class', 'nv-pie-title') + .text(function (d) { + return title; + }) + .attr("dy", "0.35em") // trick to vertically center text + .attr('transform', function(d, i) { + return 'translate(0, '+ titleOffset + ')'; + }); + } + + var slices = wrap.select('.nv-pie').selectAll('.nv-slice').data(pie); + var pieLabels = wrap.select('.nv-pieLabels').selectAll('.nv-label').data(pie); + + slices.exit().remove(); + pieLabels.exit().remove(); + + var ae = slices.enter().append('g') + ae.attr('class', 'nv-slice') + ae.on('mouseover', function(d,i){ + d3.select(this).classed('hover', true); + if (growOnHover) { + d3.select(this).select("path").transition() + .duration(70) + .attr("d", arcOver); + } + dispatch.elementMouseover({ + label: getX(d.data), + value: getY(d.data), + point: d.data, + pointIndex: i, + pos: [d3.event.pageX, d3.event.pageY], + id: id, + color: d3.select(this).style("fill") + }); + }); + ae.on('mouseout', function(d,i){ + d3.select(this).classed('hover', false); + if (growOnHover) { + d3.select(this).select("path").transition() + .duration(50) + .attr("d", arc); + } + dispatch.elementMouseout({ + label: getX(d.data), + value: getY(d.data), + point: d.data, + index: i, + id: id + }); + }); + + slices.attr('fill', function(d,i) { return color(d, i); }) + slices.attr('stroke', function(d,i) { return color(d, i); }); + + var paths = ae.append('path').each(function(d) { + this._current = d; + }); + + paths.on('click', function(d,i) { + dispatch.elementClick({ + label: getX(d.data), + value: getY(d.data), + point: d.data, + index: i, + pos: d3.event, + id: id + }); + d3.event.stopPropagation(); + }); + paths.on('dblclick', function(d,i) { + dispatch.elementDblClick({ + label: getX(d.data), + value: getY(d.data), + point: d.data, + index: i, + pos: d3.event, + id: id + }); + d3.event.stopPropagation(); + }); + slices.select('path') + .transition() + .attr('d', arc) + .attrTween('d', arcTween); + + if (showLabels) { + // This does the normal label + var labelsArc = d3.svg.arc().innerRadius(0); + + if (pieLabelsOutside){ + var labelsArc = arc; + } + + if (donutLabelsOutside) { + labelsArc = d3.svg.arc().outerRadius(arc.outerRadius()); + } + + pieLabels.enter().append("g").classed("nv-label",true).each(function(d,i) { + var group = d3.select(this); + + group.attr('transform', function(d) { + if (labelSunbeamLayout) { + d.outerRadius = arcRadius + 10; // Set Outer Coordinate + d.innerRadius = arcRadius + 15; // Set Inner Coordinate + var rotateAngle = (d.startAngle + d.endAngle) / 2 * (180 / Math.PI); + if ((d.startAngle+d.endAngle)/2 < Math.PI) { + rotateAngle -= 90; + } else { + rotateAngle += 90; + } + return 'translate(' + labelsArc.centroid(d) + ') rotate(' + rotateAngle + ')'; + } else { + d.outerRadius = radius + 10; // Set Outer Coordinate + d.innerRadius = radius + 15; // Set Inner Coordinate + return 'translate(' + labelsArc.centroid(d) + ')' + } + }); + + group.append('rect') + .style('stroke', '#fff') + .style('fill', '#fff') + .attr("rx", 3) + .attr("ry", 3); + + group.append('text') + .style('text-anchor', labelSunbeamLayout ? ((d.startAngle + d.endAngle) / 2 < Math.PI ? 'start' : 'end') : 'middle') //center the text on it's origin or begin/end if orthogonal aligned + .style('fill', '#000') + + }); + + var labelLocationHash = {}; + var avgHeight = 14; + var avgWidth = 140; + var createHashKey = function(coordinates) { + return Math.floor(coordinates[0]/avgWidth) * avgWidth + ',' + Math.floor(coordinates[1]/avgHeight) * avgHeight; + }; + + pieLabels.watchTransition(renderWatch,'pie labels').attr('transform', function(d) { + if (labelSunbeamLayout) { + d.outerRadius = arcRadius + 10; // Set Outer Coordinate + d.innerRadius = arcRadius + 15; // Set Inner Coordinate + var rotateAngle = (d.startAngle + d.endAngle) / 2 * (180 / Math.PI); + if ((d.startAngle+d.endAngle)/2 < Math.PI) { + rotateAngle -= 90; + } else { + rotateAngle += 90; + } + return 'translate(' + labelsArc.centroid(d) + ') rotate(' + rotateAngle + ')'; + } else { + d.outerRadius = radius + 10; // Set Outer Coordinate + d.innerRadius = radius + 15; // Set Inner Coordinate + + /* + Overlapping pie labels are not good. What this attempts to do is, prevent overlapping. + Each label location is hashed, and if a hash collision occurs, we assume an overlap. + Adjust the label's y-position to remove the overlap. + */ + var center = labelsArc.centroid(d); + if(d.value){ + var hashKey = createHashKey(center); + if (labelLocationHash[hashKey]) { + center[1] -= avgHeight; + } + labelLocationHash[createHashKey(center)] = true; + } + return 'translate(' + center + ')' + } + }); + + pieLabels.select(".nv-label text") + .style('text-anchor', labelSunbeamLayout ? ((d.startAngle + d.endAngle) / 2 < Math.PI ? 'start' : 'end') : 'middle') //center the text on it's origin or begin/end if orthogonal aligned + .text(function(d, i) { + var percent = (d.endAngle - d.startAngle) / (2 * Math.PI); + var labelTypes = { + "key" : getX(d.data), + "value": getY(d.data), + "percent": labelFormat(percent) + }; + return (d.value && percent > labelThreshold) ? labelTypes[labelType] : ''; + }) + ; + } + + + // Computes the angle of an arc, converting from radians to degrees. + function angle(d) { + var a = (d.startAngle + d.endAngle) * 90 / Math.PI - 90; + return a > 90 ? a - 180 : a; + } + + function arcTween(a) { + a.endAngle = isNaN(a.endAngle) ? 0 : a.endAngle; + a.startAngle = isNaN(a.startAngle) ? 0 : a.startAngle; + if (!donut) a.innerRadius = 0; + var i = d3.interpolate(this._current, a); + this._current = i(0); + return function(t) { + return arc(i(t)); + }; + } + }); + + renderWatch.renderEnd('pie immediate'); + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showLabels: {get: function(){return showLabels;}, set: function(_){showLabels=_;}}, + title: {get: function(){return title;}, set: function(_){title=_;}}, + titleOffset: {get: function(){return titleOffset;}, set: function(_){titleOffset=_;}}, + labelThreshold: {get: function(){return labelThreshold;}, set: function(_){labelThreshold=_;}}, + labelFormat: {get: function(){return labelFormat;}, set: function(_){labelFormat=_;}}, + valueFormat: {get: function(){return valueFormat;}, set: function(_){valueFormat=_;}}, + x: {get: function(){return getX;}, set: function(_){getX=_;}}, + id: {get: function(){return id;}, set: function(_){id=_;}}, + endAngle: {get: function(){return endAngle;}, set: function(_){endAngle=_;}}, + startAngle: {get: function(){return startAngle;}, set: function(_){startAngle=_;}}, + padAngle: {get: function(){return padAngle;}, set: function(_){padAngle=_;}}, + cornerRadius: {get: function(){return cornerRadius;}, set: function(_){cornerRadius=_;}}, + donutRatio: {get: function(){return donutRatio;}, set: function(_){donutRatio=_;}}, + pieLabelsOutside: {get: function(){return pieLabelsOutside;}, set: function(_){pieLabelsOutside=_;}}, + donutLabelsOutside: {get: function(){return donutLabelsOutside;}, set: function(_){donutLabelsOutside=_;}}, + labelSunbeamLayout: {get: function(){return labelSunbeamLayout;}, set: function(_){labelSunbeamLayout=_;}}, + donut: {get: function(){return donut;}, set: function(_){donut=_;}}, + growOnHover: {get: function(){return growOnHover;}, set: function(_){growOnHover=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = typeof _.top != 'undefined' ? _.top : margin.top; + margin.right = typeof _.right != 'undefined' ? _.right : margin.right; + margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom; + margin.left = typeof _.left != 'undefined' ? _.left : margin.left; + }}, + y: {get: function(){return getY;}, set: function(_){ + getY=d3.functor(_); + }}, + color: {get: function(){return color;}, set: function(_){ + color=nv.utils.getColor(_); + }}, + labelType: {get: function(){return labelType;}, set: function(_){ + labelType= _ || 'key'; + }} + }); + + nv.utils.initOptions(chart); + return chart; +}; +nv.models.pieChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var pie = nv.models.pie(); + var legend = nv.models.legend(); + + var margin = {top: 30, right: 20, bottom: 20, left: 20} + , width = null + , height = null + , showLegend = true + , color = nv.utils.defaultColor() + , tooltips = true + , tooltip = function(key, y, e, graph) { + return '

' + key + '

' + + '

' + y + '

'; + } + , state = nv.utils.state() + , defaultState = null + , noData = "No Data Available." + , duration = 250 + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState','renderEnd') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var showTooltip = function(e, offsetElement) { + var tooltipLabel = pie.x()(e.point); + var left = e.pos[0] + ( (offsetElement && offsetElement.offsetLeft) || 0 ), + top = e.pos[1] + ( (offsetElement && offsetElement.offsetTop) || 0), + y = pie.valueFormat()(pie.y()(e.point)), + content = tooltip(tooltipLabel, y, e, chart) + ; + nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's', null, offsetElement); + }; + + var renderWatch = nv.utils.renderWatch(dispatch); + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }) + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.active !== undefined) { + data.forEach(function (series, i) { + series.disabled = !state.active[i]; + }); + } + } + }; + + //============================================================ + // Chart function + //------------------------------------------------------------ + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(pie); + + selection.each(function(data) { + var container = d3.select(this); + nv.utils.initSVG(container); + + var that = this; + var availableWidth = (width || parseInt(container.style('width'), 10) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height'), 10) || 400) + - margin.top - margin.bottom + ; + + chart.update = function() { container.transition().call(chart); }; + chart.container = this; + + state.setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + //set state.disabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display No Data message if there's nothing to show. + if (!data || !data.length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-pieChart').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-pieChart').append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-pieWrap'); + gEnter.append('g').attr('class', 'nv-legendWrap'); + + // Legend + if (showLegend) { + legend.width( availableWidth ).key(pie.x()); + + wrap.select('.nv-legendWrap') + .datum(data) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + wrap.select('.nv-legendWrap') + .attr('transform', 'translate(0,' + (-margin.top) +')'); + } + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + // Main Chart Component(s) + pie.width(availableWidth).height(availableHeight); + var pieWrap = g.select('.nv-pieWrap').datum([data]); + d3.transition(pieWrap).call(pie); + + // Event Handling/Dispatching (in chart's scope) + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) { + state[key] = newState[key]; + } + dispatch.stateChange(state); + chart.update(); + }); + + pie.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + // Update chart from a state object passed to event handler + dispatch.on('changeState', function(e) { + if (typeof e.disabled !== 'undefined') { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + state.disabled = e.disabled; + } + chart.update(); + }); + + }); + + renderWatch.renderEnd('pieChart immediate'); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + pie.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.legend = legend; + chart.dispatch = dispatch; + chart.pie = pie; + chart.options = nv.utils.optionsFunc.bind(chart); + + // use Object get/set functionality to map between vars and chart functions + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + // options that require extra logic in the setter + color: {get: function(){return color;}, set: function(_){ + color = _; + legend.color(color); + pie.color(color); + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + }} + }); + nv.utils.inheritOptions(chart, pie); + nv.utils.initOptions(chart); + return chart; +}; + +nv.models.scatter = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = null + , height = null + , color = nv.utils.defaultColor() // chooses color + , id = Math.floor(Math.random() * 100000) //Create semi-unique ID incase user doesn't select one + , x = d3.scale.linear() + , y = d3.scale.linear() + , z = d3.scale.linear() //linear because d3.svg.shape.size is treated as area + , getX = function(d) { return d.x } // accessor to get the x value + , getY = function(d) { return d.y } // accessor to get the y value + , getSize = function(d) { return d.size || 1} // accessor to get the point size + , getShape = function(d) { return d.shape || 'circle' } // accessor to get point shape + , forceX = [] // List of numbers to Force into the X scale (ie. 0, or a max / min, etc.) + , forceY = [] // List of numbers to Force into the Y scale + , forceSize = [] // List of numbers to Force into the Size scale + , interactive = true // If true, plots a voronoi overlay for advanced point intersection + , pointActive = function(d) { return !d.notActive } // any points that return false will be filtered out + , padData = false // If true, adds half a data points width to front and back, for lining up a line chart with a bar chart + , padDataOuter = .1 //outerPadding to imitate ordinal scale outer padding + , clipEdge = false // if true, masks points within x and y scale + , clipVoronoi = true // if true, masks each point with a circle... can turn off to slightly increase performance + , clipRadius = function() { return 25 } // function to get the radius for voronoi point clips + , xDomain = null // Override x domain (skips the calculation from data) + , yDomain = null // Override y domain + , xRange = null // Override x range + , yRange = null // Override y range + , sizeDomain = null // Override point size domain + , sizeRange = null + , singlePoint = false + , dispatch = d3.dispatch('elementClick', 'elementDblClick', 'elementMouseover', 'elementMouseout', 'renderEnd') + , useVoronoi = true + , duration = 250 + ; + + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var x0, y0, z0 // used to store previous scales + , timeoutID + , needsUpdate = false // Flag for when the points are visually updating, but the interactive layer is behind, to disable tooltips + , renderWatch = nv.utils.renderWatch(dispatch, duration) + ; + + function chart(selection) { + renderWatch.reset(); + selection.each(function(data) { + var container = d3.select(this); + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right; + var availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + nv.utils.initSVG(container); + + //add series index to each data point for reference + data.forEach(function(series, i) { + series.values.forEach(function(point) { + point.series = i; + }); + }); + + // Setup Scales + // remap and flatten the data for use in calculating the scales' domains + var seriesData = (xDomain && yDomain && sizeDomain) ? [] : // if we know xDomain and yDomain and sizeDomain, no need to calculate.... if Size is constant remember to set sizeDomain to speed up performance + d3.merge( + data.map(function(d) { + return d.values.map(function(d,i) { + return { x: getX(d,i), y: getY(d,i), size: getSize(d,i) } + }) + }) + ); + + x .domain(xDomain || d3.extent(seriesData.map(function(d) { return d.x; }).concat(forceX))) + + if (padData && data[0]) + x.range(xRange || [(availableWidth * padDataOuter + availableWidth) / (2 *data[0].values.length), availableWidth - availableWidth * (1 + padDataOuter) / (2 * data[0].values.length) ]); + //x.range([availableWidth * .5 / data[0].values.length, availableWidth * (data[0].values.length - .5) / data[0].values.length ]); + else + x.range(xRange || [0, availableWidth]); + + y .domain(yDomain || d3.extent(seriesData.map(function(d) { return d.y }).concat(forceY))) + .range(yRange || [availableHeight, 0]); + + z .domain(sizeDomain || d3.extent(seriesData.map(function(d) { return d.size }).concat(forceSize))) + .range(sizeRange || [16, 256]); + + // If scale's domain don't have a range, slightly adjust to make one... so a chart can show a single data point + if (x.domain()[0] === x.domain()[1] || y.domain()[0] === y.domain()[1]) singlePoint = true; + if (x.domain()[0] === x.domain()[1]) + x.domain()[0] ? + x.domain([x.domain()[0] - x.domain()[0] * 0.01, x.domain()[1] + x.domain()[1] * 0.01]) + : x.domain([-1,1]); + + if (y.domain()[0] === y.domain()[1]) + y.domain()[0] ? + y.domain([y.domain()[0] - y.domain()[0] * 0.01, y.domain()[1] + y.domain()[1] * 0.01]) + : y.domain([-1,1]); + + if ( isNaN(x.domain()[0])) { + x.domain([-1,1]); + } + + if ( isNaN(y.domain()[0])) { + y.domain([-1,1]); + } + + x0 = x0 || x; + y0 = y0 || y; + z0 = z0 || z; + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-scatter').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-scatter nv-chart-' + id + (singlePoint ? ' nv-single-point' : '')); + var defsEnter = wrapEnter.append('defs'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-groups'); + gEnter.append('g').attr('class', 'nv-point-paths'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + defsEnter.append('clipPath') + .attr('id', 'nv-edge-clip-' + id) + .append('rect'); + + wrap.select('#nv-edge-clip-' + id + ' rect') + .attr('width', availableWidth) + .attr('height', (availableHeight > 0) ? availableHeight : 0); + + g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : ''); + + function updateInteractiveLayer() { + + if (!interactive) return false; + + var eventElements; + + var vertices = d3.merge(data.map(function(group, groupIndex) { + return group.values + .map(function(point, pointIndex) { + // *Adding noise to make duplicates very unlikely + // *Injecting series and point index for reference + /* *Adding a 'jitter' to the points, because there's an issue in d3.geom.voronoi. + */ + var pX = getX(point,pointIndex); + var pY = getY(point,pointIndex); + + return [x(pX)+ Math.random() * 1e-7, + y(pY)+ Math.random() * 1e-7, + groupIndex, + pointIndex, point]; //temp hack to add noise untill I think of a better way so there are no duplicates + }) + .filter(function(pointArray, pointIndex) { + return pointActive(pointArray[4], pointIndex); // Issue #237.. move filter to after map, so pointIndex is correct! + }) + }) + ); + + //inject series and point index for reference into voronoi + if (useVoronoi === true) { + + if(vertices.length < 3) { + // Issue #283 - Adding 2 dummy points to the voronoi b/c voronoi requires min 3 points to work + vertices.push([x.range()[0] - 20, y.range()[0] - 20, null, null]); + vertices.push([x.range()[1] + 20, y.range()[1] + 20, null, null]); + vertices.push([x.range()[0] - 20, y.range()[0] + 20, null, null]); + vertices.push([x.range()[1] + 20, y.range()[1] - 20, null, null]); + } + + // keep voronoi sections from going more than 10 outside of graph + // to avoid overlap with other things like legend etc + var bounds = d3.geom.polygon([ + [-10,-10], + [-10,height + 10], + [width + 10,height + 10], + [width + 10,-10] + ]); + + var voronoi = d3.geom.voronoi(vertices).map(function(d, i) { + return { + 'data': bounds.clip(d), + 'series': vertices[i][2], + 'point': vertices[i][3] + } + }); + + // nuke all voronoi paths on reload and recreate them + wrap.select('.nv-point-paths').selectAll('path').remove(); + var pointPaths = wrap.select('.nv-point-paths').selectAll('path').data(voronoi); + pointPaths + .enter().append("svg:path") + .attr("d", function(d) { + if (!d || !d.data || d.data.length === 0) + return 'M 0 0'; + else + return "M" + d.data.join(",") + "Z"; + }) + .attr("id", function(d,i) { + return "nv-path-"+i; }) + .attr("clip-path", function(d,i) { return "url(#nv-clip-"+i+")"; }) + ; + // chain these to above to see the voronoi elements (good for debugging) + //.style("fill", d3.rgb(230, 230, 230)) + //.style('fill-opacity', 0.4) + //.style('stroke-opacity', 1) + //.style("stroke", d3.rgb(200,200,200)); + + if (clipVoronoi) { + // voronoi sections are already set to clip, + // just create the circles with the IDs they expect + var clips = wrap.append("svg:g").attr("id", "nv-point-clips"); + clips.selectAll("clipPath") + .data(vertices) + .enter().append("svg:clipPath") + .attr("id", function(d, i) { return "nv-clip-"+i;}) + .append("svg:circle") + .attr('cx', function(d) { return d[0]; }) + .attr('cy', function(d) { return d[1]; }) + .attr('r', clipRadius); + } + + var mouseEventCallback = function(d,mDispatch) { + if (needsUpdate) return 0; + var series = data[d.series]; + if (typeof series === 'undefined') return; + var point = series.values[d.point]; + + mDispatch({ + point: point, + series: series, + pos: [x(getX(point, d.point)) + margin.left, y(getY(point, d.point)) + margin.top], + seriesIndex: d.series, + pointIndex: d.point + }); + }; + + pointPaths + .on('click', function(d) { + mouseEventCallback(d, dispatch.elementClick); + }) + .on('dblclick', function(d) { + mouseEventCallback(d, dispatch.elementDblClick); + }) + .on('mouseover', function(d) { + mouseEventCallback(d, dispatch.elementMouseover); + }) + .on('mouseout', function(d, i) { + mouseEventCallback(d, dispatch.elementMouseout); + }); + + } else { + /* + // bring data in form needed for click handlers + var dataWithPoints = vertices.map(function(d, i) { + return { + 'data': d, + 'series': vertices[i][2], + 'point': vertices[i][3] + } + }); + */ + + // add event handlers to points instead voronoi paths + wrap.select('.nv-groups').selectAll('.nv-group') + .selectAll('.nv-point') + //.data(dataWithPoints) + //.style('pointer-events', 'auto') // recativate events, disabled by css + .on('click', function(d,i) { + //nv.log('test', d, i); + if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point + var series = data[d.series], + point = series.values[i]; + + dispatch.elementClick({ + point: point, + series: series, + pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top], + seriesIndex: d.series, + pointIndex: i + }); + }) + .on('mouseover', function(d,i) { + if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point + var series = data[d.series], + point = series.values[i]; + + dispatch.elementMouseover({ + point: point, + series: series, + pos: [x(getX(point, i)) + margin.left, y(getY(point, i)) + margin.top], + seriesIndex: d.series, + pointIndex: i + }); + }) + .on('mouseout', function(d,i) { + if (needsUpdate || !data[d.series]) return 0; //check if this is a dummy point + var series = data[d.series], + point = series.values[i]; + + dispatch.elementMouseout({ + point: point, + series: series, + seriesIndex: d.series, + pointIndex: i + }); + }); + } + + needsUpdate = false; + } + + needsUpdate = true; + var groups = wrap.select('.nv-groups').selectAll('.nv-group') + .data(function(d) { return d }, function(d) { return d.key }); + groups.enter().append('g') + .style('stroke-opacity', 1e-6) + .style('fill-opacity', 1e-6); + groups.exit() + .remove(); + groups + .attr('class', function(d,i) { return 'nv-group nv-series-' + i }) + .classed('hover', function(d) { return d.hover }); + groups.watchTransition(renderWatch, 'scatter: groups') + .style('fill', function(d,i) { return color(d, i) }) + .style('stroke', function(d,i) { return color(d, i) }) + .style('stroke-opacity', 1) + .style('fill-opacity', .5); + + // create the points + var points = groups.selectAll('path.nv-point') + .data(function(d) { return d.values }); + points.enter().append('path') + .style('fill', function (d,i) { return d.color }) + .style('stroke', function (d,i) { return d.color }) + .attr('transform', function(d,i) { + return 'translate(' + x0(getX(d,i)) + ',' + y0(getY(d,i)) + ')' + }) + .attr('d', + nv.utils.symbol() + .type(getShape) + .size(function(d,i) { return z(getSize(d,i)) }) + ); + points.exit().remove(); + groups.exit().selectAll('path.nv-point') + .watchTransition(renderWatch, 'scatter exit') + .attr('transform', function(d,i) { + return 'translate(' + x(getX(d,i)) + ',' + y(getY(d,i)) + ')' + }) + .remove(); + points.each(function(d,i) { + d3.select(this) + .classed('nv-point', true) + .classed('nv-point-' + i, true) + .classed('hover',false) + ; + }); + points + .watchTransition(renderWatch, 'scatter points') + .attr('transform', function(d,i) { + //nv.log(d,i,getX(d,i), x(getX(d,i))); + return 'translate(' + x(getX(d,i)) + ',' + y(getY(d,i)) + ')' + }) + .attr('d', + nv.utils.symbol() + .type(getShape) + .size(function(d,i) { return z(getSize(d,i)) }) + ); + + // Delay updating the invisible interactive layer for smoother animation + clearTimeout(timeoutID); // stop repeat calls to updateInteractiveLayer + timeoutID = setTimeout(updateInteractiveLayer, 300); + //updateInteractiveLayer(); + + //store old scales for use in transitions on update + x0 = x.copy(); + y0 = y.copy(); + z0 = z.copy(); + + }); + renderWatch.renderEnd('scatter immediate'); + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + // utility function calls provided by this chart + chart._calls = new function() { + this.clearHighlights = function () { + d3.selectAll(".nv-chart-" + id + " .nv-point.hover").classed("hover", false); + return null; + }; + this.highlightPoint = function (seriesIndex, pointIndex, isHoverOver) { + d3.select(".nv-chart-" + id + " .nv-series-" + seriesIndex + " .nv-point-" + pointIndex) + .classed("hover", isHoverOver); + }; + }; + + // trigger calls from events too + dispatch.on('elementMouseover.point', function(d) { + if (interactive) chart._calls.highlightPoint(d.seriesIndex,d.pointIndex,true); + }); + + dispatch.on('elementMouseout.point', function(d) { + if (interactive) chart._calls.highlightPoint(d.seriesIndex,d.pointIndex,false); + }); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + xScale: {get: function(){return x;}, set: function(_){x=_;}}, + yScale: {get: function(){return y;}, set: function(_){y=_;}}, + pointScale: {get: function(){return z;}, set: function(_){z=_;}}, + xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}}, + yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}}, + pointDomain: {get: function(){return sizeDomain;}, set: function(_){sizeDomain=_;}}, + xRange: {get: function(){return xRange;}, set: function(_){xRange=_;}}, + yRange: {get: function(){return yRange;}, set: function(_){yRange=_;}}, + pointRange: {get: function(){return sizeRange;}, set: function(_){sizeRange=_;}}, + forceX: {get: function(){return forceX;}, set: function(_){forceX=_;}}, + forceY: {get: function(){return forceY;}, set: function(_){forceY=_;}}, + forcePoint: {get: function(){return forceSize;}, set: function(_){forceSize=_;}}, + interactive: {get: function(){return interactive;}, set: function(_){interactive=_;}}, + pointActive: {get: function(){return pointActive;}, set: function(_){pointActive=_;}}, + padDataOuter: {get: function(){return padDataOuter;}, set: function(_){padDataOuter=_;}}, + padData: {get: function(){return padData;}, set: function(_){padData=_;}}, + clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}}, + clipVoronoi: {get: function(){return clipVoronoi;}, set: function(_){clipVoronoi=_;}}, + clipRadius: {get: function(){return clipRadius;}, set: function(_){clipRadius=_;}}, + id: {get: function(){return id;}, set: function(_){id=_;}}, + + + // simple functor options + x: {get: function(){return getX;}, set: function(_){getX = d3.functor(_);}}, + y: {get: function(){return getY;}, set: function(_){getY = d3.functor(_);}}, + pointSize: {get: function(){return getSize;}, set: function(_){getSize = d3.functor(_);}}, + pointShape: {get: function(){return getShape;}, set: function(_){getShape = d3.functor(_);}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }}, + useVoronoi: {get: function(){return useVoronoi;}, set: function(_){ + useVoronoi = _; + if (useVoronoi === false) { + clipVoronoi = false; + } + }} + }); + + nv.utils.initOptions(chart); + return chart; +}; + +nv.models.scatterChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var scatter = nv.models.scatter() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + , legend = nv.models.legend() + , distX = nv.models.distribution() + , distY = nv.models.distribution() + ; + + var margin = {top: 30, right: 20, bottom: 50, left: 75} + , width = null + , height = null + , color = nv.utils.defaultColor() + , x = scatter.xScale() + , y = scatter.yScale() + , showDistX = false + , showDistY = false + , showLegend = true + , showXAxis = true + , showYAxis = true + , rightAlignYAxis = false + , tooltips = true + , tooltipX = function(key, x, y) { return '' + x + '' } + , tooltipY = function(key, x, y) { return '' + y + '' } + , tooltip = function(key, x, y, date) { return '

' + key + '

' + + '

' + date + '

' } + , state = nv.utils.state() + , defaultState = null + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState', 'renderEnd') + , noData = "No Data Available." + , duration = 250 + ; + + scatter + .xScale(x) + .yScale(y) + ; + xAxis + .orient('bottom') + .tickPadding(10) + ; + yAxis + .orient((rightAlignYAxis) ? 'right' : 'left') + .tickPadding(10) + ; + distX + .axis('x') + ; + distY + .axis('y') + ; + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var x0, y0 + , renderWatch = nv.utils.renderWatch(dispatch, duration); + + var showTooltip = function(e, offsetElement) { + //TODO: make tooltip style an option between single or dual on axes (maybe on all charts with axes? + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + leftX = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + topX = y.range()[0] + margin.top + ( offsetElement.offsetTop || 0), + leftY = x.range()[0] + margin.left + ( offsetElement.offsetLeft || 0 ), + topY = e.pos[1] + ( offsetElement.offsetTop || 0), + xVal = xAxis.tickFormat()(scatter.x()(e.point, e.pointIndex)), + yVal = yAxis.tickFormat()(scatter.y()(e.point, e.pointIndex)); + + if( tooltipX != null ) + nv.tooltip.show([leftX, topX], tooltipX(e.series.key, xVal, yVal, e, chart), 'n', 1, offsetElement, 'x-nvtooltip'); + if( tooltipY != null ) + nv.tooltip.show([leftY, topY], tooltipY(e.series.key, xVal, yVal, e, chart), 'e', 1, offsetElement, 'y-nvtooltip'); + if( tooltip != null ) + nv.tooltip.show([left, top], tooltip(e.series.key, xVal, yVal, e.point.tooltip, e, chart), e.value < 0 ? 'n' : 's', null, offsetElement); + }; + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }) + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.active !== undefined) + data.forEach(function(series,i) { + series.disabled = !state.active[i]; + }); + } + }; + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(scatter); + if (showXAxis) renderWatch.models(xAxis); + if (showYAxis) renderWatch.models(yAxis); + if (showDistX) renderWatch.models(distX); + if (showDistY) renderWatch.models(distY); + + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + chart.update = function() { + if (duration === 0) + container.call(chart); + else + container.transition().duration(duration).call(chart); + }; + chart.container = this; + + state + .setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + // DEPRECATED set state.disableddisabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display noData message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + renderWatch.renderEnd('scatter immediate'); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + x = scatter.xScale(); + y = scatter.yScale(); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-scatterChart').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-scatterChart nv-chart-' + scatter.id()); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + // background for pointer events + gEnter.append('rect').attr('class', 'nvd3 nv-background').style("pointer-events","none"); + + gEnter.append('g').attr('class', 'nv-x nv-axis'); + gEnter.append('g').attr('class', 'nv-y nv-axis'); + gEnter.append('g').attr('class', 'nv-scatterWrap'); + gEnter.append('g').attr('class', 'nv-regressionLinesWrap'); + gEnter.append('g').attr('class', 'nv-distWrap'); + gEnter.append('g').attr('class', 'nv-legendWrap'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + if (rightAlignYAxis) { + g.select(".nv-y.nv-axis") + .attr("transform", "translate(" + availableWidth + ",0)"); + } + + // Legend + if (showLegend) { + legend.width( availableWidth / 2 ); + + wrap.select('.nv-legendWrap') + .datum(data) + .call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + wrap.select('.nv-legendWrap') + .attr('transform', 'translate(' + (availableWidth / 2) + ',' + (-margin.top) +')'); + } + + // Main Chart Component(s) + scatter + .width(availableWidth) + .height(availableHeight) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled })); + + wrap.select('.nv-scatterWrap') + .datum(data.filter(function(d) { return !d.disabled })) + .call(scatter); + + + wrap.select('.nv-regressionLinesWrap') + .attr('clip-path', 'url(#nv-edge-clip-' + scatter.id() + ')'); + + var regWrap = wrap.select('.nv-regressionLinesWrap').selectAll('.nv-regLines') + .data(function (d) { + return d; + }); + + regWrap.enter().append('g').attr('class', 'nv-regLines'); + + var regLine = regWrap.selectAll('.nv-regLine') + .data(function (d) { + return [d] + }); + + regLine.enter() + .append('line').attr('class', 'nv-regLine') + .style('stroke-opacity', 0); + + // don't add lines unless we have slope and intercept to use + regLine.filter(function(d) { + return d.intercept && d.slope; + }) + .watchTransition(renderWatch, 'scatterPlusLineChart: regline') + .attr('x1', x.range()[0]) + .attr('x2', x.range()[1]) + .attr('y1', function (d, i) { + return y(x.domain()[0] * d.slope + d.intercept) + }) + .attr('y2', function (d, i) { + return y(x.domain()[1] * d.slope + d.intercept) + }) + .style('stroke', function (d, i, j) { + return color(d, j) + }) + .style('stroke-opacity', function (d, i) { + return (d.disabled || typeof d.slope === 'undefined' || typeof d.intercept === 'undefined') ? 0 : 1 + }); + + // Setup Axes + if (showXAxis) { + xAxis + .scale(x) + .ticks( xAxis.ticks() ? xAxis.ticks() : nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize( -availableHeight , 0); + + g.select('.nv-x.nv-axis') + .attr('transform', 'translate(0,' + y.range()[0] + ')') + .call(xAxis); + } + + if (showYAxis) { + yAxis + .scale(y) + .ticks( yAxis.ticks() ? yAxis.ticks() : nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize( -availableWidth, 0); + + g.select('.nv-y.nv-axis') + .call(yAxis); + } + + + if (showDistX) { + distX + .getData(scatter.x()) + .scale(x) + .width(availableWidth) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled })); + gEnter.select('.nv-distWrap').append('g') + .attr('class', 'nv-distributionX'); + g.select('.nv-distributionX') + .attr('transform', 'translate(0,' + y.range()[0] + ')') + .datum(data.filter(function(d) { return !d.disabled })) + .call(distX); + } + + if (showDistY) { + distY + .getData(scatter.y()) + .scale(y) + .width(availableHeight) + .color(data.map(function(d,i) { + return d.color || color(d, i); + }).filter(function(d,i) { return !data[i].disabled })); + gEnter.select('.nv-distWrap').append('g') + .attr('class', 'nv-distributionY'); + g.select('.nv-distributionY') + .attr('transform', 'translate(' + (rightAlignYAxis ? availableWidth : -distY.size() ) + ',0)') + .datum(data.filter(function(d) { return !d.disabled })) + .call(distY); + } + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) + state[key] = newState[key]; + dispatch.stateChange(state); + chart.update(); + }); + + + scatter.dispatch.on('elementMouseover.tooltip', function(e) { + d3.select('.nv-chart-' + scatter.id() + ' .nv-series-' + e.seriesIndex + ' .nv-distx-' + e.pointIndex) + .attr('y1', e.pos[1] - availableHeight); + d3.select('.nv-chart-' + scatter.id() + ' .nv-series-' + e.seriesIndex + ' .nv-disty-' + e.pointIndex) + .attr('x2', e.pos[0] + distX.size()); + + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + // Update chart from a state object passed to event handler + dispatch.on('changeState', function(e) { + + if (typeof e.disabled !== 'undefined') { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + + state.disabled = e.disabled; + } + + chart.update(); + }); + + //store old scales for use in transitions on update + x0 = x.copy(); + y0 = y.copy(); + + }); + + renderWatch.renderEnd('scatter with line immediate'); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + scatter.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + + d3.select('.nv-chart-' + scatter.id() + ' .nv-series-' + e.seriesIndex + ' .nv-distx-' + e.pointIndex) + .attr('y1', 0); + d3.select('.nv-chart-' + scatter.id() + ' .nv-series-' + e.seriesIndex + ' .nv-disty-' + e.pointIndex) + .attr('x2', distY.size()); + }); + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.scatter = scatter; + chart.legend = legend; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + chart.distX = distX; + chart.distY = distY; + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showDistX: {get: function(){return showDistX;}, set: function(_){showDistX=_;}}, + showDistY: {get: function(){return showDistY;}, set: function(_){showDistY=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}}, + showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + tooltipXContent: {get: function(){return tooltipX;}, set: function(_){tooltipX=_;}}, + tooltipYContent: {get: function(){return tooltipY;}, set: function(_){tooltipY=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + duration: {get: function(){return duration;}, set: function(_){duration=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){ + rightAlignYAxis = _; + yAxis.orient( (_) ? 'right' : 'left'); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + distX.color(color); + distY.color(color); + }} + }); + + nv.utils.inheritOptions(chart, scatter); + nv.utils.initOptions(chart); + return chart; +}; + +nv.models.sparkline = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 2, right: 0, bottom: 2, left: 0} + , width = 400 + , height = 32 + , animate = true + , x = d3.scale.linear() + , y = d3.scale.linear() + , getX = function(d) { return d.x } + , getY = function(d) { return d.y } + , color = nv.utils.getColor(['#000']) + , xDomain + , yDomain + , xRange + , yRange + ; + + function chart(selection) { + selection.each(function(data) { + var availableWidth = width - margin.left - margin.right, + availableHeight = height - margin.top - margin.bottom, + container = d3.select(this); + nv.utils.initSVG(container); + + // Setup Scales + x .domain(xDomain || d3.extent(data, getX )) + .range(xRange || [0, availableWidth]); + + y .domain(yDomain || d3.extent(data, getY )) + .range(yRange || [availableHeight, 0]); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-sparkline').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparkline'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')') + + var paths = wrap.selectAll('path') + .data(function(d) { return [d] }); + paths.enter().append('path'); + paths.exit().remove(); + paths + .style('stroke', function(d,i) { return d.color || color(d, i) }) + .attr('d', d3.svg.line() + .x(function(d,i) { return x(getX(d,i)) }) + .y(function(d,i) { return y(getY(d,i)) }) + ); + + // TODO: Add CURRENT data point (Need Min, Mac, Current / Most recent) + var points = wrap.selectAll('circle.nv-point') + .data(function(data) { + var yValues = data.map(function(d, i) { return getY(d,i); }); + function pointIndex(index) { + if (index != -1) { + var result = data[index]; + result.pointIndex = index; + return result; + } else { + return null; + } + } + var maxPoint = pointIndex(yValues.lastIndexOf(y.domain()[1])), + minPoint = pointIndex(yValues.indexOf(y.domain()[0])), + currentPoint = pointIndex(yValues.length - 1); + return [minPoint, maxPoint, currentPoint].filter(function (d) {return d != null;}); + }); + points.enter().append('circle'); + points.exit().remove(); + points + .attr('cx', function(d,i) { return x(getX(d,d.pointIndex)) }) + .attr('cy', function(d,i) { return y(getY(d,d.pointIndex)) }) + .attr('r', 2) + .attr('class', function(d,i) { + return getX(d, d.pointIndex) == x.domain()[1] ? 'nv-point nv-currentValue' : + getY(d, d.pointIndex) == y.domain()[0] ? 'nv-point nv-minValue' : 'nv-point nv-maxValue' + }); + }); + + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + xDomain: {get: function(){return xDomain;}, set: function(_){xDomain=_;}}, + yDomain: {get: function(){return yDomain;}, set: function(_){yDomain=_;}}, + xRange: {get: function(){return xRange;}, set: function(_){xRange=_;}}, + yRange: {get: function(){return yRange;}, set: function(_){yRange=_;}}, + xScale: {get: function(){return x;}, set: function(_){x=_;}}, + yScale: {get: function(){return y;}, set: function(_){y=_;}}, + animate: {get: function(){return animate;}, set: function(_){animate=_;}}, + + //functor options + x: {get: function(){return getX;}, set: function(_){getX=d3.functor(_);}}, + y: {get: function(){return getY;}, set: function(_){getY=d3.functor(_);}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }} + }); + + nv.utils.initOptions(chart); + return chart; +}; + +nv.models.sparklinePlus = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var sparkline = nv.models.sparkline(); + + var margin = {top: 15, right: 100, bottom: 10, left: 50} + , width = null + , height = null + , x + , y + , index = [] + , paused = false + , xTickFormat = d3.format(',r') + , yTickFormat = d3.format(',.2f') + , showValue = true + , alignValue = true + , rightAlignValue = false + , noData = "No Data Available." + ; + + function chart(selection) { + selection.each(function(data) { + var container = d3.select(this); + nv.utils.initSVG(container); + + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + chart.update = function() { chart(selection) }; + chart.container = this; + + // Display No Data message if there's nothing to show. + if (!data || !data.length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + var currentValue = sparkline.y()(data[data.length-1], data.length-1); + + // Setup Scales + x = sparkline.xScale(); + y = sparkline.yScale(); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-sparklineplus').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-sparklineplus'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-sparklineWrap'); + gEnter.append('g').attr('class', 'nv-valueWrap'); + gEnter.append('g').attr('class', 'nv-hoverArea'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + // Main Chart Component(s) + var sparklineWrap = g.select('.nv-sparklineWrap'); + + sparkline.width(availableWidth).height(availableHeight); + sparklineWrap.call(sparkline); + + var valueWrap = g.select('.nv-valueWrap'); + var value = valueWrap.selectAll('.nv-currentValue') + .data([currentValue]); + + value.enter().append('text').attr('class', 'nv-currentValue') + .attr('dx', rightAlignValue ? -8 : 8) + .attr('dy', '.9em') + .style('text-anchor', rightAlignValue ? 'end' : 'start'); + + value + .attr('x', availableWidth + (rightAlignValue ? margin.right : 0)) + .attr('y', alignValue ? function(d) { return y(d) } : 0) + .style('fill', sparkline.color()(data[data.length-1], data.length-1)) + .text(yTickFormat(currentValue)); + + gEnter.select('.nv-hoverArea').append('rect') + .on('mousemove', sparklineHover) + .on('click', function() { paused = !paused }) + .on('mouseout', function() { index = []; updateValueLine(); }); + + g.select('.nv-hoverArea rect') + .attr('transform', function(d) { return 'translate(' + -margin.left + ',' + -margin.top + ')' }) + .attr('width', availableWidth + margin.left + margin.right) + .attr('height', availableHeight + margin.top); + + //index is currently global (within the chart), may or may not keep it that way + function updateValueLine() { + if (paused) return; + + var hoverValue = g.selectAll('.nv-hoverValue').data(index) + + var hoverEnter = hoverValue.enter() + .append('g').attr('class', 'nv-hoverValue') + .style('stroke-opacity', 0) + .style('fill-opacity', 0); + + hoverValue.exit() + .transition().duration(250) + .style('stroke-opacity', 0) + .style('fill-opacity', 0) + .remove(); + + hoverValue + .attr('transform', function(d) { return 'translate(' + x(sparkline.x()(data[d],d)) + ',0)' }) + .transition().duration(250) + .style('stroke-opacity', 1) + .style('fill-opacity', 1); + + if (!index.length) return; + + hoverEnter.append('line') + .attr('x1', 0) + .attr('y1', -margin.top) + .attr('x2', 0) + .attr('y2', availableHeight); + + hoverEnter.append('text').attr('class', 'nv-xValue') + .attr('x', -6) + .attr('y', -margin.top) + .attr('text-anchor', 'end') + .attr('dy', '.9em') + + g.select('.nv-hoverValue .nv-xValue') + .text(xTickFormat(sparkline.x()(data[index[0]], index[0]))); + + hoverEnter.append('text').attr('class', 'nv-yValue') + .attr('x', 6) + .attr('y', -margin.top) + .attr('text-anchor', 'start') + .attr('dy', '.9em') + + g.select('.nv-hoverValue .nv-yValue') + .text(yTickFormat(sparkline.y()(data[index[0]], index[0]))); + } + + function sparklineHover() { + if (paused) return; + + var pos = d3.mouse(this)[0] - margin.left; + + function getClosestIndex(data, x) { + var distance = Math.abs(sparkline.x()(data[0], 0) - x); + var closestIndex = 0; + for (var i = 0; i < data.length; i++){ + if (Math.abs(sparkline.x()(data[i], i) - x) < distance) { + distance = Math.abs(sparkline.x()(data[i], i) - x); + closestIndex = i; + } + } + return closestIndex; + } + + index = [getClosestIndex(data, Math.round(x.invert(pos)))]; + updateValueLine(); + } + + }); + + return chart; + } + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.sparkline = sparkline; + + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + xTickFormat: {get: function(){return xTickFormat;}, set: function(_){xTickFormat=_;}}, + yTickFormat: {get: function(){return yTickFormat;}, set: function(_){yTickFormat=_;}}, + showValue: {get: function(){return showValue;}, set: function(_){showValue=_;}}, + alignValue: {get: function(){return alignValue;}, set: function(_){alignValue=_;}}, + rightAlignValue: {get: function(){return rightAlignValue;}, set: function(_){rightAlignValue=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }} + }); + + nv.utils.inheritOptions(chart, sparkline); + nv.utils.initOptions(chart); + + return chart; +}; + +nv.models.stackedArea = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var margin = {top: 0, right: 0, bottom: 0, left: 0} + , width = 960 + , height = 500 + , color = nv.utils.defaultColor() // a function that computes the color + , id = Math.floor(Math.random() * 100000) //Create semi-unique ID incase user doesn't selet one + , getX = function(d) { return d.x } // accessor to get the x value from a data point + , getY = function(d) { return d.y } // accessor to get the y value from a data point + , style = 'stack' + , offset = 'zero' + , order = 'default' + , interpolate = 'linear' // controls the line interpolation + , clipEdge = false // if true, masks lines within x and y scale + , x //can be accessed via chart.xScale() + , y //can be accessed via chart.yScale() + , scatter = nv.models.scatter() + , duration = 250 + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'areaClick', 'areaMouseover', 'areaMouseout','renderEnd') + ; + + // scatter is interactive by default, but this chart isn't so must disable + scatter.interactive(false); + + scatter + .pointSize(2.2) // default size + .pointDomain([2.2, 2.2]) // all the same size by default + ; + + /************************************ + * offset: + * 'wiggle' (stream) + * 'zero' (stacked) + * 'expand' (normalize to 100%) + * 'silhouette' (simple centered) + * + * order: + * 'inside-out' (stream) + * 'default' (input order) + ************************************/ + + var renderWatch = nv.utils.renderWatch(dispatch, duration); + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(scatter); + selection.each(function(data) { + var availableWidth = width - margin.left - margin.right, + availableHeight = height - margin.top - margin.bottom, + container = d3.select(this); + nv.utils.initSVG(container); + + // Setup Scales + x = scatter.xScale(); + y = scatter.yScale(); + + var dataRaw = data; + // Injecting point index into each point because d3.layout.stack().out does not give index + data.forEach(function(aseries, i) { + aseries.seriesIndex = i; + aseries.values = aseries.values.map(function(d, j) { + d.index = j; + d.seriesIndex = i; + return d; + }); + }); + + var dataFiltered = data.filter(function(series) { + return !series.disabled; + }); + + data = d3.layout.stack() + .order(order) + .offset(offset) + .values(function(d) { return d.values }) //TODO: make values customizeable in EVERY model in this fashion + .x(getX) + .y(getY) + .out(function(d, y0, y) { + var yHeight = (getY(d) === 0) ? 0 : y; + d.display = { + y: yHeight, + y0: y0 + }; + }) + (dataFiltered); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-stackedarea').data([data]); + var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-stackedarea'); + var defsEnter = wrapEnter.append('defs'); + var gEnter = wrapEnter.append('g'); + var g = wrap.select('g'); + + gEnter.append('g').attr('class', 'nv-areaWrap'); + gEnter.append('g').attr('class', 'nv-scatterWrap'); + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + scatter + .width(availableWidth) + .height(availableHeight) + .x(getX) + .y(function(d) { return d.display.y + d.display.y0 }) + .forceY([0]) + .color(data.map(function(d,i) { + return d.color || color(d, d.seriesIndex); + })); + + var scatterWrap = g.select('.nv-scatterWrap') + .datum(data); + + scatterWrap.call(scatter); + + defsEnter.append('clipPath') + .attr('id', 'nv-edge-clip-' + id) + .append('rect'); + + wrap.select('#nv-edge-clip-' + id + ' rect') + .attr('width', availableWidth) + .attr('height', availableHeight); + + g.attr('clip-path', clipEdge ? 'url(#nv-edge-clip-' + id + ')' : ''); + + var area = d3.svg.area() + .x(function(d,i) { return x(getX(d,i)) }) + .y0(function(d) { + return y(d.display.y0) + }) + .y1(function(d) { + return y(d.display.y + d.display.y0) + }) + .interpolate(interpolate); + + var zeroArea = d3.svg.area() + .x(function(d,i) { return x(getX(d,i)) }) + .y0(function(d) { return y(d.display.y0) }) + .y1(function(d) { return y(d.display.y0) }); + + var path = g.select('.nv-areaWrap').selectAll('path.nv-area') + .data(function(d) { return d }); + + path.enter().append('path').attr('class', function(d,i) { return 'nv-area nv-area-' + i }) + .attr('d', function(d,i){ + return zeroArea(d.values, d.seriesIndex); + }) + .on('mouseover', function(d,i) { + d3.select(this).classed('hover', true); + dispatch.areaMouseover({ + point: d, + series: d.key, + pos: [d3.event.pageX, d3.event.pageY], + seriesIndex: d.seriesIndex + }); + }) + .on('mouseout', function(d,i) { + d3.select(this).classed('hover', false); + dispatch.areaMouseout({ + point: d, + series: d.key, + pos: [d3.event.pageX, d3.event.pageY], + seriesIndex: d.seriesIndex + }); + }) + .on('click', function(d,i) { + d3.select(this).classed('hover', false); + dispatch.areaClick({ + point: d, + series: d.key, + pos: [d3.event.pageX, d3.event.pageY], + seriesIndex: d.seriesIndex + }); + }); + + path.exit().remove(); + path.style('fill', function(d,i){ + return d.color || color(d, d.seriesIndex) + }) + .style('stroke', function(d,i){ return d.color || color(d, d.seriesIndex) }); + path.watchTransition(renderWatch,'stackedArea path') + .attr('d', function(d,i) { + return area(d.values,i) + }); + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + scatter.dispatch.on('elementMouseover.area', function(e) { + g.select('.nv-chart-' + id + ' .nv-area-' + e.seriesIndex).classed('hover', true); + }); + scatter.dispatch.on('elementMouseout.area', function(e) { + g.select('.nv-chart-' + id + ' .nv-area-' + e.seriesIndex).classed('hover', false); + }); + + //Special offset functions + chart.d3_stackedOffset_stackPercent = function(stackData) { + var n = stackData.length, //How many series + m = stackData[0].length, //how many points per series + k = 1 / n, + i, + j, + o, + y0 = []; + + for (j = 0; j < m; ++j) { //Looping through all points + for (i = 0, o = 0; i < dataRaw.length; i++) { //looping through series' + o += getY(dataRaw[i].values[j]); //total value of all points at a certian point in time. + } + + if (o) for (i = 0; i < n; i++) { + stackData[i][j][1] /= o; + } else { + for (i = 0; i < n; i++) { + stackData[i][j][1] = k; + } + } + } + for (j = 0; j < m; ++j) y0[j] = 0; + return y0; + }; + + }); + + renderWatch.renderEnd('stackedArea immediate'); + return chart; + } + + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + scatter.dispatch.on('elementClick.area', function(e) { + dispatch.areaClick(e); + }); + scatter.dispatch.on('elementMouseover.tooltip', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top], + dispatch.tooltipShow(e); + }); + scatter.dispatch.on('elementMouseout.tooltip', function(e) { + dispatch.tooltipHide(e); + }); + + //============================================================ + // Global getters and setters + //------------------------------------------------------------ + + chart.dispatch = dispatch; + chart.scatter = scatter; + + chart.interpolate = function(_) { + if (!arguments.length) return interpolate; + interpolate = _; + return chart; + }; + + chart.duration = function(_) { + if (!arguments.length) return duration; + duration = _; + renderWatch.reset(duration); + scatter.duration(duration); + return chart; + }; + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + clipEdge: {get: function(){return clipEdge;}, set: function(_){clipEdge=_;}}, + offset: {get: function(){return offset;}, set: function(_){offset=_;}}, + order: {get: function(){return order;}, set: function(_){order=_;}}, + interpolate: {get: function(){return interpolate;}, set: function(_){interpolate=_;}}, + + // simple functor options + x: {get: function(){return getX;}, set: function(_){getX = d3.functor(_);}}, + y: {get: function(){return getY;}, set: function(_){getY = d3.functor(_);}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + }}, + style: {get: function(){return style;}, set: function(_){ + style = _; + switch (style) { + case 'stack': + chart.offset('zero'); + chart.order('default'); + break; + case 'stream': + chart.offset('wiggle'); + chart.order('inside-out'); + break; + case 'stream-center': + chart.offset('silhouette'); + chart.order('inside-out'); + break; + case 'expand': + chart.offset('expand'); + chart.order('default'); + break; + case 'stack_percent': + chart.offset(chart.d3_stackedOffset_stackPercent); + chart.order('default'); + break; + } + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + scatter.duration(duration); + }} + }); + + nv.utils.inheritOptions(chart, scatter); + nv.utils.initOptions(chart); + + return chart; +}; + +nv.models.stackedAreaChart = function() { + "use strict"; + + //============================================================ + // Public Variables with Default Settings + //------------------------------------------------------------ + + var stacked = nv.models.stackedArea() + , xAxis = nv.models.axis() + , yAxis = nv.models.axis() + , legend = nv.models.legend() + , controls = nv.models.legend() + , interactiveLayer = nv.interactiveGuideline() + ; + + var margin = {top: 30, right: 25, bottom: 50, left: 60} + , width = null + , height = null + , color = nv.utils.defaultColor() + , showControls = true + , showLegend = true + , showXAxis = true + , showYAxis = true + , rightAlignYAxis = false + , useInteractiveGuideline = false + , tooltips = true + , tooltip = function(key, x, y, e, graph) { + return '

' + key + '

' + + '

' + y + ' on ' + x + '

' + } + , x //can be accessed via chart.xScale() + , y //can be accessed via chart.yScale() + , yAxisTickFormat = d3.format(',.2f') + , state = nv.utils.state() + , defaultState = null + , noData = 'No Data Available.' + , dispatch = d3.dispatch('tooltipShow', 'tooltipHide', 'stateChange', 'changeState','renderEnd') + , controlWidth = 250 + , cData = ['Stacked','Stream','Expanded'] + , controlLabels = {} + , duration = 250 + ; + + state.style = stacked.style(); + xAxis.orient('bottom').tickPadding(7); + yAxis.orient((rightAlignYAxis) ? 'right' : 'left'); + + controls.updateState(false); + + //============================================================ + // Private Variables + //------------------------------------------------------------ + + var renderWatch = nv.utils.renderWatch(dispatch); + var style = stacked.style(); + + var showTooltip = function(e, offsetElement) { + var left = e.pos[0] + ( offsetElement.offsetLeft || 0 ), + top = e.pos[1] + ( offsetElement.offsetTop || 0), + x = xAxis.tickFormat()(stacked.x()(e.point, e.pointIndex)), + y = yAxis.tickFormat()(stacked.y()(e.point, e.pointIndex)), + content = tooltip(e.series.key, x, y, e, chart); + + nv.tooltip.show([left, top], content, e.value < 0 ? 'n' : 's', null, offsetElement); + }; + + var stateGetter = function(data) { + return function(){ + return { + active: data.map(function(d) { return !d.disabled }), + style: stacked.style() + }; + } + }; + + var stateSetter = function(data) { + return function(state) { + if (state.style !== undefined) + style = state.style; + if (state.active !== undefined) + data.forEach(function(series,i) { + series.disabled = !state.active[i]; + }); + } + }; + + function chart(selection) { + renderWatch.reset(); + renderWatch.models(stacked); + if (showXAxis) renderWatch.models(xAxis); + if (showYAxis) renderWatch.models(yAxis); + + selection.each(function(data) { + var container = d3.select(this), + that = this; + nv.utils.initSVG(container); + + var availableWidth = (width || parseInt(container.style('width')) || 960) + - margin.left - margin.right, + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + + chart.update = function() { container.transition().duration(duration).call(chart); }; + chart.container = this; + + state + .setter(stateSetter(data), chart.update) + .getter(stateGetter(data)) + .update(); + + // DEPRECATED set state.disabled + state.disabled = data.map(function(d) { return !!d.disabled }); + + if (!defaultState) { + var key; + defaultState = {}; + for (key in state) { + if (state[key] instanceof Array) + defaultState[key] = state[key].slice(0); + else + defaultState[key] = state[key]; + } + } + + // Display No Data message if there's nothing to show. + if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) { + var noDataText = container.selectAll('.nv-noData').data([noData]); + + noDataText.enter().append('text') + .attr('class', 'nvd3 nv-noData') + .attr('dy', '-.7em') + .style('text-anchor', 'middle'); + + noDataText + .attr('x', margin.left + availableWidth / 2) + .attr('y', margin.top + availableHeight / 2) + .text(function(d) { return d }); + + return chart; + } else { + container.selectAll('.nv-noData').remove(); + } + + // Setup Scales + x = stacked.xScale(); + y = stacked.yScale(); + + // Setup containers and skeleton of chart + var wrap = container.selectAll('g.nv-wrap.nv-stackedAreaChart').data([data]); + var gEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-stackedAreaChart').append('g'); + var g = wrap.select('g'); + + gEnter.append("rect").style("opacity",0); + gEnter.append('g').attr('class', 'nv-x nv-axis'); + gEnter.append('g').attr('class', 'nv-y nv-axis'); + gEnter.append('g').attr('class', 'nv-stackedWrap'); + gEnter.append('g').attr('class', 'nv-legendWrap'); + gEnter.append('g').attr('class', 'nv-controlsWrap'); + gEnter.append('g').attr('class', 'nv-interactive'); + + g.select("rect").attr("width",availableWidth).attr("height",availableHeight); + + // Legend + if (showLegend) { + var legendWidth = (showControls) ? availableWidth - controlWidth : availableWidth; + + legend.width(legendWidth); + g.select('.nv-legendWrap').datum(data).call(legend); + + if ( margin.top != legend.height()) { + margin.top = legend.height(); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + g.select('.nv-legendWrap') + .attr('transform', 'translate(' + (availableWidth-legendWidth) + ',' + (-margin.top) +')'); + } + + // Controls + if (showControls) { + var controlsData = [ + { + key: controlLabels.stacked || 'Stacked', + metaKey: 'Stacked', + disabled: stacked.style() != 'stack', + style: 'stack' + }, + { + key: controlLabels.stream || 'Stream', + metaKey: 'Stream', + disabled: stacked.style() != 'stream', + style: 'stream' + }, + { + key: controlLabels.expanded || 'Expanded', + metaKey: 'Expanded', + disabled: stacked.style() != 'expand', + style: 'expand' + }, + { + key: controlLabels.stack_percent || 'Stack %', + metaKey: 'Stack_Percent', + disabled: stacked.style() != 'stack_percent', + style: 'stack_percent' + } + ]; + + controlWidth = (cData.length/3) * 260; + controlsData = controlsData.filter(function(d) { + return cData.indexOf(d.metaKey) !== -1; + }); + + controls + .width( controlWidth ) + .color(['#444', '#444', '#444']); + + g.select('.nv-controlsWrap') + .datum(controlsData) + .call(controls); + + if ( margin.top != Math.max(controls.height(), legend.height()) ) { + margin.top = Math.max(controls.height(), legend.height()); + availableHeight = (height || parseInt(container.style('height')) || 400) + - margin.top - margin.bottom; + } + + g.select('.nv-controlsWrap') + .attr('transform', 'translate(0,' + (-margin.top) +')'); + } + + wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); + + if (rightAlignYAxis) { + g.select(".nv-y.nv-axis") + .attr("transform", "translate(" + availableWidth + ",0)"); + } + + //Set up interactive layer + if (useInteractiveGuideline) { + interactiveLayer + .width(availableWidth) + .height(availableHeight) + .margin({left: margin.left, top: margin.top}) + .svgContainer(container) + .xScale(x); + wrap.select(".nv-interactive").call(interactiveLayer); + } + + stacked + .width(availableWidth) + .height(availableHeight); + + var stackedWrap = g.select('.nv-stackedWrap') + .datum(data); + + stackedWrap.transition().call(stacked); + + // Setup Axes + if (showXAxis) { + xAxis.scale(x) + .ticks( nv.utils.calcTicksX(availableWidth/100, data) ) + .tickSize( -availableHeight, 0); + + g.select('.nv-x.nv-axis') + .attr('transform', 'translate(0,' + availableHeight + ')'); + + g.select('.nv-x.nv-axis') + .transition().duration(0) + .call(xAxis); + } + + if (showYAxis) { + yAxis.scale(y) + .ticks(stacked.offset() == 'wiggle' ? 0 : nv.utils.calcTicksY(availableHeight/36, data) ) + .tickSize(-availableWidth, 0) + .setTickFormat( (stacked.style() == 'expand' || stacked.style() == 'stack_percent') + ? d3.format('%') : yAxisTickFormat); + + g.select('.nv-y.nv-axis') + .transition().duration(0) + .call(yAxis); + } + + //============================================================ + // Event Handling/Dispatching (in chart's scope) + //------------------------------------------------------------ + + stacked.dispatch.on('areaClick.toggle', function(e) { + if (data.filter(function(d) { return !d.disabled }).length === 1) + data.forEach(function(d) { + d.disabled = false; + }); + else + data.forEach(function(d,i) { + d.disabled = (i != e.seriesIndex); + }); + + state.disabled = data.map(function(d) { return !!d.disabled }); + dispatch.stateChange(state); + + chart.update(); + }); + + legend.dispatch.on('stateChange', function(newState) { + for (var key in newState) + state[key] = newState[key]; + dispatch.stateChange(state); + chart.update(); + }); + + controls.dispatch.on('legendClick', function(d,i) { + if (!d.disabled) return; + + controlsData = controlsData.map(function(s) { + s.disabled = true; + return s; + }); + d.disabled = false; + + stacked.style(d.style); + + + state.style = stacked.style(); + dispatch.stateChange(state); + + chart.update(); + }); + + interactiveLayer.dispatch.on('elementMousemove', function(e) { + stacked.clearHighlights(); + var singlePoint, pointIndex, pointXLocation, allData = []; + data + .filter(function(series, i) { + series.seriesIndex = i; + return !series.disabled; + }) + .forEach(function(series,i) { + pointIndex = nv.interactiveBisect(series.values, e.pointXValue, chart.x()); + stacked.highlightPoint(i, pointIndex, true); + var point = series.values[pointIndex]; + if (typeof point === 'undefined') return; + if (typeof singlePoint === 'undefined') singlePoint = point; + if (typeof pointXLocation === 'undefined') pointXLocation = chart.xScale()(chart.x()(point,pointIndex)); + + //If we are in 'expand' mode, use the stacked percent value instead of raw value. + var tooltipValue = (stacked.style() == 'expand') ? point.display.y : chart.y()(point,pointIndex); + allData.push({ + key: series.key, + value: tooltipValue, + color: color(series,series.seriesIndex), + stackedValue: point.display + }); + }); + + allData.reverse(); + + //Highlight the tooltip entry based on which stack the mouse is closest to. + if (allData.length > 2) { + var yValue = chart.yScale().invert(e.mouseY); + var yDistMax = Infinity, indexToHighlight = null; + allData.forEach(function(series,i) { + + //To handle situation where the stacked area chart is negative, we need to use absolute values + //when checking if the mouse Y value is within the stack area. + yValue = Math.abs(yValue); + var stackedY0 = Math.abs(series.stackedValue.y0); + var stackedY = Math.abs(series.stackedValue.y); + if ( yValue >= stackedY0 && yValue <= (stackedY + stackedY0)) + { + indexToHighlight = i; + return; + } + }); + if (indexToHighlight != null) + allData[indexToHighlight].highlight = true; + } + + var xValue = xAxis.tickFormat()(chart.x()(singlePoint,pointIndex)); + + //If we are in 'expand' mode, force the format to be a percentage. + var valueFormatter = (stacked.style() == 'expand') ? + function(d,i) {return d3.format(".1%")(d);} : + function(d,i) {return yAxis.tickFormat()(d); }; + interactiveLayer.tooltip + .position({left: pointXLocation + margin.left, top: e.mouseY + margin.top}) + .chartContainer(that.parentNode) + .enabled(tooltips) + .valueFormatter(valueFormatter) + .data( + { + value: xValue, + series: allData + } + )(); + + interactiveLayer.renderGuideLine(pointXLocation); + + }); + + interactiveLayer.dispatch.on("elementMouseout",function(e) { + dispatch.tooltipHide(); + stacked.clearHighlights(); + }); + + + dispatch.on('tooltipShow', function(e) { + if (tooltips) showTooltip(e, that.parentNode); + }); + + // Update chart from a state object passed to event handler + dispatch.on('changeState', function(e) { + + if (typeof e.disabled !== 'undefined' && data.length === e.disabled.length) { + data.forEach(function(series,i) { + series.disabled = e.disabled[i]; + }); + + state.disabled = e.disabled; + } + + if (typeof e.style !== 'undefined') { + stacked.style(e.style); + style = e.style; + } + + chart.update(); + }); + + }); + + renderWatch.renderEnd('stacked Area chart immediate'); + return chart; + } + + //============================================================ + // Event Handling/Dispatching (out of chart's scope) + //------------------------------------------------------------ + + stacked.dispatch.on('tooltipShow', function(e) { + e.pos = [e.pos[0] + margin.left, e.pos[1] + margin.top]; + dispatch.tooltipShow(e); + }); + + stacked.dispatch.on('tooltipHide', function(e) { + dispatch.tooltipHide(e); + }); + + dispatch.on('tooltipHide', function() { + if (tooltips) nv.tooltip.cleanup(); + }); + + //============================================================ + // Expose Public Variables + //------------------------------------------------------------ + + // expose chart's sub-components + chart.dispatch = dispatch; + chart.stacked = stacked; + chart.legend = legend; + chart.controls = controls; + chart.xAxis = xAxis; + chart.yAxis = yAxis; + chart.interactiveLayer = interactiveLayer; + + yAxis.setTickFormat = yAxis.tickFormat; + + chart.dispatch = dispatch; + chart.options = nv.utils.optionsFunc.bind(chart); + + chart._options = Object.create({}, { + // simple options, just get/set the necessary values + width: {get: function(){return width;}, set: function(_){width=_;}}, + height: {get: function(){return height;}, set: function(_){height=_;}}, + showLegend: {get: function(){return showLegend;}, set: function(_){showLegend=_;}}, + showXAxis: {get: function(){return showXAxis;}, set: function(_){showXAxis=_;}}, + showYAxis: {get: function(){return showYAxis;}, set: function(_){showYAxis=_;}}, + tooltips: {get: function(){return tooltips;}, set: function(_){tooltips=_;}}, + tooltipContent: {get: function(){return tooltip;}, set: function(_){tooltip=_;}}, + defaultState: {get: function(){return defaultState;}, set: function(_){defaultState=_;}}, + noData: {get: function(){return noData;}, set: function(_){noData=_;}}, + showControls: {get: function(){return showControls;}, set: function(_){showControls=_;}}, + controlLabels: {get: function(){return controlLabels;}, set: function(_){controlLabels=_;}}, + yAxisTickFormat: {get: function(){return yAxisTickFormat;}, set: function(_){yAxisTickFormat=_;}}, + + // options that require extra logic in the setter + margin: {get: function(){return margin;}, set: function(_){ + margin.top = _.top !== undefined ? _.top : margin.top; + margin.right = _.right !== undefined ? _.right : margin.right; + margin.bottom = _.bottom !== undefined ? _.bottom : margin.bottom; + margin.left = _.left !== undefined ? _.left : margin.left; + }}, + duration: {get: function(){return duration;}, set: function(_){ + duration = _; + renderWatch.reset(duration); + stacked.duration(duration); + xAxis.duration(duration); + yAxis.duration(duration); + }}, + color: {get: function(){return color;}, set: function(_){ + color = nv.utils.getColor(_); + legend.color(color); + stacked.color(color); + }}, + rightAlignYAxis: {get: function(){return rightAlignYAxis;}, set: function(_){ + rightAlignYAxis = _; + yAxis.orient( rightAlignYAxis ? 'right' : 'left'); + }}, + useInteractiveGuideline: {get: function(){return useInteractiveGuideline;}, set: function(_){ + useInteractiveGuideline = !!_; + if (_) { + chart.interactive(false); + chart.useVoronoi(false); + } + }} + }); + + nv.utils.inheritOptions(chart, stacked); + nv.utils.initOptions(chart); + + return chart; +}; + +nv.version = "1.7.1"; +})(); \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/sonar_graph.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/sonar_graph.js new file mode 100755 index 00000000..de79082e --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/sonar_graph.js @@ -0,0 +1,60 @@ +var sonarChart; + +nv.addGraph(function () { + + sonarChart = nv.models.lineChart() + .interpolate("linear") + .options({ + transitionDuration: 300, + useInteractiveGuideline: true + }) + ; + + sonarChart.xScale(d3.time.scale()); + + // chart sub-models (ie. xAxis, yAxis, etc) when accessed directly, return themselves, not the parent chart, so need to chain separately + sonarChart.xAxis + .axisLabel("Date/Time") + .ticks(d3.time.seconds) + .tickFormat(function (d) { + return d3.time.format('%m/%d/%Y %I:%M:%S %p')(new Date(d)) + }) + .staggerLabels(true) + ; + + sonarChart.yAxis + .axisLabel('Sonar') + ; + + d3.select('.chart4 svg') + .datum(getSonarChartData()) + .call(sonarChart); + + nv.utils.windowResize(sonarChart.update); + + return sonarChart; +}); + +function getSonarChartData() { + + return [ + { + area: true, + values: [], + key: "Sonar", + color: "#34500e" + } + ]; + +} + +function updateSonarGraph(sonarData) { + + var chartData = getSonarChartData(); + chartData[0]['values'] = sonarData; + + d3.select('.chart4 svg') + .datum(chartData) + .transition().duration(500) + .call(sonarChart); +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/stream_layers.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/stream_layers.js new file mode 100755 index 00000000..43d7cfe0 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/stream_layers.js @@ -0,0 +1,35 @@ + +/* Inspired by Lee Byron's test data generator. */ +function stream_layers(n, m, o) { + if (arguments.length < 3) o = 0; + function bump(a) { + var x = 1 / (.1 + Math.random()), + y = 2 * Math.random() - .5, + z = 10 / (.1 + Math.random()); + for (var i = 0; i < m; i++) { + var w = (i / m - y) * z; + a[i] += x * Math.exp(-w * w); + } + } + return d3.range(n).map(function() { + var a = [], i; + for (i = 0; i < m; i++) a[i] = o + o * Math.random(); + for (i = 0; i < 5; i++) bump(a); + return a.map(stream_index); + }); +} + +/* Another layer generator using gamma distributions. */ +function stream_waves(n, m) { + return d3.range(n).map(function(i) { + return d3.range(m).map(function(j) { + var x = 20 * j / m - i / 3; + return 2 * x * Math.exp(-.5 * x); + }).map(stream_index); + }); +} + +function stream_index(d, i) { + return {x: i, y: Math.max(0, d)}; +} + diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/temperature_graph.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/temperature_graph.js new file mode 100755 index 00000000..4c463b39 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/mydevice/public/js/temperature_graph.js @@ -0,0 +1,60 @@ +var temperatureChart; + +nv.addGraph(function () { + + temperatureChart = nv.models.lineChart() + .interpolate("linear") + .options({ + transitionDuration: 300, + useInteractiveGuideline: true + }) + ; + + temperatureChart.xScale(d3.time.scale()); + + // chart sub-models (ie. xAxis, yAxis, etc) when accessed directly, return themselves, not the parent chart, so need to chain separately + temperatureChart.xAxis + .axisLabel("Date/Time") + .ticks(d3.time.seconds) + .tickFormat(function (d) { + return d3.time.format('%m/%d/%Y %I:%M:%S %p')(new Date(d)) + }) + .staggerLabels(true) + ; + + temperatureChart.yAxis + .axisLabel('Temperature (C)') + ; + + d3.select('.chart1 svg') + .datum(getTemperatureChartData()) + .call(temperatureChart); + + nv.utils.windowResize(temperatureChart.update); + + return temperatureChart; +}); + +function getTemperatureChartData() { + + return [ + { + area: true, + values: [], + key: "Temperature", + color: "#34500e" + } + ]; + +} + +function updateTemperatureGraph(temperatureData) { + + var chartData = getTemperatureChartData(); + chartData[0]['values'] = temperatureData; + + d3.select('.chart1 svg') + .datum(chartData) + .transition().duration(500) + .call(temperatureChart); +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/bootstrap.min.css b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/bootstrap.min.css new file mode 100755 index 00000000..d29dc3b4 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/bootstrap.min.css @@ -0,0 +1,6671 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100% +} +body { + margin: 0 +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline +} +audio:not([controls]) { + display: none; + height: 0 +} +[hidden], +template { + display: none +} +a { + background-color: transparent +} +a:active, +a:hover { + outline: 0 +} +abbr[title] { + border-bottom: 1px dotted +} +b, +strong { + font-weight: 700 +} +dfn { + font-style: italic +} +h1 { + margin: .67em 0; + font-size: 2em +} +mark { + color: #000; + background: #ff0 +} +small { + font-size: 80% +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} +sup { + top: -.5em +} +sub { + bottom: -.25em +} +img { + border: 0 +} +svg:not(:root) { + overflow: hidden +} +figure { + margin: 1em 40px +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box +} +pre { + overflow: auto +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit +} +button { + overflow: visible +} +button, +select { + text-transform: none +} +button, +html input[type=button], +input[type=reset], +input[type=submit] { + -webkit-appearance: button; + cursor: pointer +} +button[disabled], +html input[disabled] { + cursor: default +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0 +} +input { + line-height: normal +} +input[type=checkbox], +input[type=radio] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0 +} +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + height: auto +} +input[type=search] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield +} +input[type=search]::-webkit-search-cancel-button, +input[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid silver +} +legend { + padding: 0; + border: 0 +} +textarea { + overflow: auto +} +optgroup { + font-weight: 700 +} +table { + border-spacing: 0; + border-collapse: collapse +} +td, +th { + padding: 0 +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ + +@media print { + *, + :after, + :before { + color: #000!important; + text-shadow: none!important; + background: 0 0!important; + -webkit-box-shadow: none!important; + box-shadow: none!important + } + a, + a:visited { + text-decoration: underline + } + a[href]:after { + content: " (" attr(href) ")" + } + abbr[title]:after { + content: " (" attr(title) ")" + } + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: "" + } + blockquote, + pre { + border: 1px solid #999; + page-break-inside: avoid + } + thead { + display: table-header-group + } + img, + tr { + page-break-inside: avoid + } + img { + max-width: 100%!important + } + h2, + h3, + p { + orphans: 3; + widows: 3 + } + h2, + h3 { + page-break-after: avoid + } + select { + background: #fff!important + } + .navbar { + display: none + } + .btn>.caret, + .dropup>.btn>.caret { + border-top-color: #000!important + } + .label { + border: 1px solid #000 + } + .table { + border-collapse: collapse!important + } + .table td, + .table th { + background-color: #fff!important + } + .table-bordered td, + .table-bordered th { + border: 1px solid #ddd!important + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url(../fonts/glyphicons-halflings-regular.eot); + src: url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'), url(../fonts/glyphicons-halflings-regular.woff) format('woff'), url(../fonts/glyphicons-halflings-regular.woff) format('woff'), url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'), url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg') +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: 400; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} +.glyphicon-asterisk:before { + content: "\2a" +} +.glyphicon-plus:before { + content: "\2b" +} +.glyphicon-eur:before, +.glyphicon-euro:before { + content: "\20ac" +} +.glyphicon-minus:before { + content: "\2212" +} +.glyphicon-cloud:before { + content: "\2601" +} +.glyphicon-envelope:before { + content: "\2709" +} +.glyphicon-pencil:before { + content: "\270f" +} +.glyphicon-glass:before { + content: "\e001" +} +.glyphicon-music:before { + content: "\e002" +} +.glyphicon-search:before { + content: "\e003" +} +.glyphicon-heart:before { + content: "\e005" +} +.glyphicon-star:before { + content: "\e006" +} +.glyphicon-star-empty:before { + content: "\e007" +} +.glyphicon-user:before { + content: "\e008" +} +.glyphicon-film:before { + content: "\e009" +} +.glyphicon-th-large:before { + content: "\e010" +} +.glyphicon-th:before { + content: "\e011" +} +.glyphicon-th-list:before { + content: "\e012" +} +.glyphicon-ok:before { + content: "\e013" +} +.glyphicon-remove:before { + content: "\e014" +} +.glyphicon-zoom-in:before { + content: "\e015" +} +.glyphicon-zoom-out:before { + content: "\e016" +} +.glyphicon-off:before { + content: "\e017" +} +.glyphicon-signal:before { + content: "\e018" +} +.glyphicon-cog:before { + content: "\e019" +} +.glyphicon-trash:before { + content: "\e020" +} +.glyphicon-home:before { + content: "\e021" +} +.glyphicon-file:before { + content: "\e022" +} +.glyphicon-time:before { + content: "\e023" +} +.glyphicon-road:before { + content: "\e024" +} +.glyphicon-download-alt:before { + content: "\e025" +} +.glyphicon-download:before { + content: "\e026" +} +.glyphicon-upload:before { + content: "\e027" +} +.glyphicon-inbox:before { + content: "\e028" +} +.glyphicon-play-circle:before { + content: "\e029" +} +.glyphicon-repeat:before { + content: "\e030" +} +.glyphicon-refresh:before { + content: "\e031" +} +.glyphicon-list-alt:before { + content: "\e032" +} +.glyphicon-lock:before { + content: "\e033" +} +.glyphicon-flag:before { + content: "\e034" +} +.glyphicon-headphones:before { + content: "\e035" +} +.glyphicon-volume-off:before { + content: "\e036" +} +.glyphicon-volume-down:before { + content: "\e037" +} +.glyphicon-volume-up:before { + content: "\e038" +} +.glyphicon-qrcode:before { + content: "\e039" +} +.glyphicon-barcode:before { + content: "\e040" +} +.glyphicon-tag:before { + content: "\e041" +} +.glyphicon-tags:before { + content: "\e042" +} +.glyphicon-book:before { + content: "\e043" +} +.glyphicon-bookmark:before { + content: "\e044" +} +.glyphicon-print:before { + content: "\e045" +} +.glyphicon-camera:before { + content: "\e046" +} +.glyphicon-font:before { + content: "\e047" +} +.glyphicon-bold:before { + content: "\e048" +} +.glyphicon-italic:before { + content: "\e049" +} +.glyphicon-text-height:before { + content: "\e050" +} +.glyphicon-text-width:before { + content: "\e051" +} +.glyphicon-align-left:before { + content: "\e052" +} +.glyphicon-align-center:before { + content: "\e053" +} +.glyphicon-align-right:before { + content: "\e054" +} +.glyphicon-align-justify:before { + content: "\e055" +} +.glyphicon-list:before { + content: "\e056" +} +.glyphicon-indent-left:before { + content: "\e057" +} +.glyphicon-indent-right:before { + content: "\e058" +} +.glyphicon-facetime-video:before { + content: "\e059" +} +.glyphicon-picture:before { + content: "\e060" +} +.glyphicon-map-marker:before { + content: "\e062" +} +.glyphicon-adjust:before { + content: "\e063" +} +.glyphicon-tint:before { + content: "\e064" +} +.glyphicon-edit:before { + content: "\e065" +} +.glyphicon-share:before { + content: "\e066" +} +.glyphicon-check:before { + content: "\e067" +} +.glyphicon-move:before { + content: "\e068" +} +.glyphicon-step-backward:before { + content: "\e069" +} +.glyphicon-fast-backward:before { + content: "\e070" +} +.glyphicon-backward:before { + content: "\e071" +} +.glyphicon-play:before { + content: "\e072" +} +.glyphicon-pause:before { + content: "\e073" +} +.glyphicon-stop:before { + content: "\e074" +} +.glyphicon-forward:before { + content: "\e075" +} +.glyphicon-fast-forward:before { + content: "\e076" +} +.glyphicon-step-forward:before { + content: "\e077" +} +.glyphicon-eject:before { + content: "\e078" +} +.glyphicon-chevron-left:before { + content: "\e079" +} +.glyphicon-chevron-right:before { + content: "\e080" +} +.glyphicon-plus-sign:before { + content: "\e081" +} +.glyphicon-minus-sign:before { + content: "\e082" +} +.glyphicon-remove-sign:before { + content: "\e083" +} +.glyphicon-ok-sign:before { + content: "\e084" +} +.glyphicon-question-sign:before { + content: "\e085" +} +.glyphicon-info-sign:before { + content: "\e086" +} +.glyphicon-screenshot:before { + content: "\e087" +} +.glyphicon-remove-circle:before { + content: "\e088" +} +.glyphicon-ok-circle:before { + content: "\e089" +} +.glyphicon-ban-circle:before { + content: "\e090" +} +.glyphicon-arrow-left:before { + content: "\e091" +} +.glyphicon-arrow-right:before { + content: "\e092" +} +.glyphicon-arrow-up:before { + content: "\e093" +} +.glyphicon-arrow-down:before { + content: "\e094" +} +.glyphicon-share-alt:before { + content: "\e095" +} +.glyphicon-resize-full:before { + content: "\e096" +} +.glyphicon-resize-small:before { + content: "\e097" +} +.glyphicon-exclamation-sign:before { + content: "\e101" +} +.glyphicon-gift:before { + content: "\e102" +} +.glyphicon-leaf:before { + content: "\e103" +} +.glyphicon-fire:before { + content: "\e104" +} +.glyphicon-eye-open:before { + content: "\e105" +} +.glyphicon-eye-close:before { + content: "\e106" +} +.glyphicon-warning-sign:before { + content: "\e107" +} +.glyphicon-plane:before { + content: "\e108" +} +.glyphicon-calendar:before { + content: "\e109" +} +.glyphicon-random:before { + content: "\e110" +} +.glyphicon-comment:before { + content: "\e111" +} +.glyphicon-magnet:before { + content: "\e112" +} +.glyphicon-chevron-up:before { + content: "\e113" +} +.glyphicon-chevron-down:before { + content: "\e114" +} +.glyphicon-retweet:before { + content: "\e115" +} +.glyphicon-shopping-cart:before { + content: "\e116" +} +.glyphicon-folder-close:before { + content: "\e117" +} +.glyphicon-folder-open:before { + content: "\e118" +} +.glyphicon-resize-vertical:before { + content: "\e119" +} +.glyphicon-resize-horizontal:before { + content: "\e120" +} +.glyphicon-hdd:before { + content: "\e121" +} +.glyphicon-bullhorn:before { + content: "\e122" +} +.glyphicon-bell:before { + content: "\e123" +} +.glyphicon-certificate:before { + content: "\e124" +} +.glyphicon-thumbs-up:before { + content: "\e125" +} +.glyphicon-thumbs-down:before { + content: "\e126" +} +.glyphicon-hand-right:before { + content: "\e127" +} +.glyphicon-hand-left:before { + content: "\e128" +} +.glyphicon-hand-up:before { + content: "\e129" +} +.glyphicon-hand-down:before { + content: "\e130" +} +.glyphicon-circle-arrow-right:before { + content: "\e131" +} +.glyphicon-circle-arrow-left:before { + content: "\e132" +} +.glyphicon-circle-arrow-up:before { + content: "\e133" +} +.glyphicon-circle-arrow-down:before { + content: "\e134" +} +.glyphicon-globe:before { + content: "\e135" +} +.glyphicon-wrench:before { + content: "\e136" +} +.glyphicon-tasks:before { + content: "\e137" +} +.glyphicon-filter:before { + content: "\e138" +} +.glyphicon-briefcase:before { + content: "\e139" +} +.glyphicon-fullscreen:before { + content: "\e140" +} +.glyphicon-dashboard:before { + content: "\e141" +} +.glyphicon-paperclip:before { + content: "\e142" +} +.glyphicon-heart-empty:before { + content: "\e143" +} +.glyphicon-link:before { + content: "\e144" +} +.glyphicon-phone:before { + content: "\e145" +} +.glyphicon-pushpin:before { + content: "\e146" +} +.glyphicon-usd:before { + content: "\e148" +} +.glyphicon-gbp:before { + content: "\e149" +} +.glyphicon-sort:before { + content: "\e150" +} +.glyphicon-sort-by-alphabet:before { + content: "\e151" +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152" +} +.glyphicon-sort-by-order:before { + content: "\e153" +} +.glyphicon-sort-by-order-alt:before { + content: "\e154" +} +.glyphicon-sort-by-attributes:before { + content: "\e155" +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156" +} +.glyphicon-unchecked:before { + content: "\e157" +} +.glyphicon-expand:before { + content: "\e158" +} +.glyphicon-collapse-down:before { + content: "\e159" +} +.glyphicon-collapse-up:before { + content: "\e160" +} +.glyphicon-log-in:before { + content: "\e161" +} +.glyphicon-flash:before { + content: "\e162" +} +.glyphicon-log-out:before { + content: "\e163" +} +.glyphicon-new-window:before { + content: "\e164" +} +.glyphicon-record:before { + content: "\e165" +} +.glyphicon-save:before { + content: "\e166" +} +.glyphicon-open:before { + content: "\e167" +} +.glyphicon-saved:before { + content: "\e168" +} +.glyphicon-import:before { + content: "\e169" +} +.glyphicon-export:before { + content: "\e170" +} +.glyphicon-send:before { + content: "\e171" +} +.glyphicon-floppy-disk:before { + content: "\e172" +} +.glyphicon-floppy-saved:before { + content: "\e173" +} +.glyphicon-floppy-remove:before { + content: "\e174" +} +.glyphicon-floppy-save:before { + content: "\e175" +} +.glyphicon-floppy-open:before { + content: "\e176" +} +.glyphicon-credit-card:before { + content: "\e177" +} +.glyphicon-transfer:before { + content: "\e178" +} +.glyphicon-cutlery:before { + content: "\e179" +} +.glyphicon-header:before { + content: "\e180" +} +.glyphicon-compressed:before { + content: "\e181" +} +.glyphicon-earphone:before { + content: "\e182" +} +.glyphicon-phone-alt:before { + content: "\e183" +} +.glyphicon-tower:before { + content: "\e184" +} +.glyphicon-stats:before { + content: "\e185" +} +.glyphicon-sd-video:before { + content: "\e186" +} +.glyphicon-hd-video:before { + content: "\e187" +} +.glyphicon-subtitles:before { + content: "\e188" +} +.glyphicon-sound-stereo:before { + content: "\e189" +} +.glyphicon-sound-dolby:before { + content: "\e190" +} +.glyphicon-sound-5-1:before { + content: "\e191" +} +.glyphicon-sound-6-1:before { + content: "\e192" +} +.glyphicon-sound-7-1:before { + content: "\e193" +} +.glyphicon-copyright-mark:before { + content: "\e194" +} +.glyphicon-registration-mark:before { + content: "\e195" +} +.glyphicon-cloud-download:before { + content: "\e197" +} +.glyphicon-cloud-upload:before { + content: "\e198" +} +.glyphicon-tree-conifer:before { + content: "\e199" +} +.glyphicon-tree-deciduous:before { + content: "\e200" +} +.glyphicon-cd:before { + content: "\e201" +} +.glyphicon-save-file:before { + content: "\e202" +} +.glyphicon-open-file:before { + content: "\e203" +} +.glyphicon-level-up:before { + content: "\e204" +} +.glyphicon-copy:before { + content: "\e205" +} +.glyphicon-paste:before { + content: "\e206" +} +.glyphicon-alert:before { + content: "\e209" +} +.glyphicon-equalizer:before { + content: "\e210" +} +.glyphicon-king:before { + content: "\e211" +} +.glyphicon-queen:before { + content: "\e212" +} +.glyphicon-pawn:before { + content: "\e213" +} +.glyphicon-bishop:before { + content: "\e214" +} +.glyphicon-knight:before { + content: "\e215" +} +.glyphicon-baby-formula:before { + content: "\e216" +} +.glyphicon-tent:before { + content: "\26fa" +} +.glyphicon-blackboard:before { + content: "\e218" +} +.glyphicon-bed:before { + content: "\e219" +} +.glyphicon-apple:before { + content: "\f8ff" +} +.glyphicon-erase:before { + content: "\e221" +} +.glyphicon-hourglass:before { + content: "\231b" +} +.glyphicon-lamp:before { + content: "\e223" +} +.glyphicon-duplicate:before { + content: "\e224" +} +.glyphicon-piggy-bank:before { + content: "\e225" +} +.glyphicon-scissors:before { + content: "\e226" +} +.glyphicon-bitcoin:before { + content: "\e227" +} +.glyphicon-btc:before { + content: "\e227" +} +.glyphicon-xbt:before { + content: "\e227" +} +.glyphicon-yen:before { + content: "\00a5" +} +.glyphicon-jpy:before { + content: "\00a5" +} +.glyphicon-ruble:before { + content: "\20bd" +} +.glyphicon-rub:before { + content: "\20bd" +} +.glyphicon-scale:before { + content: "\e230" +} +.glyphicon-ice-lolly:before { + content: "\e231" +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232" +} +.glyphicon-education:before { + content: "\e233" +} +.glyphicon-option-horizontal:before { + content: "\e234" +} +.glyphicon-option-vertical:before { + content: "\e235" +} +.glyphicon-menu-hamburger:before { + content: "\e236" +} +.glyphicon-modal-window:before { + content: "\e237" +} +.glyphicon-oil:before { + content: "\e238" +} +.glyphicon-grain:before { + content: "\e239" +} +.glyphicon-sunglasses:before { + content: "\e240" +} +.glyphicon-text-size:before { + content: "\e241" +} +.glyphicon-text-color:before { + content: "\e242" +} +.glyphicon-text-background:before { + content: "\e243" +} +.glyphicon-object-align-top:before { + content: "\e244" +} +.glyphicon-object-align-bottom:before { + content: "\e245" +} +.glyphicon-object-align-horizontal:before { + content: "\e246" +} +.glyphicon-object-align-left:before { + content: "\e247" +} +.glyphicon-object-align-vertical:before { + content: "\e248" +} +.glyphicon-object-align-right:before { + content: "\e249" +} +.glyphicon-triangle-right:before { + content: "\e250" +} +.glyphicon-triangle-left:before { + content: "\e251" +} +.glyphicon-triangle-bottom:before { + content: "\e252" +} +.glyphicon-triangle-top:before { + content: "\e253" +} +.glyphicon-console:before { + content: "\e254" +} +.glyphicon-superscript:before { + content: "\e255" +} +.glyphicon-subscript:before { + content: "\e256" +} +.glyphicon-menu-left:before { + content: "\e257" +} +.glyphicon-menu-right:before { + content: "\e258" +} +.glyphicon-menu-down:before { + content: "\e259" +} +.glyphicon-menu-up:before { + content: "\e260" +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} +:after, +:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff +} +button, +input, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit +} +a { + color: #337ab7; + text-decoration: none +} +a:focus, +a:hover { + color: #23527c; + text-decoration: underline +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} +figure { + margin: 0 +} +img { + vertical-align: middle +} +.carousel-inner>.item>a>img, +.carousel-inner>.item>img, +.img-responsive, +.thumbnail a>img, +.thumbnail>img { + display: block; + max-width: 100%; + height: auto +} +.img-rounded { + border-radius: 6px +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out +} +.img-circle { + border-radius: 50% +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0 +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto +} +[role=button] { + cursor: pointer +} +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit +} +.h1 .small, +.h1 small, +.h2 .small, +.h2 small, +.h3 .small, +.h3 small, +.h4 .small, +.h4 small, +.h5 .small, +.h5 small, +.h6 .small, +.h6 small, +h1 .small, +h1 small, +h2 .small, +h2 small, +h3 .small, +h3 small, +h4 .small, +h4 small, +h5 .small, +h5 small, +h6 .small, +h6 small { + font-weight: 400; + line-height: 1; + color: #777 +} +.h1, +.h2, +.h3, +h1, +h2, +h3 { + margin-top: 20px; + margin-bottom: 10px +} +.h1 .small, +.h1 small, +.h2 .small, +.h2 small, +.h3 .small, +.h3 small, +h1 .small, +h1 small, +h2 .small, +h2 small, +h3 .small, +h3 small { + font-size: 65% +} +.h4, +.h5, +.h6, +h4, +h5, +h6 { + margin-top: 10px; + margin-bottom: 10px +} +.h4 .small, +.h4 small, +.h5 .small, +.h5 small, +.h6 .small, +.h6 small, +h4 .small, +h4 small, +h5 .small, +h5 small, +h6 .small, +h6 small { + font-size: 75% +} +.h1, +h1 { + font-size: 36px +} +.h2, +h2 { + font-size: 30px +} +.h3, +h3 { + font-size: 24px +} +.h4, +h4 { + font-size: 18px +} +.h5, +h5 { + font-size: 14px +} +.h6, +h6 { + font-size: 12px +} +p { + margin: 0 0 10px +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4 +} +@media (min-width: 768px) { + .lead { + font-size: 21px + } +} +.small, +small { + font-size: 85% +} +.mark, +mark { + padding: .2em; + background-color: #fcf8e3 +} +.text-left { + text-align: left +} +.text-right { + text-align: right +} +.text-center { + text-align: center +} +.text-justify { + text-align: justify +} +.text-nowrap { + white-space: nowrap +} +.text-lowercase { + text-transform: lowercase +} +.text-uppercase { + text-transform: uppercase +} +.text-capitalize { + text-transform: capitalize +} +.text-muted { + color: #777 +} +.text-primary { + color: #337ab7 +} +a.text-primary:hover { + color: #286090 +} +.text-success { + color: #3c763d +} +a.text-success:hover { + color: #2b542c +} +.text-info { + color: #31708f +} +a.text-info:hover { + color: #245269 +} +.text-warning { + color: #8a6d3b +} +a.text-warning:hover { + color: #66512c +} +.text-danger { + color: #a94442 +} +a.text-danger:hover { + color: #843534 +} +.bg-primary { + color: #fff; + background-color: #337ab7 +} +a.bg-primary:hover { + background-color: #286090 +} +.bg-success { + background-color: #dff0d8 +} +a.bg-success:hover { + background-color: #c1e2b3 +} +.bg-info { + background-color: #d9edf7 +} +a.bg-info:hover { + background-color: #afd9ee +} +.bg-warning { + background-color: #fcf8e3 +} +a.bg-warning:hover { + background-color: #f7ecb5 +} +.bg-danger { + background-color: #f2dede +} +a.bg-danger:hover { + background-color: #e4b9b9 +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee +} +ol, +ul { + margin-top: 0; + margin-bottom: 10px +} +ol ol, +ol ul, +ul ol, +ul ul { + margin-bottom: 0 +} +.list-unstyled { + padding-left: 0; + list-style: none +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none +} +.list-inline>li { + display: inline-block; + padding-right: 5px; + padding-left: 5px +} +dl { + margin-top: 0; + margin-bottom: 20px +} +dd, +dt { + line-height: 1.42857143 +} +dt { + font-weight: 700 +} +dd { + margin-left: 0 +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap + } + .dl-horizontal dd { + margin-left: 180px + } +} +abbr[data-original-title], +abbr[title] { + cursor: help; + border-bottom: 1px dotted #777 +} +.initialism { + font-size: 90%; + text-transform: uppercase +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee +} +blockquote ol:last-child, +blockquote p:last-child, +blockquote ul:last-child { + margin-bottom: 0 +} +blockquote .small, +blockquote footer, +blockquote small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777 +} +blockquote .small:before, +blockquote footer:before, +blockquote small:before { + content: '\2014 \00A0' +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0 +} +.blockquote-reverse .small:before, +.blockquote-reverse footer:before, +.blockquote-reverse small:before, +blockquote.pull-right .small:before, +blockquote.pull-right footer:before, +blockquote.pull-right small:before { + content: '' +} +.blockquote-reverse .small:after, +.blockquote-reverse footer:after, +.blockquote-reverse small:after, +blockquote.pull-right .small:after, +blockquote.pull-right footer:after, +blockquote.pull-right small:after { + content: '\00A0 \2014' +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143 +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25) +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + -webkit-box-shadow: none; + box-shadow: none +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0 +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto +} +@media (min-width: 768px) { + .container { + width: 750px + } +} +@media (min-width: 992px) { + .container { + width: 970px + } +} +@media (min-width: 1200px) { + .container { + width: 1230px + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto +} +.row { + margin-right: -15px; + margin-left: -15px +} +.col-lg-1, +.col-lg-10, +.col-lg-11, +.col-lg-12, +.col-lg-2, +.col-lg-3, +.col-lg-4, +.col-lg-5, +.col-lg-6, +.col-lg-7, +.col-lg-8, +.col-lg-9, +.col-md-1, +.col-md-10, +.col-md-11, +.col-md-12, +.col-md-2, +.col-md-3, +.col-md-4, +.col-md-5, +.col-md-6, +.col-md-7, +.col-md-8, +.col-md-9, +.col-sm-1, +.col-sm-10, +.col-sm-11, +.col-sm-12, +.col-sm-2, +.col-sm-3, +.col-sm-4, +.col-sm-5, +.col-sm-6, +.col-sm-7, +.col-sm-8, +.col-sm-9, +.col-xs-1, +.col-xs-10, +.col-xs-11, +.col-xs-12, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px +} +.col-xs-1, +.col-xs-10, +.col-xs-11, +.col-xs-12, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9 { + float: left +} +.col-xs-12 { + width: 100% +} +.col-xs-11 { + width: 91.66666667% +} +.col-xs-10 { + width: 83.33333333% +} +.col-xs-9 { + width: 75% +} +.col-xs-8 { + width: 66.66666667% +} +.col-xs-7 { + width: 58.33333333% +} +.col-xs-6 { + width: 50% +} +.col-xs-5 { + width: 41.66666667% +} +.col-xs-4 { + width: 33.33333333% +} +.col-xs-3 { + width: 25% +} +.col-xs-2 { + width: 16.66666667% +} +.col-xs-1 { + width: 8.33333333% +} +.col-xs-pull-12 { + right: 100% +} +.col-xs-pull-11 { + right: 91.66666667% +} +.col-xs-pull-10 { + right: 83.33333333% +} +.col-xs-pull-9 { + right: 75% +} +.col-xs-pull-8 { + right: 66.66666667% +} +.col-xs-pull-7 { + right: 58.33333333% +} +.col-xs-pull-6 { + right: 50% +} +.col-xs-pull-5 { + right: 41.66666667% +} +.col-xs-pull-4 { + right: 33.33333333% +} +.col-xs-pull-3 { + right: 25% +} +.col-xs-pull-2 { + right: 16.66666667% +} +.col-xs-pull-1 { + right: 8.33333333% +} +.col-xs-pull-0 { + right: auto +} +.col-xs-push-12 { + left: 100% +} +.col-xs-push-11 { + left: 91.66666667% +} +.col-xs-push-10 { + left: 83.33333333% +} +.col-xs-push-9 { + left: 75% +} +.col-xs-push-8 { + left: 66.66666667% +} +.col-xs-push-7 { + left: 58.33333333% +} +.col-xs-push-6 { + left: 50% +} +.col-xs-push-5 { + left: 41.66666667% +} +.col-xs-push-4 { + left: 33.33333333% +} +.col-xs-push-3 { + left: 25% +} +.col-xs-push-2 { + left: 16.66666667% +} +.col-xs-push-1 { + left: 8.33333333% +} +.col-xs-push-0 { + left: auto +} +.col-xs-offset-12 { + margin-left: 100% +} +.col-xs-offset-11 { + margin-left: 91.66666667% +} +.col-xs-offset-10 { + margin-left: 83.33333333% +} +.col-xs-offset-9 { + margin-left: 75% +} +.col-xs-offset-8 { + margin-left: 66.66666667% +} +.col-xs-offset-7 { + margin-left: 58.33333333% +} +.col-xs-offset-6 { + margin-left: 50% +} +.col-xs-offset-5 { + margin-left: 41.66666667% +} +.col-xs-offset-4 { + margin-left: 33.33333333% +} +.col-xs-offset-3 { + margin-left: 25% +} +.col-xs-offset-2 { + margin-left: 16.66666667% +} +.col-xs-offset-1 { + margin-left: 8.33333333% +} +.col-xs-offset-0 { + margin-left: 0 +} +@media (min-width: 768px) { + .col-sm-1, + .col-sm-10, + .col-sm-11, + .col-sm-12, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9 { + float: left + } + .col-sm-12 { + width: 100% + } + .col-sm-11 { + width: 91.66666667% + } + .col-sm-10 { + width: 83.33333333% + } + .col-sm-9 { + width: 75% + } + .col-sm-8 { + width: 66.66666667% + } + .col-sm-7 { + width: 58.33333333% + } + .col-sm-6 { + width: 50% + } + .col-sm-5 { + width: 41.66666667% + } + .col-sm-4 { + width: 33.33333333% + } + .col-sm-3 { + width: 25% + } + .col-sm-2 { + width: 16.66666667% + } + .col-sm-1 { + width: 8.33333333% + } + .col-sm-pull-12 { + right: 100% + } + .col-sm-pull-11 { + right: 91.66666667% + } + .col-sm-pull-10 { + right: 83.33333333% + } + .col-sm-pull-9 { + right: 75% + } + .col-sm-pull-8 { + right: 66.66666667% + } + .col-sm-pull-7 { + right: 58.33333333% + } + .col-sm-pull-6 { + right: 50% + } + .col-sm-pull-5 { + right: 41.66666667% + } + .col-sm-pull-4 { + right: 33.33333333% + } + .col-sm-pull-3 { + right: 25% + } + .col-sm-pull-2 { + right: 16.66666667% + } + .col-sm-pull-1 { + right: 8.33333333% + } + .col-sm-pull-0 { + right: auto + } + .col-sm-push-12 { + left: 100% + } + .col-sm-push-11 { + left: 91.66666667% + } + .col-sm-push-10 { + left: 83.33333333% + } + .col-sm-push-9 { + left: 75% + } + .col-sm-push-8 { + left: 66.66666667% + } + .col-sm-push-7 { + left: 58.33333333% + } + .col-sm-push-6 { + left: 50% + } + .col-sm-push-5 { + left: 41.66666667% + } + .col-sm-push-4 { + left: 33.33333333% + } + .col-sm-push-3 { + left: 25% + } + .col-sm-push-2 { + left: 16.66666667% + } + .col-sm-push-1 { + left: 8.33333333% + } + .col-sm-push-0 { + left: auto + } + .col-sm-offset-12 { + margin-left: 100% + } + .col-sm-offset-11 { + margin-left: 91.66666667% + } + .col-sm-offset-10 { + margin-left: 83.33333333% + } + .col-sm-offset-9 { + margin-left: 75% + } + .col-sm-offset-8 { + margin-left: 66.66666667% + } + .col-sm-offset-7 { + margin-left: 58.33333333% + } + .col-sm-offset-6 { + margin-left: 50% + } + .col-sm-offset-5 { + margin-left: 41.66666667% + } + .col-sm-offset-4 { + margin-left: 33.33333333% + } + .col-sm-offset-3 { + margin-left: 25% + } + .col-sm-offset-2 { + margin-left: 16.66666667% + } + .col-sm-offset-1 { + margin-left: 8.33333333% + } + .col-sm-offset-0 { + margin-left: 0 + } +} +@media (min-width: 992px) { + .col-md-1, + .col-md-10, + .col-md-11, + .col-md-12, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9 { + float: left + } + .col-md-12 { + width: 100% + } + .col-md-11 { + width: 91.66666667% + } + .col-md-10 { + width: 83.33333333% + } + .col-md-9 { + width: 75% + } + .col-md-8 { + width: 66.66666667% + } + .col-md-7 { + width: 58.33333333% + } + .col-md-6 { + width: 50% + } + .col-md-5 { + width: 41.66666667% + } + .col-md-4 { + width: 33.33333333% + } + .col-md-3 { + width: 25% + } + .col-md-2 { + width: 16.66666667% + } + .col-md-1 { + width: 8.33333333% + } + .col-md-pull-12 { + right: 100% + } + .col-md-pull-11 { + right: 91.66666667% + } + .col-md-pull-10 { + right: 83.33333333% + } + .col-md-pull-9 { + right: 75% + } + .col-md-pull-8 { + right: 66.66666667% + } + .col-md-pull-7 { + right: 58.33333333% + } + .col-md-pull-6 { + right: 50% + } + .col-md-pull-5 { + right: 41.66666667% + } + .col-md-pull-4 { + right: 33.33333333% + } + .col-md-pull-3 { + right: 25% + } + .col-md-pull-2 { + right: 16.66666667% + } + .col-md-pull-1 { + right: 8.33333333% + } + .col-md-pull-0 { + right: auto + } + .col-md-push-12 { + left: 100% + } + .col-md-push-11 { + left: 91.66666667% + } + .col-md-push-10 { + left: 83.33333333% + } + .col-md-push-9 { + left: 75% + } + .col-md-push-8 { + left: 66.66666667% + } + .col-md-push-7 { + left: 58.33333333% + } + .col-md-push-6 { + left: 50% + } + .col-md-push-5 { + left: 41.66666667% + } + .col-md-push-4 { + left: 33.33333333% + } + .col-md-push-3 { + left: 25% + } + .col-md-push-2 { + left: 16.66666667% + } + .col-md-push-1 { + left: 8.33333333% + } + .col-md-push-0 { + left: auto + } + .col-md-offset-12 { + margin-left: 100% + } + .col-md-offset-11 { + margin-left: 91.66666667% + } + .col-md-offset-10 { + margin-left: 83.33333333% + } + .col-md-offset-9 { + margin-left: 75% + } + .col-md-offset-8 { + margin-left: 66.66666667% + } + .col-md-offset-7 { + margin-left: 58.33333333% + } + .col-md-offset-6 { + margin-left: 50% + } + .col-md-offset-5 { + margin-left: 41.66666667% + } + .col-md-offset-4 { + margin-left: 33.33333333% + } + .col-md-offset-3 { + margin-left: 25% + } + .col-md-offset-2 { + margin-left: 16.66666667% + } + .col-md-offset-1 { + margin-left: 8.33333333% + } + .col-md-offset-0 { + margin-left: 0 + } +} +@media (min-width: 1200px) { + .col-lg-1, + .col-lg-10, + .col-lg-11, + .col-lg-12, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9 { + float: left + } + .col-lg-12 { + width: 100% + } + .col-lg-11 { + width: 91.66666667% + } + .col-lg-10 { + width: 83.33333333% + } + .col-lg-9 { + width: 75% + } + .col-lg-8 { + width: 66.66666667% + } + .col-lg-7 { + width: 58.33333333% + } + .col-lg-6 { + width: 50% + } + .col-lg-5 { + width: 41.66666667% + } + .col-lg-4 { + width: 33.33333333% + } + .col-lg-3 { + width: 25% + } + .col-lg-2 { + width: 16.66666667% + } + .col-lg-1 { + width: 8.33333333% + } + .col-lg-pull-12 { + right: 100% + } + .col-lg-pull-11 { + right: 91.66666667% + } + .col-lg-pull-10 { + right: 83.33333333% + } + .col-lg-pull-9 { + right: 75% + } + .col-lg-pull-8 { + right: 66.66666667% + } + .col-lg-pull-7 { + right: 58.33333333% + } + .col-lg-pull-6 { + right: 50% + } + .col-lg-pull-5 { + right: 41.66666667% + } + .col-lg-pull-4 { + right: 33.33333333% + } + .col-lg-pull-3 { + right: 25% + } + .col-lg-pull-2 { + right: 16.66666667% + } + .col-lg-pull-1 { + right: 8.33333333% + } + .col-lg-pull-0 { + right: auto + } + .col-lg-push-12 { + left: 100% + } + .col-lg-push-11 { + left: 91.66666667% + } + .col-lg-push-10 { + left: 83.33333333% + } + .col-lg-push-9 { + left: 75% + } + .col-lg-push-8 { + left: 66.66666667% + } + .col-lg-push-7 { + left: 58.33333333% + } + .col-lg-push-6 { + left: 50% + } + .col-lg-push-5 { + left: 41.66666667% + } + .col-lg-push-4 { + left: 33.33333333% + } + .col-lg-push-3 { + left: 25% + } + .col-lg-push-2 { + left: 16.66666667% + } + .col-lg-push-1 { + left: 8.33333333% + } + .col-lg-push-0 { + left: auto + } + .col-lg-offset-12 { + margin-left: 100% + } + .col-lg-offset-11 { + margin-left: 91.66666667% + } + .col-lg-offset-10 { + margin-left: 83.33333333% + } + .col-lg-offset-9 { + margin-left: 75% + } + .col-lg-offset-8 { + margin-left: 66.66666667% + } + .col-lg-offset-7 { + margin-left: 58.33333333% + } + .col-lg-offset-6 { + margin-left: 50% + } + .col-lg-offset-5 { + margin-left: 41.66666667% + } + .col-lg-offset-4 { + margin-left: 33.33333333% + } + .col-lg-offset-3 { + margin-left: 25% + } + .col-lg-offset-2 { + margin-left: 16.66666667% + } + .col-lg-offset-1 { + margin-left: 8.33333333% + } + .col-lg-offset-0 { + margin-left: 0 + } +} +table { + background-color: transparent +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left +} +th { + text-align: left +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px +} +.table>tbody>tr>td, +.table>tbody>tr>th, +.table>tfoot>tr>td, +.table>tfoot>tr>th, +.table>thead>tr>td, +.table>thead>tr>th { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd +} +.table>thead>tr>th { + vertical-align: bottom; + border-bottom: 2px solid #ddd +} +.table>caption+thead>tr:first-child>td, +.table>caption+thead>tr:first-child>th, +.table>colgroup+thead>tr:first-child>td, +.table>colgroup+thead>tr:first-child>th, +.table>thead:first-child>tr:first-child>td, +.table>thead:first-child>tr:first-child>th { + border-top: 0 +} +.table>tbody+tbody { + border-top: 2px solid #ddd +} +.table .table { + background-color: #fff +} +.table-condensed>tbody>tr>td, +.table-condensed>tbody>tr>th, +.table-condensed>tfoot>tr>td, +.table-condensed>tfoot>tr>th, +.table-condensed>thead>tr>td, +.table-condensed>thead>tr>th { + padding: 5px +} +.table-bordered { + border: 1px solid #ddd +} +.table-bordered>tbody>tr>td, +.table-bordered>tbody>tr>th, +.table-bordered>tfoot>tr>td, +.table-bordered>tfoot>tr>th, +.table-bordered>thead>tr>td, +.table-bordered>thead>tr>th { + border: 1px solid #ddd +} +.table-bordered>thead>tr>td, +.table-bordered>thead>tr>th { + border-bottom-width: 2px +} +.table-striped>tbody>tr:nth-of-type(odd) { + background-color: #f9f9f9 +} +.table-hover>tbody>tr:hover { + background-color: #f5f5f5 +} +table col[class*=col-] { + position: static; + display: table-column; + float: none +} +table td[class*=col-], +table th[class*=col-] { + position: static; + display: table-cell; + float: none +} +.table>tbody>tr.active>td, +.table>tbody>tr.active>th, +.table>tbody>tr>td.active, +.table>tbody>tr>th.active, +.table>tfoot>tr.active>td, +.table>tfoot>tr.active>th, +.table>tfoot>tr>td.active, +.table>tfoot>tr>th.active, +.table>thead>tr.active>td, +.table>thead>tr.active>th, +.table>thead>tr>td.active, +.table>thead>tr>th.active { + background-color: #f5f5f5 +} +.table-hover>tbody>tr.active:hover>td, +.table-hover>tbody>tr.active:hover>th, +.table-hover>tbody>tr:hover>.active, +.table-hover>tbody>tr>td.active:hover, +.table-hover>tbody>tr>th.active:hover { + background-color: #e8e8e8 +} +.table>tbody>tr.success>td, +.table>tbody>tr.success>th, +.table>tbody>tr>td.success, +.table>tbody>tr>th.success, +.table>tfoot>tr.success>td, +.table>tfoot>tr.success>th, +.table>tfoot>tr>td.success, +.table>tfoot>tr>th.success, +.table>thead>tr.success>td, +.table>thead>tr.success>th, +.table>thead>tr>td.success, +.table>thead>tr>th.success { + background-color: #dff0d8 +} +.table-hover>tbody>tr.success:hover>td, +.table-hover>tbody>tr.success:hover>th, +.table-hover>tbody>tr:hover>.success, +.table-hover>tbody>tr>td.success:hover, +.table-hover>tbody>tr>th.success:hover { + background-color: #d0e9c6 +} +.table>tbody>tr.info>td, +.table>tbody>tr.info>th, +.table>tbody>tr>td.info, +.table>tbody>tr>th.info, +.table>tfoot>tr.info>td, +.table>tfoot>tr.info>th, +.table>tfoot>tr>td.info, +.table>tfoot>tr>th.info, +.table>thead>tr.info>td, +.table>thead>tr.info>th, +.table>thead>tr>td.info, +.table>thead>tr>th.info { + background-color: #d9edf7 +} +.table-hover>tbody>tr.info:hover>td, +.table-hover>tbody>tr.info:hover>th, +.table-hover>tbody>tr:hover>.info, +.table-hover>tbody>tr>td.info:hover, +.table-hover>tbody>tr>th.info:hover { + background-color: #c4e3f3 +} +.table>tbody>tr.warning>td, +.table>tbody>tr.warning>th, +.table>tbody>tr>td.warning, +.table>tbody>tr>th.warning, +.table>tfoot>tr.warning>td, +.table>tfoot>tr.warning>th, +.table>tfoot>tr>td.warning, +.table>tfoot>tr>th.warning, +.table>thead>tr.warning>td, +.table>thead>tr.warning>th, +.table>thead>tr>td.warning, +.table>thead>tr>th.warning { + background-color: #fcf8e3 +} +.table-hover>tbody>tr.warning:hover>td, +.table-hover>tbody>tr.warning:hover>th, +.table-hover>tbody>tr:hover>.warning, +.table-hover>tbody>tr>td.warning:hover, +.table-hover>tbody>tr>th.warning:hover { + background-color: #faf2cc +} +.table>tbody>tr.danger>td, +.table>tbody>tr.danger>th, +.table>tbody>tr>td.danger, +.table>tbody>tr>th.danger, +.table>tfoot>tr.danger>td, +.table>tfoot>tr.danger>th, +.table>tfoot>tr>td.danger, +.table>tfoot>tr>th.danger, +.table>thead>tr.danger>td, +.table>thead>tr.danger>th, +.table>thead>tr>td.danger, +.table>thead>tr>th.danger { + background-color: #f2dede +} +.table-hover>tbody>tr.danger:hover>td, +.table-hover>tbody>tr.danger:hover>th, +.table-hover>tbody>tr:hover>.danger, +.table-hover>tbody>tr>td.danger:hover, +.table-hover>tbody>tr>th.danger:hover { + background-color: #ebcccc +} +.table-responsive { + min-height: .01%; + overflow-x: auto +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd + } + .table-responsive>.table { + margin-bottom: 0 + } + .table-responsive>.table>tbody>tr>td, + .table-responsive>.table>tbody>tr>th, + .table-responsive>.table>tfoot>tr>td, + .table-responsive>.table>tfoot>tr>th, + .table-responsive>.table>thead>tr>td, + .table-responsive>.table>thead>tr>th { + white-space: nowrap + } + .table-responsive>.table-bordered { + border: 0 + } + .table-responsive>.table-bordered>tbody>tr>td:first-child, + .table-responsive>.table-bordered>tbody>tr>th:first-child, + .table-responsive>.table-bordered>tfoot>tr>td:first-child, + .table-responsive>.table-bordered>tfoot>tr>th:first-child, + .table-responsive>.table-bordered>thead>tr>td:first-child, + .table-responsive>.table-bordered>thead>tr>th:first-child { + border-left: 0 + } + .table-responsive>.table-bordered>tbody>tr>td:last-child, + .table-responsive>.table-bordered>tbody>tr>th:last-child, + .table-responsive>.table-bordered>tfoot>tr>td:last-child, + .table-responsive>.table-bordered>tfoot>tr>th:last-child, + .table-responsive>.table-bordered>thead>tr>td:last-child, + .table-responsive>.table-bordered>thead>tr>th:last-child { + border-right: 0 + } + .table-responsive>.table-bordered>tbody>tr:last-child>td, + .table-responsive>.table-bordered>tbody>tr:last-child>th, + .table-responsive>.table-bordered>tfoot>tr:last-child>td, + .table-responsive>.table-bordered>tfoot>tr:last-child>th { + border-bottom: 0 + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5 +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: 700 +} +input[type=search] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} +input[type=checkbox], +input[type=radio] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal +} +input[type=file] { + display: block +} +input[type=range] { + display: block; + width: 100% +} +select[multiple], +select[size] { + height: auto +} +input[type=file]:focus, +input[type=checkbox]:focus, +input[type=radio]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555 +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6) +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1 +} +.form-control:-ms-input-placeholder { + color: #999 +} +.form-control::-webkit-input-placeholder { + color: #999 +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1 +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed +} +textarea.form-control { + height: auto +} +input[type=search] { + -webkit-appearance: none +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type=date], + input[type=time], + input[type=datetime-local], + input[type=month] { + line-height: 34px + } + .input-group-sm input[type=date], + .input-group-sm input[type=time], + .input-group-sm input[type=datetime-local], + .input-group-sm input[type=month], + input[type=date].input-sm, + input[type=time].input-sm, + input[type=datetime-local].input-sm, + input[type=month].input-sm { + line-height: 30px + } + .input-group-lg input[type=date], + .input-group-lg input[type=time], + .input-group-lg input[type=datetime-local], + .input-group-lg input[type=month], + input[type=date].input-lg, + input[type=time].input-lg, + input[type=datetime-local].input-lg, + input[type=month].input-lg { + line-height: 46px + } +} +.form-group { + margin-bottom: 15px +} +.checkbox, +.radio { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px +} +.checkbox label, +.radio label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer +} +.checkbox input[type=checkbox], +.checkbox-inline input[type=checkbox], +.radio input[type=radio], +.radio-inline input[type=radio] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px +} +.checkbox+.checkbox, +.radio+.radio { + margin-top: -5px +} +.checkbox-inline, +.radio-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer +} +.checkbox-inline+.checkbox-inline, +.radio-inline+.radio-inline { + margin-top: 0; + margin-left: 10px +} +fieldset[disabled] input[type=checkbox], +fieldset[disabled] input[type=radio], +input[type=checkbox].disabled, +input[type=checkbox][disabled], +input[type=radio].disabled, +input[type=radio][disabled] { + cursor: not-allowed +} +.checkbox-inline.disabled, +.radio-inline.disabled, +fieldset[disabled] .checkbox-inline, +fieldset[disabled] .radio-inline { + cursor: not-allowed +} +.checkbox.disabled label, +.radio.disabled label, +fieldset[disabled] .checkbox label, +fieldset[disabled] .radio label { + cursor: not-allowed +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0 +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0 +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} +select.input-sm { + height: 30px; + line-height: 30px +} +select[multiple].input-sm, +textarea.input-sm { + height: auto +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px +} +select[multiple].form-group-sm .form-control, +textarea.form-group-sm .form-control { + height: auto +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5 +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} +select.input-lg { + height: 46px; + line-height: 46px +} +select[multiple].input-lg, +textarea.input-lg { + height: auto +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px +} +select[multiple].form-group-lg .form-control, +textarea.form-group-lg .form-control { + height: auto +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333 +} +.has-feedback { + position: relative +} +.has-feedback .form-control { + padding-right: 42.5px +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none +} +.input-lg+.form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px +} +.input-sm+.form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px +} +.has-success .checkbox, +.has-success .checkbox-inline, +.has-success .control-label, +.has-success .help-block, +.has-success .radio, +.has-success .radio-inline, +.has-success.checkbox label, +.has-success.checkbox-inline label, +.has-success.radio label, +.has-success.radio-inline label { + color: #3c763d +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168 +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d +} +.has-success .form-control-feedback { + color: #3c763d +} +.has-warning .checkbox, +.has-warning .checkbox-inline, +.has-warning .control-label, +.has-warning .help-block, +.has-warning .radio, +.has-warning .radio-inline, +.has-warning.checkbox label, +.has-warning.checkbox-inline label, +.has-warning.radio label, +.has-warning.radio-inline label { + color: #8a6d3b +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b +} +.has-warning .form-control-feedback { + color: #8a6d3b +} +.has-error .checkbox, +.has-error .checkbox-inline, +.has-error .control-label, +.has-error .help-block, +.has-error .radio, +.has-error .radio-inline, +.has-error.checkbox label, +.has-error.checkbox-inline label, +.has-error.radio label, +.has-error.radio-inline label { + color: #a94442 +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483 +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442 +} +.has-error .form-control-feedback { + color: #a94442 +} +.has-feedback label~.form-control-feedback { + top: 25px +} +.has-feedback label.sr-only~.form-control-feedback { + top: 0 +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373 +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + .form-inline .form-control-static { + display: inline-block + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle + } + .form-inline .input-group .form-control, + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn { + width: auto + } + .form-inline .input-group>.form-control { + width: 100% + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle + } + .form-inline .checkbox, + .form-inline .radio { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle + } + .form-inline .checkbox label, + .form-inline .radio label { + padding-left: 0 + } + .form-inline .checkbox input[type=checkbox], + .form-inline .radio input[type=radio] { + position: relative; + margin-left: 0 + } + .form-inline .has-feedback .form-control-feedback { + top: 0 + } +} +.form-horizontal .checkbox, +.form-horizontal .checkbox-inline, +.form-horizontal .radio, +.form-horizontal .radio-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0 +} +.form-horizontal .checkbox, +.form-horizontal .radio { + min-height: 27px +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.33px + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px +} +.btn.active.focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn:active:focus, +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} +.btn.focus, +.btn:focus, +.btn:hover { + color: #333; + text-decoration: none +} +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65 +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc +} +.btn-default.active, +.btn-default.focus, +.btn-default:active, +.btn-default:focus, +.btn-default:hover, +.open>.dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad +} +.btn-default.active, +.btn-default:active, +.open>.dropdown-toggle.btn-default { + background-image: none +} +.btn-default.disabled, +.btn-default.disabled.active, +.btn-default.disabled.focus, +.btn-default.disabled:active, +.btn-default.disabled:focus, +.btn-default.disabled:hover, +.btn-default[disabled], +.btn-default[disabled].active, +.btn-default[disabled].focus, +.btn-default[disabled]:active, +.btn-default[disabled]:focus, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-default.active, +fieldset[disabled] .btn-default.focus, +fieldset[disabled] .btn-default:active, +fieldset[disabled] .btn-default:focus, +fieldset[disabled] .btn-default:hover { + background-color: #fff; + border-color: #ccc +} +.btn-default .badge { + color: #fff; + background-color: #333 +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4 +} +.btn-primary.active, +.btn-primary.focus, +.btn-primary:active, +.btn-primary:focus, +.btn-primary:hover, +.open>.dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74 +} +.btn-primary.active, +.btn-primary:active, +.open>.dropdown-toggle.btn-primary { + background-image: none +} +.btn-primary.disabled, +.btn-primary.disabled.active, +.btn-primary.disabled.focus, +.btn-primary.disabled:active, +.btn-primary.disabled:focus, +.btn-primary.disabled:hover, +.btn-primary[disabled], +.btn-primary[disabled].active, +.btn-primary[disabled].focus, +.btn-primary[disabled]:active, +.btn-primary[disabled]:focus, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-primary.active, +fieldset[disabled] .btn-primary.focus, +fieldset[disabled] .btn-primary:active, +fieldset[disabled] .btn-primary:focus, +fieldset[disabled] .btn-primary:hover { + background-color: #337ab7; + border-color: #2e6da4 +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c +} +.btn-success.active, +.btn-success.focus, +.btn-success:active, +.btn-success:focus, +.btn-success:hover, +.open>.dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439 +} +.btn-success.active, +.btn-success:active, +.open>.dropdown-toggle.btn-success { + background-image: none +} +.btn-success.disabled, +.btn-success.disabled.active, +.btn-success.disabled.focus, +.btn-success.disabled:active, +.btn-success.disabled:focus, +.btn-success.disabled:hover, +.btn-success[disabled], +.btn-success[disabled].active, +.btn-success[disabled].focus, +.btn-success[disabled]:active, +.btn-success[disabled]:focus, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-success.active, +fieldset[disabled] .btn-success.focus, +fieldset[disabled] .btn-success:active, +fieldset[disabled] .btn-success:focus, +fieldset[disabled] .btn-success:hover { + background-color: #5cb85c; + border-color: #4cae4c +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da +} +.btn-info.active, +.btn-info.focus, +.btn-info:active, +.btn-info:focus, +.btn-info:hover, +.open>.dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc +} +.btn-info.active, +.btn-info:active, +.open>.dropdown-toggle.btn-info { + background-image: none +} +.btn-info.disabled, +.btn-info.disabled.active, +.btn-info.disabled.focus, +.btn-info.disabled:active, +.btn-info.disabled:focus, +.btn-info.disabled:hover, +.btn-info[disabled], +.btn-info[disabled].active, +.btn-info[disabled].focus, +.btn-info[disabled]:active, +.btn-info[disabled]:focus, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-info.active, +fieldset[disabled] .btn-info.focus, +fieldset[disabled] .btn-info:active, +fieldset[disabled] .btn-info:focus, +fieldset[disabled] .btn-info:hover { + background-color: #5bc0de; + border-color: #46b8da +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236 +} +.btn-warning.active, +.btn-warning.focus, +.btn-warning:active, +.btn-warning:focus, +.btn-warning:hover, +.open>.dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512 +} +.btn-warning.active, +.btn-warning:active, +.open>.dropdown-toggle.btn-warning { + background-image: none +} +.btn-warning.disabled, +.btn-warning.disabled.active, +.btn-warning.disabled.focus, +.btn-warning.disabled:active, +.btn-warning.disabled:focus, +.btn-warning.disabled:hover, +.btn-warning[disabled], +.btn-warning[disabled].active, +.btn-warning[disabled].focus, +.btn-warning[disabled]:active, +.btn-warning[disabled]:focus, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-warning.active, +fieldset[disabled] .btn-warning.focus, +fieldset[disabled] .btn-warning:active, +fieldset[disabled] .btn-warning:focus, +fieldset[disabled] .btn-warning:hover { + background-color: #f0ad4e; + border-color: #eea236 +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a +} +.btn-danger.active, +.btn-danger.focus, +.btn-danger:active, +.btn-danger:focus, +.btn-danger:hover, +.open>.dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925 +} +.btn-danger.active, +.btn-danger:active, +.open>.dropdown-toggle.btn-danger { + background-image: none +} +.btn-danger.disabled, +.btn-danger.disabled.active, +.btn-danger.disabled.focus, +.btn-danger.disabled:active, +.btn-danger.disabled:focus, +.btn-danger.disabled:hover, +.btn-danger[disabled], +.btn-danger[disabled].active, +.btn-danger[disabled].focus, +.btn-danger[disabled]:active, +.btn-danger[disabled]:focus, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger, +fieldset[disabled] .btn-danger.active, +fieldset[disabled] .btn-danger.focus, +fieldset[disabled] .btn-danger:active, +fieldset[disabled] .btn-danger:focus, +fieldset[disabled] .btn-danger:hover { + background-color: #d9534f; + border-color: #d43f3a +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff +} +.btn-link { + font-weight: 400; + color: #337ab7; + border-radius: 0 +} +.btn-link, +.btn-link.active, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none +} +.btn-link, +.btn-link:active, +.btn-link:focus, +.btn-link:hover { + border-color: transparent +} +.btn-link:focus, +.btn-link:hover { + color: #23527c; + text-decoration: underline; + background-color: transparent +} +.btn-link[disabled]:focus, +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:focus, +fieldset[disabled] .btn-link:hover { + color: #777; + text-decoration: none +} +.btn-group-lg>.btn, +.btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} +.btn-group-sm>.btn, +.btn-sm { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} +.btn-group-xs>.btn, +.btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} +.btn-block { + display: block; + width: 100% +} +.btn-block+.btn-block { + margin-top: 5px +} +input[type=button].btn-block, +input[type=reset].btn-block, +input[type=submit].btn-block { + width: 100% +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear +} +.fade.in { + opacity: 1 +} +.collapse { + display: none +} +.collapse.in { + display: block +} +tr.collapse.in { + display: table-row +} +tbody.collapse.in { + display: table-row-group +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent +} +.dropdown, +.dropup { + position: relative +} +.dropdown-toggle:focus { + outline: 0 +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175) +} +.dropdown-menu.pull-right { + right: 0; + left: auto +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5 +} +.dropdown-menu>li>a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #333; + white-space: nowrap +} +.dropdown-menu>li>a:focus, +.dropdown-menu>li>a:hover { + color: #262626; + text-decoration: none; + background-color: #f5f5f5 +} +.dropdown-menu>.active>a, +.dropdown-menu>.active>a:focus, +.dropdown-menu>.active>a:hover { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0 +} +.dropdown-menu>.disabled>a, +.dropdown-menu>.disabled>a:focus, +.dropdown-menu>.disabled>a:hover { + color: #777 +} +.dropdown-menu>.disabled>a:focus, +.dropdown-menu>.disabled>a:hover { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid: DXImageTransform.Microsoft.gradient(enabled=false) +} +.open>.dropdown-menu { + display: block +} +.open>a { + outline: 0 +} +.dropdown-menu-right { + right: 0; + left: auto +} +.dropdown-menu-left { + right: auto; + left: 0 +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990 +} +.pull-right>.dropdown-menu { + right: 0; + left: auto +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px solid +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0 + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle +} +.btn-group-vertical>.btn, +.btn-group>.btn { + position: relative; + float: left +} +.btn-group-vertical>.btn.active, +.btn-group-vertical>.btn:active, +.btn-group-vertical>.btn:focus, +.btn-group-vertical>.btn:hover, +.btn-group>.btn.active, +.btn-group>.btn:active, +.btn-group>.btn:focus, +.btn-group>.btn:hover { + z-index: 2 +} +.btn-group .btn+.btn, +.btn-group .btn+.btn-group, +.btn-group .btn-group+.btn, +.btn-group .btn-group+.btn-group { + margin-left: -1px +} +.btn-toolbar { + margin-left: -5px +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left +} +.btn-toolbar>.btn, +.btn-toolbar>.btn-group, +.btn-toolbar>.input-group { + margin-left: 5px +} +.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0 +} +.btn-group>.btn:first-child { + margin-left: 0 +} +.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} +.btn-group>.btn:last-child:not(:first-child), +.btn-group>.dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} +.btn-group>.btn-group { + float: left +} +.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn { + border-radius: 0 +} +.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child, +.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} +.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0 +} +.btn-group>.btn+.dropdown-toggle { + padding-right: 8px; + padding-left: 8px +} +.btn-group>.btn-lg+.dropdown-toggle { + padding-right: 12px; + padding-left: 12px +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none +} +.btn .caret { + margin-left: 0 +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0 +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px +} +.btn-group-vertical>.btn, +.btn-group-vertical>.btn-group, +.btn-group-vertical>.btn-group>.btn { + display: block; + float: none; + width: 100%; + max-width: 100% +} +.btn-group-vertical>.btn-group>.btn { + float: none +} +.btn-group-vertical>.btn+.btn, +.btn-group-vertical>.btn+.btn-group, +.btn-group-vertical>.btn-group+.btn, +.btn-group-vertical>.btn-group+.btn-group { + margin-top: -1px; + margin-left: 0 +} +.btn-group-vertical>.btn:not(:first-child):not(:last-child) { + border-radius: 0 +} +.btn-group-vertical>.btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} +.btn-group-vertical>.btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px +} +.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn { + border-radius: 0 +} +.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child, +.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} +.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0 +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate +} +.btn-group-justified>.btn, +.btn-group-justified>.btn-group { + display: table-cell; + float: none; + width: 1% +} +.btn-group-justified>.btn-group .btn { + width: 100% +} +.btn-group-justified>.btn-group .dropdown-menu { + left: auto +} +[data-toggle=buttons]>.btn input[type=checkbox], +[data-toggle=buttons]>.btn input[type=radio], +[data-toggle=buttons]>.btn-group>.btn input[type=checkbox], +[data-toggle=buttons]>.btn-group>.btn input[type=radio] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none +} +.input-group { + position: relative; + display: table; + border-collapse: separate +} +.input-group[class*=col-] { + float: none; + padding-right: 0; + padding-left: 0 +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0 +} +.input-group-lg>.form-control, +.input-group-lg>.input-group-addon, +.input-group-lg>.input-group-btn>.btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} +select.input-group-lg>.form-control, +select.input-group-lg>.input-group-addon, +select.input-group-lg>.input-group-btn>.btn { + height: 46px; + line-height: 46px +} +select[multiple].input-group-lg>.form-control, +select[multiple].input-group-lg>.input-group-addon, +select[multiple].input-group-lg>.input-group-btn>.btn, +textarea.input-group-lg>.form-control, +textarea.input-group-lg>.input-group-addon, +textarea.input-group-lg>.input-group-btn>.btn { + height: auto +} +.input-group-sm>.form-control, +.input-group-sm>.input-group-addon, +.input-group-sm>.input-group-btn>.btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} +select.input-group-sm>.form-control, +select.input-group-sm>.input-group-addon, +select.input-group-sm>.input-group-btn>.btn { + height: 30px; + line-height: 30px +} +select[multiple].input-group-sm>.form-control, +select[multiple].input-group-sm>.input-group-addon, +select[multiple].input-group-sm>.input-group-btn>.btn, +textarea.input-group-sm>.form-control, +textarea.input-group-sm>.input-group-addon, +textarea.input-group-sm>.input-group-btn>.btn { + height: auto +} +.input-group .form-control, +.input-group-addon, +.input-group-btn { + display: table-cell +} +.input-group .form-control:not(:first-child):not(:last-child), +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child) { + border-radius: 0 +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: 400; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px +} +.input-group-addon input[type=checkbox], +.input-group-addon input[type=radio] { + margin-top: 0 +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child>.btn, +.input-group-btn:first-child>.btn-group>.btn, +.input-group-btn:first-child>.dropdown-toggle, +.input-group-btn:last-child>.btn-group:not(:last-child)>.btn, +.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} +.input-group-addon:first-child { + border-right: 0 +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:first-child>.btn-group:not(:first-child)>.btn, +.input-group-btn:first-child>.btn:not(:first-child), +.input-group-btn:last-child>.btn, +.input-group-btn:last-child>.btn-group>.btn, +.input-group-btn:last-child>.dropdown-toggle { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} +.input-group-addon:last-child { + border-left: 0 +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap +} +.input-group-btn>.btn { + position: relative +} +.input-group-btn>.btn+.btn { + margin-left: -1px +} +.input-group-btn>.btn:active, +.input-group-btn>.btn:focus, +.input-group-btn>.btn:hover { + z-index: 2 +} +.input-group-btn:first-child>.btn, +.input-group-btn:first-child>.btn-group { + margin-right: -1px +} +.input-group-btn:last-child>.btn, +.input-group-btn:last-child>.btn-group { + margin-left: -1px +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none +} +.nav>li { + position: relative; + display: block +} +.nav>li>a { + position: relative; + display: block; + padding: 10px 15px +} +.nav>li>a:focus, +.nav>li>a:hover { + text-decoration: none; + background-color: #eee +} +.nav>li.disabled>a { + color: #777 +} +.nav>li.disabled>a:focus, +.nav>li.disabled>a:hover { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent +} +.nav .open>a, +.nav .open>a:focus, +.nav .open>a:hover { + background-color: #eee; + border-color: #337ab7 +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5 +} +.nav>li>a>img { + max-width: none +} +.nav-tabs { + border-bottom: 1px solid #ddd +} +.nav-tabs>li { + float: left; + margin-bottom: -1px +} +.nav-tabs>li>a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0 +} +.nav-tabs>li>a:hover { + border-color: #eee #eee #ddd +} +.nav-tabs>li.active>a, +.nav-tabs>li.active>a:focus, +.nav-tabs>li.active>a:hover { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0 +} +.nav-tabs.nav-justified>li { + float: none +} +.nav-tabs.nav-justified>li>a { + margin-bottom: 5px; + text-align: center +} +.nav-tabs.nav-justified>.dropdown .dropdown-menu { + top: auto; + left: auto +} +@media (min-width: 768px) { + .nav-tabs.nav-justified>li { + display: table-cell; + width: 1% + } + .nav-tabs.nav-justified>li>a { + margin-bottom: 0 + } +} +.nav-tabs.nav-justified>li>a { + margin-right: 0; + border-radius: 4px +} +.nav-tabs.nav-justified>.active>a, +.nav-tabs.nav-justified>.active>a:focus, +.nav-tabs.nav-justified>.active>a:hover { + border: 1px solid #ddd +} +@media (min-width: 768px) { + .nav-tabs.nav-justified>li>a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0 + } + .nav-tabs.nav-justified>.active>a, + .nav-tabs.nav-justified>.active>a:focus, + .nav-tabs.nav-justified>.active>a:hover { + border-bottom-color: #fff + } +} +.nav-pills>li { + float: left +} +.nav-pills>li>a { + border-radius: 4px +} +.nav-pills>li+li { + margin-left: 2px +} +.nav-pills>li.active>a, +.nav-pills>li.active>a:focus, +.nav-pills>li.active>a:hover { + color: #fff; + background-color: #337ab7 +} +.nav-stacked>li { + float: none +} +.nav-stacked>li+li { + margin-top: 2px; + margin-left: 0 +} +.nav-justified { + width: 100% +} +.nav-justified>li { + float: none +} +.nav-justified>li>a { + margin-bottom: 5px; + text-align: center +} +.nav-justified>.dropdown .dropdown-menu { + top: auto; + left: auto +} +@media (min-width: 768px) { + .nav-justified>li { + display: table-cell; + width: 1% + } + .nav-justified>li>a { + margin-bottom: 0 + } +} +.nav-tabs-justified { + border-bottom: 0 +} +.nav-tabs-justified>li>a { + margin-right: 0; + border-radius: 4px +} +.nav-tabs-justified>.active>a, +.nav-tabs-justified>.active>a:focus, +.nav-tabs-justified>.active>a:hover { + border: 1px solid #ddd +} +@media (min-width: 768px) { + .nav-tabs-justified>li>a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0 + } + .nav-tabs-justified>.active>a, + .nav-tabs-justified>.active>a:focus, + .nav-tabs-justified>.active>a:hover { + border-bottom-color: #fff + } +} +.tab-content>.tab-pane { + display: none +} +.tab-content>.active { + display: block +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0 +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px + } +} +@media (min-width: 768px) { + .navbar-header { + float: left + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1) +} +.navbar-collapse.in { + overflow-y: auto +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none + } + .navbar-collapse.collapse { + display: block!important; + height: auto!important; + padding-bottom: 0; + overflow: visible!important + } + .navbar-collapse.in { + overflow-y: visible + } + .navbar-fixed-bottom .navbar-collapse, + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse { + padding-right: 0; + padding-left: 0 + } +} +.navbar-fixed-bottom .navbar-collapse, +.navbar-fixed-top .navbar-collapse { + max-height: 340px +} +@media (max-device-width: 480px)and (orientation: landscape) { + .navbar-fixed-bottom .navbar-collapse, + .navbar-fixed-top .navbar-collapse { + max-height: 200px + } +} +.container-fluid>.navbar-collapse, +.container-fluid>.navbar-header, +.container>.navbar-collapse, +.container>.navbar-header { + margin-right: -15px; + margin-left: -15px +} +@media (min-width: 768px) { + .container-fluid>.navbar-collapse, + .container-fluid>.navbar-header, + .container>.navbar-collapse, + .container>.navbar-header { + margin-right: 0; + margin-left: 0 + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0 + } +} +.navbar-fixed-bottom, +.navbar-fixed-top { + position: fixed; + right: 0; + left: 0; + z-index: 1030 +} +@media (min-width: 768px) { + .navbar-fixed-bottom, + .navbar-fixed-top { + border-radius: 0 + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0 +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px +} +.navbar-brand:focus, +.navbar-brand:hover { + text-decoration: none +} +.navbar-brand>img { + display: block +} +@media (min-width: 768px) { + .navbar>.container .navbar-brand, + .navbar>.container-fluid .navbar-brand { + margin-left: -15px + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px +} +.navbar-toggle:focus { + outline: 0 +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px +} +.navbar-toggle .icon-bar+.icon-bar { + margin-top: 4px +} +@media (min-width: 768px) { + .navbar-toggle { + display: none + } +} +.navbar-nav { + margin: 7.5px -15px +} +.navbar-nav>li>a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none + } + .navbar-nav .open .dropdown-menu .dropdown-header, + .navbar-nav .open .dropdown-menu>li>a { + padding: 5px 15px 5px 25px + } + .navbar-nav .open .dropdown-menu>li>a { + line-height: 20px + } + .navbar-nav .open .dropdown-menu>li>a:focus, + .navbar-nav .open .dropdown-menu>li>a:hover { + background-image: none + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0 + } + .navbar-nav>li { + float: left + } + .navbar-nav>li>a { + padding-top: 15px; + padding-bottom: 15px + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1) +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + .navbar-form .form-control-static { + display: inline-block + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle + } + .navbar-form .input-group .form-control, + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn { + width: auto + } + .navbar-form .input-group>.form-control { + width: 100% + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle + } + .navbar-form .checkbox, + .navbar-form .radio { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle + } + .navbar-form .checkbox label, + .navbar-form .radio label { + padding-left: 0 + } + .navbar-form .checkbox input[type=checkbox], + .navbar-form .radio input[type=radio] { + position: relative; + margin-left: 0 + } + .navbar-form .has-feedback .form-control-feedback { + top: 0 + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px + } + .navbar-form .form-group:last-child { + margin-bottom: 0 + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none + } +} +.navbar-nav>li>.dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0 +} +.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px + } +} +@media (min-width: 768px) { + .navbar-left { + float: left!important + } + .navbar-right { + float: right!important; + margin-right: -15px + } + .navbar-right~.navbar-right { + margin-right: 0 + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7 +} +.navbar-default .navbar-brand { + color: #777 +} +.navbar-default .navbar-brand:focus, +.navbar-default .navbar-brand:hover { + color: #5e5e5e; + background-color: transparent +} +.navbar-default .navbar-text { + color: #777 +} +.navbar-default .navbar-nav>li>a { + color: #777 +} +.navbar-default .navbar-nav>li>a:focus, +.navbar-default .navbar-nav>li>a:hover { + color: #333; + background-color: transparent +} +.navbar-default .navbar-nav>.active>a, +.navbar-default .navbar-nav>.active>a:focus, +.navbar-default .navbar-nav>.active>a:hover { + color: #555; + background-color: #e7e7e7 +} +.navbar-default .navbar-nav>.disabled>a, +.navbar-default .navbar-nav>.disabled>a:focus, +.navbar-default .navbar-nav>.disabled>a:hover { + color: #ccc; + background-color: transparent +} +.navbar-default .navbar-toggle { + border-color: #ddd +} +.navbar-default .navbar-toggle:focus, +.navbar-default .navbar-toggle:hover { + background-color: #ddd +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888 +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7 +} +.navbar-default .navbar-nav>.open>a, +.navbar-default .navbar-nav>.open>a:focus, +.navbar-default .navbar-nav>.open>a:hover { + color: #555; + background-color: #e7e7e7 +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu>li>a { + color: #777 + } + .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus, + .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover { + color: #333; + background-color: transparent + } + .navbar-default .navbar-nav .open .dropdown-menu>.active>a, + .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus, + .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover { + color: #555; + background-color: #e7e7e7 + } + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a, + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus, + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover { + color: #ccc; + background-color: transparent + } +} +.navbar-default .navbar-link { + color: #777 +} +.navbar-default .navbar-link:hover { + color: #333 +} +.navbar-default .btn-link { + color: #777 +} +.navbar-default .btn-link:focus, +.navbar-default .btn-link:hover { + color: #333 +} +.navbar-default .btn-link[disabled]:focus, +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:focus, +fieldset[disabled] .navbar-default .btn-link:hover { + color: #ccc +} +.navbar-inverse { + background-color: #222; + border-color: #080808 +} +.navbar-inverse .navbar-brand { + color: #9d9d9d +} +.navbar-inverse .navbar-brand:focus, +.navbar-inverse .navbar-brand:hover { + color: #fff; + background-color: transparent +} +.navbar-inverse .navbar-text { + color: #9d9d9d +} +.navbar-inverse .navbar-nav>li>a { + color: #9d9d9d +} +.navbar-inverse .navbar-nav>li>a:focus, +.navbar-inverse .navbar-nav>li>a:hover { + color: #fff; + background-color: transparent +} +.navbar-inverse .navbar-nav>.active>a, +.navbar-inverse .navbar-nav>.active>a:focus, +.navbar-inverse .navbar-nav>.active>a:hover { + color: #fff; + background-color: #080808 +} +.navbar-inverse .navbar-nav>.disabled>a, +.navbar-inverse .navbar-nav>.disabled>a:focus, +.navbar-inverse .navbar-nav>.disabled>a:hover { + color: #444; + background-color: transparent +} +.navbar-inverse .navbar-toggle { + border-color: #333 +} +.navbar-inverse .navbar-toggle:focus, +.navbar-inverse .navbar-toggle:hover { + background-color: #333 +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010 +} +.navbar-inverse .navbar-nav>.open>a, +.navbar-inverse .navbar-nav>.open>a:focus, +.navbar-inverse .navbar-nav>.open>a:hover { + color: #fff; + background-color: #080808 +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header { + border-color: #080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a { + color: #9d9d9d + } + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus, + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover { + color: #fff; + background-color: transparent + } + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a, + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus, + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover { + color: #fff; + background-color: #080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a, + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus, + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover { + color: #444; + background-color: transparent + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d +} +.navbar-inverse .navbar-link:hover { + color: #fff +} +.navbar-inverse .btn-link { + color: #9d9d9d +} +.navbar-inverse .btn-link:focus, +.navbar-inverse .btn-link:hover { + color: #fff +} +.navbar-inverse .btn-link[disabled]:focus, +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:focus, +fieldset[disabled] .navbar-inverse .btn-link:hover { + color: #444 +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px +} +.breadcrumb>li { + display: inline-block +} +.breadcrumb>li+li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0" +} +.breadcrumb>.active { + color: #777 +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px +} +.pagination>li { + display: inline +} +.pagination>li>a, +.pagination>li>span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd +} +.pagination>li:first-child>a, +.pagination>li:first-child>span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px +} +.pagination>li:last-child>a, +.pagination>li:last-child>span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px +} +.pagination>li>a:focus, +.pagination>li>a:hover, +.pagination>li>span:focus, +.pagination>li>span:hover { + color: #23527c; + background-color: #eee; + border-color: #ddd +} +.pagination>.active>a, +.pagination>.active>a:focus, +.pagination>.active>a:hover, +.pagination>.active>span, +.pagination>.active>span:focus, +.pagination>.active>span:hover { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7 +} +.pagination>.disabled>a, +.pagination>.disabled>a:focus, +.pagination>.disabled>a:hover, +.pagination>.disabled>span, +.pagination>.disabled>span:focus, +.pagination>.disabled>span:hover { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd +} +.pagination-lg>li>a, +.pagination-lg>li>span { + padding: 10px 16px; + font-size: 18px +} +.pagination-lg>li:first-child>a, +.pagination-lg>li:first-child>span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px +} +.pagination-lg>li:last-child>a, +.pagination-lg>li:last-child>span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px +} +.pagination-sm>li>a, +.pagination-sm>li>span { + padding: 5px 10px; + font-size: 12px +} +.pagination-sm>li:first-child>a, +.pagination-sm>li:first-child>span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px +} +.pagination-sm>li:last-child>a, +.pagination-sm>li:last-child>span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none +} +.pager li { + display: inline +} +.pager li>a, +.pager li>span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px +} +.pager li>a:focus, +.pager li>a:hover { + text-decoration: none; + background-color: #eee +} +.pager .next>a, +.pager .next>span { + float: right +} +.pager .previous>a, +.pager .previous>span { + float: left +} +.pager .disabled>a, +.pager .disabled>a:focus, +.pager .disabled>a:hover, +.pager .disabled>span { + color: #777; + cursor: not-allowed; + background-color: #fff +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em +} +a.label:focus, +a.label:hover { + color: #fff; + text-decoration: none; + cursor: pointer +} +.label:empty { + display: none +} +.btn .label { + position: relative; + top: -1px +} +.label-default { + background-color: #777 +} +.label-default[href]:focus, +.label-default[href]:hover { + background-color: #5e5e5e +} +.label-primary { + background-color: #337ab7 +} +.label-primary[href]:focus, +.label-primary[href]:hover { + background-color: #286090 +} +.label-success { + background-color: #5cb85c +} +.label-success[href]:focus, +.label-success[href]:hover { + background-color: #449d44 +} +.label-info { + background-color: #5bc0de +} +.label-info[href]:focus, +.label-info[href]:hover { + background-color: #31b0d5 +} +.label-warning { + background-color: #f0ad4e +} +.label-warning[href]:focus, +.label-warning[href]:hover { + background-color: #ec971f +} +.label-danger { + background-color: #d9534f +} +.label-danger[href]:focus, +.label-danger[href]:hover { + background-color: #c9302c +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #777; + border-radius: 10px +} +.badge:empty { + display: none +} +.btn .badge { + position: relative; + top: -1px +} +.btn-group-xs>.btn .badge, +.btn-xs .badge { + top: 0; + padding: 1px 5px +} +a.badge:focus, +a.badge:hover { + color: #fff; + text-decoration: none; + cursor: pointer +} +.list-group-item.active>.badge, +.nav-pills>.active>a>.badge { + color: #337ab7; + background-color: #fff +} +.list-group-item>.badge { + float: right +} +.list-group-item>.badge+.badge { + margin-right: 5px +} +.nav-pills>li>a>.badge { + margin-left: 3px +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eee +} +.jumbotron .h1, +.jumbotron h1 { + color: inherit +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200 +} +.jumbotron>hr { + border-top-color: #d5d5d5 +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px +} +.jumbotron .container { + max-width: 100% +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0 + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px + } + .jumbotron .h1, + .jumbotron h1 { + font-size: 63px + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out +} +.thumbnail a>img, +.thumbnail>img { + margin-right: auto; + margin-left: auto +} +a.thumbnail.active, +a.thumbnail:focus, +a.thumbnail:hover { + border-color: #337ab7 +} +.thumbnail .caption { + padding: 9px; + color: #333 +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px +} +.alert h4 { + margin-top: 0; + color: inherit +} +.alert .alert-link { + font-weight: 700 +} +.alert>p, +.alert>ul { + margin-bottom: 0 +} +.alert>p+p { + margin-top: 5px +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6 +} +.alert-success hr { + border-top-color: #c9e2b3 +} +.alert-success .alert-link { + color: #2b542c +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1 +} +.alert-info hr { + border-top-color: #a6e1ec +} +.alert-info .alert-link { + color: #245269 +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc +} +.alert-warning hr { + border-top-color: #f7e1b5 +} +.alert-warning .alert-link { + color: #66512c +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1 +} +.alert-danger hr { + border-top-color: #e4b9c0 +} +.alert-danger .alert-link { + color: #843534 +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + to { + background-position: 0 0 + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + to { + background-position: 0 0 + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0 + } + to { + background-position: 0 0 + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1) +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease +} +.progress-bar-striped, +.progress-striped .progress-bar { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px +} +.progress-bar.active, +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite +} +.progress-bar-success { + background-color: #5cb85c +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent) +} +.progress-bar-info { + background-color: #5bc0de +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent) +} +.progress-bar-warning { + background-color: #f0ad4e +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent) +} +.progress-bar-danger { + background-color: #d9534f +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent) +} +.media { + margin-top: 15px +} +.media:first-child { + margin-top: 0 +} +.media, +.media-body { + overflow: hidden; + zoom: 1 +} +.media-body { + width: 10000px +} +.media-object { + display: block +} +.media-right, +.media>.pull-right { + padding-left: 10px +} +.media-left, +.media>.pull-left { + padding-right: 10px +} +.media-body, +.media-left, +.media-right { + display: table-cell; + vertical-align: top +} +.media-middle { + vertical-align: middle +} +.media-bottom { + vertical-align: bottom +} +.media-heading { + margin-top: 0; + margin-bottom: 5px +} +.media-list { + padding-left: 0; + list-style: none +} +.list-group { + padding-left: 0; + margin-bottom: 20px +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px +} +a.list-group-item { + color: #555 +} +a.list-group-item .list-group-item-heading { + color: #333 +} +a.list-group-item:focus, +a.list-group-item:hover { + color: #555; + text-decoration: none; + background-color: #f5f5f5 +} +.list-group-item.disabled, +.list-group-item.disabled:focus, +.list-group-item.disabled:hover { + color: #777; + cursor: not-allowed; + background-color: #eee +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading { + color: inherit +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text { + color: #777 +} +.list-group-item.active, +.list-group-item.active:focus, +.list-group-item.active:hover { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7 +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active .list-group-item-heading>.small, +.list-group-item.active .list-group-item-heading>small, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading>.small, +.list-group-item.active:focus .list-group-item-heading>small, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading>.small, +.list-group-item.active:hover .list-group-item-heading>small { + color: inherit +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:focus .list-group-item-text, +.list-group-item.active:hover .list-group-item-text { + color: #c7ddef +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8 +} +a.list-group-item-success { + color: #3c763d +} +a.list-group-item-success .list-group-item-heading { + color: inherit +} +a.list-group-item-success:focus, +a.list-group-item-success:hover { + color: #3c763d; + background-color: #d0e9c6 +} +a.list-group-item-success.active, +a.list-group-item-success.active:focus, +a.list-group-item-success.active:hover { + color: #fff; + background-color: #3c763d; + border-color: #3c763d +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7 +} +a.list-group-item-info { + color: #31708f +} +a.list-group-item-info .list-group-item-heading { + color: inherit +} +a.list-group-item-info:focus, +a.list-group-item-info:hover { + color: #31708f; + background-color: #c4e3f3 +} +a.list-group-item-info.active, +a.list-group-item-info.active:focus, +a.list-group-item-info.active:hover { + color: #fff; + background-color: #31708f; + border-color: #31708f +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3 +} +a.list-group-item-warning { + color: #8a6d3b +} +a.list-group-item-warning .list-group-item-heading { + color: inherit +} +a.list-group-item-warning:focus, +a.list-group-item-warning:hover { + color: #8a6d3b; + background-color: #faf2cc +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:focus, +a.list-group-item-warning.active:hover { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede +} +a.list-group-item-danger { + color: #a94442 +} +a.list-group-item-danger .list-group-item-heading { + color: inherit +} +a.list-group-item-danger:focus, +a.list-group-item-danger:hover { + color: #a94442; + background-color: #ebcccc +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:focus, +a.list-group-item-danger.active:hover { + color: #fff; + background-color: #a94442; + border-color: #a94442 +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3 +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05) +} +.panel-body { + padding: 15px +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px +} +.panel-heading>.dropdown .dropdown-toggle { + color: inherit +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit +} +.panel-title>.small, +.panel-title>.small>a, +.panel-title>a, +.panel-title>small, +.panel-title>small>a { + color: inherit +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} +.panel>.list-group, +.panel>.panel-collapse>.list-group { + margin-bottom: 0 +} +.panel>.list-group .list-group-item, +.panel>.panel-collapse>.list-group .list-group-item { + border-width: 1px 0; + border-radius: 0 +} +.panel>.list-group:first-child .list-group-item:first-child, +.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px +} +.panel>.list-group:last-child .list-group-item:last-child, +.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} +.panel-heading+.list-group .list-group-item:first-child { + border-top-width: 0 +} +.list-group+.panel-footer { + border-top-width: 0 +} +.panel>.panel-collapse>.table, +.panel>.table, +.panel>.table-responsive>.table { + margin-bottom: 0 +} +.panel>.panel-collapse>.table caption, +.panel>.table caption, +.panel>.table-responsive>.table caption { + padding-right: 15px; + padding-left: 15px +} +.panel>.table-responsive:first-child>.table:first-child, +.panel>.table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px +} +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child, +.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child, +.panel>.table:first-child>tbody:first-child>tr:first-child, +.panel>.table:first-child>thead:first-child>tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px +} +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child, +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child, +.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child, +.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child, +.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child, +.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child, +.panel>.table:first-child>thead:first-child>tr:first-child td:first-child, +.panel>.table:first-child>thead:first-child>tr:first-child th:first-child { + border-top-left-radius: 3px +} +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child, +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child, +.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child, +.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child, +.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child, +.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child, +.panel>.table:first-child>thead:first-child>tr:first-child td:last-child, +.panel>.table:first-child>thead:first-child>tr:first-child th:last-child { + border-top-right-radius: 3px +} +.panel>.table-responsive:last-child>.table:last-child, +.panel>.table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child, +.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child, +.panel>.table:last-child>tbody:last-child>tr:last-child, +.panel>.table:last-child>tfoot:last-child>tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child, +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child, +.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child, +.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child, +.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child, +.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child, +.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child, +.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child { + border-bottom-left-radius: 3px +} +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child, +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child, +.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child, +.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child, +.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child, +.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child, +.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child, +.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child { + border-bottom-right-radius: 3px +} +.panel>.panel-body+.table, +.panel>.panel-body+.table-responsive, +.panel>.table+.panel-body, +.panel>.table-responsive+.panel-body { + border-top: 1px solid #ddd +} +.panel>.table>tbody:first-child>tr:first-child td, +.panel>.table>tbody:first-child>tr:first-child th { + border-top: 0 +} +.panel>.table-bordered, +.panel>.table-responsive>.table-bordered { + border: 0 +} +.panel>.table-bordered>tbody>tr>td:first-child, +.panel>.table-bordered>tbody>tr>th:first-child, +.panel>.table-bordered>tfoot>tr>td:first-child, +.panel>.table-bordered>tfoot>tr>th:first-child, +.panel>.table-bordered>thead>tr>td:first-child, +.panel>.table-bordered>thead>tr>th:first-child, +.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child, +.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child, +.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child, +.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child, +.panel>.table-responsive>.table-bordered>thead>tr>td:first-child, +.panel>.table-responsive>.table-bordered>thead>tr>th:first-child { + border-left: 0 +} +.panel>.table-bordered>tbody>tr>td:last-child, +.panel>.table-bordered>tbody>tr>th:last-child, +.panel>.table-bordered>tfoot>tr>td:last-child, +.panel>.table-bordered>tfoot>tr>th:last-child, +.panel>.table-bordered>thead>tr>td:last-child, +.panel>.table-bordered>thead>tr>th:last-child, +.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child, +.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child, +.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child, +.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child, +.panel>.table-responsive>.table-bordered>thead>tr>td:last-child, +.panel>.table-responsive>.table-bordered>thead>tr>th:last-child { + border-right: 0 +} +.panel>.table-bordered>tbody>tr:first-child>td, +.panel>.table-bordered>tbody>tr:first-child>th, +.panel>.table-bordered>thead>tr:first-child>td, +.panel>.table-bordered>thead>tr:first-child>th, +.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td, +.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th, +.panel>.table-responsive>.table-bordered>thead>tr:first-child>td, +.panel>.table-responsive>.table-bordered>thead>tr:first-child>th { + border-bottom: 0 +} +.panel>.table-bordered>tbody>tr:last-child>td, +.panel>.table-bordered>tbody>tr:last-child>th, +.panel>.table-bordered>tfoot>tr:last-child>td, +.panel>.table-bordered>tfoot>tr:last-child>th, +.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td, +.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th, +.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td, +.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th { + border-bottom: 0 +} +.panel>.table-responsive { + margin-bottom: 0; + border: 0 +} +.panel-group { + margin-bottom: 20px +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px +} +.panel-group .panel+.panel { + margin-top: 5px +} +.panel-group .panel-heading { + border-bottom: 0 +} +.panel-group .panel-heading+.panel-collapse>.list-group, +.panel-group .panel-heading+.panel-collapse>.panel-body { + border-top: 1px solid #ddd +} +.panel-group .panel-footer { + border-top: 0 +} +.panel-group .panel-footer+.panel-collapse .panel-body { + border-bottom: 1px solid #ddd +} +.panel-default { + border-color: #ddd +} +.panel-default>.panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd +} +.panel-default>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #ddd +} +.panel-default>.panel-heading .badge { + color: #f5f5f5; + background-color: #333 +} +.panel-default>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #ddd +} +.panel-primary { + border-color: #337ab7 +} +.panel-primary>.panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7 +} +.panel-primary>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #337ab7 +} +.panel-primary>.panel-heading .badge { + color: #337ab7; + background-color: #fff +} +.panel-primary>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #337ab7 +} +.panel-success { + border-color: #d6e9c6 +} +.panel-success>.panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6 +} +.panel-success>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #d6e9c6 +} +.panel-success>.panel-heading .badge { + color: #dff0d8; + background-color: #3c763d +} +.panel-success>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #d6e9c6 +} +.panel-info { + border-color: #bce8f1 +} +.panel-info>.panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1 +} +.panel-info>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #bce8f1 +} +.panel-info>.panel-heading .badge { + color: #d9edf7; + background-color: #31708f +} +.panel-info>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #bce8f1 +} +.panel-warning { + border-color: #faebcc +} +.panel-warning>.panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc +} +.panel-warning>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #faebcc +} +.panel-warning>.panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b +} +.panel-warning>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #faebcc +} +.panel-danger { + border-color: #ebccd1 +} +.panel-danger>.panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1 +} +.panel-danger>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #ebccd1 +} +.panel-danger>.panel-heading .badge { + color: #f2dede; + background-color: #a94442 +} +.panel-danger>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #ebccd1 +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden +} +.embed-responsive .embed-responsive-item, +.embed-responsive embed, +.embed-responsive iframe, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0 +} +.embed-responsive-16by9 { + padding-bottom: 56.25% +} +.embed-responsive-4by3 { + padding-bottom: 75% +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05) +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15) +} +.well-lg { + padding: 24px; + border-radius: 6px +} +.well-sm { + padding: 9px; + border-radius: 3px +} +.close { + float: right; + font-size: 21px; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2 +} +.close:focus, +.close:hover { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5 +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: 0 0; + border: 0 +} +.modal-open { + overflow: hidden +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0 +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%) +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0) +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5) +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000 +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0 +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5 +} +.modal-header { + min-height: 16.43px; + padding: 15px; + border-bottom: 1px solid #e5e5e5 +} +.modal-header .close { + margin-top: -2px +} +.modal-title { + margin: 0; + line-height: 1.42857143 +} +.modal-body { + position: relative; + padding: 15px +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5 +} +.modal-footer .btn+.btn { + margin-bottom: 0; + margin-left: 5px +} +.modal-footer .btn-group .btn+.btn { + margin-left: -1px +} +.modal-footer .btn-block+.btn-block { + margin-left: 0 +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5) + } + .modal-sm { + width: 300px + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: 400; + line-height: 1.4; + filter: alpha(opacity=0); + opacity: 0 +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9 +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000 +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000 +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000 +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000 +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000 +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000 +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000 +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000 +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: left; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2) +} +.popover.top { + margin-top: -10px +} +.popover.right { + margin-left: 10px +} +.popover.bottom { + margin-top: 10px +} +.popover.left { + margin-left: -10px +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0 +} +.popover-content { + padding: 9px 14px +} +.popover>.arrow, +.popover>.arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} +.popover>.arrow { + border-width: 11px +} +.popover>.arrow:after { + content: ""; + border-width: 10px +} +.popover.top>.arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0 +} +.popover.top>.arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0 +} +.popover.right>.arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0 +} +.popover.right>.arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0 +} +.popover.bottom>.arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25) +} +.popover.bottom>.arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff +} +.popover.left>.arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25) +} +.popover.left>.arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff +} +.carousel { + position: relative +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} +.carousel-inner>.item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left +} +.carousel-inner>.item>a>img, +.carousel-inner>.item>img { + line-height: 1 +} +@media all and (transform-3d), +(-webkit-transform-3d) { + .carousel-inner>.item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000 + } + .carousel-inner>.item.active.right, + .carousel-inner>.item.next { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } + .carousel-inner>.item.active.left, + .carousel-inner>.item.prev { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } + .carousel-inner>.item.active, + .carousel-inner>.item.next.left, + .carousel-inner>.item.prev.right { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} +.carousel-inner>.active, +.carousel-inner>.next, +.carousel-inner>.prev { + display: block +} +.carousel-inner>.active { + left: 0 +} +.carousel-inner>.next, +.carousel-inner>.prev { + position: absolute; + top: 0; + width: 100% +} +.carousel-inner>.next { + left: 100% +} +.carousel-inner>.prev { + left: -100% +} +.carousel-inner>.next.left, +.carousel-inner>.prev.right { + left: 0 +} +.carousel-inner>.active.left { + left: -100% +} +.carousel-inner>.active.right { + left: 100% +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5 +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0, rgba(0, 0, 0, .0001) 100%); + filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0, rgba(0, 0, 0, .5) 100%); + filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x +} +.carousel-control:focus, +.carousel-control:hover { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9 +} +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right, +.carousel-control .icon-next, +.carousel-control .icon-prev { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block +} +.carousel-control .glyphicon-chevron-left, +.carousel-control .icon-prev { + left: 50%; + margin-left: -10px +} +.carousel-control .glyphicon-chevron-right, +.carousel-control .icon-next { + right: 50%; + margin-right: -10px +} +.carousel-control .icon-next, +.carousel-control .icon-prev { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + line-height: 1 +} +.carousel-control .icon-prev:before { + content: '\2039' +} +.carousel-control .icon-next:before { + content: '\203a' +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6) +} +.carousel-caption .btn { + text-shadow: none +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next, + .carousel-control .icon-prev { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px + } + .carousel-indicators { + bottom: 20px + } +} +.btn-group-vertical>.btn-group:after, +.btn-group-vertical>.btn-group:before, +.btn-toolbar:after, +.btn-toolbar:before, +.clearfix:after, +.clearfix:before, +.container-fluid:after, +.container-fluid:before, +.container:after, +.container:before, +.dl-horizontal dd:after, +.dl-horizontal dd:before, +.form-horizontal .form-group:after, +.form-horizontal .form-group:before, +.modal-footer:after, +.modal-footer:before, +.nav:after, +.nav:before, +.navbar-collapse:after, +.navbar-collapse:before, +.navbar-header:after, +.navbar-header:before, +.navbar:after, +.navbar:before, +.pager:after, +.pager:before, +.panel-body:after, +.panel-body:before, +.row:after, +.row:before { + display: table; + content: " " +} +.btn-group-vertical>.btn-group:after, +.btn-toolbar:after, +.clearfix:after, +.container-fluid:after, +.container:after, +.dl-horizontal dd:after, +.form-horizontal .form-group:after, +.modal-footer:after, +.nav:after, +.navbar-collapse:after, +.navbar-header:after, +.navbar:after, +.pager:after, +.panel-body:after, +.row:after { + clear: both +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto +} +.pull-right { + float: right!important +} +.pull-left { + float: left!important +} +.hide { + display: none!important +} +.show { + display: block!important +} +.invisible { + visibility: hidden +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} +.hidden { + display: none!important +} +.affix { + position: fixed +} +@-ms-viewport { + width: device-width +} +.visible-lg, +.visible-md, +.visible-sm, +.visible-xs { + display: none!important +} +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block { + display: none!important +} +@media (max-width: 767px) { + .visible-xs { + display: block!important + } + table.visible-xs { + display: table + } + tr.visible-xs { + display: table-row!important + } + td.visible-xs, + th.visible-xs { + display: table-cell!important + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block!important + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline!important + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block!important + } +} +@media (min-width: 768px)and (max-width: 991px) { + .visible-sm { + display: block!important + } + table.visible-sm { + display: table + } + tr.visible-sm { + display: table-row!important + } + td.visible-sm, + th.visible-sm { + display: table-cell!important + } +} +@media (min-width: 768px)and (max-width: 991px) { + .visible-sm-block { + display: block!important + } +} +@media (min-width: 768px)and (max-width: 991px) { + .visible-sm-inline { + display: inline!important + } +} +@media (min-width: 768px)and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block!important + } +} +@media (min-width: 992px)and (max-width: 1199px) { + .visible-md { + display: block!important + } + table.visible-md { + display: table + } + tr.visible-md { + display: table-row!important + } + td.visible-md, + th.visible-md { + display: table-cell!important + } +} +@media (min-width: 992px)and (max-width: 1199px) { + .visible-md-block { + display: block!important + } +} +@media (min-width: 992px)and (max-width: 1199px) { + .visible-md-inline { + display: inline!important + } +} +@media (min-width: 992px)and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block!important + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block!important + } + table.visible-lg { + display: table + } + tr.visible-lg { + display: table-row!important + } + td.visible-lg, + th.visible-lg { + display: table-cell!important + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block!important + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline!important + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block!important + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none!important + } +} +@media (min-width: 768px)and (max-width: 991px) { + .hidden-sm { + display: none!important + } +} +@media (min-width: 992px)and (max-width: 1199px) { + .hidden-md { + display: none!important + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none!important + } +} +.visible-print { + display: none!important +} +@media print { + .visible-print { + display: block!important + } + table.visible-print { + display: table + } + tr.visible-print { + display: table-row!important + } + td.visible-print, + th.visible-print { + display: table-cell!important + } +} +.visible-print-block { + display: none!important +} +@media print { + .visible-print-block { + display: block!important + } +} +.visible-print-inline { + display: none!important +} +@media print { + .visible-print-inline { + display: inline!important + } +} +.visible-print-inline-block { + display: none!important +} +@media print { + .visible-print-inline-block { + display: inline-block!important + } +} +@media print { + .hidden-print { + display: none!important + } +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/custom-theme.css b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/custom-theme.css new file mode 100755 index 00000000..a4256032 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/custom-theme.css @@ -0,0 +1,74 @@ +.navbar-default { + background-color: #2a2a2a; + border-color:#2a2a2a ; +} +.navbar-nav{color: #a5a5a5; font-weight:300; padding-top: 5px; padding-left:0px;} +.form-control {background-color: #121212; border: 0px;} +.btn-default {background-color: #121212; border: 1px solid #121212;} +.container { padding:0px;} +.container-fluid{padding-left:0px;} +.navbar-default .navbar-nav > li > a {color: #a5a5a5; font-size: 14px; font-weight: 500;} +.navbar-form .input-group > .form-control { height: 39px; margin-top: 0; } +.input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { height: 39px;} +.container-bg{background-image: url("../images/content-bg.png"); background-repeat: no-repeat; background-position: top left; min-height: 550px; overflow: hidden; padding: 0 15px;} +.navbar-default .navbar-nav > li > a :focus,.navbar-default .navbar-nav>li>a:hover{color:#ccc;background-color:transparent;} +.btn-default.active, +.btn-default.focus, +.btn-default:active, +.btn-default:focus, +.btn-default:hover, +.open>.dropdown-toggle.btn-default { + color: #ccc; + background-color: #121212; + border-color: #121212; +} +input { + background-color: #333; + border: 1px solid #2a2a2a; + border-radius: 3px; + height: 45px; + margin: 5px 0; + width: 100%; + padding-left: 10px; +} +input[type="checkbox"], input[type="radio"] { + line-height: normal; + margin-top: -3px; + width: 30px; +} +.navbar-default .navbar-nav>li>a:focus, +.navbar-default .navbar-nav>li>a:hover { + color: #747474; + outline: 0; +} +.navbar { + margin-bottom: 5px; +} +.navbar-brand { + padding: 15px 10px; +} +.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:focus, .navbar-default .navbar-nav > .open > a:hover { + color: #fff; + background-color:#202020 ; +} +.dropdown-menu { + background-clip: padding-box; + background-color: #202020; + border: 0px solid rgba(0, 0, 0, 0.15); + border-radius: 0; + box-shadow: none; + display: none; + float: left; + font-size: 14px; + left: 0; + color: #a5a5a5; +} +.dropdown-menu > li > a { + color: #a5a5a5; +} +.dropdown-menu>li>a:focus, +.dropdown-menu>li>a:hover { + color: #fff; + text-decoration: none; + background-color: #313131; +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/fontwso2-extend.css b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/fontwso2-extend.css new file mode 100755 index 00000000..032768d9 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/fontwso2-extend.css @@ -0,0 +1,177 @@ +.fw, [class^="fw-"], [class*=" fw-"] { + display: inline-block; + font: normal normal normal 14px/1 fontwso2; + font-size: inherit; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + vertical-align: middle; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: auto; + transform: translate(0, 0); +} + +/* icon options */ +.fw-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fw-1-5x { + font-size: 1.5em; +} +.fw-2x { + font-size: 2em; +} +.fw-3x { + font-size: 3em; +} +.fw-4x { + font-size: 4em; +} +.fw-5x { + font-size: 5em; +} +.fw-fixedwidth { + width: 1.28571429em; + text-align: center; +} +.fw-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fw-ul > li { + position: relative; +} +.fw-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fw-li.fw-lg { + left: -1.85714286em; +} +.fw-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fw.pull-left { + margin-right: .3em; +} +.fw.pull-right { + margin-left: .3em; +} +.fw-spin { + -webkit-animation: wso2icon-spin 2s infinite linear; + animation: wso2icon-spin 2s infinite linear; +} +.fw-pulse { + -webkit-animation: wso2icon-spin 1s infinite steps(8); + animation: wso2icon-spin 1s infinite steps(8); +} +@-webkit-keyframes wso2icon-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes wso2icon-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fw-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fw-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fw-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fw-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fw-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fw-rotate-90, +:root .fw-rotate-180, +:root .fw-rotate-270, +:root .fw-flip-horizontal, +:root .fw-flip-vertical { + filter: none; +} +.fw-stack, .fw-stack-md { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 1.8em; + vertical-align: middle; + text-align: center; +} +.fw-stack-md { + width: 1em; +} +.fw-stack-1x, +.fw-stack-2x, +.fw-stack-1-5x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fw-stack-1x { + line-height: inherit; + font-size: 0.9em; + } +.fw-stack-1-5x { + line-height: inherit; + font-size: 1.2em; +} +.fw-stack-2x { + font-size: 1.8em; +} +.fw-inverse { + color: #ffffff; +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/fontwso2.css b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/fontwso2.css new file mode 100755 index 00000000..463b22ec --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/fontwso2.css @@ -0,0 +1,481 @@ +@font-face { + font-family: 'fontwso2'; + src:url('../fonts/fontwso2.eot?3uii6i'); + src:url('../fonts/fontwso2.eot?#iefix3uii6i') format('embedded-opentype'), + url('../fonts/fontwso2.woff?3uii6i') format('woff'), + url('../fonts/fontwso2.ttf?3uii6i') format('truetype'), + url('../fonts/fontwso2.svg?3uii6i#fontwso2') format('svg'); + font-weight: normal; + font-style: normal; +} + +.fw { + font-family: 'fontwso2'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.fw-lifecycle:before { + content: "\e617"; +} + +.fw-globe:before { + content: "\e666"; +} + +.fw-filter:before { + content: "\e65b"; +} + +.fw-store:before { + content: "\e61b"; +} + +.fw-apple:before { + content: "\e613"; +} + +.fw-android:before { + content: "\e653"; +} + +.fw-windows:before { + content: "\e654"; +} + +.fw-monitor:before { + content: "\e658"; +} + +.fw-laptop:before { + content: "\e659"; +} + +.fw-computer:before { + content: "\e655"; +} + +.fw-mobile:before { + content: "\e656"; +} + +.fw-dots:before { + content: "\e615"; +} + +.fw-tiles:before { + content: "\e60e"; +} + +.fw-menu:before { + content: "\e60f"; +} + +.fw-list:before { + content: "\e610"; +} + +.fw-grid:before { + content: "\e611"; +} + +.fw-list2:before { + content: "\e667"; +} + +.fw-user:before { + content: "\e601"; +} + +.fw-add-user:before { + content: "\e668"; +} + +.fw-key:before { + content: "\e665"; +} + +.fw-star:before { + content: "\e65c"; +} + +.fw-star-2:before { + content: "\e612"; +} + +.fw-view:before { + content: "\e652"; +} + +.fw-edit:before { + content: "\e65d"; +} + +.fw-register2:before { + content: "\e669"; +} + +.fw-register:before { + content: "\e65f"; +} + +.fw-search:before { + content: "\e657"; +} + +.fw-send:before { + content: "\e66a"; +} + +.fw-delete:before { + content: "\e614"; +} + +.fw-settings:before { + content: "\e65e"; +} + +.fw-share:before { + content: "\e65a"; +} + +.fw-message:before { + content: "\e616"; +} + +.fw-bell:before { + content: "\e66b"; +} + +.fw-lock:before { + content: "\e618"; +} + +.fw-battery:before { + content: "\e619"; +} + +.fw-camera:before { + content: "\e61a"; +} + +.fw-wifi:before { + content: "\e606"; +} + +.fw-usb-drive:before { + content: "\e602"; +} + +.fw-hdd:before { + content: "\e61c"; +} + +.fw-map-location:before { + content: "\e61d"; +} + +.fw-invitation:before { + content: "\e664"; +} + +.fw-dial-up:before { + content: "\e61f"; +} + +.fw-incoming-call:before { + content: "\e620"; +} + +.fw-clock:before { + content: "\e621"; +} + +.fw-clean:before { + content: "\e622"; +} + +.fw-sort:before { + content: "\e623"; +} + +.fw-list-sort:before { + content: "\e624"; +} + +.fw-sequence:before { + content: "\e625"; +} + +.fw-rules:before { + content: "\e626"; +} + +.fw-padlock:before { + content: "\e66c"; +} + +.fw-uri:before { + content: "\e603"; +} + +.fw-pdf:before { + content: "\e627"; +} + +.fw-ms-document:before { + content: "\e629"; +} + +.fw-swagger:before { + content: "\e62a"; +} + +.fw-jquery:before { + content: "\e62b"; +} + +.fw-java:before { + content: "\e62c"; +} + +.fw-javaee:before { + content: "\e62d"; +} + +.fw-javascript:before { + content: "\e62e"; +} + +.fw-jaggery:before { + content: "\e62f"; +} + +.fw-uncheck:before { + content: "\e630"; +} + +.fw-check:before { + content: "\e631"; +} + +.fw-up-arrow-2:before { + content: "\e660"; +} + +.fw-down-arrow-2:before { + content: "\e661"; +} + +.fw-left-arrow-2:before { + content: "\e662"; +} + +.fw-right-arrow-2:before { + content: "\e663"; +} + +.fw-up-arrow:before { + content: "\e632"; +} + +.fw-down-arrow:before { + content: "\e63e"; +} + +.fw-left-arrow:before { + content: "\e633"; +} + +.fw-right-arrow:before { + content: "\e634"; +} + +.fw-cancel:before { + content: "\e635"; +} + +.fw-add:before { + content: "\e636"; +} + +.fw-minus:before { + content: "\e628"; +} + +.fw-refresh:before { + content: "\e637"; +} + +.fw-ring:before { + content: "\e600"; +} + +.fw-circle:before { + content: "\e638"; +} + +.fw-ok:before { + content: "\e639"; +} + +.fw-error:before { + content: "\e63a"; +} + +.fw-block:before { + content: "\e63b"; +} + +.fw-warning:before { + content: "\e605"; +} + +.fw-deploy:before { + content: "\e66d"; +} + +.fw-devices:before { + content: "\e63c"; +} + +.fw-dss:before { + content: "\e63d"; +} + +.fw-database:before { + content: "\e66e"; +} + +.fw-computer2:before { + content: "\e66f"; +} + +.fw-endpoint:before { + content: "\e63f"; +} + +.fw-bpmn:before { + content: "\e640"; +} + +.fw-bpel:before { + content: "\e641"; +} + +.fw-gadget:before { + content: "\e642"; +} + +.fw-application:before { + content: "\e643"; +} + +.fw-cloud:before { + content: "\e644"; +} + +.fw-service:before { + content: "\e645"; +} + +.fw-rest-service:before { + content: "\e646"; +} + +.fw-rest-api:before { + content: "\e647"; +} + +.fw-api:before { + content: "\e648"; +} + +.fw-service-provider:before { + content: "\e649"; +} + +.fw-website:before { + content: "\e604"; +} + +.fw-proxy:before { + content: "\e64a"; +} + +.fw-policy:before { + content: "\e64b"; +} + +.fw-security-policy:before { + content: "\e64c"; +} + +.fw-throttling-policy:before { + content: "\e64d"; +} + +.fw-blank-document:before { + content: "\e64e"; +} + +.fw-ebook:before { + content: "\e670"; +} + +.fw-document:before { + content: "\e671"; +} + +.fw-text:before { + content: "\e64f"; +} + +.fw-html:before { + content: "\e650"; +} + +.fw-wadl:before { + content: "\e608"; +} + +.fw-wsdl:before { + content: "\e609"; +} + +.fw-xacml:before { + content: "\e60a"; +} + +.fw-xsd:before { + content: "\e60b"; +} + +.fw-xq:before { + content: "\e60c"; +} + +.fw-xslt:before { + content: "\e60d"; +} + +.fw-xml:before { + content: "\e61e"; +} + +.fw-soap:before { + content: "\e651"; +} + +.fw-wso2:before { + content: "\e607"; +} + diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/main.css b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/main.css new file mode 100755 index 00000000..2c7dd473 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/css/main.css @@ -0,0 +1,484 @@ +/* _____________________________________________________________________________ + + FONT + _____________________________________________________________________________ */ +/* Regular */ +@font-face { + font-family: 'Open Sans'; + + src: url('../fonts/OpenSans-Regular-webfont.eot'); + src: url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Regular-webfont.woff') format('woff'), + url('../fonts/OpenSans-Regular-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Regular-webfont.svg#OpenSansRegular') format('svg'); + font-weight: normal; + font-weight: 400; + font-style: normal; + +} + +/* Italic */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-Italic-webfont.eot'); + src: url('../fonts/OpenSans-Italic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Italic-webfont.woff') format('woff'), + url('../fonts/OpenSans-Italic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Italic-webfont.svg#OpenSansItalic') format('svg'); + font-weight: normal; + font-weight: 400; + font-style: italic; + +} + +/* Light */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-Light-webfont.eot'); + src: url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Light-webfont.woff') format('woff'), + url('../fonts/OpenSans-Light-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Light-webfont.svg#OpenSansLight') format('svg'); + font-weight: 200; + font-style: normal; + +} + +/* Light Italic */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-LightItalic-webfont.eot'); + src: url('../fonts/OpenSans-LightItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-LightItalic-webfont.woff') format('woff'), + url('../fonts/OpenSans-LightItalic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-LightItalic-webfont.svg#OpenSansLightItalic') format('svg'); + font-weight: 200; + font-style: italic; + +} + +/* Semibold */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-Semibold-webfont.eot'); + src: url('../fonts/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Semibold-webfont.woff') format('woff'), + url('../fonts/OpenSans-Semibold-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Semibold-webfont.svg#OpenSansSemibold') format('svg'); + font-weight: 500; + font-style: normal; + +} + +/* Semibold Italic */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-SemiboldItalic-webfont.eot'); + src: url('../fonts/OpenSans-SemiboldItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-SemiboldItalic-webfont.woff') format('woff'), + url('../fonts/OpenSans-SemiboldItalic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-SemiboldItalic-webfont.svg#OpenSansSemiboldItalic') format('svg'); + font-weight: 500; + font-style: italic; + +} + +/* Bold */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-Bold-webfont.eot'); + src: url('../fonts/OpenSans-Bold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Bold-webfont.woff') format('woff'), + url('../fonts/OpenSans-Bold-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Bold-webfont.svg#OpenSansBold') format('svg'); + font-weight: bold; + font-weight: 700; + font-style: normal; + +} + +/* Bold Italic */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-BoldItalic-webfont.eot'); + src: url('../fonts/OpenSans-BoldItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-BoldItalic-webfont.woff') format('woff'), + url('../fonts/OpenSans-BoldItalic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-BoldItalic-webfont.svg#OpenSansBoldItalic') format('svg'); + font-weight: bold; + font-weight: 700; + font-style: italic; + +} + +/* Extra Bold */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-ExtraBold-webfont.eot'); + src: url('../fonts/OpenSans-ExtraBold-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-ExtraBold-webfont.woff') format('woff'), + url('../fonts/OpenSans-ExtraBold-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-ExtraBold-webfont.svg#OpenSansExtrabold') format('svg'); + font-weight: 900; + font-style: normal; + +} + +/* Extra Bold Italic */ +@font-face { + font-family: 'Open Sans'; + src: url('../fonts/OpenSans-ExtraBoldItalic-webfont.eot'); + src: url('../fonts/OpenSans-ExtraBoldItalic-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-ExtraBoldItalic-webfont.woff') format('woff'), + url('../fonts/OpenSans-ExtraBoldItalic-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-ExtraBoldItalic-webfont.svg#OpenSansExtraboldItalic') format('svg'); + font-weight: 900; + font-style: italic; + +} +/* _____________________________________________________________________________ + + RESET + _____________________________________________________________________________ */ +html, body, div, span, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +abbr, address, cite, code, +del, dfn, em, img, ins, kbd, q, samp, +small, strong, sub, sup, var, +b, i, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, figcaption, figure, +footer, header, hgroup, menu, nav, section, summary, +time, mark, audio, video { + margin:0; + padding:0; + border:0; + outline:0; + font-size:100%; + vertical-align:baseline; + background:transparent; +} +body { + font-family: 'Open Sans'; + line-height:1; + color:#141414; + line-height:1; + background: url("../images/content-bg-1.png")repeat scroll 0 0 #f0f2f4; + margin: 15px; +} + + +article,aside,details,figcaption,figure, +footer,header,hgroup,menu,nav,section { + display:block; +} +nav ul { + list-style:none; +} +blockquote, q { + quotes:none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content:''; + content:none; +} +a { + margin:0; + padding:0; + font-size:100%; + vertical-align:baseline; + background:transparent; +} +/* change colours to suit your needs */ +ins { + background-color:#ff9; + color:#000; + text-decoration:none; +} +/* change colours to suit your needs */ +mark { + background-color:#ff9; + color:#000; + font-style:italic; + font-weight:bold; +} +del { + text-decoration: line-through; +} +abbr[title], dfn[title] { + border-bottom:1px dotted; + cursor:help; +} +table { + border-collapse:collapse; + border-spacing:0; +} +/* change border colour to suit your needs */ +hr { + display:block; + height:1px; + border:0; + border-top:1px solid #7f7f7f; + margin:1em 0; + padding:0; + opacity: 0.2; +} +input, select { + vertical-align:middle; +} + +/* _____________________________________________________________________________ + + TYPOGRAPHY + _____________________________________________________________________________ */ + + +p{font-size:17px; line-height:24px; color:#c7c7c7;} +h1{ font-size:39px;font-weight:100; line-height:Auto; font-style: normal;} +h2{font-size:24px; line-height:Auto; font-weight: 400; } +h3{font-size:15px; line-height:Auto; font-weight: 400; } +h4{font-size:20px; line-height:Auto; font-weight: 400; } +h5{ font-size:30px;font-weight:100; line-height:Auto; font-style: normal; color: #929292;} +.font-small{font-size:12px;} +.font-large{font-size:25px;} +.font-medium{font-size:16px;} +.medium-weight{font-weight: 100;} + +.uppercase{text-transform:uppercase;} +.capitalize{text-transform:capitalize;} +.lowercase{text-transform:lowercase;} + + +.light-blue{color:#3a9ecf;} +.black{color:#000;} +.grey{color:#333;} +.light-grey{color:#7c7c7c;} +.white{color:#FFF;} +.blue{color: #00979c;} .blue:hover{color: #03c5cb;} + +.bold{font-weight:bold;} +.no-underline{text-decoration:none;} +.italic{font-style: italic;} + +.center{text-align:center;} +.right{text-align:right;} +.left{text-align:left;} +.justify{text-align:justify;} + +.middle{vertical-align: middle;} + +.top{vertical-align: top;} +.middle{vertical-align: middle;} +.bottom{vertical-align: bottom;} +.rounded{-webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px;} +.opacity{opacity: 0.8;} + + +.circle { + background: none repeat scroll 0 0 #191919; + border-radius: 50px; + height: 50px; + padding: 10px; + width: 50px; + color: #fff; +} + + +/* _____________________________________________________________________________ + + BACKGROUND + _____________________________________________________________________________ */ +.grey-bg{ background-color:#f6f4f4;} +.light-grey-bg{ background-color:#f5f5f5 ; } +.white-bg{background-color:#fff;} +.off-white{background-color:#3a9ecf;} +.dark-grey{background-color: #2a2a2a;} +.blue-bg{background-color: #00979c;} + +/* _____________________________________________________________________________ + + Main + _____________________________________________________________________________ */ + +body { margin: 0; } +header{background-color: #2a2a2a;} + + +.product-wrapper{ float: left; width:100%; margin-top: -2px; min-height: 310px; -webkit-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.14); + -moz-box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.14); + box-shadow: 5px 5px 5px 0px rgba(0,0,0,0.14);} +.icon-wrapper{min-height: 110px; padding-top: 12px; text-align: center; } +.text-wrapper{margin:15px; font-size:14px; border-top: 1px solid #404040; padding-top: 20px; color:#c6c5c5; line-height: 18px; text-align: center } +.sign-panel {background-color: #191919; width: 100%; height: auto; min-height: 150px; display: none; padding:15px; color: #a5a5a5; cursor:pointer;} +#flip-login{ font-weight: 500; font-size: 14px; padding: 20px; cursor:pointer; margin-top:-2px; } +.chart1,.chart2,.chart3 {width: 100%; height: 350px;} +/* ____________________________________________________________________________ + + COLUMNS + _____________________________________________________________________________ */ + +.col-row{width:100%; height: 100px;} +.col-x-large{width:100%; } +.col-large{width:75%; } +.col-medium{width:50%; } +.col-small{width:24%; } +.col-x-small{width:223px; } + +.opacity{opacity: 0.2;} +/* ____________________________________________________________________________ + + padding-margin + _____________________________________________________________________________ */ +.padding-left {padding-left:10px;} +.padding-right {padding-right:10px;} +.padding-top {padding-top:10px;} +.padding-bottom {padding-bottom:10px;} +.padding{padding:10px;} +.padding-none{ padding:0px;} +.padding-left-none{ padding-left:0px;} + + +.padding-left-double {padding-left:20px;} +.padding-right-double {padding-right:20px;} +.padding-top-double {padding-top:20px;} +.padding-bottom-double {padding-bottom:20px;} +.padding-double{padding:20px;} +.padding-top-large{padding-top:60px;} +.padding-bottom-large{padding-bottom:60px;} + +.margin-left {margin-left:10px;} +.margin-right {margin-right:10px;} +.margin-top {margin-top:10px;} +.margin-bottom {margin-bottom:10px;} +.margin{margin:10px;} +.margin-top-minus{margin-top:-123px;} + +.margin-left-double {margin-left:20px;} +.margin-right-double {margin-right:20px;} +.margin-top-double {margin-top:20px;} +.margin-bottom-double {margin-bottom:20px;} +.margin-double{margin:20px;} +.margin-left-none{margin-left: 0px;} +.margin-right-none{margin-right: 0px;} + +.float-left{float:left;} +.float-right{float:right;} +.clear{ clear:both;} + +.inline-block{display: inline-block;} +.relative{ position:relative;} +.border{border: 2px solid #dddddd;} +.border-bottom{border-bottom: 1px solid #efefef;} +.border-radius{border-radius: 5px;} +.border-top{border-top: 1px solid #ddd;} + +/* ____________________________________________________________________________ + + button + _____________________________________________________________________________ */ +.blue-btn { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0px; + color: #ffffff; + font-size: 15px; + font-weight: 500; + background: #00979c; + padding: 10px 20px 10px 20px; + text-decoration: none; + border: 0px; cursor:pointer; +} + +.blue-btn:hover { + background: #00787a; + text-decoration: none; +} +.blue-action-btn { + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; + color: #ffffff; + font-size: 15px; + font-weight: 500; + background: #00979c; + padding: 10px 30px; + height: 45px; + text-decoration: none; + border: 0px; cursor:pointer; +} + +.blue-action-btn:hover { + background: #00787a; + text-decoration: none; +} +.black-btn { + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; + color: #ccc; + font-size: 15px; + font-weight: 500; + background: #333333; + padding: 10px 30px; + height: 45px; + text-decoration: none; + border: 0px; cursor:pointer; +} + +.black-btn:hover { + background: #2a2a2a; + text-decoration: none; ; +} +.grey-btn { + background: none repeat scroll 0 0 #00979c; + border: 0 none; + border-top-left-radius: 0; + border-top-right-radius: 0; + color: #ffffff; + cursor: pointer; + font-size: 18px; + font-weight: 300; + padding: 10px 35px; + text-decoration: none; +} +.grey-btn:hover { + background: none repeat scroll 0 0 #006a6d; + border: 0 none; + border-top-left-radius: 0; + border-top-right-radius: 0; + color: #ffffff; + cursor: pointer; + font-size: 18px; + font-weight: 300; + padding: 10px 35px; + text-decoration: none; +} +.grey-btn a{color: #fff; text-decoration: none;} +.btn-black{color: #ffffff; margin-right: 5px; padding: 10px; text-decoration: none; overflow: hidden; background:#5c5c5c; text-align: center; float: left; cursor: pointer; } +.btn-black:hover{opacity: 0.8; } + +.menu-button-wrapper-temp{float: left; font-size: 13px; width: 125px;} +.menu-button-wrapper{float: left; font-size: 13px; width: 100px;} +.tick { opacity: 0 !important; } +.nv-discreteBarWithAxes>g>.nv-x>g>g>g{opacity: 1 !important;} +#date-range1{ + background: #fff none repeat scroll 0 0; + border: 1px solid #ccc; + width: 300px; +} + +#device_id{ + background: #fff none repeat scroll 0 0; + border: 1px solid #ccc; +} + +.hour-range,.minute-range{background: #fff none repeat scroll 0 0; border: 1px solid #ccc;} + +.btn-black-action{color: #ffffff; padding: 5px 20px; text-decoration: none; overflow: hidden; background:#5c5c5c; text-align: center; margin: 0 10px; float: left; cursor: pointer; border: none; outline:none;} +.btn-black-action:hover{background-color: #0076a3; } +.date-picker-wrapper {box-shadow:none;} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..5d4a1c47770fd38b715d6f8e119869fed1f4d8ab GIT binary patch literal 30858 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

Ceu_Z(Fs(Qh0@@*3OSQd0Q?oY2~#ME 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.svg new file mode 100755 index 00000000..7cda1026 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.svg @@ -0,0 +1,251 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Bold-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..7ab5d85bfdd1886b621b98b46e5a9d3609f2429c GIT binary patch literal 30680 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 I0Ex{hY^xD?4gdfE literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..ad6518076e32b52ad56d50ccb0e48d8a093b7efb GIT binary patch literal 34166 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..6a30fa9dd37f5da9f303e421c1e9d52f45bd3433 GIT binary patch literal 33960 zcmc${349b)_CI=WRrQ*r(_7M6Nq3qggph=!Nt&=E5caUhCWci&1PlTqn}~>rh@gmo z0-~aWh{&K*)rla8iW}&lBBOu~qPU>O1s!H|P)X%|&#mqdbmskk@Auy4^Wf9fRkypV z?mhS1bI4v@IuHTI7op_zUX2Cqa>l$wYWAelJyzkT-rp-)jD1H*xUoa+JJ8jb3 z8_@1#%sdG1)@j!-n)-DpI~Ug@8N2cN>DNx0@>|^=m9d)+;`8$9XmGrxe1_`_xNbXr z=DeG}sxSVQu|*lU=br0lUo&ZoXX%fO-SR%3|MAR8H{Bq)`A>}9+JNu-XHA-UZM);W zZpAfy{>2Tm=guqiy1!)Xw&&2FFK@W<+8Z|dPX55y^2hMG6~7^Bus2uDE}{1$=BIi` z-v@|K9JorM7AA@7?{Ng(aE0zD)zSfGV$8I~6vB;7A&k?;?fcbw@%vrjZ-Cs1 znHSFNKNC6g)S1W5+2iC#Ny)yH)U@=B%r;s6Kz6WgPHtYi{PqPM3X6(6mXwA%m6eA(S9Iyxt$Srv zkDk@Nz}@}&52zV9Xz-9Lh7KD(V&s*huBsh9X6(4}6Rw^(iQTz!)!iF5Z+(2*_8m_= z`P83x?SA?%&!}4cvkiNm+k4>o7hYsHPPz8FPj33t4Ku!8P{;1t!saqIZK3Gr^|!E{ z`%-*Q{Q9-@1Dr z*vRgG_>qTRIrPRH#tz>sZUb%*9Du>@U_hemJIfl`dG<3`cmXfO{}LW%N7)^0 z6>r1yc>+7f-Jsq@p3B=Zo$X|E|Ut6sl5(fx~P21V;x7Rk_1;DSoxb(At37V|1aabfBLGf`OZBPp7{< zIvwAuZA$-sbb2tLnhI*wz6(Z+4@Qs1{Y)Ja#*Had%^kFCeixqZziZsMbd}*YmJV85 z(bS`*$=bo~@>diWsb{eLtNp8k;&DNh4X;&u;F}m9Jyz{;EnVO@4)LV!CsG1|bpMIfAOn6h0DZeM+BftM zUrX!|^q+`6Jm{|-I3hiu^3k=cF`xm#)j|L20jqDhKVD6 z`AYQMzj}CWa58!ytWL)p4_1TnJ%-mtARBsJQyt-cjyKhRjhcFGhUh8onAAZMgJNPHr69s(oLj^>SFOb=JJFyxS)5X!Do)MB z3mRl`rP+7^>sS(U1zb4+SKwuNKvR~qsA;8X&#yJpl`rv()aJ7iE?FF&7-o?K+*h>~ zH^_uDX68e^x$ru^7*MQ{Ex(kB+Mii%9fLQ>Z~nWL6A- zmC}f!J;&|jkS8F&*^eh}K3c=Qo8%pmv*|~AfmRaB$6ir}d!@51eg%spgGQ00)U;42 z6tUpG5o=sL&Knp{wj>nPORkK}w!Vy{Sv&>xvN)RQi2K#sQmr^icGlaI<8YGXtWQXa$JdGjUnv=fJ#S1A+CUe<=SWd*!5Q!_#G zkS519syU^ROxa#g-y<{KR-k5-s@cV=JEYkY8r1~MO$P|06IzzDQB5yZvz!eX2LERi zM>4YLR~Zby%5rM$z_mVnE6#tyMH7WZq7@nwRr$_8HJTrXn&DKHgKD}{EjYNpa`Zp$ zp;kqWD{`oTgNhcP{EI{N95mr;^>T)S=?GxT0yJeFOqqwK%uPq!p*}6W04MlnX6&2U z;+yy=hdz?ovr1gNCs1I_0q+qnEA|ApCoMCOofB;|KB8Ii#bY*{SZ#7979LBjs8F+A z_1xn0we?k~cDH6rte_?6O7?k*cv+|NDju>V`z*P6avKRtGLZ+vx!mguJGiG3pXcU< z4!zUw@rU(Kf_DdYEUUX?R@L&`s((A5cTb07ykuyovd_4xAtk|`+&;t3tGhSc^7Qe< zO`DQ?f8Eoj9}i7hcI9&?U5DR{mmj;r|FflclhxM0vZyPmbkN%7HlH)EH639I%!T!s z&&t?yEaIRQnTLbc!O|E>q&2DFpru+G8{)iqNSp>)77qj`;IHr3y9Z z5~Pgl08(bOM?FMM)WST@m&BH@n_J&H`Wu1cA62I)T zFxrW*!E6VgJA41)RS(?o;>~xjou~Bp_P5t(ckVf%qUvht+PW8SS@pp62NvD8?&olR z|Kcur{fp%JPw~wA9^1M@KePVHrnV%KR9 zYS>b^stAsfJgf~CKek5*H`-amu3~H`^!pn9fZSi~g+UgPK}oL0iywmda`D3i5X(Xg zW*5@Y3CU;YE~h6b)%?U|Zf^c*{x=WsR6atg;&J*nO`86K{+9k3w_``2sUMK)aBn-q zy=eh(HLh5dP7q_$z2oWL67FrHd&|t_ltXS81osC1&v}gxTxiDc1JX(`VwQeE->vUz zdP)BUecmlqD=W=83`@`xHhD~PjwQ!qiQ{=WyGQZi0nX;|?#gQO|5+n{wYI_0v> zpp5;5DwQ_ajLlFfjo9q;vCV>S+HG`dhX^LB(Oyy(a6t`83b=x<%KHn+TN!zem0(2jZCp6Nl6&rvlqHKUY&XQjy#h3A&zy6BfLLcIb zc?IZD#4ag9E&7nb4~9O}5LJte0k&3xS`?s|>LdEqyaNmPXThH=2sLSpoX_(vo}`6O zpG&N|`8#D4)^;3AWxZL%MvFQzq0x|+$uxj8qJ$QY-7MazdB8Getl@OLd$3JtijCB= zmciWKP7dM1QxVrBQ&AD^ak2uwx1j5sPV6LDz~=!^IW{fJ z9;y5n{fK_FA((Hw?r+K%J`QrS`{tF_A%}1dl*I>^{WBm*bSxa#k+l*#aK(TZo z2Hl=U+BY<}3A9N~BQmAXLgp2!)fF+txk=z98rp0y%wyupl2^%vW{ZB9k^*u`0YBZa zYIvXOyQi+d79Xfymzr3iy4`Aeg_`10lZ0B(1_LNB>l6rv#XBayWl&~I zQX38xLBZBF^0o0>cj@}-q5)4H95v+52bbRR;p!JZc;U(AEAQ98d*O$!Jgzjfbk6S6 zx6JBQGv%#eJ)eE>;rBC@v_CCc@wfTJyUkx=9)=3O@URyR-c_w3q1!ju<7^TJsX!Cg z?D37zpt-)nG+&8a4WQ>>(t)myBjZrPx2*%F~;#nW+r<@Nvg z6yJ@jPY{g`I!16#CRotyaA7BRRKS>VBtntmdlZYE;Ekxx3y$NO)dsCVa*~F?v^cxL z3KFRY5WZnDIxIms;K>Puv8e^kmeh{2#KW)d3hk=WPgUs`dALh_XNNgBi5Gt(KXUQ9 zAN6Cr_{R%f-VatS06jQM$GlGmJu=t`7D=Odm$5yQd8IiWjSU`KS^`MoiEoV9JVI*5 zkx+&5Yd)bRgIn7`%xN;I+<(saT+3dm6l40D;A{!C=cGjnH7 zojv`i^v|&FtL-1&`~F(}+{^Qibms}z+`D+fguoE#wEnApD)F7?p8R!X5oAv-`nwFW zCza*0t60QGJ=?CuZcV)ku zi2g&sk1vD%W(HjV*9Brj*CYoWzsadYxbn(x z1mI#934=CMK^q_T?m~7GizE?s((O@otH6eP776O4K;2SO7}Tw{pi_#Ircra@)a6v; zX*svUdAnkg;94<0YMX*pog{&9ZCnlM)3z=yJ=`Q!POo?{|at&?EnFD2u zB$8OR7FgU49@DglczL93`3y3e!+hKm^FG?Jc;BQyZTxWQw-2BAiRVwba{SBzBj??y zF5Y)V)u1ta0&joY9ZxQNe)`DGlkYs-Y0a6NU#@%O$grztTsdHVdEqV6^>_5?|3L2{ z(~GM z_>uPx>3h!I_SwMR-KKT#H?Zfm;dm$klk0bGJ-TNH_pSQ*oc^_L{#I_dYV?4mSC6b4 zc^}QIfqj%HbFtt07_fsx37ATf06s45{9H{D+J~{%*TMw4{--N5<48rQy;eu|{UHBT5dy zci_gJGM;4PNi*f=nwCh*rDbdRk3Z_K>R$oom)K0c4Z0$&3=8&MpZAp$Kz&7%bS+S&mH*z8g%y`b>~_!M?0F& z%IC0u#z8JEfi+3&76by&f>Eit#ZlQ5)yLG-Qq}BiNOQ6*n2*qy%uWJkXc-D|l}0lb zPcv38+uG35QUmUKM^ZA0DyHQE)dGSfOd!~cE^H-#M7cc1ghDNFNEWe27$%_EvSZfO zy@$=Jtr;HwxnpM#8aBw3x#Ta8j94*eY(cj^ zHAAM|KWyZvvW0%QN+dR}xv%+k$ga-N0?!%Ng4WL5sFoFL#dvcUt8pQ%8_oiyYR_UV z)eNfl5nS5A(8W7AX;*EiFs>?`T8?2s1I5z%Mz>qXk5?JnZFi?ybx><#{Y6bbSf9}* z9lLBM9o6p6`pWKA*jaJBw6jL=A#Jc373|scjLNFaHc=eovMaI4=2W=cd*j@xO1t9H zGC|zpGSEJRRpL@hE7WenRPX6(u&|_@4nhKWps@!0%;gn!cV18kI71TnU`r-NjcrH) z1?UFDCKygK2eaEsVh8brg?JeE5B>u8K#Qxp?ejIYbDZYVTSqRvcjb@w@4L4y&e^4U zUY~z|cSPT}m&c!<|MtQ!zx_~uahEi+q;O6Dinc|=mk!|n;y&K+Z+)Ns;nVsDI|lb1 z-1pIq8@RkFtdHx^)8G5H6Elu~dO+X#(LeR?+ZF8}^Jm`qY|k3*_}D(}&$M<|VDGux zbO5U(k##k8pO}{1V74-jjo(cB5WrQ^mcf^VtO_ky0ta#{h?D?v2qQu4?NCQ@yK}Q; zv840)8}ySYdfskm>4Vek9eSD${Mwt3)3-|#`Gn;+x4r33tjaPx|8ww9BIH^YdlZrl z(pqI9%?TAmpshSaXhB1YFOd|p6cXQnI=wJ001sr)MrDEy5`{A>*PUNQtfI0aHLFNv zPR*I}3n6P9Z%*Kn&Mfdu3LWKV8F%_pqWB`|_8CA{G@F$~z7PH-T6ifg(V%9Lu`4!T z0UjILr~=iC6xIT6D69n#4P|`S*>83{IAx*!j(+~}hWRV@J`s9g(V|_OO?w{Sw((WJ zIc?3Xvllp{FUTV5rbt$doDtuvUaE*9_jneiU|r_1NNf`MA%PyfS-1-Rjk%A?boik+w|9;eRA7i{o-IeM#weHk*NT4WMdvSF{&?PhU~3o z$V2uE^yI`7Vm5xKC(~?r#BA6Te*p}s@x))`dKl{-T8|(-(>$ctMoEk{MH?v*mux_T ztoLvS&wEW@b8%eV{U6=3?yk9}J^E+*PuMN5`GB*{JnzLVe}b$getH;vjbqnEZ7dtQ zNiGOY0T-DJmNrp$#cMou2D=@n;}T3 z>w+tQH51+(kih|RX}QjN@zY^FI8PQM7fps8dDdx^e~ou(O`Gh35n80{Ny5D02G2n+j&=I?ClkhR z^e$R%n)2(MpU$Mm#w+GBo~?|oTPsX(W8q4s5b&A=!Fcf)Gw`J7v}ul(1^g}baew8* z=lA0z4&SMl<1rESadeE}cu6f#Wk`5Aj`~kW>c1wD?*dq<#tqO^EFZG2ZP?K)w5)mQ z=B@leeqGZuJg7hO-jbP^wCcC{Kbm?snWdq9n|_XsLnirSVvyyuzJ)DK3@IkgT&(gF zVzw;No<~_r7aI=KI!|00x}0=r3dz^9aW z5T^YvCLm$^E4QCNLmxN@?}!8J0ah@hdFlCbL36AHn>Ffaa(i4LJC2vg9>Isu#@Ms6 zEe^P!AwhW$JD1?`i*vLzMOO`g4-fWZ1-80s!6qLsOa?N4@xrk@44p#`nk7M<`+F-= z9)A)G>g#o7olH%K^{=`sapjMJUe7Ciu(BHd{mO3}l$o{qXH7O^eVK`NPQ*(X^JI6n z@SBAQ=Mwzp1mT=c4YMTxAa``u9y|YbYr;7R2HOA1h3^g+gtLQiaUfiVAe;<@K2E?p z&tj~0af(5L?=%bP88)(oXi%YYH^~Sdw3rQ+yOxhs;>#c8Zj5V}{;*l`XRpJEjtt^y z($QaQl;Qplb~OzpJ)GqDX2|gbcw2zS#$6`KQ)s)(hzV}hAyjV70vVo(aU}tSg7QFW zPl^ktmR5MIu@n0lCmo^%kzIU@h-_GqU}8JgzTHW3Ni#t{!I~8E?(y@VT$&4fL3JOjx7ppa_US0sb6cF?Hj;;$ zo8(k0U5*8UvL~v>(J~u;{(}Creqz+j?Vay^{M8!Mp5w>=p?}|WK{l_RM?q#pYkj+* zwG*D;35M5D^J3R@cnKYI#KWf`l(%#udzR?B3%aVysbL2bWG6_9XkD+wC)mlVv$)ha z(BF%xfD}^GU4NJb_^M=Vn*U`YetKWmAB?2^-_6BqdSJ4?koW)3^RXNAk-(B!bSKqp z30Ms={X3Zk;u8Z&z#JqvHLL@n=wU!&4q{SF2oiijO@>@}`26!E7wY2^k}(+$I!17Q zNg@#Psl_`Wi0gU0Be`Yay9tG{0-GZ=4y!{;hET?)OmHIBiJ^ki;*ZW;R7ITj{ka_v zbCce1bm79?Lzb_CZ`2L zBu3j-AVjH{HiS}`G1@Gw7MP}5D*6_&%K)=0v@A2uUC9{+N|cScBOM4X?*uR6Gb&Ux zc+h1yyaj_5@jP;S6DnrliqOn`gpUC<%76KZ8*WW6y=L_dx14?8!-km;-!Y=DdhVi| z^beX&_vP;EudFHP*}3MLS8iB#WX?5>HDhYJj~zJlhI30bxi>**Ng&%$c3pJObD zP%*XurZj4br4%a&aW_C~Y1tsmMoihG=l?2}4R&?QLDfXsq>L}eHXiah;=gBSSUw-t zAJz4vy3)WUUH@&6BGv(CYanyB;JIG5fJNLyLmO5BIU}_M2Z_)m!7|V#>SYT7jS83t z+7+}a&4Hd!gbMjx9y$Lq^~6DZ6Mqom3BnY70g1`QQEbo(;YKz%Kd^NJ5En{@r&AcK z!c3NSIh{%5JX(|Z8ZUXp^}^!&{IBrRH!Gm-=*9TdwbP1ESIRfQbtax=`3lc!!xpkg8=5O`NIVYGjYwvQ z3p@}CK|>oObO0(h7x6p|2nj))K|`Do!b4Jow*d$;rRiF^k%hAgwyY)&4N$meiJk_};byoQ%GEz)-+ zONvs|M?auHgJFHv>3ms_#!NYMant%+mwhB>V2?d^cWvMG4>py+*L62&3PS^S80-p+ z8=7)do|rI7sNfRN1gtLTuV6@Q^+MSeFgKJt3;})wg(QF#3m-5n6iku<)I?wd7}HSA z_Ix2re7s4WE=HrP~Xz=k&bM?F{upQ@5UXYd3%x}SGm z#uxBWO&b^L#}-0sRHdO87d0J|ib1DWv36DT%LX5=p@&#tuZryh_6k?+#bo|5!S~N&WQ6 zLj8dG*Y|$i{hqO=PGh4apN0(YMnoohO9r1~hZoLm`9y;x!U^i369K1&CPo-2TD3iGwotN;5X_q)(pFXGvCh&&3)FaReXq#Td3U z_XoW)MLYpFu?|@2#v2hV8Ur9B24H_1xjaihaL+xA^NY%d@(yzVe2w3kVZ$YYX~51D zWa(jcJRR%{^%CHAvM(uEgkSJ*+bf>yx6&M+bpJ!CeV(HElGqsRhg*T+yAjV&$s%w{ z6bL9TVgs5VQE<>Q<8kYN5QrW~?`&erOqfmeEWwdX+np`uIur3ozEC(M2O(789}$RW z)Kl%?WA6Lro=I!+tQB9MJL^#H+_&K=Uec?w&uv2nSM^>zfG<15r@cOM=-S`5t$X75 zJGHfUo?X{({C(dU{mel>ry~Z>i+G7S#)^p`n*r(+^$t;Y82|>+yI^$DK74*(l&2jq zaWsFMUtr19%YHHnalE99Fycc$O*%&eX7p6phEe~!8;cIg2RH+=Q}{>-_st7hTKqla z5X^zFEUe5gunt)^X#G=noxAUq;npsjYkKy&dEoNiw+uCV^)q|sPwxN0i!bVry!-fC zzIN!u)&H2U-u@N%2y-Bx#~h@x?ok}j1)r;+JzUW-1dw)4fdIOq2%y~+VHQFFRVBJ9 zbt3%FfL#cO7N$5s&$(kB;Et#FtRGiCz52>kgU1dVbbFu8&%Jq)uY8}6eWCwZU-oUE z+%|Diaq#CWPDXj+SI{~cS`s|Ngv>@fbP!$gQY>J(YboX zA)IAQ^TW8SXHHitv55lZ79cD6SYwPryEm4Y0iowy0?xrJYrk1Dd|{bYGJ6K`LVXVy zrr$&3iDOn(FBvqjCo#JpYeT@MqK?E76Nb1(Y^91a~AZ7 zZ7hQ17(hVqa3<3_O|@eiLxdB~;eXK*Xr8i)$qgP=)n7HXF{pg@gIXF^L=tRyle6Az zvJ;R+M~VVYPD{dNDjj83Z?Y$)iPf>!g!tT~;|Qni~?bD0_&!YR29%yXEWP*pU~4f$dVQu9S6E@ zJc$m@jdQTl+*RvqMo;Zo`P&C0M)13X&p6M&+qK=uZe3SB{(%05{_(qw-1f?*Ej_Qh zv2G@BJ8j_jYX)C^Z0d%N#iRO7D=xWp%;84gj{Hv5uYPV%4`sKpx|5dP^xm0GPt6@O zJg>dO;TR>m7d|+D{)3QFInY;TLMEiLx1!QF(U}UIH71=>K`U5H6z>HwT%Q>4f!;4b zlwvIrijPmTxeK~sT69pzw)<#JtCwv@D$fUHPNX$4pQj3oJvTZB919^jNo`l zbOX;*l?t|pOAc3xtPoG)AOGF8up*pTof>J&i2fk&3F4??=nEXAF~M$u)&{>0MSjRa zpy##kX|3EmW%VZC3jMuR&g;i*ESPNeKKsi1gU3Jl(100D%cV8FLyNz7OGg@+L^P7t zfJQPR9VbV%Uy3}V1u2C9WNH@Lr4tP-5MdaI*P*CakPZ=m@UamXs1U>1p?*4Bb}~XX z4LwMcpayCdN^QWVpyb-#TEgAKy+b0BGL;A z6OY-CTr*RUUm|!LiaVKWal)35A;To@Y3aA>wtk^|*{Zfpyh#7ISoPAN=ny_l+NJFJ zEgvi15{?bT;KLs=jzqRGsyD|a0n7vIk`GcnNQ@XWj3*X*f-%fH(j8A%4@X&x34vGea3J!_k{uo#c z_y66%MD(Jhamnat6k-(J(D#_VzmP&Do?|`^`I*c9ZafFc0V3~2uxo_aA`&NvYQ$9K zf~dL1#+ZTA3}KfNsq5W|$zWmuG#6`b^b7G;g5b~mGtuCeOsCrBAbtYp{r<}H|GHi* zbzsikgNU5Rf@k$EZ@O^N^OiF~<6Oez5&xL!ipUBgkl@h=nJJzSF2l%ghU9J?>{Z@R!jZ+FO$sckDV$o_uhBiU2AEruXauz_dth< zwCE?(qE{vy{o;#R3wCWDG(EcL&%C1-w_5#Cnkq9v(`2?O%A4_orqTKr1dU;7$sk}d zJk*etaPuKv&UPR229K1Y$ga?}!8h2Xb)~G$M$MXq3=GBd16ch%TTE+i5Fh=0b6!}An z6vh7%$Qi|(lL3Dt!6~W?lG8fLOCeNZmovgtNCo7MXJ7kbjsElAR~vcp#(_8WT03yz zK)&TTAH4Uwqwnea>%V<<-{MotUcZ@mT53K3onSipMmE9&2BJge!KDcxtI&%r%h2@@ z`=xqCt_Dp*i{%g%b1~nD*Qxps)_c5u2nHN42?qGCVK(pxr#C|;P#{6XoIpD}wtm8j zpbK%t@F=!6g8nj;pVl#jd4OKz%j}5WeAJgN+v@uDPpvw)cEn8~YkXG!=c8uC(!sjd zT(j$?lP|xdKYFxg^rLs_yXD1(A+hpPk{{4{K?Abql979X%od>x0%I4`6F^)m5STbn zAm{h`J0)7=Mi=gu^9{zr1;=GTMT{ebaew8V=SQGfxY!cnGe}y}F@p0;M2W_ky(gqBoJI$t|GHgs4o=!l4z{7OKU3bvNh$Ca}C9T7So1zy5>|DhUfhyr;Zj< zoc^(M@1J!MtI3%U_TFQ7W;SUFezHnr8{)z7T+K^yn!#c(KYewxLsN zCM=qG`t3KjU31TZioQK+7ti|T;~9?@UKrD}b3yM;y;qLg_59T*M}`XWx)xU5Kk>ku zZ9uCD7{_eWAlO%HqBt;Y4k76P;v=-QG-9%nXT*eLjEE#Qlhk50>4fSl6>fN2sg@RH zxv1}2QGG=wH3jKxwl;8~Sr5ugv-wEgSyKcbX>my)0hcHk9@(94V~JT^Lgi3RBne?( zR!Jfe&_IYq@D(C8!=4G5uif!V2~RK8znp8X?Kx@oLmSt`&y^Q#82R0~vrT8)_-cZm zmfdhH%a4~ z<_i6jAN_6H(a)d2oJ@tDz7~CsL*|w621Xzh2!xHrKM zvqf?oAZ)_K1a^&u1njyE5yA&$7tpmD?}pk15kMUh(Do(N8p>3q1kKR}&^jy-gMchR zYdNrlrz(m?F*`@eU-ABSbH;$=Q#{mk4vLQ5T-m)*KcGy|T~GemTkxeKr8Iqg??Xf1 zE#*J_woS4=v@f!zi5vmE88s}F?Sf{xQJsr0Ya*M0SrfhffJ0LfF7hk1@s6X(sZ=xJw8g`C7v-Ca(SKLC1gn>-QTd=o%9fk!Abz4Db;|u z#!6T+?cNeL6g9a*bpn_cUNB)%R}s35sS;4W(5Kh*?l^L3dD?cKhk$=?$9xnG=+{)M z>F zAcd!BKL0Oj!a-crD?y6L@j2@qz69)2$#kUlw$vWMvDJ2^R7CJO)+B9QdleH9O<%Ar zZCdn?|Di>wT&YNI(I_tiybAb3^CA!z+q@9Ba+q9FmAos$Zn*`Zp~zoJDNybB1*26Up$ExBG1AqKe+n^>N)pbI1=v3*BaR2>dvfJZ8YpF%%kR0^z{OY~zPd z>BW{$E(D0@fjfVSxyePfiHL{XUb)2@Go~k#<^^iM{X|2$fzDH!4@6!=vN0Jcr7cSS z&F9;YuArz12z`(txKkA5A!i?igQs4RiT?3)RI{D+so5#G4A2pdj)YdT5ML2NGtELO zWJl{wFAg_Gr;19<-ISq@uhM?s(Z zHc92}KE2Sn_r5-^yU&iCq<^ss#7BI%l&9p#OAx^tVr13BwPLe2)+gB#q0h?*H;;$w zAqBzDBtDYRWyDDtPE4^&m0>d`KQK8l1xkw@8XCmRYai-SH>$^kj-i{oPkXTIlu4rp zwJ%>H<$X0XqiuRd_ikU!^tH=%S3}?3qpy*2uzqD|FNnXlK$tWnMC0#8+-`&YQc(mu z^48#H1Jfe@o`+f^2e~zzo!{E;`Y{7WQ1rdNhH4;~60e+D(`(#}L1Hbl?br*u!f)P& zeQv}HA_G3=bD@VKW4$5OlWqdcmTCZx1gAP--hhSR=0T`C#D63$ofdeS4>^}HTyn?x zZ-haJ#CAlPr5T|`hHE&Ea@Cb|TF$^FEoo*?feFAQ-eS&U@r?}nMg+%JEQN)Q?}Mcf zn{E;6=(AKtCRHe;QOj8K5M~Qi3APinBY6o}1>r&lLLE&~r#Ue~X=#=yRlSIBU-H%F zz=7a`8RN>PSFhMHX86F{``q<-{(+J^S4;h0=DpwaZQbe!ed){AKYMxNM8N9(YzP0= z_6?G`|H5ALA>ws1*dtLJG0g$or!*2r?sHgD4JI>-0~IY^WTGKiK~sF>$ImRLJRKqU zqDv0TjUw{26ht^v-oIFID5X$uk*Q!qinHFE;=!eljsSAe3LT1snygr?NWu|U)Pf}i zJR8J<5LDx^&_RJ<7+LyQI>;@Hsf>w`_W?vG1?2dW*E%L2EIe3}fBxXB&&*jfao|L6 zF)t|8kGtDHDXk6v-0_3yAN~9Fqocm=eZ}~*AB}uBePcWlPpCz53d@BbTgOT3-I(%%Q_(&$(jAY{j=>X<2yL+GV3> z%^0_2-I7pf@wz4Br%%25^}(}e4H-J?29nXpMPeqZk&?`M8F^WVBN6*P98O7g1gSbv z?ZZTXHA<(5hIsff(cr+u`-({=K(ZRrLIrPvFH!L#Bs}4SrCaC~2-oIZ%)FTQ+CiRw zBcIE|y7@@n#f*zN7mM}N#it{yBht4`5ot(M5>8LUNef%C)!t!&r$@w!$R|{#lpM4) z1?JcpIZtU13Auu)IA9+^n#_cY#}rjAz6dP>bL)kCP|W$PJ)*pTe&h?Q1|WP|v6e)z zJL)CGpJ*sB0vp`4u}87?0;g7jdB!$Rl@tO_HJ1QT;gT=bfI5ki2?dzddb^yMPZOVk z*!&PIpb~JbmR5w>&2>eRvVuZ+l=DF*7(!{TXL({uZc&JSkwmNf52jEH&62a&D)Kr{4OW(w} zr&3KYiLX&ED1FTe^e-^5+tuPSG1wa4Y-Q3p_Vj%XC4PRo`|fAa(0j5 z@on&$SZ7FQ3O{Jb5a$h@isH#P*2&!15Nsz-gEWs};XZLXMI9dmNJ5I!tP;CmCc&u< zR`HqE8QmrC$DVj4BbZatNvzJIPM95J)wFZ%u{u-yEVqQFC+Jpl4514oNO2obP+KYN zbt|FLwnzn#+EOl!j|SQjK-IEqE_s7b`0HUl{>bb4_IHlz+g@GsIM00iNuKtnKj~+8 zY}Y^EcIw-A@4a{6jbmp|pFO=`dDrF3U;9`(MZY?vKl*nhA74RxI2~ zs0TunKs^uyZ#38qN>F}f95JwxD6DlPMK@T?&~XGw6w03!LGwm{SS#=OrLrC7&EvLA zxv85uZ_Cy#R%z(X({6lgRN;`a+5y+f7w3O`)3h;7)#Ik$bMx#Gj|{3iDEiu;jZu~= zR>UTtN*^-ieB5I}lq0?M=j&e58(03!Gx_=#^~Sq?mh#;E=tFQvZkxv6ZaKwmNXMa? z3vw0WnxW&6&Tef)xC(9JOrdOG1U9z>Jb-`b128nUFTtf$Q316S2QOjNbBM#@TXpEx= z<%=L`Dai;ij{j#4M{&4LPw%T8^}4>gSE&E+e#6TCj||@Qq+GXh#i*qLeKXJ3Px51x z-Me-bbKVT!zY;Q^hP3b*b8bOx3fiDAi$*aQD)EJ8@0)MpM-tmEr^>ZLuB5a6(R@H8 z{ZX=whvbHcLT-TEp!ET{0Vzh30$0M>E&$Hg5c5W5+x;p=#{7%Bl%hQ~zc{@5)im z30-+gRP&uLAzms(S2(v()Q`&1OQvA zy)@!TpeqLzb5csl;RFF4GBQhHc0~({P=;x&sK}{P(za+>kqsPOvsYE@h zK&06~z0_jV`T_MQLsUo??2!UXchlaNl1lXQkrE3BfXx*#Usfc-6V9oWgd)>YPQk%R ziR&8VuG!r(L%~r~r_^kpwRl5^iEEbevH4QXj#FbRJ7=_SH+*YFw_7Lmt-E&W)zDh0 zf8(SIxzO|`e4IBUMuqz4hJq4=+Y)aStVW9|S9H^FP|5F9(`cVhG%gd1qc(t+2YHxC z+9no;-=$_^3~~^c*tMx#1kg?BbXq3hAvkt4FX6&Iife@4R+b!F6Rk=`U{}D-4NIGj zu&~E1SvF{Lr^=<-V@6KuR5)tt@O%G!`-4;GZaEPdxJH_Duz&Y1IibfoSF~$ay>Z;^ zDOb&JqXgD2e>h8wlYg#!s5nJjRgU0&`BGe!$wP&D#6D~yC>XA1?8B%v8AyVu&p*Fn zEx)4ZgHg(dskJ9vonNjbx(T1ei?Gqs*uhqjG@3Q)mO%bVC`4|FG=M;;0|J{V4M8=i zULdl2u=68Ajq2`Dd=09D2m@gId8#adq?gCezbg=V7)Np%`7cw%F_n%HoVT)vQY$F? zB_gM!k_ixf7q&DxG7*OfD#yDbsIN(8Py(3(aBEWdjuU0OAj8ON6fw6n1wi9sAzqaK zD#L5R3s*X;I*wUaI2jn_S+{xq1EIlQvo*aB`7D|i_YHUJdHgs({@XV7wY-e#_4+=8 zuQuoxm5A`?4k8UmlM%sT72Ak4!G=X;HDggxDgX>x;1MX~Lj?qF&IV+^Sa1f?*+igr zgUQ%!jn#(?v=D7Q^q+WQ!^!WYaocwMsdD58Zz%{_=F)|)%|m}d%B%ZV#!$;}xs=b( z%1fN6oy6)Sq&Q>lN^~!$NIw@v##zZXkSKsVVs#`qW8X94a*e15vafBTu7pIUK9aHl zOEYAzfO4Q27Gho)WzPhU<{ho7oLYIs#C>^dc5E6|t-t3Ro?U3$(!XTcyjy+rY_?3Q zkv@UVV8@D!aICjz;Tl49NC*&5P&O_EvoPsV><$(0%EPcwm+`en_y0UHCCk}kx$@$L zi}&+2Gbbk&4#RyVwhcN=K6IFPSR;@$B52!dEa5~Nm%y}Rg3bu|Z!jBj8han=!Qhdy z7^Rmmm}m{3s0vC_I+wH-BZy+#yH77$HEHJ!ciweuXw}F;J+4w5um5Yq>f4T8xAB(Q zf4+G}J^I5~eAZ5KAZCxbLo?kLa@iLHkzz{8xSU=X?mCFij7+^^%7! zonr1L0gFb&zcY`0A-&F+GnXws!!VOy%9%}jqn{%;3!l%E=QQnY`CNP(pRd60SDN0W z-^(a-g!eDyG5DUD&CdtTu!a}Oide(B>}sIhgtN32I18aWD3KE@JQ7VBg0r(BU?4B> zg=^^m`5R0LiklQZ)R#a)X%fXvA}56kOaR_(3;e+viw6RDRmrO$rYUnDTOTbqAMtRj zpo!ex6|?Rf-`8nH=!<9W4LA3pto?DP&uH)PFK3Q6V4SYQSIiwJs_`zF4e#DL)(iL~t4CbF+kc&uFJSriTR`+8K0f{({E!hxP?* z$$xA=#41{~6Mc;P)Il?j-bdOh?%%<lPGt*=qZ)ZO?z3@=4H;X@HdE#22lb=8@Bw7vytk3( zD{PB?oEL1wf@V9Vd6y{yJRu1vZ7xMgi`<+5rj^RfY9cKSu)d7yO;9Wl zfkFYh2-FZIN0Q;GjBqbWAy_i?7I&&hWpcpbY{w=BX%&DC3)@db9H+Y?j+9*bt_5F+ zqc3zUsp7e1M&`Fb)m2@`};`e3-%(lr#vUZyZ;p_ zkeCCJk0j=%b9Byn3tIoaeF1m>$M!>Pd#iSu8{ksLr? z2li5LEaC_2NbJ^#_iL~xh@^g$OHkuV8)T2jNB4?+bOG(Su#Di?k7Yx(q|zZPLDV9M zM-c*Oe^iU$@~mboCQ|mibd>i}&^k(^dyN$oT|*uUKA~u2#GzS)e*F7<$I{XuG9Le| ze=w?Ye)#SuDdX|%@#Fv0|Dm6ff-4qc_3IZQ|GbDb?!tCO>w{$>P64zL&P!D9BsG?+ zU5nLrC$wm$V-Z*?4*5OVgyJDSTNqJ%78Kw(8Hc`AW6a~ z5OMG#*$!K1Ud(!&TD zJ)kW_%Zo%13aVC>kk%9Mj|i|1$2T^3yZR}t+DjH{Z(+L>!gc{>0=d%A)-e0pI<+dW z1Qj;wgZCT)OqBK=!=wtKu9g)=fC(B@tK55RsBe_!?@CuLm$3hsmX?F>w+ZIvQ7eL5 zSY}~IoND2&;0RZzDonX%>q+~CaF1WgEC|67C|Kb4QTTb5OZf&6NKqC*0!K`19kZ(O z-igaf%@qgS9UdI_NIh_|Bb}t#)2nw6s^2qnO|kQU!`yGvxb=_olAc}q-%?ZEr}s^L zr5(}W{bg_PtB(x6YVDYk$|qMpf5hXNIIXDN=cCHIO;}eu`0sCy9CugaQbcSuE~bcn znn%R*BliRI(pSiqoB7I?`KlIt(%;|{RPBk)W9#+>B>SWMFu2wC4}E{Bz1mFtVBDwf zjL{AqKkogx3UeNIq7DpII5WUdS~lFv`Nb#!3VtaR{6dwnQKScfXIcs(jY)XqX2F4DSK^%+ zC~r=Mcp5Bjk2MMBOv{g^+A6My#foBWq#?v|Npgh)Coh~V+&WPZ`F9CO{g-|Hz=%~v zX78l0YTw8nv*6Cj-w!%CtjFE@zh3y@GhRGoVD+4ygZmD+v5Ieef;%@?Rvn+Te8ZgV zqW#^6EZ8&+54vq9$QEGum%m3-DX;gu(7bF-=O+A(K#6@XgS=N zL;Qi1So`!=?F*o8#@erJ)qaT9X!Jg}iTfM(c>^LK);?0u-e|9juIZWVG_bD20_#er z8nH&?c@(}SP{~861~fV4gz7BS?4%8p5)KDIgDRq#qV^nF9j;dARBCNgO?CBvnw~ue z)>QZEPwzl>PyH}x;E(}*hYyjJfrE$j>pKjU4e|7X<}J!pWdrn)Oz_E#F?|FvCgiGy zV-B4FWOPX%p%^#PM+hNmt&g-NeZ)s0lqhueAN7$`1X((gbLbntQ%H=QD8to9A*N7B zNFBkxAYAY6?z~`Oe~L6+KC$n*k<}D!x_Ii$H~Gw9*|4R3`p1=|-MH0!|BMGH=(Ka~ ztm|exNP(wiDTi>uIa{E3f&4-8=6Z3}&CD|UG@87pCSZd7Q@7oWN>ECi6 zTC>J|>KvlIS;P>D`;Qa%UqJ1#xL05(N$}zwFi<9P!V@-<1X#())uLn;{3U=^uo5LX zp&AZJYoW(S17DSBfP9h>Aa4YNB0xS#=p5phO~;5gsWrfqEdVBDipyRjaswcfI1~Fh zN7x=gB9aUK?L;G$Dig31z&;?p23`_Hm|6$OULGGSrmZ(>1{79jhOEmsZ+v3)XR9LP zMTl&#{(Wv5IIz0kf&seM%JjFFKd|fgtB3Xb4?G@=lD+-=Wwo`p{{Z{epd-=Opkv)r zL`Ng`zDmSXL~FQ+ifFX+QQcr5#ZKn z{YLGHum|KfOQHnGJ$>Z-GM)8~)w(KcvW~whR)eCp?<)10wK){wL{dT%0py1rFM|&5r*nP=UO3xBpfB_R>A;C_2?qD z5-Mg2WuuIk8X}}C-pks$+&yfHHPPu!540Dq#yBXY*f>ye1NE!46kyDnBah4)Ut3Zo z3QKU_KCX<;tzodN;g}O?mF0g>Cj{ID4>6>q2u&v2ROEuTs1mEWIdW|JmY+nj-;t0s zm6H9&@0&gExuU9_i=RKuiw6vtc~4EBemC@yUMPHM_w?F__|^~jfQH8&Yn1?4)NXL^ z-h;n+W9(#}@YjjgF8X=~lm~3rBr6QtglrbWHmPGlvL|^MIQB%~*beN#0whI5fsuSf zc?U?_Aq1QLFbXdN;1p=XktCd(he811s)kN{c=GhpLsi#Yw-jJ@MMHJD)<3muZtYMe zNnYioVmC)%r}~gtP9-iAg})dHL=Cbyi&Y~9HcC(}@BkDIAqoae={kj<|md-Bh)TyvA6vBAB zqF>7p2bYBUOQK{{NVDLtq_`~!h{ci+WMT()kxZOIe;I{324M)7It7?e$ME+XG&_V8 z(kam~kj0G>wh|^X9Fh=wju&Xtwd=-?`MbKk75B^{C=VmeTh7>gg1QoWptbkmKFbl z-&hJR{bsKGvNQ&Ev#5J4LFP4>FRP*tQ~6RAePG%lvmBT^?a@!iPSZb^Pkw&!xPC@F zyAJmme%XBh9saj!{GM`AjlXVm9jft9dsKe;9iEr``9;jt|E8vYt#KFq!cm^*qq~sK zi*YHbqCW{(bqLfKJ4Zvj=oJ1;0hJY@dLpD{8KcU%d~kfvv`0UiG`VGz=-=o1IdN}{ zRdI@Y(~34K^w{w?gN%DqwerMbv9jsjVx$NUzHG#&eZ@<7MysKh&Etav1xSZLEnm4> z{9OYFq8mtJSVGZ1ZXlLU%iW{3d!u)kr$#C9NeW8aW!R=X9wSM`VqWb#t?O6|)A=*f z9wi?*33O3=G5rxGxNf3v(E@J`7U9o{zEOQQqLT3cM%{YTuYBmbo0jZ-Wc~{2nL2gS zowsOj+zHY^2IB7_m`?Kw;QB7;MS096mEawo9Az@Tz+w4}kv5B1h-5@LQ4I`~Xb_K! zm1wv;FrrmFg!nyt6w*-Pqd?X}^!IQEVhp0N+9hXT)PE6mT(t66;5LjmeTPlYhdGoP zL(MN-D^=h9_S&Vttxyafa3N~4+EEiD6q{qXR72!lg=aZpk0U>`-AYbr7d#In$f^FG z#sQ6hTqq4f$S5q_yigSY%Hk}3iYtp21{eCz1@3;POL9Ut>C!h2ph9zz-xpDab|cCV_%6!1;eaZ+vAU)72b>UO zXbF(BKMe1k-<6-U)RwR$Z{=0I-+NQGj#_e6ZPBEyo%y&teRCW*B}e~y^t2TlZ+%Oz z=ATA-byP3%^rDJSN-`f9eqh2IL z5GFKYb$CllOGSIEiN1pzZq^%{hK#`?hXu}f!`&D$nMIrcWw;=X9!xtXi_2W*({LGpi7LzIPzynRM zN!{=|rb}FJD(0IPHT@vDX6qBMKJZVOs7xfj#2;Y`C=-8sj9#?1sNR5So;eF^Yk*i& zgQTxo+LyO#zk=G4myhpT3xOGShCb2{p$(A=@RQmt6e$O6NRSfB6{y9f05(+yh)^vI zX`NxJbSM=y4C;Mty8r+RX(4EU<~+JL##11-HrX(^Rx=u6s6|6;Yv39T!1 z@@`$bV56^q5?E2Jb;Da1r`nw`$X?Kw2ShELt>-T*fzU~mK-gb-|M^W~CQ6)0J<{5t zH7GKJg);w#3JIN1A)ym$Bd8@PD_nwLcC{UH3)%&tXy?(9+Dk<{z8Ru#%4{#HD5M12 zm2{#RrGLDK(rz4RS7t65wp!P2;DR1~i3{9)aq6T9 zi3C@DVrKVV`24?>TL=K=jK$3%l_pwzfsj!0;)`tT%M;1}OI-$jw^63yiatFn`Xr!C z!zq+$*f+gz_wu{izOBzQYBrc3qbzjSM3IHQ`41Hwepkxje9|uYby3uTzjs;2x+M6h ztHDQn7Fe<^P6HqD-Zz6;8FwL6n?O zyB_@iglT%%V_egv>m|1MA97AN!8tj(lnMxbL0yg*zi5d7%K!Jwg1V^u{~d?$0q|Pw z{eQw6B5R%G6i?mq>-u4zU7gtNCzfSJgZSIMkW9vV(|3?QT`hAV$*hp|#y|Ydx~6F- zj;!gsrbcU5HU(Bf>wn)XZ`0qg#P)z(EeXk4QVmO$A7gKt3Ru1}orTOFvbm;RthZ!m zZ%TVujkKqErZSH0#%D97ismiS29_`N$8RPy??78MUVD`3%}4R>!24HtPsghkuOWDa z@ftyG|cv7M%sY>o09d(M)_o>M+-zFS$&_A52buSz?b zPstP5X}m8)G?P~jHTP9!qqfw`h#q~F<;bV;PUrKXL0xRlQAReeQI4}5X(GM!3(DQb zxurYHp?2jN`d#w@`VH=zBfrUfa(^}fpUqZM*;MlownV9FeptzCo-1!}J|>-PzMxF! zhw=U}(ZHa6Gib-QgKq!A`&_(0H-1?DoO#i=HRhdciL9{A%2Gs*&~HF{YExMAukuX# z9h)gzSy#Nq;rpK}pEe&bb!Qtu@8x`Za|zm)N$1%%{GM6j*`(-eg}fWz1Kt1A%aV`z zz+8xVpt*>?#5~YkL|>SzoY*|jT(o|nU(0Ykh32C5OUwn$Szkm#5v~8j%ls?oNppdD zX#FzgLCis0I#;%WCb4;-xoG_&K6{20h`FHoh`lfuV$SeR_pp?)#TEyCOFS|gIKo!g z{Ihvi839{ZSuFN0Eyi;E2(RwO3$_E}OR$Kp!}_815PiufS-#~N*u&2uTI4zCUsx~l zLfA?RS)KeV*3Rc_x_K8%rQb@Mp=oc%eXvsL-k7Um&@JDjvpVP}%+$X*hhA3JoYM@? z1OAmp|6kA6^BbjF*)DIEpOe2-+)BA}lk%{#U-??OV5%{#H+^OvW&YSwZrN&i&Dz(h zT6J4z+aTL4+wHcC_K)H+;FvAR0y7Jdj_dDPD&S^`ZSLsxP zsugvcdQSak#;%NG8l|RL^O|NstJKzMhqY7MOWGTmV&)r}tGcba*{qFO>)E5(i#fG9 zr*f9{qx!qKjk)2x-FYYS{>l&Jhx6|hbQT;dSSd^^oG)DFhxs`?>qQgAy5jNTl@dkC zWXV$LVCh2XTA9AAwrsUrQQlfUUA|u7tvFK2S9VthD$i6d8F+)s&|>H`1Pv>ORl^-2 zMo1I%Lb(tShJ;aJT$mJQgbTuD;hONHai`I1>^F`W$BYxkY2#-mmuai1!_;F6nublc z%@gKnbI5$j95yeSZ&;=*XDqXpE0*h)Wy>wgx|OUc*5|B;ttYG}t>>(B)~mKO+o)~a zHffu&U9erYci4OE#~lTZdB=j|ZdF6o*h8L~s&LgWB8hsjPV5v%#q;9N&J3r^*@7qN zJnlS+=VoU%ZHTGIx6Fv{Pix3PbVLyQUqe$hE3os^9)%UHQoi5t(r6p5%E zM2g@X{MiK=F12`p;gV+_Nxvc0SKzM7DTc>kH}EyX$mQuYk^@>zJCd1UcASLqhyb@2PcQk=44-b2e6M^DDlf9Z;{9Kqiz>Hg<73h0jX9016uJ9X}1IIg6K6e z9*=oik$KF-Bj@zW^Oky--Y2qFomd?nlovFQbI!RM>4AAv+}gulKz`00O?>ak9nASZ6T-Db$^7I@@sf`0UIc){F8 z%{Uiq!P~adcG`i+Wo_`k-+@!nowz%{3l@dD$-~9an~>6j^b!0T-GXoO!}JPlvrfY@ zC6-=>kDll0Rb1+hqeEOgy-1(X3YS2Wu*>*^*69v>!M#mi(C73Hq@jzBKu*5IN`~nw zBE~P^hVM1p!0w@M=sJBx??U?4=qPbbe`U)PvQ6fEl!7cd>_LSDvQhJa%haxbGcj| z?xz$a3y7_4H@$>0VFI&3z%KA@e^a(&QpeL#`r%k4l{GrESsS_Y&2 z)kkPM>(_2i>hbjs1ow1%`n-`MM`Hv!8LSZ%?t$Q5Dbvm7)98xK2T-05pgbQyk!Y5? ze=x)yqNb3txedp3huhCK!Uu0rNY&mH(zXB@Y0nSEBeXriN0>VlYitOm^6qmAe+<+T zAW}f2KE{Y-5Gf``B=PQxl#HckbRr6qN*SR9k(kGb1Q1FsBjQ0MY-dCqi1-vnq)8nr yxJ}Ux(@~gK5-EhGHk+MVs--%B@C7hcZXCoEGo&0fr~fxcgO(Zlq7~XhTI1h{8dv!M literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.woff b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-BoldItalic-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..46778a21796d14b21754178d21ded6431905dbee GIT binary patch literal 21940 zcmY&fV{j%-xP4>Ww!N{jv2EM7ZQIGlwry-|+s?+$&3Esw+f%1zp3~=)Sp)v-=OX_~S43(^kt#Bg2KYozag@ z9`~o+A3vb&OccLc8w2;Bb`>6e@(BL}Ff!1it$~dR0HBEaqXGHBA?4C1#`aIcM#4h(YOEf9M=&-51O@sB1_#0_hml3Xk9>cB^MCoBeh+w?Dhq9Be?Re zKIk6>fg!Bpqw?1E_(|`PT}YK#NdQM%!`jRcOs;jT9a&ok{dAPs6fPsbt ziwF-7k&zY`nHV1(qM@cFt0*rmva&Qcxi~*Qz`@2u%Sca6($Q8|*;rp);^F3G>u7In z^73?d`FMYRfB**t{uUY>AR#U+Ffu&YM?uC~U+3~fiC!P|Jg-0qC~LrKPZ?>jsYc!^=60gKm&8Ht5CKha+^QEs4KU&+LYFf?856Ti5~ z^?93c!G68j?O{bR*k34@%kTMd&iec4$_ti`cdA?G6NUUqCTE1vWO{QgEH;PISf4`| zY!MQ0^((33XI#F1-ZW5MuofTypajqdm;$T;b^u3!Gr%3-2?!L328izGVgh0Z%m9J` z5kUArR6uZmYanDGaKHx;IS?t}3(x`x{cn7A6gp+K1QEC35I_QkRtY)RQ5!Sjfp0?C z#0hKY2gY2DIEB_@v=0rn`yk{A6@s3uz|AR@ie!S~VMzG`an&BRtp<*rkgzxF@HL^xn*^Xz(O8ZktbiQA(Z2*brl?WNfrONu)V=Aoh4;D z<{nr3yh~cH)gno!T_E^6mE6FvgF>i~2fBz~Qon#K*5t;0i7Z2QCw&KYlxA`+H8)Wk_WkhG5N(wXq)kXY2t$0HE)0 z0D}Aaun&|ss>pg0cX(Nwv`Q(E;9^?5J~a~CBliQtE`Dqh;-~QScH0r zqDDL_2wlwmWsYGNPjhtqM*`wann~yS z68_f%&2gmOU4WSWR9!%E-n`tpD)PMvTq)%;36(~EV+1>y&|5pHzV_MwMio)7+(hrD z*$jO*BAbZS2}=}#Cj?J~XW%n)3J4{;NMb6Lg(mx@$h30?97Fu_)KH88{~tDgCwNcF zbPw3`r1T~QjYFPwR|zMDg9&}hy$@;ZD3Js`u9K>(tnF*<*SOEGWC8HH1w<8VRrg2X zfR|ixM&w9PUITrg53HbQAZ@g}9mT zi@=o=ygaEbyGOqyTc7U>66YvS-Y>k@Hy;azK_IH)t%z(m zQUsc=W)=FXNR#{2`D4DdjAKR4O3CTk_$`BBL%Wo#zASpQhJWdaG|hiAR2*wiXXX$2 zD~VH6qIUig-&Si&oPjD{gjH5~jB1ZjW}};67h3LohXsB(jAutU&@PF~y|23W8@hS@Y6yA_DegUv+yUQ=*Khf^#`sU15If~wXKIo1 z73M=>ZC`bAno?F!Eptanwz6|+ajuSO%8r)$*oh-OQ5HKARiT!DKR;LVrK^m?d-pRy zj;G2Oxr4jS=rx*uvPR3n>yyDO>gLQbSTz=M<%vL#z3bNlOY>yY?A!J~tvvqo%?7gS zy^9{xM|1bPI~rY{Yp$2r7{8B(E~k-Dwj>XE8xJ`MX%R!hd-@!t6)bopZijwvTB4;x z5oD*`Xxh-A`QcS;r~Pcy-F(pKYKO{J^|~}_RgS4j!%~kCRq7SS;)7IiuGwKpN~AY8~#*&H66Gd_`sWc1)^j z9sgvFoIij576*3>h51z^WfL;b2UE(6_)Z` zp}Rb1?=DuR&(1;IwLJgUt+EzSg|Y8nQtEAXiSEVJ+S%F9IBOqCUWacI9P$}H4v+a5 zJLGHzxU?QtYqlYrVS7Y>Z)#=dv_&&vXRKx;UGZ?(mGv{ zf|jy&pfnRCSrZB@W!|O0<7>s^nLPuC#nXiBG~1{Lf>!%^(+@-LhC{`+G2fnpX1Z!@ zy$dIHr<*1uk9b`+^7(xn4pG*fHv2r7Wm(}klCCqoL~3OpgU%Ko!zgwf-f>EEyVO2C zgFJ~kyi+}IMIIMfVRl}mc9?k2@^7WDL+}1&@RmMDhEgEb#pLiU(L7-A{((Moem=D*S| zl6eSeAIK$_?ic5wdpAaapB`!BHCOC3QJqhmcb=Oq3Y`{focr2>Z*BxWqpx;Xqy0+j zYK6O*VuFKxK8}#uAGF1wypDMwxYuIO=>^?EaI6$SbXvMUcRHVLQCotUJvnLfG)Pew z*N65b29FD1U_tkcR@Kyg*~H|c79ZE{7^v>KeQB?^!z;lz=yzk7Z8vzVw{BKWfmld5 zXWy7X!F{K7)TKl<#(YNuJrrgOMYFU_fl~o+%V!}+VaY@EEB(!4{i_~3uC20Jh4uRn zwQ0-ls40oI1=B$}m@=axT)7IKGZ5@QFdd>5TCR7{oWdIZei=@|lZp%3vgZXHe^G>r zlQT!h&~Q?Ocf^zIq3BI!%a@U$8&s4|JiP;`H<5$Ikt~ZAi#?z7*V0pyFR46awp8Rd z7WSYGa7VNIxn=eaT3mRSqKwR@>wJW^0b3tBy)CTp<0kLTd+W|He%Vg4erhXsNq!)B+A_wNte?ZDnyZoM4l zM-Z1D(Ty#}&;{w((E!}v2qt`!$C;BM8R9UbsM}kScayZ2g=Ra8v{i)T;C1<3q)v1^ z32;Zsd$5@?2Vn7DB+fa|){cUsg402{*o>MZTiR1#kMW)y_|!~#-vk5dT=);hH`SHW zgKC5_2q2=ipjk_EpY2|=M7kkA9RPA-0^gD2JjgTyUr>E>&X;)`@aVIO$+76O zuM)s6?nH+JIc{nA!Vm?aOv~P+kiC4;|LX6nu@ zM^j~4w{bpj7)N~o>(W->A4snd1u_USY#&ZkT~J1y!kz5fQ&|-qCBB#PRHnfjZ~e7u zf?AKG!n8ci`g7mMjkMkyiE5QS6Q?|GkBdv+7^Q8zHMbQIgl{sfv6qAWl<#_g$@9Eg zUl@`!J�b|3(OkNIB1U?gr{-Bgaj?f>vWKZ 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 z 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.svg new file mode 100755 index 00000000..009e1d7b --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.svg @@ -0,0 +1,251 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 2011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..dacc5bbb58035bc5203e206454b92cd3250843fa GIT binary patch literal 30404 zcmc(Id3Y36*7v>D)mysL=`{=4y3<(*+0%p&5W*Tl*kZsKLPVCZ$|AA}h=>d#n}{MR zYDC6i7-g`kX;BdnK~Y?Waa0_192^;Sa2!QkMj@$uzjLb-qT_t;`#j$tA3W7nb!)r# z+;h)4_jk^@VVp7M#E;BaRn@pr*Ka@GgE4MLY09u6L#uc)GvK^C&i!M?7M1S$;NfR+ zUXAlfQ|C^;@tLMM58!+cwu@7jEb_;mb6&-m;bB}aoPOhsxp9%A-{SlY#-wR8CNI1Z z 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 E0HNKzPXGV_ literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.woff b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBold-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..de4f8e77e890aa401db7bf258ec31b02ee184053 GIT binary patch literal 19972 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..e4f4ab0db8c0172efd8c0b6e49c9db1d916a19b8 GIT binary patch literal 33758 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 PPAX@+o>LdMx{3Y+lZLfZ literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.svg new file mode 100755 index 00000000..a0612586 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.svg @@ -0,0 +1,251 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..7e636eb4c051bfed4971d912387eb4554ee47cbb GIT binary patch literal 33532 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 z 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.woff b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-ExtraBoldItalic-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..f81b21618a3a5665123072c94044839f6871023c GIT binary patch literal 21824 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
shdk2P8wb?1{b!eg6-^b1nNU z!W?=CbLfFt#sB1R8UJ3?d7niuVHQ5Kx1IKd@Ba{OQ)As6dg6+iy)cU~GisRSWBL&fb8ko<9eHWu^l`*~1cDOp_=Or0IV9s<@QunEvYhkZ!v%Jq z_j3cu$amz(yvb?R9`ml#3t8mzAZCIX628~$B4u{<4ClXg{NBv!D)YY?z0P}+2i%d4 zdSV5V*U{fS2NmrAc-muNU@(HhEQV=}4NMkHUzppNmoQ&rVPnx^$zz$qvW4Xy%R5#l z)*jXyYyoWh*u~ge*jI6wam?d*!>Pt;#Tmz0#CeBn71tB)9PS-F0z64PYj|0BD|lD& ze&NgDo5yd%KZF0BK!Ct9K?T7M!6QO;LODXGg#HK{2qy@y5q=kGwoBbjy+?hU z`X3E7jS`I+8Y?t*Xq?it(e%&^(M-_H(X7yH(LAGhL-UE|2hBfP99kk;3R*f^7Fu0e z)3g?8t<&12bxiA$))(y@?F#J{?Frg*v{&e8>DV!Z009610PX-y00jU&00aO60096302TlM0RRDc00RI4c-n=K zJ8r^27=%CbQqrVIm2wXdtblTZBp@mZqVzVHhh*7_Llj8OQD|s61t-ZdqRg(>hyn>& zzcu@NW_CQl6;tX2jccILlsMp4rxMpNY&@=W!`9;lkL*2ea>uX7Egtyu_&^qfJhNb? zS!#Yrn8D1>{9W309RT`sok=x9iQ{w-&Y%*4NMyI)Jq<7Se_~1)Ug`Py-w!2fc?JWEU{@YSn zc-n2zM{HAJ48ZZf)3j;Ry?5Drz4wwdEjytJd+$x5O&dlFDPd2sr$9*DK&%TO_7w8~ zh`q!{f-_qj3Rig5`?z7r`pG_6mW>VmG@2PA#Q)-lnSzZN?8Fj>gLo2fl1LKCq>xG) z>12>e7TM&GOCI?YP)HHQl+cXkw4f!eXiXd1(vJ3Ypd+2=Oc%P+4GkRw7j8V1;-!po zy3>Q6^rAO?=!*|O{iq;7kp2u{AcGjp5QZ|0;f!D;qZrK?#xjoaOkg6Dn9LNWGL7lX zpi*ocW<49Y&R#yTk)3Q~A4fSNF>K{M>)0c9iDiexv6)+Z6bJh`#xENA%^^;3pSzr7 zCbQT@6%VQA9uIiRBOddF&*t@B@Qml2qK2RB<~1*QMJ-?X&K719W)Ab1OC1NOX94qx z&_I-hEMhTVSi&-vvYeHy;4%kU%_`QgmT%?(MWYwWkapiGJ=*KrPpl_ zL?iW0ML_Kn^jrIw8cLVa{TD|ipsxS`c-q^+_`h`nV=sgE29AJ;jf{+aksICEv?CNZ z2t;~s5D5Y@8X{#kuxZCcFl=B^aNWSH?XrPG!F3Z$7n3%a!w%$dq(C`rKn}Ytl*0<- zuxUX#oC>bH7+4s^86bSd4O~#ecz~+7{xNB9WOge9a=C$A9$7e-7o?4={yzg;gbyUb T%P0XCiQFKf4FJ+YH{}2T4(1!x literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Italic-webfont.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Italic-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..c31595212fcbd4ff65267f36b92bb733e85f64ff GIT binary patch literal 34798 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Italic-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Italic-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..cb3fda65e9f6e05f49f7cd67ffa9c2850cfffc32 GIT binary patch literal 34612 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 gw%zmJ)NB{r; literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..f17617e0396d6395a3fd3db07604c1754d2e7b1b GIT binary patch literal 29794 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.svg new file mode 100755 index 00000000..deadc3ef --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,252 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..b83078a6075d5d7800466c2981158fc721fd9419 GIT binary patch literal 29612 zcmc(|d3+RA);E4{RrQiiC+Ri&(n)6lvXUmmfPsL3YzB-NLktLE3u^#b6+}d26A=a6 z5D^(vM6BvWKtu#l#0433z!5jx#bMNO98^duzwf!#9ik8K^E~h8{o|*fN>$yezIB&# z&+o$3B-w<~b}6pjny=FRb$*GKeVOx}*?#S>>vnjX_!_$2QC&X_b|(%744qTIol zxdLbFq-hH$*7VGN9QUYi?D&QWW5-|Iwrc}plXl^G_XZS1|7;qL`>$}H*)V<1g4bUk zeJf)PR@AwFTI0B}8!XQ)Vr=TG`2LycV;9Vn+)@-{)9L%Z8DpnU$f~T^jC*?i%FM=_ z=eVEGAHrDUO0?&@nX@O%{Qj@c-^JK$w2Sw|Z)h~w8>e<$^i1h(+C$Iq9eg2lB#S%7enAP9C!-A*UsjCw6y{>L zu{Pe7U&j|nN2Sx!$3C0S<4g3V`Z9dkzCvFQUq9bXzB#^K=@}WWGwh<$)`s8u*jD_e zs{J?2=kUe*l0&~K`_pfDTU*RKG=R?@xnin1O(uPpD?yP{9u zt3c&f4;(aj$k1ylhYi2B>beovSKm-Gvi8QhQKN4fGnU=8V%3`aAKdc9w(UFq^5oOc z?A-P2bGuco>G|e8`}Q7q@uh=o_V@{tKU?tl%&Fhao5EH;%x(s~&KHfGwun8of9bdx zbTfVNnfg1HKXByL5B~n~Cm)`EfgOJBt8c&f@*n5e!jC>>ciz2h?do;+uD@sFCbnVo zqmR6D^w=!MUcW_D1FA46p_Y}gN;ZO3v(aoEo5c>Zi7deSut6xR$Msa!$dhdg z@>J#?qIMZxqYj=oQf2<$@v1qurhKF*TRhVDH5fB(qz zd{xey9Pd*rhS#L46(jRiC69iZ?oYp^=98r3Ba`r6O>5FWM<)5xRa0(_I$+*N@nGag z)Mv_zs;kXc&3Re|Ux}~#R@T)esSMRv^0Z7*RMB2!&2u?@Wrg`_M4oRkedJZt?^ETh zL4KdAWDi!^@S4>VR*&`3#T7~E=_8X?i@Pf0jy`BJTIWb|q~jxzdA|2VckFq-Le-L6 zSL5?t?H@39im%2uzTT*U-ix9y3R!_T@wNIY2VvFTH#{TJBq2RpYNm>-~L`aN_>H82O5-njpBr zRpa^wxsT(d`o^gV6Ou(sQKL6cMJdJwfAWbsIRiIfF<6<0L8UhEE16kX5ewo;uBO<| z2Dyw2i|s5|t%WK(r72NoRmGv1c&;W#oz)_EE-UI9aHc!6(w*st}P{k)XP;n)!D4XvP2~}bZW9G%$lo3#++3n3pHEJ z*{0M;Yjmy_;XSKG;j6Ytr%N+SWo1mWN=}z*D=X?++AUD*_4qT~0olKOcvaQ#*!d~t zmG$-YrZ+Dhp?*qixx7QF4E3)E`iIY}N}yS`GpmxTnu|sMm9Jy$OkdKp<$r z_kz|)JFc4{7%JaO?!nQ_Idc!_F0{0gBGhTx2eLSMC7VghZc)gdr|6*rBbgOrCx^?iBh}std`Dm)$WP= zdwufnHs;N>?eBH+-|x|dn&@bf5-slBCRzM7(_eg~DI&p&i&#gKEjAJtUPn`u*N)d5 z;;&Qu_0V5>Cr-SBU&V`Gq0XdmJ;~vEQs|wg)bN{WR4!LIB$+ztaMCCc-!J&ne`-Y{ z4Sh+vI~_+r7Kb-oPRHSQ(@}~?r95}2{sAwozHua#l^*1 zGA1Y5(+QVqvO~+o#KeQFi|CvSB6B&3td&%dH7ip+&gXfAD?YOzGp3;w9a(bG8q8cjWrJD_+`q?Q0LG zuhmX&J^I|WbszShecSwnyw5FbZ(Fs0Qf4u4$*WmVz36Grp@R{y?f1ro7OIWpuTp@;c=tK)NYe=$F!W} zKi$7()q@+>uG~cBhsV?^(r4fQ>+fIu<6j@|f057K_rePo!RIav=6gQ>?xzpG_{YCb zzwiQ|&1da3XzJFsbEXxhhRa4HRYGHOg&31`uvw4}v7tOr zQJzB#Kol;c9GVBEUW`c@&c%67*Yh?xHM5gLbUg~=;EYSm!Hw#5stFjIl1!&-k0lD@ z)~OK1Vn|AJ3P2&Dk+FbWN&{vK_vb`Q;bH1t%A+MBCqYUWms{_DV@ThMmmh!R`MdY> zSIet?V|w4mZ7UAf-TTb+cYkcy|CifOPSR6WE-bxo_{_%^Et)cW8NYe;E7Pj3UO9N( zQ`^=}er~E>I&kNl^UeA%uhm|c_s&b}w%ss^e?4%*Jn6k*cTK&1!%d^-&cR@D;?-Oc zygJR`)FC#_Ri#ihcr*#15IZJTOk9}8nX@YW0RIWUwL{kz^vBgGF`^dFSuNW5k;8@F zN=^s&XG>L&+&62(7GBhN|HD#O9>L$)y+;qUF+D|}wv!(<>MTc{ABF2A$sy{rK^R`D zGZ5=?IwXsq;cxk@`yYPfzD8cO#kA)+y{rB^{_pV=-@w1*oF6ypY>>9eEoKjcRpKr+ z$pJYl&g8a4@*H=Ao3GEgFN<&V>T`cx^m6m!pOx{;8u&(iYQwS|eb?3eR(<)^d<6R1 z$Sx>;WjEGg6;wv(O972r&Z?$jh;QOW%odRwOHy&U=Ff&V`HZ)6i z7NOu%mO@p+0L7lwtVVSh^Ek=U@0#?v_95f&BlnkH{a3PlIIEMGR4P?rWHYD^>I5A$ z-5TS$&2lW&8J_ZzbZ;I1NMcn`lsVf5{h}X!WnqOKw2QEs5z<=zs9}VZmax*WjT8n_ z7DQVTAjr1~+VdG&kkEhx^7b36gJe>u0p?A^&e~JEx>!jYqOL)|Uk% zXmLY07;Ml>i#y(6cv!|@crGkoGuVFu&MvSvEkY*t?~MWbH`6k8xB|sQRsIaAIw_>&;3svQmCWEKg(HL1Fg~vjT;WjkJLXCmg@jJVfMsw5a zd~J2TJ;tYhq^#wgFAP>XuiqS#{Ix+3Fnkn}4e_vb3@tJ?0y2--8@NAL6AD%HDa{#m zHs~}H#W~|ad}b$Inu+)lK`mM=!&iBk8sTg*N7|i&X$4AnFNi(xZcC2Awb7+Pj)`N-EKDYI3vpq5=5rWDdfu?rGiaMobf)i&t)D+(-r{=)KISRED&)J|O zg_`V$M3cKvlNE>~655eYjc1mXsdksk4UMwAC|-&%H`9w?tLzYxvx1zKs_g&w2p!unzO!06iwN zMJ$*Yo(DlE&WN+k9$R8G=D}mdJfw(uh=a9}YG|;%U%4<#D6Y{3(Q4Eo6UgcJXw`Ly zX;H3%0^SrA?ZmmD0D2?W;w&KM7>7`-5{)^sIfL9D_oq1_x^k073F1;P4UmKDrag7j zq3^zU<&Jx<>>(X$-IBk#=6fEce|LWRtGy?c=Dzjp6Z>;=q({fJwxoP<^z#cCc8M)R zzx?0<@z9Iv4I4m90fi}I1z64o&2(XbBINMLD(Iqv7+sFw3kk#*ib=iqVX)oka3`F7 z2~JnD66J_BV;wNfp8^TbqTF^vlsjCRf#NtXmIadoAxZ+nV5J@?iXj?{=F1-8DQ}Ff z95m@y{h!XLp|4Iq{_Vft`BZP4KJMv>+xIj-GV!?vsgbAfYypiM>IwY#!@Jly~c?;WMUfN)!fgg%fZ&| zbER5S^_W2y?l)DFj=d1$&Z{fO?>gG?Z+NHv+v>j-t+H%;-07PTl);3 zzwGFMp-<17{8;tDZ8LWb8g}5W=l}j@aP@wkfd1L>hML@kzF&E~!#?QE8E<_#ard?f&rKTjOrEgr&7pnEIs53%NbKs?eWNK+;?OtiHaapn%49DAbF7p>K6# z9Y0|`)od4F1C%5Z!E!7(ULk!#v&$GqTMYOF=(f9|t+?AiHZ-Mg3@I*NmfPzhi^r2e6CS0#kZQdZ44jBH{PUY z1OAp+S=%|;19_JQTXrf7W)q!d0Dlp5mQ3umQ=#fSr8%5un-ZPA=-lQ^V}KkEp_srT z(>h~#98L^RMmESS)2YeHI48iy@fmS`!3`(bSK zHmp*TdB(u{Gs|4G%xzs9gC~GSX>%#6|FCdGP*lm6%mn&D?U5F zC~&1%R`~%etFC2QuQJ$FRul@07zad|ytN97ocs-zp%Tb%4A;}gwqe`9URk{%cEGih zmTl2LI`EDD_)EN!2S&ZT@~!vvC-hq+>x}uV&E*(2d!q^qhVh5K2is<`>B*4=Oa zONx9w!Jp(a9k|d>Qd(Q2F;Yyg8DlDmhGljFvSdAENeqhxeNGDLiw;OjfjXvv3&zEY z&&JVb0f2!EIxtaj#VW{CtXeO4A_)K!*dYKeEeTEpEy7Av8H-CaPmOazaRFtfxl|Jx z3!}zIctA+q@@J*{oQ}@C1k*w4W%>yWON{==#^?T`|8id6!J$j)BlLs3?>jHP|E~U_ zY0tj>OP-E5CqDhao2P5}V4h#Q>c0E#q&2w|JbfS5S}aigpodmkOvKqHSBwXErn6lK zpsvJ;uGpdc$J0PYU~vVR#ZK!-aT>~hHzC+9*`N<6(TYJTOP}WD@11(O^Hx>=r~WGM z!oB+*UjL!~w!TIB>@z;%h2eF>^{x6l`s@0R!rFiUv?Lm5Qx?YA3h&(&p;3l1Zj3U9 zo2yRIo(K$WghQABCNvH93DX>;@`Z;@v?M2h@nW6%3BHDp=F|1t^wq!pEUnWI>u>4* zHto^x(;wIG)mPL?Yj_V19>nSU@(=iaB)dBNb=U-Ajuq&7CWEw0q(TTlSfhrJc`8iT z2($bItuv$-OnXMRelWUq?P!BX(sv09hyZU8w#cP# zT1|qktn^J=d*?5G6XtU0gFsIq5iWi3gq+^mU)s<*jXt*FrdBwNLUV8GEadqD7K|5j z-(kj^-JW<-_T2Qnr10d2QLk9Ch6H5m1Z1lvgNzC43MvutL=mx0%>pcoX)*Dbi&)@W zZqT@$;ZcMW#+j;w?8W~=GEU&7PIJ1CE#1qn|K!Jmoe#dPf2Kdn`|>N^T&rIrCH+nR zRo|hnlRo^6k33LQSEE0ozpL-jo600dPJ=|(KbYZZ*E-6IE$_}*49`=x^*7k7- z!%TM3d4V(uJy?@%ghEm?O9^uHa|_zLO)9^m^=WC+;?@&K(0}VTsk(JjOS7!(YJCdb z=&)u?VNR@JgvFq9=)lAXF$O_dtPt4*ssU6e=#(h+#6(&P7j}+mugjc(cDvzwG;DH9 z6nql205OA{U~JUqhA?!CITM3KLeWi%d`y{Ybp|C<6w#u^rA2~Gf%oH4P>zJYWb_Ua zzyJvR=%PQ?>pZbVGMgpy!;|dR)=&DherC0zMHftF-~}V*EV^*OG+@yk7x#txs+>pr zV#1h#8WC!p1+8<4*2SQ8F%Hd)Rz*N1A+R`xT89}lJ2eS|tVWR0VYEz>p_qtK=Yi}J zA~>T>6Xmhyh;frzwpi_G%}>qS0n_S<`YZ(gp2mWo^9Kvt!tiAUc`%et-c++`h>o{k;ij0xAHi$@AZrN z*Fbbe@%8$2NcipgRKAhd=|}aa`3PRlujJS26k#Fwx`;7|fSnJ#2~=aCI+_cT(`u|s zE3tQ2_?Tegs*)zg3-kJJQy0Nl*KqM)9=1q`SVI z50?I$vAiEN7{y}QjUg@CBF81FaUy#LL- z)``;M)@9PkzdZirgP3L5j`Dfv8JTPh3;Joqi8nY1SP&>G*Mb&D6IutI1C7DfJ%~K z_L7O5DiKcNYuxgm=Jy9|dFaeDoWJ?b^I3a#Y&+ERt|y+^HBA5aXZkNW6R-NqUDr*o z?RHJm#_cC6Yld!GdTqmXJ$g2-9l!UKSpPQ2mmG|}g~2mR(5)e-fhhov5)dvRLlfAY zNkE1s2L)D9UMK4`L*2&=X!DSFl?EiG<8=`0T0;F!cwT}rG+t0+4fbaP zgAt}Du~Suckm;p?hYRI00wy8Y9~p#TA%^-+7c4!49h~(2sdvAbsDF&rs(&e2<=rin z@Bic56pEJN?U4XAhncE|@dvXXo@1^i ziv`C)1Ke<}xzH(iBFO{%O8Jka0zYF8HR(_^-cZel_Lm?3aSWB3R2yKmh(lU@-0vne z@zDNPmi#bOyzW7H+#!IYD38Ps-v04MDv!pRR$~sCRF^|_O`M^2)d$R8bP=X!6E+=$&0Zd@V}gN=`_OcjpFC8wEc2 z&A|6yXhQM9Dk}@(;icjre%#>>m0!AJ6;V=z-5W~Md4*e|I3z?M#U&

5FqS%E< zV2Xmvliopqu8`jLLZMt~5&=Pq&^Ee8kg7r2Mg-^Q^gcI3RbM|{@5#TPs}I))N*AO9 zt@lW?TL-i%(#}>a5`$LD@C_^JHkNi;l|f1o0)I7whuDaR08dpVFb!s06m@mdw>XyG zT)vaA;l;#4cHLD{+dGT zjyxd1{Gq{mdAhesu4y?T?{C>5&l+m7jTw63{1}W1>fWs%0I*2BqboDm222WqRD?NU z#H^THU>!nJGQrg){9pJSt!l%9*v)t8d-!1efce7c-;dlR>ivTsNDhz3W&J>ye}BS6 z$v?@^La|2SFN9CXXj8bGgpLZ76m89 zbNT4sfheJ`HBwil%w*t8L}d}MP2cUu-yW~e)n`jx<$GIZ%5g1c>D{&#{k&Y+HV|AP zjuFJg;8VjPd}@Z~Y(eK0xvFLNzADD~D&<4jYEH)-bz*2L`SGI2k0*?yW>YMSgx^cd zl0@^)F*|T#KnQsK1^D$niR%aSAM=9Q;Ve2Z)G_P@v_WF^kW=?7RV)FLY90%^XcQ?- zKmg)V@Kb13I3(nZxG0!LGBpm83u;0lxK^TJ-zz>uO*o+Y!QOW{2-6XQ%nc;J$r=?I zC$xqPK;l8>fha4}tVBDuGBwHx)euwMEweX;LbQ90oc<6hBVqx%mvc)rujdgLPuzC* z1KYBio@>$uC0MJTowqeOdGYMsZyfyk2v2`ZHJJxKvSmc|i2bj%=I@$(!}hfkXT7dX zwMH%!{oDh)e<*ypUhw%4iV;LqZmyO9F=L~CBHAHnOC^bAbwp{Pm=|!H6+? z_l#3yORwi{{p#C)e>`V@_lV@IXZHr1_05NNm_7Q!n!(rC*Xf_@=k$N+r^nQ6mmKF$ z{r(OA;Nwfj*V9pqn}qjXua?(ntr26+M8dN7@{;9GIjCP$5f!nbBUb zX9G5X)^xZ>Vlh!sId*_`OHY{m)`mFw&l)$5Te%G49U%&hK_ma8* z&n6l|I}|&{)(wORUV&2(eJ6k@vK;tUPC!BqF=+l;eNylFvwRT$F=F$Juf1M$1 z-M;?OgHjw2G$jfB>j^Vs~8Z8 zDg`tb{EMs@T7kw*2E}+p@BtZ`(Z$ePXg#={Q06>ty7Z8nQBYGPxxgc+U(lS2(>9{d@#d%otnFQR4Su-JeB?>K}a|~J&MNN>XH6&QVQDtNsJk>kR?@#L;JHd(K1@Q zm>a}5dN2Zr1rc)tOV@m<@6>4$OyNF5$!3~ajDHwbaY8W+p;>#zSxi#y0(}I3cfLL@ zX!f-HqMwxN^`h4GQr0$ovB59!O`d>n%D@T4H{0PnbeIB9F2Q+w#+g08pEKHNo`|)Z zL9rUtPR$8ZC&R4QyVM1tuI#(;_1{S*QeYf$r&lSQI1N<|#ZTv?$Q9 zoqt>rhI}nUTPR*GjCs)t6_Oq@Rz&PTCnK~2PzU*3;D)C#9Rw)g(?-k^xmrLW!WtrJ zLyiJCz$8P-68e{UK9@c}!`fgiuRA@b;kD-G*IsXKJ|d-a8yr;c1NJ(vpIptQr_Wrx zc;@rpeub>u1KvFpZ6n!#6ARjj0^kWU2tW)K#S5^)u*@gH0?#-R0Dw$tVg!UGd4=2* zDGrI4=nTqcarEiPT)Q@fk(_z{<8S}{-o=|O zvhvK~C->?*4hD6PIrkA2p!zxe7yZKnBL>&#^-4tB>EAx%pS^pICE5sVAdRKTY>Gx~xDfH=Vhogq zAXuTVh{iiZV}I`Bb92qE5%p&Cyo;yKH8eea^y!`Z)xDC3yLtZZhkifFx7>2uL7vQQ zU!OhAx&1$IBK!{zRnY z8xG+}&OIY+ma86|)_<70-=H-?rT41~#zx=dJl7mrDk3|apzUX_o-X5wys*fd7*m$T~~ej_UXc@RZ~Y+&FtRu`l;94a!=pdzBQHC zPwZWC{j@>%JxV+`q3xWs&@=%068u9#fu+$S=1)ct=}Cy+hn^JVBIJtVHG>kK3QgN% zfVbqH5=xVZ*z|}nEmE2Y(v_n{Bm+UKGK8kE(Cxrh+qFSbqk03QC*_GqLnz|F#uFYd z4)EUk;hNE-2Mip2?<%NK`RDcDt6PUJUf>uW|L|X=gVg?=(8DFAH+a^Nj#{_?($Gwm zfHVVU1~U%qUfnW>-_r)N~PUP7A0sj)wazJ&UbHK-lsR_8n;DyeFZu#Ne_s4MA zpEhN8x!c?`=}hg(fey2E;EwV7hYdf(WtzSDKi6YySARd_`)i~JTBrVFXdj*=&AfP6 z`e5+7!RuQQB8Ra?o{apOn7@vA7EK>{qb`GI8DN%yXO;5R`tsR`Ywa@~A%*wetnbvH zk_sh<-krbM`cvz>{A)dlXhio28i}W9BLrDP20&K09ja3Va#}mkOG2R$b;__@GzBhK zq8zsiltZ1Si1-{r!Fx%i6Tg|9Z0>RsVBdtE!>0}{8_?sbKxOai?CA0q{oDGboJn;T zoexjz?yYtdP53As?Ev;A*P^c-urI881)U{EM)=DAjD1PVTX#wyz)QNOxBOI1@0OYx zgJuzzF0BF1ltP(RlwqX7+XEjJ2}u!EM5YVnuACw-ENR%0#X(P!u(c3&ONKFm=rHFH zg_=7Fx)67YP)XGats7#Jcm|@uoQ^CQjb3P*B4z^YBhH%v*3qr}mTA0U^`e^ku_NcN zJMtIFFU6W!{i}h24n$u!p|7dbSK;cQw3}1_TcIvfU(+Z(0G-s5&{ubHP!@faQ_-~8psS>#0XzPB#%SUtBd<6S3BHPt?{N#8bptTbFXu0Qw41A^8Yr3S=$m4ok> zh)6Um!jasCgm$5w#M}*w*9wbQV_=V}8v(=^dcsdc5O@iclGr#>L=4M4hs>SEX^YFJ zO}K6J6;pc^%^Ec4;YDM+&XZ=1o{^N-qr75F*NTB<oo7wQ|K zqLlB3gocDfqS^#6tY|^9E((S4BFq|ila0a}RWl(5)I=90Ms*P0Le%AQq(@~-?;qb^ z6}{}=CUM4vFAQtmv$8(hJqD&G0+Py1E(-L^}Azp9PR*;+J)u%{)6Pjo0-fIQ_O=9Cyk z8bac-5P?aH2XTPNtwDwwrKTasRC7X&qtL%(65SSBG8xXjCaXQh9h=BWZ$fdDuuju3 z8=8lZi!A3}ZW3=;=?xpK0>ejAnqAVZG^aF6cPfQ2Q_l0)We7_=1T)si)}wQG8= zp7iJ=lUMZ=*Q;i1dT8qE!7r`2>!pLs?>fi_tevvy{>HUe-ZN^{Jy))6y#Im8#x;Lq z<)N2Xt$c;Z4}2GrMi~!&5zFQnUTMSkCI^}w&S-}DiU?5XH5OsB$14g<0nLK~3nmcO zc=RdYLK-DpS&M^F(KKIC6o_O7SQJHf(GJ|f+8{%n0?viT4(|Ntcr08dU&+ZW=c_X{@*Gh71x2ucZ`RdusZ}w>NiD4k=6z{fi@XB-wutp&cd%fA(4v8WB@+q967Jqx zXwh9ku3a5!8c9eI4FUqeSGqd1E3g>xv1}+gxhRP*)+*5LE7Am(73qjg&g@iBLJ^W` zu90&l7hpu-QBFnF@< zcVlUvz6FC;O}K7NcHxX`=Ps`po{>0mNcaA|aw}F%e0D;YX;mxMr^;!4DhKxNJiDUT z@WI7#GcoqVO>y#2(-HW@oa{;?n@qI_nk{zL6FI{U$QKM?=r-&|23Dk+3^#H#U>qZO zStJ@#f^rruWxC+Q(|i>bz4>BsGEFb&R9#(7f1oa~@oneK{lGh8pp}-eTSJyF@+b|T z8I0awC*tLPaGyYd-4DPrK>V}2z(7LY5=tS+1^MPW1c@TILn}oQ<(cladz55q*d+YeBSCn+CmXcqu-@w8Qe4+&x%;_OxW`-B~YB{3P-V;Ij{0^kx?2i3I=&$@EQI1^QwL#$UA+yfBv+r`nr1_-+14M*%PO{_?GmM_?5ox z&DZoDe?7r#j|TO3gY?7QykMWEzy17QfA4l({!2Ue2Xkxkzaf5BDW^;QOs`{&r?dI6 zN`wXkj^=?vhZB?og&3RRY>5M7ixbJXw0dH|+sM%pN9uqLsFs@IghR>Yq0Wn3TLw22 zo;l&nP*a^61JF)^b`tqGgoBA+2_{`={o3&5A^bZBkD(Y?=`-z!elO|wGZ8Kv79eI zg?REP5m6o|yDbPTr&AR#>80zv0=#>f zl--f5FFl!3^Jqd7{vxg}&b* zZ_!TMpzp}9wH=TND73a+pti=(QQ~Im&r~HBYm{^ z4bMY}-VLy6&9k@N_UyB_-SKqoEjLu(x?p7Od}ZsMPd<6)olovqe&cP6M%6989nHtS z6OD{h{;DH~!Bx|GgTqYOu%NLLX|OaG?TjOQ)L7L7krWzEF|^WzFmU+K9U=zEK^m1w zI226eK|+HOgokxa8H846lgSoIkQtV0NogpTIh;WlEkQ(={JePdsB5N8?>hg1MRzB5 zzfS)Te_0w_`Ok&-UUT(zRedHcX)GLZ!zjIlj4sYPOJ&khw9QYMb#cUT$jy}jjUFd5 z=4c=RN|{e-X`sRwlBJ1gYm87}W8k4AbP6F?AsEUAbsu>XYNSg|0T%5Hdc28HXQ{QZ z;V8WJWWjK|%^`UFC=y zuDR;k$^oMnOsbq3o4@0Zb?Cz%ef`MURsP`XH@ExxG0zx9fdAy{rxbBmffl}M(7MF6 zna?&TAHvUH}>%7)FS;8Dt9 z7$p*TEh&=GV6_P21WFW)ChrFg#-DH^k*t&h^K8$!)%O}`QSq_4<5mSs1ju&4i>?_} zT2@!7*NeHErMDJwRNN{wKaa>-2Y0+W4==S5*D|EycwZ{kQMT`+pxG2VCU;10n#+n|n|(m>ex zmz&zFvg+`tF@2v}v9MpFKHqjlx6w(v=Vq-MKOqv8V~&POgZX~w#1WLcN726`yd#wO zi`b41iNE+jmH{T4Ekn7huHK$_!sOcCvO)5XyDLuYY$UM(kiT0XeEo5T+tl6LA8*?A6tcXm%a$ymzDbzT#j-yvD@)ySDfjX$<1`Qwl9%Xj@mxqux_F9D z;Zt+dOiViIaoKj*T;Ogb z*^E>__k62lkiXiALqBR4C}$jwSCZ1#&QkpY+nZ&1(_4IdEkJIzbUS&=R+ z9m!f?gh+tIE)Z%q3}ul{Kn`TA6iykaU8dl^x zs_ZqA;xJzLPdRS6*_DkLAR5Q3+K%z6%aqSUM%(4ekFt~wNv{s(p`jAx7dPtho z8ql-8D z#|B)s{3!Mdr13G{r*SjtnZjID-Uc|FSBU!ajQaH}#QQH}k@f0OKCi92c>fH_vpbX@ z)t?vdV=q04Td01co+(rg`Y*)zQ!Wzu8xbod@?N80&(b{a}Gqpa2Y+FAO+EC<`jj%hQJF%w57KP|o{B%TOyyAi!#S*sBAv)gdM*fnxcg-9UzW5X+Bf4dI!@n3K!RL+S#8z|x(2&2p5(WsOTFUE4-GNWj4k zcQHLpaPDPRo5>XuD}vC0bBg^X9LRAK$Piq|$icDXlxDjfaY%|pJX%pXV zoi?!XWlEel_gMAd+5?Siq%W7hK{*p|FF#Hx6l;v!iG>ed`OpcNL`a`lu%PFXW4uv6 z_KaeisPAgoIz=Q>^n3>6DPqILd|eTmuQD;te=eWLe!6V=QMSHAIn9ev&y-L(239E( z^ zoMPM&CBrliz(79K7w20g&jpmj%4PB#c9C5iM|fSOuX z5zhIp=OY|(shJ{c*5U*~fHH_~63f&gXVBsS&WI&zfS!aBl6VT`8jylz%-Ez}og?*mvKYL;2j3s0G3?AI)?mO3SQ}#T2VEyVf zjTM7(@{0QA4;eT0s?E=2rB2N*nm*;aTZY`Qp!&-3J<7)R7&U(Nl8b#oA0md;oQ`?z zXV6F6JhA@&SZ-$X5D-Uv;m_qq|JtG4^hT&2GduQd$MPfXxV9J%iyf*=)<_{)C|8J? z%mF@>Bc_iq5u_oiAg)-4*h#^I&w`{J<&9BjPqF z{uSdtK+O9s9O)NS4!_0^f*uB<+{~`}i!on+E}usm(q88MqrY}2H_^Ns^-Q@a%G*AL z{2e9g2arwjUB6z`GZp3EcPO8ye?jGKMCm!FvbyaWlFSISJ#U9I7TX`G44v47?&zzo-k0CE61*{mn}bP>rgK0H|jY??#OWc zVtkGADfB+pXCrq2)7XToDBu@e8D;vIq2B|&z?N337pe2)fdhyE7g2O^v(?b(;cFn= zf^-$+JG86dmv+0rCJ?PB4ZYj=3rwy`e?#cm(tpN{>qc8&;H&f7K2ge)hCj-15q~Zs zx)5R9F2FIzVF3=o5*Fat=>ba{BHScL#aLZo5f0}Tt?x@he2*1@1g1aB@UVA>!oP$J zFZGZN$9{VudzGTVnr<00xM3y&!JeI0J#f^*hDs@|enaz-HKXrser=!;5Z17$bk+U8 zP)Jz)tR4#<`u*4~(&5@)TQ^o+JaZ7+9kdzoC}Mtr%g{P}(wG+!r_!N(-o(q7A0?Zud;&pU(nv3^8M8rF}8`Peu^L(<|QBq^RtMHF|e>PkjLG zL#BaIg@-eH1;gW$Z- zEfGRZh!E-gxE1&~LAPD*gjNvHl&FnAQUL4rc17Pt^ZO?z0;j$>|k zz?qf_4y}5`D{guv9~eLm&Rs$~N>E^CY@93o&$$4UtM=z$O;b2MK>GZFV`VdV`k_x- z&C+W@BS~QMC#5})K4gS(?%uP1SMw2hu(Wpj`bTyftM~3T$YlQIo8jMlBN7KzEW3TR z5!v~lZ_fPw>q9S{gi=KGCv;=dnGM}|O50z_mf^X`MVf_Nq$qfC33amu+966Kasf;e zeiI5$z{YEaeiDW#5w78c#E!fmO@^I|4NtJ8fo2x5EZAy?CfmsP2pDi_0qyBz;YqeBBZ`K1$*4#v=;a*h zm@+K0vX`&imw%;8`KWP8aYl09pzG$`l2ww}sXvfi;s^gP`!oLk_1h|m$-5=mQxf@a zhVX6QQ_}E_kfg1W(LVS_5T_+E%m3niOZfd1`7p;G0`LuEk5ZbmW@~8YOQcJ}Jhs63 ziy&T-=(L%X8C!#<_{Qb-N$npwS3WtD$KE(WKL(LQ;~TEa(q0$f5wVLVas?5SLHP$p zc3^m8s+5!pCv8V1A0ET~vpuwtCe~9w{dbPNIH5J3W;qvOhk_rYZi#X)$%l>X>JW8> z8VlwW_FJR9WWM1un#1s0gYJm3Li=8aJCPN>Xzva0no-}SZz}f3y3{Yv0v>&1z5YH4 z-%D+-}*h4fRcIU!~hDV_V zADNf>aMbhsiJsf_^EZUXMVckX<&)63aP}>B98Hq9V*MA;>ZcuM?bw6dIED71 zX@)B#8imFwyf118uh+NN4jOcA)xd#O(z%g0j;_9bjDZbpL%unv4j3>neqg{(eimmS z{_^``zTwy9uL-Og5rVW+Ds~n%GAt?Li9lZyF*QYW`Vaoz4vt>X4KQ!M|Bv;k5;hT! zrLJ76hf_TvNIZ;%cYwgrB*yh-Ocb`!#d=}sh+NT|<=oLNCyk6&n!^P6s; zzJ?oJb&x*vT7-uxd(iv&Ae5Vgs551s>30F6~;Yc0m9k1g|Hx zxHy<35!jf7-M)j8h$fT>Y%~|sPJEP@XDtjSiHPl_Sm-8sB$3i{FnO6}Ds!s-GHmLH zJ4AIw8c|)qBC|_M5!K}q(pYS!K$*DMoDYdyB1JEhp(hXCr6{}h<#6BWn)`<2+_`%9 zSDpEJT~ZW&Snr?uk9`}~T)XD#uk^EBBu7>Dkcm~;K%zLKQ}w`$KUOuw_ld3g@ZWt# zXCxp6(T@4ENne}dFuxYyu83q4Sa$@rqo?iXX^KKI0kr9-HQJ55gYZ_ZCWHoDcHaeB zszj^tm}7YIC{{2U{$f(vXrrPgo89FlQ;{Y!UF;AFmpS4F;VCPH%Ut%yIc<{dqiVi* z@h4{%S1Xn;2Y-TX#TzOsTNg{qaJ<{PO&Z-=$nQDP`h+z04ZVTpxKY}v_z}D0>1(urSc^m%7IrSK8&7=w(x|9s~ul`epAeq|6yrXY8?GLHGRWpy;(O~c3Wsm zDJ$m8_z!)suBB`UDD=(x3zpqRuR>4h^aJWYOc&Bl93Fh?9NR9v&z768*SNBtZ8y(l zvrNtGR(KhgOZkv>`K%l^VgsHv@_nqIbU&-(-@-S!pCzE|W*o2Mn1y3Bj$9n;a4f?y z9mhf(jr2Z_p>!QS={a$3x5o=1kd%@uP9S%wayl>cw1O9%wGY2j<{Y%*9lkkK*`;vWd-Y zp9h+Yjt9{h-D55~9yAwXu5m_Pdn|=)sbv%1BO2KPTVe}z{VhC6egX7@l@&fqx8nVe zag-Ye_AqCBF&5EetRc)v_)r+D!b(L*Ej*EQ9Km`4Eztp{(hso8w-~o=^jpaeny^DI zpVynIZp;;}r@@d(HkwzA4O2=$hd9ie!Dmuv)xv5t{-23j?vi39RUROZm+z7H$)}ZM zrI%8t+^K9+ellg6=77IkVcu@>Sgx?_vldw=TDMvESpRN47f}aZ+QYWZ_CsVrzpf{JDl%1zjHBH z7uOcI)jibR?1}eG^LFyi@$T}Tk1dKF9J?pBC2nxsu6TR=(0G_13DpU=Cw5P4NZgfp zI;nfo@T6Ty-zR;a+$s6)wLMGCI*@fN>u*_SvZd@r*(&iKb=ueI)lPry^l_)}I{nhQu5&}@Ih}9se0S#uJ8$p&RhODBNn2dHI9$8}e_@e=z@G{ulY@kUle`U_rr-f<5^E zbRjEr;Q#u(0J9G{C4Zn<0E+b0np3t>|ID*ZgYZD~<{?N4<`0jh5>tl%Z{sG>L z$?&&MMl|$fb_<)p#xoy|vA7?Lt8vf?X0nC&9=+9oQXhL7M=_!XyW+?XU3CSe`ml>* zBmSSnrlB4my9(E{@oV}^^-adr3~1HEP&NTqK12kK#rbA7w7vHEcv6pE)0=ZH^QN!E zyVZDiHhyi?>qC1AM4Q6(hilL8@S73n!({x%*ZvJ3B1FfEl1ZXfR42987>RoH-G{pd z-1~s|8||W&&q5r>WV|~YPp0A7)qnUk^|=5u7LwI%6Y;&v{r4jZY2IZ}fC=%O76^0f zZVBrHp;wsC7+6M5%(ol3nHSU%hq+9^-oQzi#}v$Q8or#4s2x9|D6&{K;`citR;UZ` zkvz;z0lexoPsKo=x*@KzJ3K>I;9nc-foPU1v42M|P+kQnurKDSAM!W{pcez7^9)8V z-%xf9cHJAsh9ghE3jH0yuE#EcHz3PqB&$V)L>(K2NVl8V7&aCe%1?j_m$R4HCiWe> z3sks0{>DyXR{p{M$yTu`n2D)u zI_6;p+lo1w1qvg|n2VX4hxz>;xs|tICU3>Rud;~kV~?{X`1kZ~2M&1-D_}qS07!tw zUc|q*_X+zDuHp!!9!DYsBMLDvG0>i!+=X;l5BI_Y+Jr3mz3f%i%${eju@&qY9?K50 zm)QXx2aP%b|0>Xr*yLmF*^N}#Kh&N9eU0|uEZT#!Xb;Za_VKpmDqqWnsMg^%8t3J$JO<#^Tmn6uup)dUDzS E2guaj@Bjb+ literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.woff b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Light-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..ff882b6acaa0fb595bb7658ec36d663394de3fba GIT binary patch literal 19396 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..95c6c619d305e4aec571cad1d0af35ce677d0236 GIT binary patch literal 34578 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 aEQu3y2~1#<>~m}~SW|k0tqYp4vHCyok7ken literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.svg new file mode 100755 index 00000000..1ac169c0 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.svg @@ -0,0 +1,252 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..3162ff8eb1ecc63453f2c88a43e57fbbee5d5c6c GIT binary patch literal 34368 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.woff b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-LightItalic-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..f6e97d5afd5fe6aaa8d357af39256b24ae6e5f88 GIT binary patch literal 22444 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 K{{n-nR8IimBgcmT literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Regular-webfont.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Regular-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..545b7c15e54a1399b315ebc761936289283eeb90 GIT binary patch literal 29934 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Regular-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Regular-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..a5b2378e5c2f3c0614d06c1d6696e8c6e31c84d3 GIT binary patch literal 29744 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 E8i2eEj{pDw literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..acc32c425dd91d5d9012d14c634bcc3e6f00724f GIT binary patch literal 30350 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 QB~JV{Yh%e!)sxNs4|ZBi%m4rY literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.svg new file mode 100755 index 00000000..ef8b7a2b --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.svg @@ -0,0 +1,251 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 2011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-Semibold-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..a5b9691c1f329bff2acd569b3c82da44d96bb1a2 GIT binary patch literal 30156 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 GO#cAXOHe%k literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.svg new file mode 100755 index 00000000..46cfd5c8 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.svg @@ -0,0 +1,251 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data copyright 20102011 Google Corporation +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..61d58bfa37b1f2b143527d72084130a59a5eb053 GIT binary patch literal 34644 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 AZU6uP literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.woff b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/OpenSans-SemiboldItalic-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..611b39028f17d21ffed411076b8457c66dda9199 GIT binary patch literal 22332 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 R9ggs_6Z}nA4DN|H{~v4SaiRbK literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.svg new file mode 100755 index 00000000..40683e9e --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.svg @@ -0,0 +1,124 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.ttf new file mode 100755 index 0000000000000000000000000000000000000000..787e513d733c42baf2705fe87025a26047db5194 GIT binary patch literal 34660 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.woff b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/fontwso2.woff new file mode 100755 index 0000000000000000000000000000000000000000..669b1a4235314daef57955ab5ab1b62639479f06 GIT binary patch literal 34736 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 Ng1_mC!9Dfj{{xCoWgP$j literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.eot b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.eot new file mode 100755 index 0000000000000000000000000000000000000000..4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed GIT binary patch literal 20335 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

!oRptb@n+ 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.svg b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.svg new file mode 100755 index 00000000..25691af8 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.ttf b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..67fa00bf83801d2fa568546b982c80d27f6ef74e GIT binary patch literal 41280 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

PBK;&Wcg|NX{>QR@W3{K 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 literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.woff b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/fonts/glyphicons-halflings-regular.woff new file mode 100755 index 0000000000000000000000000000000000000000..8c54182aa5d4d1ab3c9171976b615c1dcb1dc187 GIT binary patch literal 23320 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

v6>Q$# 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 b{V8Z#Oo&ic{PlhL07zb1`E9ABVZi?ZLT3ar literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/images/content-bg.png b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/images/content-bg.png new file mode 100755 index 0000000000000000000000000000000000000000..cf4e63e7334871b5fee2a55ad4aa2fdfd5a44403 GIT binary patch literal 11641 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 Q7%_0@fQ3o1F+S%10Ts`)CjbBd literal 0 HcmV?d00001 diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/bootstrap.min.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/bootstrap.min.js new file mode 100755 index 00000000..c8f82e59 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-mp.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/html5shiv.min.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/html5shiv.min.js new file mode 100755 index 00000000..8aff8f65 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/html5shiv.min.js @@ -0,0 +1,7 @@ +/** + * Created by Sharon on 5/14/2015. + */ +/** + * @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed + */ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/jquery-1.11.2.min.js b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/jquery-1.11.2.min.js new file mode 100755 index 00000000..18bdbed7 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/sensebot/units/theme/public/js/jquery-1.11.2.min.js @@ -0,0 +1,5 @@ +/*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.3",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c) +},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("