Ver código fonte

后台功能重写。

xian 5 anos atrás
pai
commit
1ed674213a
65 arquivos alterados com 37000 adições e 0 exclusões
  1. 1648 0
      watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/demo.html
  2. 328 0
      watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.css
  3. BIN
      watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.eot
  4. 11 0
      watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.min.css
  5. 1265 0
      watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.svg
  6. BIN
      watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.ttf
  7. BIN
      watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.woff
  8. 218 0
      watero-wechat-web/src/main/webapp/common/lib/drag/drag.js
  9. 29 0
      watero-wechat-web/src/main/webapp/common/lib/echarts/3.4.0/echarts.common.min.js
  10. 50 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/highcharts-3d.js
  11. 60 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/highcharts-more.js
  12. 383 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/highcharts.js
  13. 46 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/accessibility.js
  14. 1072 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/accessibility.src.js
  15. 14 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.js
  16. 408 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.src.js
  17. 22 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/boost.js
  18. 652 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/boost.src.js
  19. 14 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/broken-axis.js
  20. 338 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/broken-axis.src.js
  21. 26 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/data.js
  22. 981 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/data.src.js
  23. 25 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/drilldown.js
  24. 756 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/drilldown.src.js
  25. 26 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/exporting.js
  26. 953 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/exporting.src.js
  27. 12 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/funnel.js
  28. 290 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/funnel.src.js
  29. 24 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/gantt.js
  30. 791 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/gantt.src.js
  31. 19 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/grid-axis.js
  32. 545 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/grid-axis.src.js
  33. 25 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/heatmap.js
  34. 798 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/heatmap.src.js
  35. 12 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.js
  36. 150 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.src.js
  37. 18 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/offline-exporting.js
  38. 492 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/offline-exporting.src.js
  39. 10 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/overlapping-datalabels.js
  40. 164 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/overlapping-datalabels.src.js
  41. 19 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/series-label.js
  42. 606 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/series-label.src.js
  43. 14 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/solid-gauge.js
  44. 305 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/solid-gauge.src.js
  45. 29 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/treemap.js
  46. 881 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/treemap.src.js
  47. 15 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/xrange-series.js
  48. 254 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/xrange-series.src.js
  49. 317 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/dark-blue.js
  50. 314 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/dark-green.js
  51. 243 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/dark-unica.js
  52. 326 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/gray.js
  53. 99 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/grid-light.js
  54. 131 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/grid.js
  55. 129 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/sand-signika.js
  56. 112 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/skies.js
  57. BIN
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/license.pdf
  58. 15 0
      watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/readme.txt
  59. 12 0
      watero-wechat-web/src/main/webapp/common/lib/jquery.SuperSlide/2.1.1/jquery.SuperSlide.min.js
  60. 144 0
      watero-wechat-web/src/main/webapp/common/lib/jquery.contextmenu/jquery.contextmenu.r2.js
  61. 233 0
      watero-wechat-web/src/main/webapp/common/lib/jquery.ui/Popt.js
  62. 2 0
      watero-wechat-web/src/main/webapp/common/lib/jquery.ui/cityJson.js
  63. 136 0
      watero-wechat-web/src/main/webapp/common/lib/jquery.ui/citySet.js
  64. 1283 0
      watero-wechat-web/src/main/webapp/common/lib/jquery.ui/jquery-ui.css
  65. 18706 0
      watero-wechat-web/src/main/webapp/common/lib/jquery.ui/jquery-ui.js

Diferenças do arquivo suprimidas por serem muito extensas
+ 1648 - 0
watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/demo.html


+ 328 - 0
watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.css

@@ -0,0 +1,328 @@
+/* -----------H-ui前端框架-------------
+* iconfont.css v1.0.8
+* http://www.h-ui.net/
+* Created & Modified by guojunhui
+* Date modified 2016.06.21
+*
+* Copyright 2013-2015 北京颖杰联创科技有限公司 All rights reserved.
+* Licensed under MIT license.
+* http://opensource.org/licenses/MIT
+*
+*/
+@font-face {font-family: "Hui-iconfont";
+  src: url('iconfont.eot'); /* IE9*/
+  src: url('iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+  url('iconfont.woff') format('woff'), /* chrome、firefox */
+  url('iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
+  url('iconfont.svg#Hui-iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.Hui-iconfont {
+  font-family:"Hui-iconfont" !important;
+  font-style:normal;
+  -webkit-font-smoothing: antialiased;
+  -webkit-text-stroke-width: 0.2px;
+  -moz-osx-font-smoothing: grayscale;
+}
+.Hui-iconfont-gotop:before { content: "\e684"; }
+.Hui-iconfont-music:before { content: "\e60f"; }
+.Hui-iconfont-tags:before { content: "\e64b"; }
+.Hui-iconfont-jieri:before { content: "\e727"; }
+.Hui-iconfont-jishiqi:before { content: "\e728"; }
+.Hui-iconfont-pad:before { content: "\e64c"; }
+.Hui-iconfont-lunzi:before { content: "\e64d"; }
+.Hui-iconfont-jiandao:before { content: "\e64e"; }
+.Hui-iconfont-xianshiqi:before { content: "\e64f"; }
+.Hui-iconfont-zhaoxiangji:before { content: "\e650"; }
+.Hui-iconfont-danfanxiangji:before { content: "\e651"; }
+.Hui-iconfont-dayinji:before { content: "\e652"; }
+.Hui-iconfont-user-zhanzhang:before { content: "\e653"; }
+.Hui-iconfont-chajian:before { content: "\e654"; }
+.Hui-iconfont-arrow1-bottom:before { content: "\e674"; }
+.Hui-iconfont-arrow1-left:before { content: "\e678"; }
+.Hui-iconfont-arrow1-top:before { content: "\e679"; }
+.Hui-iconfont-arrow1-right:before { content: "\e67a"; }
+.Hui-iconfont-jieri1:before { content: "\e655"; }
+.Hui-iconfont-face-weixiao:before { content: "\e656"; }
+.Hui-iconfont-face-chijing:before { content: "\e657"; }
+.Hui-iconfont-face-dai:before { content: "\e658"; }
+.Hui-iconfont-face-shuaku:before { content: "\e659"; }
+.Hui-iconfont-face-mogui:before { content: "\e65a"; }
+.Hui-iconfont-face-ganga:before { content: "\e65b"; }
+.Hui-iconfont-face-qin:before { content: "\e65c"; }
+.Hui-iconfont-face-nu:before { content: "\e65d"; }
+.Hui-iconfont-face-zhayan:before { content: "\e65e"; }
+.Hui-iconfont-face-shengqi:before { content: "\e65f"; }
+.Hui-iconfont-face-ma:before { content: "\e660"; }
+.Hui-iconfont-face-bishi:before { content: "\e661"; }
+.Hui-iconfont-face-maimeng:before { content: "\e662"; }
+.Hui-iconfont-face-jingdai:before { content: "\e663"; }
+.Hui-iconfont-face-yun:before { content: "\e664"; }
+.Hui-iconfont-home2:before { content: "\e67f"; }
+.Hui-iconfont-search2:before { content: "\e665"; }
+.Hui-iconfont-share2:before { content: "\e666"; }
+.Hui-iconfont-face:before { content: "\e668"; }
+.Hui-iconfont-wuliu:before { content: "\e669"; }
+.Hui-iconfont-dianpu:before { content: "\e66a"; }
+.Hui-iconfont-chexiao:before { content: "\e66b"; }
+.Hui-iconfont-zhongzuo:before { content: "\e66c"; }
+.Hui-iconfont-zan:before { content: "\e66d"; }
+.Hui-iconfont-cai:before { content: "\e66e"; }
+.Hui-iconfont-yuyin3:before { content: "\e66f"; }
+.Hui-iconfont-cart2-selected:before { content: "\e670"; }
+.Hui-iconfont-weizhi:before { content: "\e671"; }
+.Hui-iconfont-face-ku:before { content: "\e688"; }
+.Hui-iconfont-down:before { content: "\e640"; }
+.Hui-iconfont-cart2-man:before { content: "\e672"; }
+.Hui-iconfont-card2-kong:before { content: "\e673"; }
+.Hui-iconfont-luyin:before { content: "\e619"; }
+.Hui-iconfont-html:before { content: "\e69f"; }
+.Hui-iconfont-css:before { content: "\e6a0"; }
+.Hui-iconfont-android:before { content: "\e6a2"; }
+.Hui-iconfont-github:before { content: "\e6d1"; }
+.Hui-iconfont-html5:before { content: "\e6d2"; }
+.Hui-iconfont-huangguan:before { content: "\e6d3"; }
+.Hui-iconfont-news:before { content: "\e616"; }
+.Hui-iconfont-slider-right:before { content: "\e63d"; }
+.Hui-iconfont-slider-left:before { content: "\e67d"; }
+.Hui-iconfont-tuku:before { content: "\e613"; }
+.Hui-iconfont-shuru:before { content: "\e647"; }
+.Hui-iconfont-sanjiao:before { content: "\e67e"; }
+.Hui-iconfont-share-renren:before { content: "\e6d8"; }
+.Hui-iconfont-share-tweibo:before { content: "\e6d9"; }
+.Hui-iconfont-arrow2-left:before { content: "\e6d4"; }
+.Hui-iconfont-paixu:before { content: "\e675"; }
+.Hui-iconfont-niming:before { content: "\e624"; }
+.Hui-iconfont-add:before { content: "\e600"; }
+.Hui-iconfont-root:before { content: "\e62d"; }
+.Hui-iconfont-xuanzhong:before { content: "\e676"; }
+.Hui-iconfont-weixuanzhong:before { content: "\e677"; }
+.Hui-iconfont-arrow2-bottom:before { content: "\e6d5"; }
+.Hui-iconfont-arrow2-top:before { content: "\e6d6"; }
+.Hui-iconfont-like2:before { content: "\e648"; }
+.Hui-iconfont-arrow2-right:before { content: "\e6d7"; }
+.Hui-iconfont-shangyishou:before { content: "\e6db"; }
+.Hui-iconfont-xiayishou:before { content: "\e6e3"; }
+.Hui-iconfont-share-weixin:before { content: "\e694"; }
+.Hui-iconfont-shenhe-tingyong:before { content: "\e631"; }
+.Hui-iconfont-gouxuan2:before { content: "\e601"; }
+.Hui-iconfont-selected:before { content: "\e617"; }
+.Hui-iconfont-jianhao:before { content: "\e6a1"; }
+.Hui-iconfont-user-group:before { content: "\e62b"; }
+.Hui-iconfont-yiguanzhu:before { content: "\e680"; }
+.Hui-iconfont-gengduo3:before { content: "\e6f9"; }
+.Hui-iconfont-comment:before { content: "\e622"; }
+.Hui-iconfont-tongji-zhu:before { content: "\e618"; }
+.Hui-iconfont-like:before { content: "\e649"; }
+.Hui-iconfont-shangjia:before { content: "\e6dc"; }
+.Hui-iconfont-save:before { content: "\e632"; }
+.Hui-iconfont-gongsi:before { content: "\e643"; }
+.Hui-iconfont-system:before { content: "\e62e"; }
+.Hui-iconfont-pifu:before { content: "\e62a"; }
+.Hui-iconfont-menu:before { content: "\e667"; }
+.Hui-iconfont-msg:before { content: "\e62f"; }
+.Hui-iconfont-huangguan1:before { content: "\e729"; }
+.Hui-iconfont-userid:before { content: "\e602"; }
+.Hui-iconfont-cang-selected:before { content: "\e630"; }
+.Hui-iconfont-yundown:before { content: "\e641"; }
+.Hui-iconfont-help:before { content: "\e633"; }
+.Hui-iconfont-chuku:before { content: "\e634"; }
+.Hui-iconfont-picture:before { content: "\e646"; }
+.Hui-iconfont-wenzhouyinxing:before { content: "\e6ed"; }
+.Hui-iconfont-ad:before { content: "\e635"; }
+.Hui-iconfont-fenlei:before { content: "\e681"; }
+.Hui-iconfont-saoyisao:before { content: "\e682"; }
+.Hui-iconfont-search:before { content: "\e683"; }
+.Hui-iconfont-tuwenxiangqing:before { content: "\e685"; }
+.Hui-iconfont-leijipingjia:before { content: "\e686"; }
+.Hui-iconfont-hetong:before { content: "\e636"; }
+.Hui-iconfont-tongji:before { content: "\e61a"; }
+.Hui-iconfont-quanbudingdan:before { content: "\e687"; }
+.Hui-iconfont-cang:before { content: "\e61b"; }
+.Hui-iconfont-xiaoxi:before { content: "\e68a"; }
+.Hui-iconfont-renwu:before { content: "\e637"; }
+.Hui-iconfont-more:before { content: "\e68b"; }
+.Hui-iconfont-zhizhao:before { content: "\e638"; }
+.Hui-iconfont-fabu:before { content: "\e603"; }
+.Hui-iconfont-shenhe-butongguo2:before { content: "\e6dd"; }
+.Hui-iconfont-share-qq:before { content: "\e67b"; }
+.Hui-iconfont-upload:before { content: "\e642"; }
+.Hui-iconfont-add2:before { content: "\e604"; }
+.Hui-iconfont-jiesuo:before { content: "\e605"; }
+.Hui-iconfont-zhongtumoshi:before { content: "\e68c"; }
+.Hui-iconfont-datumoshi:before { content: "\e68d"; }
+.Hui-iconfont-face2:before { content: "\e68e"; }
+.Hui-iconfont-huanyipi:before { content: "\e68f"; }
+.Hui-iconfont-shijian:before { content: "\e690"; }
+.Hui-iconfont-feedback:before { content: "\e691"; }
+.Hui-iconfont-feedback2:before { content: "\e692"; }
+.Hui-iconfont-share-pengyouquan:before { content: "\e693"; }
+.Hui-iconfont-zan2:before { content: "\e697"; }
+.Hui-iconfont-arrow3-bottom:before { content: "\e698"; }
+.Hui-iconfont-arrow3-top:before { content: "\e699"; }
+.Hui-iconfont-arrow3-right:before { content: "\e69a"; }
+.Hui-iconfont-arrow3-left:before { content: "\e69b"; }
+.Hui-iconfont-more2:before { content: "\e69c"; }
+.Hui-iconfont-cang2-selected:before { content: "\e69d"; }
+.Hui-iconfont-cang2:before { content: "\e69e"; }
+.Hui-iconfont-dangan:before { content: "\e639"; }
+.Hui-iconfont-money:before { content: "\e63a"; }
+.Hui-iconfont-share-weibo:before { content: "\e6da"; }
+.Hui-iconfont-email:before { content: "\e63b"; }
+.Hui-iconfont-tongji-xian:before { content: "\e61c"; }
+.Hui-iconfont-bank:before { content: "\e628"; }
+.Hui-iconfont-home:before { content: "\e625"; }
+.Hui-iconfont-user:before { content: "\e62c"; }
+.Hui-iconfont-log:before { content: "\e623"; }
+.Hui-iconfont-pages:before { content: "\e626"; }
+.Hui-iconfont-sim:before { content: "\e629"; }
+.Hui-iconfont-tingzhi:before { content: "\e6e4"; }
+.Hui-iconfont-dengdai:before { content: "\e606"; }
+.Hui-iconfont-user-add:before { content: "\e607"; }
+.Hui-iconfont-copy:before { content: "\e6ea"; }
+.Hui-iconfont-file:before { content: "\e63e"; }
+.Hui-iconfont-share-douban:before { content: "\e67c"; }
+.Hui-iconfont-share-zhihu:before { content: "\e689"; }
+.Hui-iconfont-daochu:before { content: "\e644"; }
+.Hui-iconfont-daoru:before { content: "\e645"; }
+.Hui-iconfont-weigouxuan2:before { content: "\e608"; }
+.Hui-iconfont-phone:before { content: "\e696"; }
+.Hui-iconfont-bold:before { content: "\e6e7"; }
+.Hui-iconfont-manage2:before { content: "\e63c"; }
+.Hui-iconfont-edit:before { content: "\e6df"; }
+.Hui-iconfont-del2:before { content: "\e609"; }
+.Hui-iconfont-duigou:before { content: "\e6e8"; }
+.Hui-iconfont-chongqi:before { content: "\e6f7"; }
+.Hui-iconfont-avatar:before { content: "\e60a"; }
+.Hui-iconfont-del:before { content: "\e60b"; }
+.Hui-iconfont-edit2:before { content: "\e60c"; }
+.Hui-iconfont-zanting:before { content: "\e6e5"; }
+.Hui-iconfont-apple:before { content: "\e64a"; }
+.Hui-iconfont-guangdayinxing:before { content: "\e6f0"; }
+.Hui-iconfont-minshengyinxing:before { content: "\e6f4"; }
+.Hui-iconfont-xiajia:before { content: "\e6de"; }
+.Hui-iconfont-manage:before { content: "\e61d"; }
+.Hui-iconfont-user2:before { content: "\e60d"; }
+.Hui-iconfont-code:before { content: "\e6ee"; }
+.Hui-iconfont-cut:before { content: "\e6ef"; }
+.Hui-iconfont-link:before { content: "\e6f1"; }
+.Hui-iconfont-new:before { content: "\e6f2"; }
+.Hui-iconfont-ordered-list:before { content: "\e6f3"; }
+.Hui-iconfont-unordered-list:before { content: "\e6f5"; }
+.Hui-iconfont-share-qzone:before { content: "\e6c8"; }
+.Hui-iconfont-suoding:before { content: "\e60e"; }
+.Hui-iconfont-tel2:before { content: "\e6a3"; }
+.Hui-iconfont-order:before { content: "\e627"; }
+.Hui-iconfont-shujutongji:before { content: "\e61e"; }
+.Hui-iconfont-del3:before { content: "\e6e2"; }
+.Hui-iconfont-add3:before { content: "\e610"; }
+.Hui-iconfont-add4:before { content: "\e61f"; }
+.Hui-iconfont-xiangpicha:before { content: "\e72a"; }
+.Hui-iconfont-key:before { content: "\e63f"; }
+.Hui-iconfont-yuyin2:before { content: "\e6a4"; }
+.Hui-iconfont-yuyin:before { content: "\e6a5"; }
+.Hui-iconfont-close:before { content: "\e6a6"; }
+.Hui-iconfont-xuanze:before { content: "\e6a7"; }
+.Hui-iconfont-xuanzhong1:before { content: "\e6a8"; }
+.Hui-iconfont-yiguanzhu1:before { content: "\e6a9"; }
+.Hui-iconfont-share:before { content: "\e6aa"; }
+.Hui-iconfont-zhuanfa:before { content: "\e6ab"; }
+.Hui-iconfont-tianqi-duoyun:before { content: "\e6ac"; }
+.Hui-iconfont-tianqi-mai:before { content: "\e6ad"; }
+.Hui-iconfont-tianqi-qing:before { content: "\e6ae"; }
+.Hui-iconfont-tianqi-wu:before { content: "\e6af"; }
+.Hui-iconfont-tianqi-xue:before { content: "\e6b0"; }
+.Hui-iconfont-tianqi-yin:before { content: "\e6b1"; }
+.Hui-iconfont-tianqi-yu:before { content: "\e6b2"; }
+.Hui-iconfont-daipingjia:before { content: "\e6b3"; }
+.Hui-iconfont-vip-card2:before { content: "\e6b4"; }
+.Hui-iconfont-jifen:before { content: "\e6b5"; }
+.Hui-iconfont-youhuiquan:before { content: "\e6b6"; }
+.Hui-iconfont-hongbao:before { content: "\e6b7"; }
+.Hui-iconfont-cart-selected:before { content: "\e6b8"; }
+.Hui-iconfont-cart-kong:before { content: "\e6b9"; }
+.Hui-iconfont-jiangjia:before { content: "\e6ba"; }
+.Hui-iconfont-liwu:before { content: "\e6bb"; }
+.Hui-iconfont-caiqie:before { content: "\e6bc"; }
+.Hui-iconfont-xuanzhuan:before { content: "\e6bd"; }
+.Hui-iconfont-bigpic:before { content: "\e6be"; }
+.Hui-iconfont-list:before { content: "\e6bf"; }
+.Hui-iconfont-middle:before { content: "\e6c0"; }
+.Hui-iconfont-hot:before { content: "\e6c1"; }
+.Hui-iconfont-paishe:before { content: "\e6c2"; }
+.Hui-iconfont-hot1:before { content: "\e6c3"; }
+.Hui-iconfont-new1:before { content: "\e6c4"; }
+.Hui-iconfont-xiaoxi1:before { content: "\e6c5"; }
+.Hui-iconfont-canshu:before { content: "\e6c6"; }
+.Hui-iconfont-tel:before { content: "\e6c7"; }
+.Hui-iconfont-dingwei:before { content: "\e6c9"; }
+.Hui-iconfont-hongbao2:before { content: "\e6ca"; }
+.Hui-iconfont-2code:before { content: "\e6cb"; }
+.Hui-iconfont-vip:before { content: "\e6cc"; }
+.Hui-iconfont-tishi:before { content: "\e6cd"; }
+.Hui-iconfont-dingyue:before { content: "\e6ce"; }
+.Hui-iconfont-italic:before { content: "\e6e9"; }
+.Hui-iconfont-yulan:before { content: "\e695"; }
+.Hui-iconfont-usergroup2:before { content: "\e611"; }
+.Hui-iconfont-goods:before { content: "\e620"; }
+.Hui-iconfont-paixingbang:before { content: "\e6cf"; }
+.Hui-iconfont-qingdaoyinxing:before { content: "\e6f6"; }
+.Hui-iconfont-kefu:before { content: "\e6d0"; }
+.Hui-iconfont-picture1:before { content: "\e612"; }
+.Hui-iconfont-weigouxuan:before { content: "\e614"; }
+.Hui-iconfont-fanqiang:before { content: "\e6fa"; }
+.Hui-iconfont-shenhe-weitongguo:before { content: "\e6e0"; }
+.Hui-iconfont-shenhe-tongguo:before { content: "\e6e1"; }
+.Hui-iconfont-tongji-bing:before { content: "\e621"; }
+.Hui-iconfont-gouxuan:before { content: "\e615"; }
+.Hui-iconfont-jiansheyinxing:before { content: "\e6f8"; }
+.Hui-iconfont-moban:before { content: "\e72b"; }
+.Hui-iconfont-pay-weixin:before { content: "\e719"; }
+.Hui-iconfont-pay-alipay-2:before { content: "\e71c"; }
+.Hui-iconfont-beijingyinxing:before { content: "\e6fb"; }
+.Hui-iconfont-guangdongfazhanyinxing:before { content: "\e703"; }
+.Hui-iconfont-zhaoshangyinxing:before { content: "\e704"; }
+.Hui-iconfont-zheshangyinxing:before { content: "\e712"; }
+.Hui-iconfont-zhongguonongyeyinxing:before { content: "\e713"; }
+.Hui-iconfont-cdbank:before { content: "\e714"; }
+.Hui-iconfont-gengduo2:before { content: "\e716"; }
+.Hui-iconfont-bofang:before { content: "\e6e6"; }
+.Hui-iconfont-gengduo4:before { content: "\e717"; }
+.Hui-iconfont-text-height:before { content: "\e6fc"; }
+.Hui-iconfont-text-width:before { content: "\e6fd"; }
+.Hui-iconfont-underline:before { content: "\e6fe"; }
+.Hui-iconfont-star:before { content: "\e6ff"; }
+.Hui-iconfont-star-half:before { content: "\e700"; }
+.Hui-iconfont-star-halfempty:before { content: "\e701"; }
+.Hui-iconfont-star-o:before { content: "\e702"; }
+.Hui-iconfont-font:before { content: "\e6ec"; }
+.Hui-iconfont-hangzhouyinxing:before { content: "\e718"; }
+.Hui-iconfont-jiaotongyinxing:before { content: "\e71a"; }
+.Hui-iconfont-gengduo:before { content: "\e715"; }
+.Hui-iconfont-avatar2:before { content: "\e705"; }
+.Hui-iconfont-close2:before { content: "\e706"; }
+.Hui-iconfont-about:before { content: "\e707"; }
+.Hui-iconfont-phone-android:before { content: "\e708"; }
+.Hui-iconfont-search1:before { content: "\e709"; }
+.Hui-iconfont-comment1:before { content: "\e70a"; }
+.Hui-iconfont-read:before { content: "\e70b"; }
+.Hui-iconfont-feedback1:before { content: "\e70c"; }
+.Hui-iconfont-practice:before { content: "\e70d"; }
+.Hui-iconfont-align-center:before { content: "\e70e"; }
+.Hui-iconfont-align-justify:before { content: "\e70f"; }
+.Hui-iconfont-align-left:before { content: "\e710"; }
+.Hui-iconfont-align-right:before { content: "\e711"; }
+.Hui-iconfont-paste:before { content: "\e6eb"; }
+.Hui-iconfont-pay-alipay-1:before { content: "\e71f"; }
+.Hui-iconfont-pufayinxing:before { content: "\e71b"; }
+.Hui-iconfont-gongshangyinxing:before { content: "\e71d"; }
+.Hui-iconfont-huaxiayinxing:before { content: "\e71e"; }
+.Hui-iconfont-youzhengyinxing:before { content: "\e721"; }
+.Hui-iconfont-zhongguoyinxing:before { content: "\e722"; }
+.Hui-iconfont-zhongxinyinxing:before { content: "\e723"; }
+.Hui-iconfont-shanghaiyinxing:before { content: "\e724"; }
+.Hui-iconfont-banzhu:before { content: "\e72c"; }
+.Hui-iconfont-yuedu:before { content: "\e720"; }
+.Hui-iconfont-yanjing:before { content: "\e725"; }
+.Hui-iconfont-power:before { content: "\e726"; }
+.Hui-iconfont-moban-2:before { content: "\e72d"; }

BIN
watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.eot


Diferenças do arquivo suprimidas por serem muito extensas
+ 11 - 0
watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.min.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 1265 - 0
watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.svg


BIN
watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.ttf


BIN
watero-wechat-web/src/main/webapp/common/lib/Hui-iconfont/1.0.8/iconfont.woff


+ 218 - 0
watero-wechat-web/src/main/webapp/common/lib/drag/drag.js

@@ -0,0 +1,218 @@
+// 队列数组
+var queueArr = [];
+// 可拖动对象数组
+var draggers = [];
+// 是否在被拖动
+var isDragging = false;
+// 鼠标是否在某个拖动上按下
+var isMouseDown = false;
+// 被拖动的对象
+var dragger = null;
+// 刚开始拖动时的鼠标横坐标
+var mouseX;
+// 刚开始拖动时的鼠标纵坐标
+var mouseY;
+// 刚开始拖动时的拖动对象横坐标
+var draggerLeft;
+// 刚开始拖动时的拖动对象纵坐标
+var draggerTop;
+// 当前拖动对象的一个克隆,跟着鼠标移到
+var clone = null;
+// 拖动到灵敏度
+var DRAG_THRESHOLD = 5;
+// 包含所有队列的容器
+var queueContainer;
+// 队列选中时的border
+var queueActive = {'border': '1px solid #e85032'};
+// 队列未选中时的border
+var queueUnActive = {'border': '1px solid #2db9c7'};
+
+var registerDrag = function(container){
+	queueContainer = container;
+	$.each(container.find('.queue'), function(index, value){
+		queueArr[index] = $(value);
+		draggers[index] = [];
+		elements = $(value).find('.dragger');
+		$.each(elements, function(_index, _value){
+			draggers[index][_index] = $(_value);
+		});
+	});
+	for(var i=0;i<draggers.length;i++)
+		for(var j=0;j<draggers[i].length;j++){
+			draggers[i][j].on('mousedown', dragStart);
+		}
+	$(document).on('mousemove', dragMove);
+	$(document).on('mouseup', dragEnd);
+}
+
+var dragStart = function(e){
+	e.stopPropagation();
+
+	isMouseDown = true;
+	mouseX = e.clientX;
+	mouseY = e.clientY;
+	dragger = $(this);
+}
+
+var dragMove = function(e){
+	e.stopPropagation();
+
+	if(!isMouseDown) return;
+
+	var dx = e.clientX - mouseX;
+	var dy = e.clientY - mouseY;
+	if(isDragging){
+		clone.css({left: draggerLeft + dx, top: draggerTop + dy});
+		arrangeDragger();
+	}else if(Math.abs(dx)>DRAG_THRESHOLD || Math.abs(dy)>DRAG_THRESHOLD){
+		clone = makeClone(dragger);
+		draggerLeft = dragger.offset().left - parseInt(dragger.css('margin-left')) - parseInt(dragger.css('padding-left'));
+		draggerTop = dragger.offset().top - parseInt(dragger.css('margin-top')) - parseInt(dragger.css('padding-top'));
+		clone.css({left: draggerLeft, top: draggerTop});
+		queueContainer.append(clone);
+		dragger.css('visibility', 'hidden');
+		isDragging = true;
+	}
+}
+
+var dragEnd = function(e){
+	e.stopPropagation();
+	if(isDragging){
+		isDragging = false;
+		clone.remove();
+		dragger.css('visibility', 'visible');
+	}
+	for(var i=0;i<queueArr.length;i++)
+		queueArr[i].css(queueUnActive);
+	isMouseDown = false;
+}
+
+var makeClone = function(source){
+	var res = source.clone();
+	res.css({position: 'absolute', 'z-index': 100000});
+	return res;
+}
+
+var arrangeDragger = function(){
+	for(var i=0;i<queueArr.length;i++)
+		queueArr[i].css(queueUnActive);
+	var queueIn = findQueue();
+	if(queueIn != -1)
+		queueArr[queueIn].css(queueActive);
+	var hover = findHover(queueIn);
+	if(hover == null)
+		return;
+	var _hover = hover.hover;
+	var _insert = hover.insert;
+	var queueIdOriginal, drggerIdOriginal;
+	var queueIdHover, drggerIdHover;
+	for(var i=0;i<draggers.length;i++)
+		for(var j=0;j<draggers[i].length;j++){
+			if(draggers[i][j][0] == dragger[0]){
+				queueIdOriginal = i;
+				drggerIdOriginal = j;
+			}
+		}
+	draggers[queueIdOriginal].splice(drggerIdOriginal, 1);
+	if(_hover){
+		for(var i=0;i<draggers.length;i++)
+			for(var j=0;j<draggers[i].length;j++){
+				if(_hover && draggers[i][j][0] == _hover[0]){
+					queueIdHover = i;
+					drggerIdHover = j;
+				}
+			}
+		if(_insert == 'left'){
+			_hover.before(dragger);
+			draggers[queueIdHover].splice(drggerIdHover, 0, dragger);
+		}
+		else{
+			_hover.after(dragger);
+			draggers[queueIdHover].splice(drggerIdHover + 1, 0, dragger);
+		}
+	}else{
+		draggers[queueIn].push(dragger);
+		queueArr[queueIn].append(dragger);
+	}
+	console.log('******************');
+	for(var i=0;i<draggers.length;i++)
+		for(var j=0;j<draggers[i].length;j++)
+			console.log(draggers[i][j][0]);
+	console.log('******************');
+}
+
+var findQueue = function(){
+	var mx=-1,pos=-1;
+	var cloneTop = clone.offset().top;
+	var cloneHeight = clone.height();
+	for(var i=0;i<queueArr.length;i++){
+		var queueTop = queueArr[i].offset().top;
+		var queueHeight = queueArr[i].height();
+		var val = Math.min(queueTop + queueHeight, cloneTop + cloneHeight) - Math.max(queueTop, cloneTop);
+		if(val > mx){
+			mx = val;
+			pos = i;
+		}
+	}
+	return pos;
+}
+
+var findHover = function(queueIn){
+	if(queueIn == -1)
+		return null;
+	var mx=-1,pos=null;
+	var cloneTop = clone.offset().top;
+	var cloneHeight = clone.height();
+	var cloneLeft = clone.offset().left;
+	var cloneWidth = clone.width();
+	var isOwn = false;
+	for(var i=0;i<draggers[queueIn].length;i++){
+
+		var _draggerTop = draggers[queueIn][i].offset().top;
+		var _draggerHeight = draggers[queueIn][i].height();
+		var vertical = Math.min(_draggerTop + _draggerHeight, cloneTop + cloneHeight) - Math.max(_draggerTop, cloneTop);
+
+		var _draggerLeft = draggers[queueIn][i].offset().left;
+		var _draggerWidth = draggers[queueIn][i].width();
+		var horizontal = Math.min(_draggerLeft + _draggerWidth, cloneLeft + cloneWidth) - Math.max(_draggerLeft, cloneLeft);
+
+		if(vertical <= 0 || horizontal <=0) continue;
+		var s = vertical * horizontal;
+		if(s <= cloneHeight * cloneWidth /3)
+			continue;
+		if(draggers[queueIn][i][0] == dragger[0]){
+			isOwn = true;
+			continue;
+		}
+		if(s > mx){
+			mx = s;
+			pos = draggers[queueIn][i];
+		}
+	}
+	if(mx < 0){
+		if(isOwn) return null;
+		if(draggers[queueIn].length == 0){
+			return {'hover': null};
+		}else{
+			var last,index=draggers[queueIn].length - 1;
+			while(index>=0 && draggers[queueIn][index][0] == dragger[0])
+				index--;
+			if(index >= 0)
+				last = draggers[queueIn][index];
+			else
+				return {'hover': null};
+			if(cloneLeft >= last.offset().left + last.width())
+				return {'hover': last, 'insert': 'right'};
+			else
+				return null;
+		}
+	}
+	else{
+		var posMid = (2* pos.offset().left + pos.width())/2;
+		var cloneMid = (2* clone.offset().left + clone.width())/2;
+		if(posMid > cloneMid)
+			return {'hover': pos, 'insert': 'left'};
+		else
+			return {'hover': pos, 'insert': 'right'};
+	}
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 29 - 0
watero-wechat-web/src/main/webapp/common/lib/echarts/3.4.0/echarts.common.min.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 50 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/highcharts-3d.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 60 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/highcharts-more.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 383 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/highcharts.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 46 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/accessibility.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 1072 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/accessibility.src.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 14 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.js


+ 408 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.src.js

@@ -0,0 +1,408 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2009-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+
+        var defined = H.defined,
+            isNumber = H.isNumber,
+            inArray = H.inArray,
+            isArray = H.isArray,
+            merge = H.merge,
+            Chart = H.Chart,
+            extend = H.extend,
+            each = H.each;
+
+        var ALIGN_FACTOR,
+            ALLOWED_SHAPES;
+
+        ALLOWED_SHAPES = ['path', 'rect', 'circle'];
+
+        ALIGN_FACTOR = {
+            top: 0,
+            left: 0,
+            center: 0.5,
+            middle: 0.5,
+            bottom: 1,
+            right: 1
+        };
+
+        function defaultOptions(shapeType) {
+            var shapeOptions,
+                options;
+
+            options = {
+                xAxis: 0,
+                yAxis: 0,
+                title: {
+                    style: {},
+                    text: '',
+                    x: 0,
+                    y: 0
+                },
+                shape: {
+                    params: {
+                        stroke: '#000000',
+                        fill: 'transparent',
+                        strokeWidth: 2
+                    }
+                }
+            };
+
+            shapeOptions = {
+                circle: {
+                    params: {
+                        x: 0,
+                        y: 0
+                    }
+                }
+            };
+
+            if (shapeOptions[shapeType]) {
+                options.shape = merge(options.shape, shapeOptions[shapeType]);
+            }
+
+            return options;
+        }
+
+        function translatePath(d, xAxis, yAxis, xOffset, yOffset) {
+            var len = d.length,
+                i = 0;
+
+            while (i < len) {
+                if (isNumber(d[i]) && isNumber(d[i + 1])) {
+                    d[i] = xAxis.toPixels(d[i]) - xOffset;
+                    d[i + 1] = yAxis.toPixels(d[i + 1]) - yOffset;
+                    i += 2;
+                } else {
+                    i += 1;
+                }
+            }
+
+            return d;
+        }
+
+
+        // Define annotation prototype
+        var Annotation = function() {
+            this.init.apply(this, arguments);
+        };
+        Annotation.prototype = {
+            /* 
+             * Initialize the annotation
+             */
+            init: function(chart, options) {
+                var shapeType = options.shape && options.shape.type;
+
+                this.chart = chart;
+                this.options = merge({}, defaultOptions(shapeType), options);
+            },
+
+            /*
+             * Render the annotation
+             */
+            render: function(redraw) {
+                var annotation = this,
+                    chart = this.chart,
+                    renderer = annotation.chart.renderer,
+                    group = annotation.group,
+                    title = annotation.title,
+                    shape = annotation.shape,
+                    options = annotation.options,
+                    titleOptions = options.title,
+                    shapeOptions = options.shape;
+
+                if (!group) {
+                    group = annotation.group = renderer.g();
+                }
+
+
+                if (!shape && shapeOptions && inArray(shapeOptions.type, ALLOWED_SHAPES) !== -1) {
+                    shape = annotation.shape = renderer[options.shape.type](shapeOptions.params);
+                    shape.add(group);
+                }
+
+                if (!title && titleOptions) {
+                    title = annotation.title = renderer.label(titleOptions);
+                    title.add(group);
+                }
+
+                group.add(chart.annotations.group);
+
+                // link annotations to point or series
+                annotation.linkObjects();
+
+                if (redraw !== false) {
+                    annotation.redraw();
+                }
+            },
+
+            /*
+             * Redraw the annotation title or shape after options update
+             */
+            redraw: function() {
+                var options = this.options,
+                    chart = this.chart,
+                    group = this.group,
+                    title = this.title,
+                    shape = this.shape,
+                    linkedTo = this.linkedObject,
+                    xAxis = chart.xAxis[options.xAxis],
+                    yAxis = chart.yAxis[options.yAxis],
+                    width = options.width,
+                    height = options.height,
+                    anchorY = ALIGN_FACTOR[options.anchorY],
+                    anchorX = ALIGN_FACTOR[options.anchorX],
+                    shapeParams,
+                    linkType,
+                    series,
+                    param,
+                    bbox,
+                    x,
+                    y;
+
+                if (linkedTo) {
+                    linkType = (linkedTo instanceof H.Point) ? 'point' :
+                        (linkedTo instanceof H.Series) ? 'series' : null;
+
+                    if (linkType === 'point') {
+                        options.xValue = linkedTo.x;
+                        options.yValue = linkedTo.y;
+                        series = linkedTo.series;
+                    } else if (linkType === 'series') {
+                        series = linkedTo;
+                    }
+
+                    if (group.visibility !== series.group.visibility) {
+                        group.attr({
+                            visibility: series.group.visibility
+                        });
+                    }
+                }
+
+
+                // Based on given options find annotation pixel position
+                x = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) - xAxis.minPixelPadding : options.x);
+                y = defined(options.yValue) ? yAxis.toPixels(options.yValue) : options.y;
+
+                if (!isNumber(x) || !isNumber(y)) {
+                    return;
+                }
+
+
+                if (title) {
+                    title.attr(options.title);
+                    title.css(options.title.style);
+                }
+
+                if (shape) {
+                    shapeParams = extend({}, options.shape.params);
+
+                    if (options.units === 'values') {
+                        for (param in shapeParams) {
+                            if (inArray(param, ['width', 'x']) > -1) {
+                                shapeParams[param] = xAxis.translate(shapeParams[param]);
+                            } else if (inArray(param, ['height', 'y']) > -1) {
+                                shapeParams[param] = yAxis.translate(shapeParams[param]);
+                            }
+                        }
+
+                        if (shapeParams.width) {
+                            shapeParams.width -= xAxis.toPixels(0) - xAxis.left;
+                        }
+
+                        if (shapeParams.x) {
+                            shapeParams.x += xAxis.minPixelPadding;
+                        }
+
+                        if (options.shape.type === 'path') {
+                            translatePath(shapeParams.d, xAxis, yAxis, x, y);
+                        }
+                    }
+
+                    // move the center of the circle to shape x/y
+                    if (options.shape.type === 'circle') {
+                        shapeParams.x += shapeParams.r;
+                        shapeParams.y += shapeParams.r;
+                    }
+
+                    shape.attr(shapeParams);
+                }
+
+                group.bBox = null;
+
+                // If annotation width or height is not defined in options use bounding box size
+                if (!isNumber(width)) {
+                    bbox = group.getBBox();
+                    width = bbox.width;
+                }
+
+                if (!isNumber(height)) {
+                    // get bbox only if it wasn't set before
+                    if (!bbox) {
+                        bbox = group.getBBox();
+                    }
+
+                    height = bbox.height;
+                }
+
+                // Calculate anchor point
+                if (!isNumber(anchorX)) {
+                    anchorX = ALIGN_FACTOR.center;
+                }
+
+                if (!isNumber(anchorY)) {
+                    anchorY = ALIGN_FACTOR.center;
+                }
+
+                // Translate group according to its dimension and anchor point
+                x = x - width * anchorX;
+                y = y - height * anchorY;
+
+                if (defined(group.translateX) && defined(group.translateY)) {
+                    group.animate({
+                        translateX: x,
+                        translateY: y
+                    });
+                } else {
+                    group.translate(x, y);
+                }
+            },
+
+            /*
+             * Destroy the annotation
+             */
+            destroy: function() {
+                var annotation = this,
+                    chart = this.chart,
+                    allItems = chart.annotations.allItems,
+                    index = allItems.indexOf(annotation);
+
+                if (index > -1) {
+                    allItems.splice(index, 1);
+                }
+
+                each(['title', 'shape', 'group'], function(element) {
+                    if (annotation[element]) {
+                        annotation[element].destroy();
+                        annotation[element] = null;
+                    }
+                });
+
+                annotation.group = annotation.title = annotation.shape = annotation.chart = annotation.options = null;
+            },
+
+            /*
+             * Update the annotation with a given options
+             */
+            update: function(options, redraw) {
+                extend(this.options, options);
+
+                // update link to point or series
+                this.linkObjects();
+
+                this.render(redraw);
+            },
+
+            linkObjects: function() {
+                var annotation = this,
+                    chart = annotation.chart,
+                    linkedTo = annotation.linkedObject,
+                    linkedId = linkedTo && (linkedTo.id || linkedTo.options.id),
+                    options = annotation.options,
+                    id = options.linkedTo;
+
+                if (!defined(id)) {
+                    annotation.linkedObject = null;
+                } else if (!defined(linkedTo) || id !== linkedId) {
+                    annotation.linkedObject = chart.get(id);
+                }
+            }
+        };
+
+
+        // Add annotations methods to chart prototype
+        extend(Chart.prototype, {
+            annotations: {
+                /*
+                 * Unified method for adding annotations to the chart
+                 */
+                add: function(options, redraw) {
+                    var annotations = this.allItems,
+                        chart = this.chart,
+                        item,
+                        len;
+
+                    if (!isArray(options)) {
+                        options = [options];
+                    }
+
+                    len = options.length;
+
+                    while (len--) {
+                        item = new Annotation(chart, options[len]);
+                        annotations.push(item);
+                        item.render(redraw);
+                    }
+                },
+
+                /**
+                 * Redraw all annotations, method used in chart events
+                 */
+                redraw: function() {
+                    each(this.allItems, function(annotation) {
+                        annotation.redraw();
+                    });
+                }
+            }
+        });
+
+
+        // Initialize on chart load
+        Chart.prototype.callbacks.push(function(chart) {
+            var options = chart.options.annotations,
+                group;
+
+            group = chart.renderer.g('annotations');
+            group.attr({
+                zIndex: 7
+            });
+            group.add();
+
+            // initialize empty array for annotations
+            chart.annotations.allItems = [];
+
+            // link chart object to annotations
+            chart.annotations.chart = chart;
+
+            // link annotations group element to the chart
+            chart.annotations.group = group;
+
+            if (isArray(options) && options.length > 0) {
+                chart.annotations.add(chart.options.annotations);
+            }
+
+            // update annotations after chart redraw
+            H.addEvent(chart, 'redraw', function() {
+                chart.annotations.redraw();
+            });
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 22 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/boost.js


+ 652 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/boost.src.js

@@ -0,0 +1,652 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * Boost module
+ *
+ * (c) 2010-2016 Highsoft AS
+ * Author: Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * License: www.highcharts.com/license
+         * Author: Torstein Honsi
+         * 
+         * This is an experimental Highcharts module that draws long data series on a canvas
+         * in order to increase performance of the initial load time and tooltip responsiveness.
+         *
+         * Compatible with HTML5 canvas compatible browsers (not IE < 9).
+         *
+         *
+         * 
+         * Development plan
+         * - Column range.
+         * - Heatmap. Modify the heatmap-canvas demo so that it uses this module.
+         * - Treemap.
+         * - Check how it works with Highstock and data grouping. Currently it only works when navigator.adaptToUpdatedData
+         *   is false. It is also recommended to set scrollbar.liveRedraw to false.
+         * - Check inverted charts.
+         * - Check reversed axes.
+         * - Chart callback should be async after last series is drawn. (But not necessarily, we don't do
+        	 that with initial series animation).
+         * - Cache full-size image so we don't have to redraw on hide/show and zoom up. But k-d-tree still
+         *   needs to be built.
+         * - Test IE9 and IE10.
+         * - Stacking is not perhaps not correct since it doesn't use the translation given in 
+         *   the translate method. If this gets to complicated, a possible way out would be to 
+         *   have a simplified renderCanvas method that simply draws the areaPath on a canvas.
+         *
+         * If this module is taken in as part of the core
+         * - All the loading logic should be merged with core. Update styles in the core.
+         * - Most of the method wraps should probably be added directly in parent methods.
+         *
+         * Notes for boost mode
+         * - Area lines are not drawn
+         * - Point markers are not drawn on line-type series
+         * - Lines are not drawn on scatter charts
+         * - Zones and negativeColor don't work
+         * - Initial point colors aren't rendered
+         * - Columns are always one pixel wide. Don't set the threshold too low.
+         *
+         * Optimizing tips for users
+         * - For scatter plots, use a marker.radius of 1 or less. It results in a rectangle being drawn, which is 
+         *   considerably faster than a circle.
+         * - Set extremes (min, max) explicitly on the axes in order for Highcharts to avoid computing extremes.
+         * - Set enableMouseTracking to false on the series to improve total rendering time.
+         * - The default threshold is set based on one series. If you have multiple, dense series, the combined
+         *   number of points drawn gets higher, and you may want to set the threshold lower in order to 
+         *   use optimizations.
+         */
+
+        'use strict';
+
+        var win = H.win,
+            doc = win.document,
+            noop = function() {},
+            Color = H.Color,
+            Series = H.Series,
+            seriesTypes = H.seriesTypes,
+            each = H.each,
+            extend = H.extend,
+            addEvent = H.addEvent,
+            fireEvent = H.fireEvent,
+            grep = H.grep,
+            isNumber = H.isNumber,
+            merge = H.merge,
+            pick = H.pick,
+            wrap = H.wrap,
+            plotOptions = H.getOptions().plotOptions,
+            CHUNK_SIZE = 50000,
+            destroyLoadingDiv;
+
+        function eachAsync(arr, fn, finalFunc, chunkSize, i) {
+            i = i || 0;
+            chunkSize = chunkSize || CHUNK_SIZE;
+
+            var threshold = i + chunkSize,
+                proceed = true;
+
+            while (proceed && i < threshold && i < arr.length) {
+                proceed = fn(arr[i], i);
+                i = i + 1;
+            }
+            if (proceed) {
+                if (i < arr.length) {
+                    setTimeout(function() {
+                        eachAsync(arr, fn, finalFunc, chunkSize, i);
+                    });
+                } else if (finalFunc) {
+                    finalFunc();
+                }
+            }
+        }
+
+        // Set default options
+        each(
+            ['area', 'arearange', 'bubble', 'column', 'line', 'scatter'],
+            function(type) {
+                if (plotOptions[type]) {
+                    plotOptions[type].boostThreshold = 5000;
+                }
+            }
+        );
+
+        /**
+         * Override a bunch of methods the same way. If the number of points is below the threshold,
+         * run the original method. If not, check for a canvas version or do nothing.
+         */
+        each(['translate', 'generatePoints', 'drawTracker', 'drawPoints', 'render'], function(method) {
+            function branch(proceed) {
+                var letItPass = this.options.stacking && (method === 'translate' || method === 'generatePoints');
+                if ((this.processedXData || this.options.data).length < (this.options.boostThreshold || Number.MAX_VALUE) ||
+                    letItPass) {
+
+                    // Clear image
+                    if (method === 'render' && this.image) {
+                        this.image.attr({
+                            href: ''
+                        });
+                        this.animate = null; // We're zooming in, don't run animation
+                    }
+
+                    proceed.call(this);
+
+                    // If a canvas version of the method exists, like renderCanvas(), run
+                } else if (this[method + 'Canvas']) {
+
+                    this[method + 'Canvas']();
+                }
+            }
+            wrap(Series.prototype, method, branch);
+
+            // A special case for some types - its translate method is already wrapped
+            if (method === 'translate') {
+                each(['arearange', 'bubble', 'column'], function(type) {
+                    if (seriesTypes[type]) {
+                        wrap(seriesTypes[type].prototype, method, branch);
+                    }
+                });
+            }
+        });
+
+        /**
+         * Do not compute extremes when min and max are set.
+         * If we use this in the core, we can add the hook to hasExtremes to the methods directly.
+         */
+        wrap(Series.prototype, 'getExtremes', function(proceed) {
+            if (!this.hasExtremes()) {
+                proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+            }
+        });
+        wrap(Series.prototype, 'setData', function(proceed) {
+            if (!this.hasExtremes(true)) {
+                proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+            }
+        });
+        wrap(Series.prototype, 'processData', function(proceed) {
+            if (!this.hasExtremes(true)) {
+                proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+            }
+        });
+
+
+        H.extend(Series.prototype, {
+            pointRange: 0,
+            allowDG: false, // No data grouping, let boost handle large data 
+            hasExtremes: function(checkX) {
+                var options = this.options,
+                    data = options.data,
+                    xAxis = this.xAxis && this.xAxis.options,
+                    yAxis = this.yAxis && this.yAxis.options;
+                return data.length > (options.boostThreshold || Number.MAX_VALUE) && isNumber(yAxis.min) && isNumber(yAxis.max) &&
+                    (!checkX || (isNumber(xAxis.min) && isNumber(xAxis.max)));
+            },
+
+            /**
+             * If implemented in the core, parts of this can probably be shared with other similar
+             * methods in Highcharts.
+             */
+            destroyGraphics: function() {
+                var series = this,
+                    points = this.points,
+                    point,
+                    i;
+
+                if (points) {
+                    for (i = 0; i < points.length; i = i + 1) {
+                        point = points[i];
+                        if (point && point.graphic) {
+                            point.graphic = point.graphic.destroy();
+                        }
+                    }
+                }
+
+                each(['graph', 'area', 'tracker'], function(prop) {
+                    if (series[prop]) {
+                        series[prop] = series[prop].destroy();
+                    }
+                });
+            },
+
+            /**
+             * Create a hidden canvas to draw the graph on. The contents is later copied over 
+             * to an SVG image element.
+             */
+            getContext: function() {
+                var chart = this.chart,
+                    width = chart.plotWidth,
+                    height = chart.plotHeight,
+                    ctx = this.ctx,
+                    swapXY = function(proceed, x, y, a, b, c, d) {
+                        proceed.call(this, y, x, a, b, c, d);
+                    };
+
+                if (!this.canvas) {
+                    this.canvas = doc.createElement('canvas');
+                    this.image = chart.renderer.image('', 0, 0, width, height).add(this.group);
+                    this.ctx = ctx = this.canvas.getContext('2d');
+                    if (chart.inverted) {
+                        each(['moveTo', 'lineTo', 'rect', 'arc'], function(fn) {
+                            wrap(ctx, fn, swapXY);
+                        });
+                    }
+                } else {
+                    ctx.clearRect(0, 0, width, height);
+                }
+
+                this.canvas.width = width;
+                this.canvas.height = height;
+                this.image.attr({
+                    width: width,
+                    height: height
+                });
+
+                return ctx;
+            },
+
+            /** 
+             * Draw the canvas image inside an SVG image
+             */
+            canvasToSVG: function() {
+                this.image.attr({
+                    href: this.canvas.toDataURL('image/png')
+                });
+            },
+
+            cvsLineTo: function(ctx, clientX, plotY) {
+                ctx.lineTo(clientX, plotY);
+            },
+
+            renderCanvas: function() {
+                var series = this,
+                    options = series.options,
+                    chart = series.chart,
+                    xAxis = this.xAxis,
+                    yAxis = this.yAxis,
+                    ctx,
+                    c = 0,
+                    xData = series.processedXData,
+                    yData = series.processedYData,
+                    rawData = options.data,
+                    xExtremes = xAxis.getExtremes(),
+                    xMin = xExtremes.min,
+                    xMax = xExtremes.max,
+                    yExtremes = yAxis.getExtremes(),
+                    yMin = yExtremes.min,
+                    yMax = yExtremes.max,
+                    pointTaken = {},
+                    lastClientX,
+                    sampling = !!series.sampling,
+                    points,
+                    r = options.marker && options.marker.radius,
+                    cvsDrawPoint = this.cvsDrawPoint,
+                    cvsLineTo = options.lineWidth ? this.cvsLineTo : false,
+                    cvsMarker = r && r <= 1 ?
+                    this.cvsMarkerSquare :
+                    this.cvsMarkerCircle,
+                    strokeBatch = this.cvsStrokeBatch || 1000,
+                    enableMouseTracking = options.enableMouseTracking !== false,
+                    lastPoint,
+                    threshold = options.threshold,
+                    yBottom = yAxis.getThreshold(threshold),
+                    hasThreshold = isNumber(threshold),
+                    translatedThreshold = yBottom,
+                    doFill = this.fill,
+                    isRange = series.pointArrayMap && series.pointArrayMap.join(',') === 'low,high',
+                    isStacked = !!options.stacking,
+                    cropStart = series.cropStart || 0,
+                    loadingOptions = chart.options.loading,
+                    requireSorting = series.requireSorting,
+                    wasNull,
+                    connectNulls = options.connectNulls,
+                    useRaw = !xData,
+                    minVal,
+                    maxVal,
+                    minI,
+                    maxI,
+                    fillColor = series.fillOpacity ?
+                    new Color(series.color).setOpacity(pick(options.fillOpacity, 0.75)).get() :
+                    series.color,
+                    stroke = function() {
+                        if (doFill) {
+                            ctx.fillStyle = fillColor;
+                            ctx.fill();
+                        } else {
+                            ctx.strokeStyle = series.color;
+                            ctx.lineWidth = options.lineWidth;
+                            ctx.stroke();
+                        }
+                    },
+                    drawPoint = function(clientX, plotY, yBottom, i) {
+                        if (c === 0) {
+                            ctx.beginPath();
+
+                            if (cvsLineTo) {
+                                ctx.lineJoin = 'round';
+                            }
+                        }
+
+                        if (wasNull) {
+                            ctx.moveTo(clientX, plotY);
+                        } else {
+                            if (cvsDrawPoint) {
+                                cvsDrawPoint(ctx, clientX, plotY, yBottom, lastPoint);
+                            } else if (cvsLineTo) {
+                                cvsLineTo(ctx, clientX, plotY);
+                            } else if (cvsMarker) {
+                                cvsMarker.call(series, ctx, clientX, plotY, r, i);
+                            }
+                        }
+
+                        // We need to stroke the line for every 1000 pixels. It will crash the browser
+                        // memory use if we stroke too infrequently.
+                        c = c + 1;
+                        if (c === strokeBatch) {
+                            stroke();
+                            c = 0;
+                        }
+
+                        // Area charts need to keep track of the last point
+                        lastPoint = {
+                            clientX: clientX,
+                            plotY: plotY,
+                            yBottom: yBottom
+                        };
+                    },
+
+                    addKDPoint = function(clientX, plotY, i) {
+
+                        // The k-d tree requires series points. Reduce the amount of points, since the time to build the 
+                        // tree increases exponentially.
+                        if (enableMouseTracking && !pointTaken[clientX + ',' + plotY]) {
+                            pointTaken[clientX + ',' + plotY] = true;
+
+                            if (chart.inverted) {
+                                clientX = xAxis.len - clientX;
+                                plotY = yAxis.len - plotY;
+                            }
+
+                            points.push({
+                                clientX: clientX,
+                                plotX: clientX,
+                                plotY: plotY,
+                                i: cropStart + i
+                            });
+                        }
+                    };
+
+                // If we are zooming out from SVG mode, destroy the graphics
+                if (this.points || this.graph) {
+                    this.destroyGraphics();
+                }
+
+                // The group
+                series.plotGroup(
+                    'group',
+                    'series',
+                    series.visible ? 'visible' : 'hidden',
+                    options.zIndex,
+                    chart.seriesGroup
+                );
+
+                series.markerGroup = series.group;
+                addEvent(series, 'destroy', function() {
+                    series.markerGroup = null;
+                });
+
+                points = this.points = [];
+                ctx = this.getContext();
+                series.buildKDTree = noop; // Do not start building while drawing 
+
+                // Display a loading indicator
+                if (rawData.length > 99999) {
+                    chart.options.loading = merge(loadingOptions, {
+                        labelStyle: {
+                            backgroundColor: H.color('#ffffff').setOpacity(0.75).get(),
+                            padding: '1em',
+                            borderRadius: '0.5em'
+                        },
+                        style: {
+                            backgroundColor: 'none',
+                            opacity: 1
+                        }
+                    });
+                    clearTimeout(destroyLoadingDiv);
+                    chart.showLoading('Drawing...');
+                    chart.options.loading = loadingOptions; // reset
+                }
+
+                // Loop over the points
+                eachAsync(isStacked ? series.data : (xData || rawData), function(d, i) {
+                    var x,
+                        y,
+                        clientX,
+                        plotY,
+                        isNull,
+                        low,
+                        chartDestroyed = typeof chart.index === 'undefined',
+                        isYInside = true;
+
+                    if (!chartDestroyed) {
+                        if (useRaw) {
+                            x = d[0];
+                            y = d[1];
+                        } else {
+                            x = d;
+                            y = yData[i];
+                        }
+
+                        // Resolve low and high for range series
+                        if (isRange) {
+                            if (useRaw) {
+                                y = d.slice(1, 3);
+                            }
+                            low = y[0];
+                            y = y[1];
+                        } else if (isStacked) {
+                            x = d.x;
+                            y = d.stackY;
+                            low = y - d.y;
+                        }
+
+                        isNull = y === null;
+
+                        // Optimize for scatter zooming
+                        if (!requireSorting) {
+                            isYInside = y >= yMin && y <= yMax;
+                        }
+
+                        if (!isNull && x >= xMin && x <= xMax && isYInside) {
+
+                            clientX = Math.round(xAxis.toPixels(x, true));
+
+                            if (sampling) {
+                                if (minI === undefined || clientX === lastClientX) {
+                                    if (!isRange) {
+                                        low = y;
+                                    }
+                                    if (maxI === undefined || y > maxVal) {
+                                        maxVal = y;
+                                        maxI = i;
+                                    }
+                                    if (minI === undefined || low < minVal) {
+                                        minVal = low;
+                                        minI = i;
+                                    }
+
+                                }
+                                if (clientX !== lastClientX) { // Add points and reset
+                                    if (minI !== undefined) { // then maxI is also a number
+                                        plotY = yAxis.toPixels(maxVal, true);
+                                        yBottom = yAxis.toPixels(minVal, true);
+                                        drawPoint(
+                                            clientX,
+                                            hasThreshold ? Math.min(plotY, translatedThreshold) : plotY,
+                                            hasThreshold ? Math.max(yBottom, translatedThreshold) : yBottom,
+                                            i
+                                        );
+                                        addKDPoint(clientX, plotY, maxI);
+                                        if (yBottom !== plotY) {
+                                            addKDPoint(clientX, yBottom, minI);
+                                        }
+                                    }
+
+
+                                    minI = maxI = undefined;
+                                    lastClientX = clientX;
+                                }
+                            } else {
+                                plotY = Math.round(yAxis.toPixels(y, true));
+                                drawPoint(clientX, plotY, yBottom, i);
+                                addKDPoint(clientX, plotY, i);
+                            }
+                        }
+                        wasNull = isNull && !connectNulls;
+
+                        if (i % CHUNK_SIZE === 0) {
+                            series.canvasToSVG();
+                        }
+                    }
+
+                    return !chartDestroyed;
+                }, function() {
+                    var loadingDiv = chart.loadingDiv,
+                        loadingShown = chart.loadingShown;
+                    stroke();
+                    series.canvasToSVG();
+
+                    fireEvent(series, 'renderedCanvas');
+
+                    // Do not use chart.hideLoading, as it runs JS animation and will be blocked by buildKDTree.
+                    // CSS animation looks good, but then it must be deleted in timeout. If we add the module to core,
+                    // change hideLoading so we can skip this block.
+                    if (loadingShown) {
+                        extend(loadingDiv.style, {
+                            transition: 'opacity 250ms',
+                            opacity: 0
+                        });
+                        chart.loadingShown = false;
+                        destroyLoadingDiv = setTimeout(function() {
+                            if (loadingDiv.parentNode) { // In exporting it is falsy
+                                loadingDiv.parentNode.removeChild(loadingDiv);
+                            }
+                            chart.loadingDiv = chart.loadingSpan = null;
+                        }, 250);
+                    }
+
+                    // Pass tests in Pointer. 
+                    // Replace this with a single property, and replace when zooming in
+                    // below boostThreshold.
+                    series.directTouch = false;
+                    series.options.stickyTracking = true;
+
+                    delete series.buildKDTree; // Go back to prototype, ready to build
+                    series.buildKDTree();
+
+                    // Don't do async on export, the exportChart, getSVGForExport and getSVG methods are not chained for it.
+                }, chart.renderer.forExport ? Number.MAX_VALUE : undefined);
+            }
+        });
+
+        seriesTypes.scatter.prototype.cvsMarkerCircle = function(ctx, clientX, plotY, r) {
+            ctx.moveTo(clientX, plotY);
+            ctx.arc(clientX, plotY, r, 0, 2 * Math.PI, false);
+        };
+
+        // Rect is twice as fast as arc, should be used for small markers
+        seriesTypes.scatter.prototype.cvsMarkerSquare = function(ctx, clientX, plotY, r) {
+            ctx.rect(clientX - r, plotY - r, r * 2, r * 2);
+        };
+        seriesTypes.scatter.prototype.fill = true;
+
+        if (seriesTypes.bubble) {
+            seriesTypes.bubble.prototype.cvsMarkerCircle = function(ctx, clientX, plotY, r, i) {
+                ctx.moveTo(clientX, plotY);
+                ctx.arc(clientX, plotY, this.radii && this.radii[i], 0, 2 * Math.PI, false);
+            };
+            seriesTypes.bubble.prototype.cvsStrokeBatch = 1;
+        }
+
+
+        extend(seriesTypes.area.prototype, {
+            cvsDrawPoint: function(ctx, clientX, plotY, yBottom, lastPoint) {
+                if (lastPoint && clientX !== lastPoint.clientX) {
+                    ctx.moveTo(lastPoint.clientX, lastPoint.yBottom);
+                    ctx.lineTo(lastPoint.clientX, lastPoint.plotY);
+                    ctx.lineTo(clientX, plotY);
+                    ctx.lineTo(clientX, yBottom);
+                }
+            },
+            fill: true,
+            fillOpacity: true,
+            sampling: true
+        });
+
+        extend(seriesTypes.column.prototype, {
+            cvsDrawPoint: function(ctx, clientX, plotY, yBottom) {
+                ctx.rect(clientX - 1, plotY, 1, yBottom - plotY);
+            },
+            fill: true,
+            sampling: true
+        });
+
+        /**
+         * Return a full Point object based on the index. The boost module uses stripped point objects
+         * for performance reasons.
+         * @param   {Number} boostPoint A stripped-down point object
+         * @returns {Object}   A Point object as per http://api.highcharts.com/highcharts#Point
+         */
+        Series.prototype.getPoint = function(boostPoint) {
+            var point = boostPoint;
+
+            if (boostPoint && !(boostPoint instanceof this.pointClass)) {
+                point = (new this.pointClass()).init(this, this.options.data[boostPoint.i]); // eslint-disable-line new-cap
+                point.category = point.x;
+
+                point.dist = boostPoint.dist;
+                point.distX = boostPoint.distX;
+                point.plotX = boostPoint.plotX;
+                point.plotY = boostPoint.plotY;
+            }
+
+            return point;
+        };
+
+        /**
+         * Extend series.destroy to also remove the fake k-d-tree points (#5137). Normally
+         * this is handled by Series.destroy that calls Point.destroy, but the fake
+         * search points are not registered like that.
+         */
+        wrap(Series.prototype, 'destroy', function(proceed) {
+            var series = this,
+                chart = series.chart;
+            if (chart.hoverPoints) {
+                chart.hoverPoints = grep(chart.hoverPoints, function(point) {
+                    return point.series === series;
+                });
+            }
+
+            if (chart.hoverPoint && chart.hoverPoint.series === series) {
+                chart.hoverPoint = null;
+            }
+            proceed.call(this);
+        });
+
+        /**
+         * Return a point instance from the k-d-tree
+         */
+        wrap(Series.prototype, 'searchPoint', function(proceed) {
+            return this.getPoint(
+                proceed.apply(this, [].slice.call(arguments, 1))
+            );
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 14 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/broken-axis.js


+ 338 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/broken-axis.src.js

@@ -0,0 +1,338 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2009-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+
+        var pick = H.pick,
+            wrap = H.wrap,
+            each = H.each,
+            extend = H.extend,
+            fireEvent = H.fireEvent,
+            Axis = H.Axis,
+            Series = H.Series;
+
+        function stripArguments() {
+            return Array.prototype.slice.call(arguments, 1);
+        }
+
+        extend(Axis.prototype, {
+            isInBreak: function(brk, val) {
+                var ret,
+                    repeat = brk.repeat || Infinity,
+                    from = brk.from,
+                    length = brk.to - brk.from,
+                    test = (val >= from ? (val - from) % repeat : repeat - ((from - val) % repeat));
+
+                if (!brk.inclusive) {
+                    ret = test < length && test !== 0;
+                } else {
+                    ret = test <= length;
+                }
+                return ret;
+            },
+
+            isInAnyBreak: function(val, testKeep) {
+
+                var breaks = this.options.breaks,
+                    i = breaks && breaks.length,
+                    inbrk,
+                    keep,
+                    ret;
+
+
+                if (i) {
+
+                    while (i--) {
+                        if (this.isInBreak(breaks[i], val)) {
+                            inbrk = true;
+                            if (!keep) {
+                                keep = pick(breaks[i].showPoints, this.isXAxis ? false : true);
+                            }
+                        }
+                    }
+
+                    if (inbrk && testKeep) {
+                        ret = inbrk && !keep;
+                    } else {
+                        ret = inbrk;
+                    }
+                }
+                return ret;
+            }
+        });
+
+        wrap(Axis.prototype, 'setTickPositions', function(proceed) {
+            proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+
+            if (this.options.breaks) {
+                var axis = this,
+                    tickPositions = this.tickPositions,
+                    info = this.tickPositions.info,
+                    newPositions = [],
+                    i;
+
+                for (i = 0; i < tickPositions.length; i++) {
+                    if (!axis.isInAnyBreak(tickPositions[i])) {
+                        newPositions.push(tickPositions[i]);
+                    }
+                }
+
+                this.tickPositions = newPositions;
+                this.tickPositions.info = info;
+            }
+        });
+
+        wrap(Axis.prototype, 'init', function(proceed, chart, userOptions) {
+            // Force Axis to be not-ordinal when breaks are defined
+            if (userOptions.breaks && userOptions.breaks.length) {
+                userOptions.ordinal = false;
+            }
+
+            proceed.call(this, chart, userOptions);
+
+            if (this.options.breaks) {
+
+                var axis = this;
+
+                axis.isBroken = true;
+
+                this.val2lin = function(val) {
+                    var nval = val,
+                        brk,
+                        i;
+
+                    for (i = 0; i < axis.breakArray.length; i++) {
+                        brk = axis.breakArray[i];
+                        if (brk.to <= val) {
+                            nval -= brk.len;
+                        } else if (brk.from >= val) {
+                            break;
+                        } else if (axis.isInBreak(brk, val)) {
+                            nval -= (val - brk.from);
+                            break;
+                        }
+                    }
+
+                    return nval;
+                };
+
+                this.lin2val = function(val) {
+                    var nval = val,
+                        brk,
+                        i;
+
+                    for (i = 0; i < axis.breakArray.length; i++) {
+                        brk = axis.breakArray[i];
+                        if (brk.from >= nval) {
+                            break;
+                        } else if (brk.to < nval) {
+                            nval += brk.len;
+                        } else if (axis.isInBreak(brk, nval)) {
+                            nval += brk.len;
+                        }
+                    }
+                    return nval;
+                };
+
+                this.setExtremes = function(newMin, newMax, redraw, animation, eventArguments) {
+                    // If trying to set extremes inside a break, extend it to before and after the break ( #3857 )
+                    while (this.isInAnyBreak(newMin)) {
+                        newMin -= this.closestPointRange;
+                    }
+                    while (this.isInAnyBreak(newMax)) {
+                        newMax -= this.closestPointRange;
+                    }
+                    Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);
+                };
+
+                this.setAxisTranslation = function(saveOld) {
+                    Axis.prototype.setAxisTranslation.call(this, saveOld);
+
+                    var breaks = axis.options.breaks,
+                        breakArrayT = [], // Temporary one
+                        breakArray = [],
+                        length = 0,
+                        inBrk,
+                        repeat,
+                        brk,
+                        min = axis.userMin || axis.min,
+                        max = axis.userMax || axis.max,
+                        start,
+                        i,
+                        j;
+
+                    // Min & max check (#4247)
+                    for (i in breaks) {
+                        brk = breaks[i];
+                        repeat = brk.repeat || Infinity;
+                        if (axis.isInBreak(brk, min)) {
+                            min += (brk.to % repeat) - (min % repeat);
+                        }
+                        if (axis.isInBreak(brk, max)) {
+                            max -= (max % repeat) - (brk.from % repeat);
+                        }
+                    }
+
+                    // Construct an array holding all breaks in the axis
+                    for (i in breaks) {
+                        brk = breaks[i];
+                        start = brk.from;
+                        repeat = brk.repeat || Infinity;
+
+                        while (start - repeat > min) {
+                            start -= repeat;
+                        }
+                        while (start < min) {
+                            start += repeat;
+                        }
+
+                        for (j = start; j < max; j += repeat) {
+                            breakArrayT.push({
+                                value: j,
+                                move: 'in'
+                            });
+                            breakArrayT.push({
+                                value: j + (brk.to - brk.from),
+                                move: 'out',
+                                size: brk.breakSize
+                            });
+                        }
+                    }
+
+                    breakArrayT.sort(function(a, b) {
+                        var ret;
+                        if (a.value === b.value) {
+                            ret = (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);
+                        } else {
+                            ret = a.value - b.value;
+                        }
+                        return ret;
+                    });
+
+                    // Simplify the breaks
+                    inBrk = 0;
+                    start = min;
+
+                    for (i in breakArrayT) {
+                        brk = breakArrayT[i];
+                        inBrk += (brk.move === 'in' ? 1 : -1);
+
+                        if (inBrk === 1 && brk.move === 'in') {
+                            start = brk.value;
+                        }
+                        if (inBrk === 0) {
+                            breakArray.push({
+                                from: start,
+                                to: brk.value,
+                                len: brk.value - start - (brk.size || 0)
+                            });
+                            length += brk.value - start - (brk.size || 0);
+                        }
+                    }
+
+                    axis.breakArray = breakArray;
+
+                    fireEvent(axis, 'afterBreaks');
+
+                    axis.transA *= ((max - axis.min) / (max - min - length));
+
+                    axis.min = min;
+                    axis.max = max;
+                };
+            }
+        });
+
+        wrap(Series.prototype, 'generatePoints', function(proceed) {
+
+            proceed.apply(this, stripArguments(arguments));
+
+            var series = this,
+                xAxis = series.xAxis,
+                yAxis = series.yAxis,
+                points = series.points,
+                point,
+                i = points.length,
+                connectNulls = series.options.connectNulls,
+                nullGap;
+
+
+            if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {
+                while (i--) {
+                    point = points[i];
+
+                    nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)
+                    if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {
+                        points.splice(i, 1);
+                        if (this.data[i]) {
+                            this.data[i].destroyElements(); // removes the graphics for this point if they exist
+                        }
+                    }
+                }
+            }
+
+        });
+
+        function drawPointsWrapped(proceed) {
+            proceed.apply(this);
+            this.drawBreaks(this.xAxis, ['x']);
+            this.drawBreaks(this.yAxis, pick(this.pointArrayMap, ['y']));
+        }
+
+        H.Series.prototype.drawBreaks = function(axis, keys) {
+            var series = this,
+                points = series.points,
+                breaks,
+                threshold,
+                eventName,
+                y;
+
+            if (!axis) {
+                return; // #5950
+            }
+
+            each(keys, function(key) {
+                breaks = axis.breakArray || [];
+                threshold = axis.isXAxis ? axis.min : pick(series.options.threshold, axis.min);
+                each(points, function(point) {
+                    y = pick(point['stack' + key.toUpperCase()], point[key]);
+                    each(breaks, function(brk) {
+                        eventName = false;
+
+                        if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) {
+                            eventName = 'pointBreak';
+                        } else if ((threshold < brk.from && y > brk.from && y < brk.to) || (threshold > brk.from && y > brk.to && y < brk.from)) { // point falls inside the break
+                            eventName = 'pointInBreak';
+                        }
+                        if (eventName) {
+                            fireEvent(axis, eventName, {
+                                point: point,
+                                brk: brk
+                            });
+                        }
+                    });
+                });
+            });
+        };
+
+        wrap(H.seriesTypes.column.prototype, 'drawPoints', drawPointsWrapped);
+        wrap(H.Series.prototype, 'drawPoints', drawPointsWrapped);
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 26 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/data.js


+ 981 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/data.src.js

@@ -0,0 +1,981 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * Data module
+ *
+ * (c) 2012-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * Data module
+         *
+         * (c) 2012-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+
+        /* global jQuery */
+        'use strict';
+
+        // Utilities
+        var win = Highcharts.win,
+            doc = win.document,
+            each = Highcharts.each,
+            pick = Highcharts.pick,
+            inArray = Highcharts.inArray,
+            isNumber = Highcharts.isNumber,
+            splat = Highcharts.splat,
+            SeriesBuilder;
+
+
+        // The Data constructor
+        var Data = function(dataOptions, chartOptions) {
+            this.init(dataOptions, chartOptions);
+        };
+
+        // Set the prototype properties
+        Highcharts.extend(Data.prototype, {
+
+            /**
+             * Initialize the Data object with the given options
+             */
+            init: function(options, chartOptions) {
+                this.options = options;
+                this.chartOptions = chartOptions;
+                this.columns = options.columns || this.rowsToColumns(options.rows) || [];
+                this.firstRowAsNames = pick(options.firstRowAsNames, true);
+                this.decimalRegex = options.decimalPoint && new RegExp('^(-?[0-9]+)' + options.decimalPoint + '([0-9]+)$');
+
+                // This is a two-dimensional array holding the raw, trimmed string values
+                // with the same organisation as the columns array. It makes it possible
+                // for example to revert from interpreted timestamps to string-based
+                // categories.
+                this.rawColumns = [];
+
+                // No need to parse or interpret anything
+                if (this.columns.length) {
+                    this.dataFound();
+
+                    // Parse and interpret
+                } else {
+
+                    // Parse a CSV string if options.csv is given
+                    this.parseCSV();
+
+                    // Parse a HTML table if options.table is given
+                    this.parseTable();
+
+                    // Parse a Google Spreadsheet 
+                    this.parseGoogleSpreadsheet();
+                }
+
+            },
+
+            /**
+             * Get the column distribution. For example, a line series takes a single column for 
+             * Y values. A range series takes two columns for low and high values respectively,
+             * and an OHLC series takes four columns.
+             */
+            getColumnDistribution: function() {
+                var chartOptions = this.chartOptions,
+                    options = this.options,
+                    xColumns = [],
+                    getValueCount = function(type) {
+                        return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length;
+                    },
+                    getPointArrayMap = function(type) {
+                        return Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap;
+                    },
+                    globalType = chartOptions && chartOptions.chart && chartOptions.chart.type,
+                    individualCounts = [],
+                    seriesBuilders = [],
+                    seriesIndex = 0,
+                    i;
+
+                each((chartOptions && chartOptions.series) || [], function(series) {
+                    individualCounts.push(getValueCount(series.type || globalType));
+                });
+
+                // Collect the x-column indexes from seriesMapping
+                each((options && options.seriesMapping) || [], function(mapping) {
+                    xColumns.push(mapping.x || 0);
+                });
+
+                // If there are no defined series with x-columns, use the first column as x column
+                if (xColumns.length === 0) {
+                    xColumns.push(0);
+                }
+
+                // Loop all seriesMappings and constructs SeriesBuilders from
+                // the mapping options.
+                each((options && options.seriesMapping) || [], function(mapping) {
+                    var builder = new SeriesBuilder(),
+                        name,
+                        numberOfValueColumnsNeeded = individualCounts[seriesIndex] || getValueCount(globalType),
+                        seriesArr = (chartOptions && chartOptions.series) || [],
+                        series = seriesArr[seriesIndex] || {},
+                        pointArrayMap = getPointArrayMap(series.type || globalType) || ['y'];
+
+                    // Add an x reader from the x property or from an undefined column
+                    // if the property is not set. It will then be auto populated later.
+                    builder.addColumnReader(mapping.x, 'x');
+
+                    // Add all column mappings
+                    for (name in mapping) {
+                        if (mapping.hasOwnProperty(name) && name !== 'x') {
+                            builder.addColumnReader(mapping[name], name);
+                        }
+                    }
+
+                    // Add missing columns
+                    for (i = 0; i < numberOfValueColumnsNeeded; i++) {
+                        if (!builder.hasReader(pointArrayMap[i])) {
+                            //builder.addNextColumnReader(pointArrayMap[i]);
+                            // Create and add a column reader for the next free column index
+                            builder.addColumnReader(undefined, pointArrayMap[i]);
+                        }
+                    }
+
+                    seriesBuilders.push(builder);
+                    seriesIndex++;
+                });
+
+                var globalPointArrayMap = getPointArrayMap(globalType);
+                if (globalPointArrayMap === undefined) {
+                    globalPointArrayMap = ['y'];
+                }
+
+                this.valueCount = {
+                    global: getValueCount(globalType),
+                    xColumns: xColumns,
+                    individual: individualCounts,
+                    seriesBuilders: seriesBuilders,
+                    globalPointArrayMap: globalPointArrayMap
+                };
+            },
+
+            /**
+             * When the data is parsed into columns, either by CSV, table, GS or direct input,
+             * continue with other operations.
+             */
+            dataFound: function() {
+
+                if (this.options.switchRowsAndColumns) {
+                    this.columns = this.rowsToColumns(this.columns);
+                }
+
+                // Interpret the info about series and columns
+                this.getColumnDistribution();
+
+                // Interpret the values into right types
+                this.parseTypes();
+
+                // Handle columns if a handleColumns callback is given
+                if (this.parsed() !== false) {
+
+                    // Complete if a complete callback is given
+                    this.complete();
+                }
+
+            },
+
+            /**
+             * Parse a CSV input string
+             */
+            parseCSV: function() {
+                var self = this,
+                    options = this.options,
+                    csv = options.csv,
+                    columns = this.columns,
+                    startRow = options.startRow || 0,
+                    endRow = options.endRow || Number.MAX_VALUE,
+                    startColumn = options.startColumn || 0,
+                    endColumn = options.endColumn || Number.MAX_VALUE,
+                    itemDelimiter,
+                    lines,
+                    activeRowNo = 0;
+
+                if (csv) {
+
+                    lines = csv
+                        .replace(/\r\n/g, '\n') // Unix
+                        .replace(/\r/g, '\n') // Mac
+                        .split(options.lineDelimiter || '\n');
+
+                    itemDelimiter = options.itemDelimiter || (csv.indexOf('\t') !== -1 ? '\t' : ',');
+
+                    each(lines, function(line, rowNo) {
+                        var trimmed = self.trim(line),
+                            isComment = trimmed.indexOf('#') === 0,
+                            isBlank = trimmed === '',
+                            items;
+
+                        if (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) {
+                            items = line.split(itemDelimiter);
+                            each(items, function(item, colNo) {
+                                if (colNo >= startColumn && colNo <= endColumn) {
+                                    if (!columns[colNo - startColumn]) {
+                                        columns[colNo - startColumn] = [];
+                                    }
+
+                                    columns[colNo - startColumn][activeRowNo] = item;
+                                }
+                            });
+                            activeRowNo += 1;
+                        }
+                    });
+
+                    this.dataFound();
+                }
+            },
+
+            /**
+             * Parse a HTML table
+             */
+            parseTable: function() {
+                var options = this.options,
+                    table = options.table,
+                    columns = this.columns,
+                    startRow = options.startRow || 0,
+                    endRow = options.endRow || Number.MAX_VALUE,
+                    startColumn = options.startColumn || 0,
+                    endColumn = options.endColumn || Number.MAX_VALUE;
+
+                if (table) {
+
+                    if (typeof table === 'string') {
+                        table = doc.getElementById(table);
+                    }
+
+                    each(table.getElementsByTagName('tr'), function(tr, rowNo) {
+                        if (rowNo >= startRow && rowNo <= endRow) {
+                            each(tr.children, function(item, colNo) {
+                                if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) {
+                                    if (!columns[colNo - startColumn]) {
+                                        columns[colNo - startColumn] = [];
+                                    }
+
+                                    columns[colNo - startColumn][rowNo - startRow] = item.innerHTML;
+                                }
+                            });
+                        }
+                    });
+
+                    this.dataFound(); // continue
+                }
+            },
+
+            /**
+             */
+            parseGoogleSpreadsheet: function() {
+                var self = this,
+                    options = this.options,
+                    googleSpreadsheetKey = options.googleSpreadsheetKey,
+                    columns = this.columns,
+                    startRow = options.startRow || 0,
+                    endRow = options.endRow || Number.MAX_VALUE,
+                    startColumn = options.startColumn || 0,
+                    endColumn = options.endColumn || Number.MAX_VALUE,
+                    gr, // google row
+                    gc; // google column
+
+                if (googleSpreadsheetKey) {
+                    jQuery.ajax({
+                        dataType: 'json',
+                        url: 'https://spreadsheets.google.com/feeds/cells/' +
+                            googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') +
+                            '/public/values?alt=json-in-script&callback=?',
+                        error: options.error,
+                        success: function(json) {
+                            // Prepare the data from the spreadsheat
+                            var cells = json.feed.entry,
+                                cell,
+                                cellCount = cells.length,
+                                colCount = 0,
+                                rowCount = 0,
+                                i;
+
+                            // First, find the total number of columns and rows that 
+                            // are actually filled with data
+                            for (i = 0; i < cellCount; i++) {
+                                cell = cells[i];
+                                colCount = Math.max(colCount, cell.gs$cell.col);
+                                rowCount = Math.max(rowCount, cell.gs$cell.row);
+                            }
+
+                            // Set up arrays containing the column data
+                            for (i = 0; i < colCount; i++) {
+                                if (i >= startColumn && i <= endColumn) {
+                                    // Create new columns with the length of either end-start or rowCount
+                                    columns[i - startColumn] = [];
+
+                                    // Setting the length to avoid jslint warning
+                                    columns[i - startColumn].length = Math.min(rowCount, endRow - startRow);
+                                }
+                            }
+
+                            // Loop over the cells and assign the value to the right
+                            // place in the column arrays
+                            for (i = 0; i < cellCount; i++) {
+                                cell = cells[i];
+                                gr = cell.gs$cell.row - 1; // rows start at 1
+                                gc = cell.gs$cell.col - 1; // columns start at 1
+
+                                // If both row and col falls inside start and end
+                                // set the transposed cell value in the newly created columns
+                                if (gc >= startColumn && gc <= endColumn &&
+                                    gr >= startRow && gr <= endRow) {
+                                    columns[gc - startColumn][gr - startRow] = cell.content.$t;
+                                }
+                            }
+
+                            // Insert null for empty spreadsheet cells (#5298)
+                            each(columns, function(column) {
+                                for (i = 0; i < column.length; i++) {
+                                    if (column[i] === undefined) {
+                                        column[i] = null;
+                                    }
+                                }
+                            });
+
+                            self.dataFound();
+                        }
+                    });
+                }
+            },
+
+            /**
+             * Trim a string from whitespace
+             */
+            trim: function(str, inside) {
+                if (typeof str === 'string') {
+                    str = str.replace(/^\s+|\s+$/g, '');
+
+                    // Clear white space insdie the string, like thousands separators
+                    if (inside && /^[0-9\s]+$/.test(str)) {
+                        str = str.replace(/\s/g, '');
+                    }
+
+                    if (this.decimalRegex) {
+                        str = str.replace(this.decimalRegex, '$1.$2');
+                    }
+                }
+                return str;
+            },
+
+            /**
+             * Parse numeric cells in to number types and date types in to true dates.
+             */
+            parseTypes: function() {
+                var columns = this.columns,
+                    col = columns.length;
+
+                while (col--) {
+                    this.parseColumn(columns[col], col);
+                }
+
+            },
+
+            /**
+             * Parse a single column. Set properties like .isDatetime and .isNumeric.
+             */
+            parseColumn: function(column, col) {
+                var rawColumns = this.rawColumns,
+                    columns = this.columns,
+                    row = column.length,
+                    val,
+                    floatVal,
+                    trimVal,
+                    trimInsideVal,
+                    firstRowAsNames = this.firstRowAsNames,
+                    isXColumn = inArray(col, this.valueCount.xColumns) !== -1,
+                    dateVal,
+                    backup = [],
+                    diff,
+                    chartOptions = this.chartOptions,
+                    descending,
+                    columnTypes = this.options.columnTypes || [],
+                    columnType = columnTypes[col],
+                    forceCategory = isXColumn && ((chartOptions && chartOptions.xAxis && splat(chartOptions.xAxis)[0].type === 'category') || columnType === 'string');
+
+                if (!rawColumns[col]) {
+                    rawColumns[col] = [];
+                }
+                while (row--) {
+                    val = backup[row] || column[row];
+
+                    trimVal = this.trim(val);
+                    trimInsideVal = this.trim(val, true);
+                    floatVal = parseFloat(trimInsideVal);
+
+                    // Set it the first time
+                    if (rawColumns[col][row] === undefined) {
+                        rawColumns[col][row] = trimVal;
+                    }
+
+                    // Disable number or date parsing by setting the X axis type to category
+                    if (forceCategory || (row === 0 && firstRowAsNames)) {
+                        column[row] = trimVal;
+
+                    } else if (+trimInsideVal === floatVal) { // is numeric
+
+                        column[row] = floatVal;
+
+                        // If the number is greater than milliseconds in a year, assume datetime
+                        if (floatVal > 365 * 24 * 3600 * 1000 && columnType !== 'float') {
+                            column.isDatetime = true;
+                        } else {
+                            column.isNumeric = true;
+                        }
+
+                        if (column[row + 1] !== undefined) {
+                            descending = floatVal > column[row + 1];
+                        }
+
+                        // String, continue to determine if it is a date string or really a string
+                    } else {
+                        dateVal = this.parseDate(val);
+                        // Only allow parsing of dates if this column is an x-column
+                        if (isXColumn && isNumber(dateVal) && columnType !== 'float') { // is date
+                            backup[row] = val;
+                            column[row] = dateVal;
+                            column.isDatetime = true;
+
+                            // Check if the dates are uniformly descending or ascending. If they 
+                            // are not, chances are that they are a different time format, so check
+                            // for alternative.
+                            if (column[row + 1] !== undefined) {
+                                diff = dateVal > column[row + 1];
+                                if (diff !== descending && descending !== undefined) {
+                                    if (this.alternativeFormat) {
+                                        this.dateFormat = this.alternativeFormat;
+                                        row = column.length;
+                                        this.alternativeFormat = this.dateFormats[this.dateFormat].alternative;
+                                    } else {
+                                        column.unsorted = true;
+                                    }
+                                }
+                                descending = diff;
+                            }
+
+                        } else { // string
+                            column[row] = trimVal === '' ? null : trimVal;
+                            if (row !== 0 && (column.isDatetime || column.isNumeric)) {
+                                column.mixed = true;
+                            }
+                        }
+                    }
+                }
+
+                // If strings are intermixed with numbers or dates in a parsed column, it is an indication
+                // that parsing went wrong or the data was not intended to display as numbers or dates and 
+                // parsing is too aggressive. Fall back to categories. Demonstrated in the 
+                // highcharts/demo/column-drilldown sample.
+                if (isXColumn && column.mixed) {
+                    columns[col] = rawColumns[col];
+                }
+
+                // If the 0 column is date or number and descending, reverse all columns. 
+                if (isXColumn && descending && this.options.sort) {
+                    for (col = 0; col < columns.length; col++) {
+                        columns[col].reverse();
+                        if (firstRowAsNames) {
+                            columns[col].unshift(columns[col].pop());
+                        }
+                    }
+                }
+            },
+
+            /**
+             * A collection of available date formats, extendable from the outside to support
+             * custom date formats.
+             */
+            dateFormats: {
+                'YYYY-mm-dd': {
+                    regex: /^([0-9]{4})[\-\/\.]([0-9]{2})[\-\/\.]([0-9]{2})$/,
+                    parser: function(match) {
+                        return Date.UTC(+match[1], match[2] - 1, +match[3]);
+                    }
+                },
+                'dd/mm/YYYY': {
+                    regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,
+                    parser: function(match) {
+                        return Date.UTC(+match[3], match[2] - 1, +match[1]);
+                    },
+                    alternative: 'mm/dd/YYYY' // different format with the same regex
+                },
+                'mm/dd/YYYY': {
+                    regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,
+                    parser: function(match) {
+                        return Date.UTC(+match[3], match[1] - 1, +match[2]);
+                    }
+                },
+                'dd/mm/YY': {
+                    regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,
+                    parser: function(match) {
+                        return Date.UTC(+match[3] + 2000, match[2] - 1, +match[1]);
+                    },
+                    alternative: 'mm/dd/YY' // different format with the same regex
+                },
+                'mm/dd/YY': {
+                    regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,
+                    parser: function(match) {
+                        return Date.UTC(+match[3] + 2000, match[1] - 1, +match[2]);
+                    }
+                }
+            },
+
+            /**
+             * Parse a date and return it as a number. Overridable through options.parseDate.
+             */
+            parseDate: function(val) {
+                var parseDate = this.options.parseDate,
+                    ret,
+                    key,
+                    format,
+                    dateFormat = this.options.dateFormat || this.dateFormat,
+                    match;
+
+                if (parseDate) {
+                    ret = parseDate(val);
+
+                } else if (typeof val === 'string') {
+                    // Auto-detect the date format the first time
+                    if (!dateFormat) {
+                        for (key in this.dateFormats) {
+                            format = this.dateFormats[key];
+                            match = val.match(format.regex);
+                            if (match) {
+                                this.dateFormat = dateFormat = key;
+                                this.alternativeFormat = format.alternative;
+                                ret = format.parser(match);
+                                break;
+                            }
+                        }
+                        // Next time, use the one previously found
+                    } else {
+                        format = this.dateFormats[dateFormat];
+                        match = val.match(format.regex);
+                        if (match) {
+                            ret = format.parser(match);
+                        }
+                    }
+                    // Fall back to Date.parse		
+                    if (!match) {
+                        match = Date.parse(val);
+                        // External tools like Date.js and MooTools extend Date object and
+                        // returns a date.
+                        if (typeof match === 'object' && match !== null && match.getTime) {
+                            ret = match.getTime() - match.getTimezoneOffset() * 60000;
+
+                            // Timestamp
+                        } else if (isNumber(match)) {
+                            ret = match - (new Date(match)).getTimezoneOffset() * 60000;
+                        }
+                    }
+                }
+                return ret;
+            },
+
+            /**
+             * Reorganize rows into columns
+             */
+            rowsToColumns: function(rows) {
+                var row,
+                    rowsLength,
+                    col,
+                    colsLength,
+                    columns;
+
+                if (rows) {
+                    columns = [];
+                    rowsLength = rows.length;
+                    for (row = 0; row < rowsLength; row++) {
+                        colsLength = rows[row].length;
+                        for (col = 0; col < colsLength; col++) {
+                            if (!columns[col]) {
+                                columns[col] = [];
+                            }
+                            columns[col][row] = rows[row][col];
+                        }
+                    }
+                }
+                return columns;
+            },
+
+            /**
+             * A hook for working directly on the parsed columns
+             */
+            parsed: function() {
+                if (this.options.parsed) {
+                    return this.options.parsed.call(this, this.columns);
+                }
+            },
+
+            getFreeIndexes: function(numberOfColumns, seriesBuilders) {
+                var s,
+                    i,
+                    freeIndexes = [],
+                    freeIndexValues = [],
+                    referencedIndexes;
+
+                // Add all columns as free
+                for (i = 0; i < numberOfColumns; i = i + 1) {
+                    freeIndexes.push(true);
+                }
+
+                // Loop all defined builders and remove their referenced columns
+                for (s = 0; s < seriesBuilders.length; s = s + 1) {
+                    referencedIndexes = seriesBuilders[s].getReferencedColumnIndexes();
+
+                    for (i = 0; i < referencedIndexes.length; i = i + 1) {
+                        freeIndexes[referencedIndexes[i]] = false;
+                    }
+                }
+
+                // Collect the values for the free indexes
+                for (i = 0; i < freeIndexes.length; i = i + 1) {
+                    if (freeIndexes[i]) {
+                        freeIndexValues.push(i);
+                    }
+                }
+
+                return freeIndexValues;
+            },
+
+            /**
+             * If a complete callback function is provided in the options, interpret the 
+             * columns into a Highcharts options object.
+             */
+            complete: function() {
+
+                var columns = this.columns,
+                    xColumns = [],
+                    type,
+                    options = this.options,
+                    series,
+                    data,
+                    i,
+                    j,
+                    r,
+                    seriesIndex,
+                    chartOptions,
+                    allSeriesBuilders = [],
+                    builder,
+                    freeIndexes,
+                    typeCol,
+                    index;
+
+                xColumns.length = columns.length;
+                if (options.complete || options.afterComplete) {
+
+                    // Get the names and shift the top row
+                    for (i = 0; i < columns.length; i++) {
+                        if (this.firstRowAsNames) {
+                            columns[i].name = columns[i].shift();
+                        }
+                    }
+
+                    // Use the next columns for series
+                    series = [];
+                    freeIndexes = this.getFreeIndexes(columns.length, this.valueCount.seriesBuilders);
+
+                    // Populate defined series
+                    for (seriesIndex = 0; seriesIndex < this.valueCount.seriesBuilders.length; seriesIndex++) {
+                        builder = this.valueCount.seriesBuilders[seriesIndex];
+
+                        // If the builder can be populated with remaining columns, then add it to allBuilders
+                        if (builder.populateColumns(freeIndexes)) {
+                            allSeriesBuilders.push(builder);
+                        }
+                    }
+
+                    // Populate dynamic series
+                    while (freeIndexes.length > 0) {
+                        builder = new SeriesBuilder();
+                        builder.addColumnReader(0, 'x');
+
+                        // Mark index as used (not free)
+                        index = inArray(0, freeIndexes);
+                        if (index !== -1) {
+                            freeIndexes.splice(index, 1);
+                        }
+
+                        for (i = 0; i < this.valueCount.global; i++) {
+                            // Create and add a column reader for the next free column index
+                            builder.addColumnReader(undefined, this.valueCount.globalPointArrayMap[i]);
+                        }
+
+                        // If the builder can be populated with remaining columns, then add it to allBuilders
+                        if (builder.populateColumns(freeIndexes)) {
+                            allSeriesBuilders.push(builder);
+                        }
+                    }
+
+                    // Get the data-type from the first series x column
+                    if (allSeriesBuilders.length > 0 && allSeriesBuilders[0].readers.length > 0) {
+                        typeCol = columns[allSeriesBuilders[0].readers[0].columnIndex];
+                        if (typeCol !== undefined) {
+                            if (typeCol.isDatetime) {
+                                type = 'datetime';
+                            } else if (!typeCol.isNumeric) {
+                                type = 'category';
+                            }
+                        }
+                    }
+                    // Axis type is category, then the "x" column should be called "name"
+                    if (type === 'category') {
+                        for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) {
+                            builder = allSeriesBuilders[seriesIndex];
+                            for (r = 0; r < builder.readers.length; r++) {
+                                if (builder.readers[r].configName === 'x') {
+                                    builder.readers[r].configName = 'name';
+                                }
+                            }
+                        }
+                    }
+
+                    // Read data for all builders
+                    for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) {
+                        builder = allSeriesBuilders[seriesIndex];
+
+                        // Iterate down the cells of each column and add data to the series
+                        data = [];
+                        for (j = 0; j < columns[0].length; j++) {
+                            data[j] = builder.read(columns, j);
+                        }
+
+                        // Add the series
+                        series[seriesIndex] = {
+                            data: data
+                        };
+                        if (builder.name) {
+                            series[seriesIndex].name = builder.name;
+                        }
+                        if (type === 'category') {
+                            series[seriesIndex].turboThreshold = 0;
+                        }
+                    }
+
+
+
+                    // Do the callback
+                    chartOptions = {
+                        series: series
+                    };
+                    if (type) {
+                        chartOptions.xAxis = {
+                            type: type
+                        };
+                        if (type === 'category') {
+                            chartOptions.xAxis.uniqueNames = false;
+                        }
+                    }
+
+                    if (options.complete) {
+                        options.complete(chartOptions);
+                    }
+
+                    // The afterComplete hook is used internally to avoid conflict with the externally
+                    // available complete option.
+                    if (options.afterComplete) {
+                        options.afterComplete(chartOptions);
+                    }
+                }
+            }
+        });
+
+        // Register the Data prototype and data function on Highcharts
+        Highcharts.Data = Data;
+        Highcharts.data = function(options, chartOptions) {
+            return new Data(options, chartOptions);
+        };
+
+        // Extend Chart.init so that the Chart constructor accepts a new configuration
+        // option group, data.
+        Highcharts.wrap(Highcharts.Chart.prototype, 'init', function(proceed, userOptions, callback) {
+            var chart = this;
+
+            if (userOptions && userOptions.data) {
+                Highcharts.data(Highcharts.extend(userOptions.data, {
+
+                    afterComplete: function(dataOptions) {
+                        var i, series;
+
+                        // Merge series configs
+                        if (userOptions.hasOwnProperty('series')) {
+                            if (typeof userOptions.series === 'object') {
+                                i = Math.max(userOptions.series.length, dataOptions.series.length);
+                                while (i--) {
+                                    series = userOptions.series[i] || {};
+                                    userOptions.series[i] = Highcharts.merge(series, dataOptions.series[i]);
+                                }
+                            } else { // Allow merging in dataOptions.series (#2856)
+                                delete userOptions.series;
+                            }
+                        }
+
+                        // Do the merge
+                        userOptions = Highcharts.merge(dataOptions, userOptions);
+
+                        proceed.call(chart, userOptions, callback);
+                    }
+                }), userOptions);
+            } else {
+                proceed.call(chart, userOptions, callback);
+            }
+        });
+
+        /**
+         * Creates a new SeriesBuilder. A SeriesBuilder consists of a number
+         * of ColumnReaders that reads columns and give them a name.
+         * Ex: A series builder can be constructed to read column 3 as 'x' and
+         * column 7 and 8 as 'y1' and 'y2'.
+         * The output would then be points/rows of the form {x: 11, y1: 22, y2: 33}
+         * 
+         * The name of the builder is taken from the second column. In the above
+         * example it would be the column with index 7.
+         * @constructor
+         */
+        SeriesBuilder = function() {
+            this.readers = [];
+            this.pointIsArray = true;
+        };
+
+        /**
+         * Populates readers with column indexes. A reader can be added without
+         * a specific index and for those readers the index is taken sequentially
+         * from the free columns (this is handled by the ColumnCursor instance).
+         * @returns {boolean}
+         */
+        SeriesBuilder.prototype.populateColumns = function(freeIndexes) {
+            var builder = this,
+                enoughColumns = true;
+
+            // Loop each reader and give it an index if its missing.
+            // The freeIndexes.shift() will return undefined if there
+            // are no more columns.
+            each(builder.readers, function(reader) {
+                if (reader.columnIndex === undefined) {
+                    reader.columnIndex = freeIndexes.shift();
+                }
+            });
+
+            // Now, all readers should have columns mapped. If not
+            // then return false to signal that this series should
+            // not be added.
+            each(builder.readers, function(reader) {
+                if (reader.columnIndex === undefined) {
+                    enoughColumns = false;
+                }
+            });
+
+            return enoughColumns;
+        };
+
+        /**
+         * Reads a row from the dataset and returns a point or array depending
+         * on the names of the readers.
+         * @param columns
+         * @param rowIndex
+         * @returns {Array | Object}
+         */
+        SeriesBuilder.prototype.read = function(columns, rowIndex) {
+            var builder = this,
+                pointIsArray = builder.pointIsArray,
+                point = pointIsArray ? [] : {},
+                columnIndexes;
+
+            // Loop each reader and ask it to read its value.
+            // Then, build an array or point based on the readers names.
+            each(builder.readers, function(reader) {
+                var value = columns[reader.columnIndex][rowIndex];
+                if (pointIsArray) {
+                    point.push(value);
+                } else {
+                    point[reader.configName] = value;
+                }
+            });
+
+            // The name comes from the first column (excluding the x column)
+            if (this.name === undefined && builder.readers.length >= 2) {
+                columnIndexes = builder.getReferencedColumnIndexes();
+                if (columnIndexes.length >= 2) {
+                    // remove the first one (x col)
+                    columnIndexes.shift();
+
+                    // Sort the remaining
+                    columnIndexes.sort();
+
+                    // Now use the lowest index as name column
+                    this.name = columns[columnIndexes.shift()].name;
+                }
+            }
+
+            return point;
+        };
+
+        /**
+         * Creates and adds ColumnReader from the given columnIndex and configName.
+         * ColumnIndex can be undefined and in that case the reader will be given
+         * an index when columns are populated.
+         * @param columnIndex {Number | undefined}
+         * @param configName
+         */
+        SeriesBuilder.prototype.addColumnReader = function(columnIndex, configName) {
+            this.readers.push({
+                columnIndex: columnIndex,
+                configName: configName
+            });
+
+            if (!(configName === 'x' || configName === 'y' || configName === undefined)) {
+                this.pointIsArray = false;
+            }
+        };
+
+        /**
+         * Returns an array of column indexes that the builder will use when
+         * reading data.
+         * @returns {Array}
+         */
+        SeriesBuilder.prototype.getReferencedColumnIndexes = function() {
+            var i,
+                referencedColumnIndexes = [],
+                columnReader;
+
+            for (i = 0; i < this.readers.length; i = i + 1) {
+                columnReader = this.readers[i];
+                if (columnReader.columnIndex !== undefined) {
+                    referencedColumnIndexes.push(columnReader.columnIndex);
+                }
+            }
+
+            return referencedColumnIndexes;
+        };
+
+        /**
+         * Returns true if the builder has a reader for the given configName.
+         * @param configName
+         * @returns {boolean}
+         */
+        SeriesBuilder.prototype.hasReader = function(configName) {
+            var i, columnReader;
+            for (i = 0; i < this.readers.length; i = i + 1) {
+                columnReader = this.readers[i];
+                if (columnReader.configName === configName) {
+                    return true;
+                }
+            }
+            // Else return undefined
+        };
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 25 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/drilldown.js


+ 756 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/drilldown.src.js

@@ -0,0 +1,756 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * Highcharts Drilldown module
+ * 
+ * Author: Torstein Honsi
+ * License: www.highcharts.com/license
+ *
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * Highcharts Drilldown module
+         * 
+         * Author: Torstein Honsi
+         * License: www.highcharts.com/license
+         *
+         */
+
+        'use strict';
+
+        var noop = H.noop,
+            color = H.color,
+            defaultOptions = H.defaultOptions,
+            each = H.each,
+            extend = H.extend,
+            format = H.format,
+            pick = H.pick,
+            wrap = H.wrap,
+            Chart = H.Chart,
+            seriesTypes = H.seriesTypes,
+            PieSeries = seriesTypes.pie,
+            ColumnSeries = seriesTypes.column,
+            Tick = H.Tick,
+            fireEvent = H.fireEvent,
+            inArray = H.inArray,
+            ddSeriesId = 1;
+
+        // Utilities
+        /*
+         * Return an intermediate color between two colors, according to pos where 0
+         * is the from color and 1 is the to color. This method is copied from ColorAxis.js
+         * and should always be kept updated, until we get AMD support.
+         */
+        function tweenColors(from, to, pos) {
+            // Check for has alpha, because rgba colors perform worse due to lack of
+            // support in WebKit.
+            var hasAlpha,
+                ret;
+
+            // Unsupported color, return to-color (#3920)
+            if (!to.rgba.length || !from.rgba.length) {
+                ret = to.input || 'none';
+
+                // Interpolate
+            } else {
+                from = from.rgba;
+                to = to.rgba;
+                hasAlpha = (to[3] !== 1 || from[3] !== 1);
+                ret = (hasAlpha ? 'rgba(' : 'rgb(') +
+                    Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' +
+                    Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' +
+                    Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) +
+                    (hasAlpha ? (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) : '') + ')';
+            }
+            return ret;
+        }
+        /**
+         * Handle animation of the color attributes directly
+         */
+        each(['fill', 'stroke'], function(prop) {
+            H.Fx.prototype[prop + 'Setter'] = function() {
+                this.elem.attr(
+                    prop,
+                    tweenColors(color(this.start), color(this.end), this.pos),
+                    null,
+                    true
+                );
+            };
+        });
+
+        // Add language
+        extend(defaultOptions.lang, {
+            drillUpText: '◁ Back to {series.name}'
+        });
+        defaultOptions.drilldown = {
+
+            animation: {
+                duration: 500
+            },
+            drillUpButton: {
+                position: {
+                    align: 'right',
+                    x: -10,
+                    y: 10
+                }
+                // relativeTo: 'plotBox'
+                // theme
+            }
+        };
+
+        /**
+         * A general fadeIn method
+         */
+        H.SVGRenderer.prototype.Element.prototype.fadeIn = function(animation) {
+            this
+                .attr({
+                    opacity: 0.1,
+                    visibility: 'inherit'
+                })
+                .animate({
+                    opacity: pick(this.newOpacity, 1) // newOpacity used in maps
+                }, animation || {
+                    duration: 250
+                });
+        };
+
+        Chart.prototype.addSeriesAsDrilldown = function(point, ddOptions) {
+            this.addSingleSeriesAsDrilldown(point, ddOptions);
+            this.applyDrilldown();
+        };
+        Chart.prototype.addSingleSeriesAsDrilldown = function(point, ddOptions) {
+            var oldSeries = point.series,
+                xAxis = oldSeries.xAxis,
+                yAxis = oldSeries.yAxis,
+                newSeries,
+                pointIndex,
+                levelSeries = [],
+                levelSeriesOptions = [],
+                level,
+                levelNumber,
+                last,
+                colorProp;
+
+
+
+            colorProp = {
+                colorIndex: pick(point.colorIndex, oldSeries.colorIndex)
+            };
+
+
+            if (!this.drilldownLevels) {
+                this.drilldownLevels = [];
+            }
+
+            levelNumber = oldSeries.options._levelNumber || 0;
+
+            // See if we can reuse the registered series from last run
+            last = this.drilldownLevels[this.drilldownLevels.length - 1];
+            if (last && last.levelNumber !== levelNumber) {
+                last = undefined;
+            }
+
+            ddOptions = extend(extend({
+                _ddSeriesId: ddSeriesId++
+            }, colorProp), ddOptions);
+            pointIndex = inArray(point, oldSeries.points);
+
+            // Record options for all current series
+            each(oldSeries.chart.series, function(series) {
+                if (series.xAxis === xAxis && !series.isDrilling) {
+                    series.options._ddSeriesId = series.options._ddSeriesId || ddSeriesId++;
+                    series.options._colorIndex = series.userOptions._colorIndex;
+                    series.options._levelNumber = series.options._levelNumber || levelNumber; // #3182
+
+                    if (last) {
+                        levelSeries = last.levelSeries;
+                        levelSeriesOptions = last.levelSeriesOptions;
+                    } else {
+                        levelSeries.push(series);
+                        levelSeriesOptions.push(series.options);
+                    }
+                }
+            });
+
+            // Add a record of properties for each drilldown level
+            level = extend({
+                levelNumber: levelNumber,
+                seriesOptions: oldSeries.options,
+                levelSeriesOptions: levelSeriesOptions,
+                levelSeries: levelSeries,
+                shapeArgs: point.shapeArgs,
+                bBox: point.graphic ? point.graphic.getBBox() : {}, // no graphic in line series with markers disabled
+                color: point.isNull ? new H.Color(color).setOpacity(0).get() : color,
+                lowerSeriesOptions: ddOptions,
+                pointOptions: oldSeries.options.data[pointIndex],
+                pointIndex: pointIndex,
+                oldExtremes: {
+                    xMin: xAxis && xAxis.userMin,
+                    xMax: xAxis && xAxis.userMax,
+                    yMin: yAxis && yAxis.userMin,
+                    yMax: yAxis && yAxis.userMax
+                }
+            }, colorProp);
+
+            // Push it to the lookup array
+            this.drilldownLevels.push(level);
+
+            newSeries = level.lowerSeries = this.addSeries(ddOptions, false);
+            newSeries.options._levelNumber = levelNumber + 1;
+            if (xAxis) {
+                xAxis.oldPos = xAxis.pos;
+                xAxis.userMin = xAxis.userMax = null;
+                yAxis.userMin = yAxis.userMax = null;
+            }
+
+            // Run fancy cross-animation on supported and equal types
+            if (oldSeries.type === newSeries.type) {
+                newSeries.animate = newSeries.animateDrilldown || noop;
+                newSeries.options.animation = true;
+            }
+        };
+
+        Chart.prototype.applyDrilldown = function() {
+            var drilldownLevels = this.drilldownLevels,
+                levelToRemove;
+
+            if (drilldownLevels && drilldownLevels.length > 0) { // #3352, async loading
+                levelToRemove = drilldownLevels[drilldownLevels.length - 1].levelNumber;
+                each(this.drilldownLevels, function(level) {
+                    if (level.levelNumber === levelToRemove) {
+                        each(level.levelSeries, function(series) {
+                            if (series.options && series.options._levelNumber === levelToRemove) { // Not removed, not added as part of a multi-series drilldown
+                                series.remove(false);
+                            }
+                        });
+                    }
+                });
+            }
+
+            this.redraw();
+            this.showDrillUpButton();
+        };
+
+        Chart.prototype.getDrilldownBackText = function() {
+            var drilldownLevels = this.drilldownLevels,
+                lastLevel;
+            if (drilldownLevels && drilldownLevels.length > 0) { // #3352, async loading
+                lastLevel = drilldownLevels[drilldownLevels.length - 1];
+                lastLevel.series = lastLevel.seriesOptions;
+                return format(this.options.lang.drillUpText, lastLevel);
+            }
+
+        };
+
+        Chart.prototype.showDrillUpButton = function() {
+            var chart = this,
+                backText = this.getDrilldownBackText(),
+                buttonOptions = chart.options.drilldown.drillUpButton,
+                attr,
+                states;
+
+
+            if (!this.drillUpButton) {
+                attr = buttonOptions.theme;
+                states = attr && attr.states;
+
+                this.drillUpButton = this.renderer.button(
+                        backText,
+                        null,
+                        null,
+                        function() {
+                            chart.drillUp();
+                        },
+                        attr,
+                        states && states.hover,
+                        states && states.select
+                    )
+                    .addClass('highcharts-drillup-button')
+                    .attr({
+                        align: buttonOptions.position.align,
+                        zIndex: 7
+                    })
+                    .add()
+                    .align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');
+            } else {
+                this.drillUpButton.attr({
+                        text: backText
+                    })
+                    .align();
+            }
+        };
+
+        Chart.prototype.drillUp = function() {
+            var chart = this,
+                drilldownLevels = chart.drilldownLevels,
+                levelNumber = drilldownLevels[drilldownLevels.length - 1].levelNumber,
+                i = drilldownLevels.length,
+                chartSeries = chart.series,
+                seriesI,
+                level,
+                oldSeries,
+                newSeries,
+                oldExtremes,
+                addSeries = function(seriesOptions) {
+                    var addedSeries;
+                    each(chartSeries, function(series) {
+                        if (series.options._ddSeriesId === seriesOptions._ddSeriesId) {
+                            addedSeries = series;
+                        }
+                    });
+
+                    addedSeries = addedSeries || chart.addSeries(seriesOptions, false);
+                    if (addedSeries.type === oldSeries.type && addedSeries.animateDrillupTo) {
+                        addedSeries.animate = addedSeries.animateDrillupTo;
+                    }
+                    if (seriesOptions === level.seriesOptions) {
+                        newSeries = addedSeries;
+                    }
+                };
+
+            while (i--) {
+
+                level = drilldownLevels[i];
+                if (level.levelNumber === levelNumber) {
+                    drilldownLevels.pop();
+
+                    // Get the lower series by reference or id
+                    oldSeries = level.lowerSeries;
+                    if (!oldSeries.chart) { // #2786
+                        seriesI = chartSeries.length; // #2919
+                        while (seriesI--) {
+                            if (chartSeries[seriesI].options.id === level.lowerSeriesOptions.id &&
+                                chartSeries[seriesI].options._levelNumber === levelNumber + 1) { // #3867
+                                oldSeries = chartSeries[seriesI];
+                                break;
+                            }
+                        }
+                    }
+                    oldSeries.xData = []; // Overcome problems with minRange (#2898)
+
+                    each(level.levelSeriesOptions, addSeries);
+
+                    fireEvent(chart, 'drillup', {
+                        seriesOptions: level.seriesOptions
+                    });
+
+                    if (newSeries.type === oldSeries.type) {
+                        newSeries.drilldownLevel = level;
+                        newSeries.options.animation = chart.options.drilldown.animation;
+
+                        if (oldSeries.animateDrillupFrom && oldSeries.chart) { // #2919
+                            oldSeries.animateDrillupFrom(level);
+                        }
+                    }
+                    newSeries.options._levelNumber = levelNumber;
+
+                    oldSeries.remove(false);
+
+                    // Reset the zoom level of the upper series
+                    if (newSeries.xAxis) {
+                        oldExtremes = level.oldExtremes;
+                        newSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false);
+                        newSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false);
+                    }
+                }
+            }
+
+            // Fire a once-off event after all series have been drilled up (#5158)
+            fireEvent(chart, 'drillupall');
+
+            this.redraw();
+
+            if (this.drilldownLevels.length === 0) {
+                this.drillUpButton = this.drillUpButton.destroy();
+            } else {
+                this.drillUpButton.attr({
+                        text: this.getDrilldownBackText()
+                    })
+                    .align();
+            }
+
+            this.ddDupes.length = []; // #3315
+        };
+
+
+        ColumnSeries.prototype.supportsDrilldown = true;
+
+        /**
+         * When drilling up, keep the upper series invisible until the lower series has
+         * moved into place
+         */
+        ColumnSeries.prototype.animateDrillupTo = function(init) {
+            if (!init) {
+                var newSeries = this,
+                    level = newSeries.drilldownLevel;
+
+                each(this.points, function(point) {
+                    if (point.graphic) { // #3407
+                        point.graphic.hide();
+                    }
+                    if (point.dataLabel) {
+                        point.dataLabel.hide();
+                    }
+                    if (point.connector) {
+                        point.connector.hide();
+                    }
+                });
+
+
+                // Do dummy animation on first point to get to complete
+                setTimeout(function() {
+                    if (newSeries.points) { // May be destroyed in the meantime, #3389
+                        each(newSeries.points, function(point, i) {
+                            // Fade in other points			  
+                            var verb = i === (level && level.pointIndex) ? 'show' : 'fadeIn',
+                                inherit = verb === 'show' ? true : undefined;
+                            if (point.graphic) { // #3407
+                                point.graphic[verb](inherit);
+                            }
+                            if (point.dataLabel) {
+                                point.dataLabel[verb](inherit);
+                            }
+                            if (point.connector) {
+                                point.connector[verb](inherit);
+                            }
+                        });
+                    }
+                }, Math.max(this.chart.options.drilldown.animation.duration - 50, 0));
+
+                // Reset
+                this.animate = noop;
+            }
+
+        };
+
+        ColumnSeries.prototype.animateDrilldown = function(init) {
+            var series = this,
+                drilldownLevels = this.chart.drilldownLevels,
+                animateFrom,
+                animationOptions = this.chart.options.drilldown.animation,
+                xAxis = this.xAxis;
+
+            if (!init) {
+                each(drilldownLevels, function(level) {
+                    if (series.options._ddSeriesId === level.lowerSeriesOptions._ddSeriesId) {
+                        animateFrom = level.shapeArgs;
+
+                    }
+                });
+
+                animateFrom.x += (pick(xAxis.oldPos, xAxis.pos) - xAxis.pos);
+
+                each(this.points, function(point) {
+                    var animateTo = point.shapeArgs;
+
+
+
+                    if (point.graphic) {
+                        point.graphic
+                            .attr(animateFrom)
+                            .animate(
+                                extend(point.shapeArgs, {
+                                    fill: point.color || series.color
+                                }),
+                                animationOptions
+                            );
+                    }
+                    if (point.dataLabel) {
+                        point.dataLabel.fadeIn(animationOptions);
+                    }
+                });
+                this.animate = null;
+            }
+
+        };
+
+        /**
+         * When drilling up, pull out the individual point graphics from the lower series
+         * and animate them into the origin point in the upper series.
+         */
+        ColumnSeries.prototype.animateDrillupFrom = function(level) {
+            var animationOptions = this.chart.options.drilldown.animation,
+                group = this.group,
+                series = this;
+
+            // Cancel mouse events on the series group (#2787)
+            each(series.trackerGroups, function(key) {
+                if (series[key]) { // we don't always have dataLabelsGroup
+                    series[key].on('mouseover');
+                }
+            });
+
+
+            delete this.group;
+            each(this.points, function(point) {
+                var graphic = point.graphic,
+                    animateTo = level.shapeArgs,
+                    complete = function() {
+                        graphic.destroy();
+                        if (group) {
+                            group = group.destroy();
+                        }
+                    };
+
+                if (graphic) {
+
+                    delete point.graphic;
+
+
+
+                    if (animationOptions) {
+                        graphic.animate(
+                            animateTo,
+                            H.merge(animationOptions, {
+                                complete: complete
+                            })
+                        );
+                    } else {
+                        graphic.attr(animateTo);
+                        complete();
+                    }
+                }
+            });
+        };
+
+        if (PieSeries) {
+            extend(PieSeries.prototype, {
+                supportsDrilldown: true,
+                animateDrillupTo: ColumnSeries.prototype.animateDrillupTo,
+                animateDrillupFrom: ColumnSeries.prototype.animateDrillupFrom,
+
+                animateDrilldown: function(init) {
+                    var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
+                        animationOptions = this.chart.options.drilldown.animation,
+                        animateFrom = level.shapeArgs,
+                        start = animateFrom.start,
+                        angle = animateFrom.end - start,
+                        startAngle = angle / this.points.length;
+
+                    if (!init) {
+                        each(this.points, function(point, i) {
+                            var animateTo = point.shapeArgs;
+
+
+
+                            if (point.graphic) {
+                                point.graphic
+                                    .attr(H.merge(animateFrom, {
+                                        start: start + i * startAngle,
+                                        end: start + (i + 1) * startAngle
+                                    }))[animationOptions ? 'animate' : 'attr'](
+                                        animateTo,
+                                        animationOptions
+                                    );
+                            }
+                        });
+                        this.animate = null;
+                    }
+                }
+            });
+        }
+
+        H.Point.prototype.doDrilldown = function(_holdRedraw, category, originalEvent) {
+            var series = this.series,
+                chart = series.chart,
+                drilldown = chart.options.drilldown,
+                i = (drilldown.series || []).length,
+                seriesOptions;
+
+            if (!chart.ddDupes) {
+                chart.ddDupes = [];
+            }
+
+            while (i-- && !seriesOptions) {
+                if (drilldown.series[i].id === this.drilldown && inArray(this.drilldown, chart.ddDupes) === -1) {
+                    seriesOptions = drilldown.series[i];
+                    chart.ddDupes.push(this.drilldown);
+                }
+            }
+
+            // Fire the event. If seriesOptions is undefined, the implementer can check for 
+            // seriesOptions, and call addSeriesAsDrilldown async if necessary.
+            fireEvent(chart, 'drilldown', {
+                point: this,
+                seriesOptions: seriesOptions,
+                category: category,
+                originalEvent: originalEvent,
+                points: category !== undefined && this.series.xAxis.getDDPoints(category).slice(0)
+            }, function(e) {
+                var chart = e.point.series && e.point.series.chart,
+                    seriesOptions = e.seriesOptions;
+                if (chart && seriesOptions) {
+                    if (_holdRedraw) {
+                        chart.addSingleSeriesAsDrilldown(e.point, seriesOptions);
+                    } else {
+                        chart.addSeriesAsDrilldown(e.point, seriesOptions);
+                    }
+                }
+            });
+
+
+        };
+
+        /**
+         * Drill down to a given category. This is the same as clicking on an axis label.
+         */
+        H.Axis.prototype.drilldownCategory = function(x, e) {
+            var key,
+                point,
+                ddPointsX = this.getDDPoints(x);
+            for (key in ddPointsX) {
+                point = ddPointsX[key];
+                if (point && point.series && point.series.visible && point.doDrilldown) { // #3197
+                    point.doDrilldown(true, x, e);
+                }
+            }
+            this.chart.applyDrilldown();
+        };
+
+        /**
+         * Return drillable points for this specific X value
+         */
+        H.Axis.prototype.getDDPoints = function(x) {
+            var ret = [];
+            each(this.series, function(series) {
+                var i,
+                    xData = series.xData,
+                    points = series.points;
+
+                for (i = 0; i < xData.length; i++) {
+                    if (xData[i] === x && series.options.data[i] && series.options.data[i].drilldown) {
+                        ret.push(points ? points[i] : true);
+                        break;
+                    }
+                }
+            });
+            return ret;
+        };
+
+
+        /**
+         * Make a tick label drillable, or remove drilling on update
+         */
+        Tick.prototype.drillable = function() {
+            var pos = this.pos,
+                label = this.label,
+                axis = this.axis,
+                isDrillable = axis.coll === 'xAxis' && axis.getDDPoints,
+                ddPointsX = isDrillable && axis.getDDPoints(pos);
+
+            if (isDrillable) {
+                if (label && ddPointsX.length) {
+                    label.drillable = true;
+
+
+
+                    label
+                        .addClass('highcharts-drilldown-axis-label')
+
+                    .on('click', function(e) {
+                        axis.drilldownCategory(pos, e);
+                    });
+
+                } else if (label && label.drillable) {
+
+
+
+                    label.on('click', null); // #3806			
+                    label.removeClass('highcharts-drilldown-axis-label');
+                }
+            }
+        };
+
+        /**
+         * Always keep the drillability updated (#3951)
+         */
+        wrap(Tick.prototype, 'addLabel', function(proceed) {
+            proceed.call(this);
+            this.drillable();
+        });
+
+
+        /**
+         * On initialization of each point, identify its label and make it clickable. Also, provide a
+         * list of points associated to that label.
+         */
+        wrap(H.Point.prototype, 'init', function(proceed, series, options, x) {
+            var point = proceed.call(this, series, options, x),
+                xAxis = series.xAxis,
+                tick = xAxis && xAxis.ticks[x];
+
+            if (point.drilldown) {
+
+                // Add the click event to the point 
+                H.addEvent(point, 'click', function(e) {
+                    if (series.xAxis && series.chart.options.drilldown.allowPointDrilldown === false) {
+                        series.xAxis.drilldownCategory(point.x, e); // #5822, x changed
+                    } else {
+                        point.doDrilldown(undefined, undefined, e);
+                    }
+                });
+                /*wrap(point, 'importEvents', function (proceed) { // wrapping importEvents makes point.click event work
+                	if (!this.hasImportedEvents) {
+                		proceed.call(this);
+                		H.addEvent(this, 'click', function () {
+                			this.doDrilldown();
+                		});
+                	}
+                });*/
+
+            }
+
+            // Add or remove click handler and style on the tick label
+            if (tick) {
+                tick.drillable();
+            }
+
+            return point;
+        });
+
+        wrap(H.Series.prototype, 'drawDataLabels', function(proceed) {
+            var css = this.chart.options.drilldown.activeDataLabelStyle,
+                renderer = this.chart.renderer;
+
+            proceed.call(this);
+
+            each(this.points, function(point) {
+                var pointCSS = {};
+                if (point.drilldown && point.dataLabel) {
+                    if (css.color === 'contrast') {
+                        pointCSS.color = renderer.getContrast(point.color || this.color);
+                    }
+                    point.dataLabel
+                        .addClass('highcharts-drilldown-data-label');
+
+
+                }
+            }, this);
+        });
+
+        // Mark the trackers with a pointer 
+        var type,
+            drawTrackerWrapper = function(proceed) {
+                proceed.call(this);
+                each(this.points, function(point) {
+                    if (point.drilldown && point.graphic) {
+                        point.graphic.addClass('highcharts-drilldown-point');
+
+
+                    }
+                });
+            };
+        for (type in seriesTypes) {
+            if (seriesTypes[type].prototype.supportsDrilldown) {
+                wrap(seriesTypes[type].prototype, 'drawTracker', drawTrackerWrapper);
+            }
+        }
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 26 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/exporting.js


+ 953 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/exporting.src.js

@@ -0,0 +1,953 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * Exporting module
+ *
+ * (c) 2010-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * Exporting module
+         *
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+
+        /* eslint indent:0 */
+        'use strict';
+
+        // create shortcuts
+        var defaultOptions = H.defaultOptions,
+            doc = H.doc,
+            Chart = H.Chart,
+            addEvent = H.addEvent,
+            removeEvent = H.removeEvent,
+            fireEvent = H.fireEvent,
+            createElement = H.createElement,
+            discardElement = H.discardElement,
+            css = H.css,
+            merge = H.merge,
+            pick = H.pick,
+            each = H.each,
+            extend = H.extend,
+            isTouchDevice = H.isTouchDevice,
+            win = H.win,
+            SVGRenderer = H.SVGRenderer;
+
+        var symbols = H.Renderer.prototype.symbols;
+
+        // Add language
+        extend(defaultOptions.lang, {
+            printChart: 'Print chart',
+            downloadPNG: 'Download PNG image',
+            downloadJPEG: 'Download JPEG image',
+            downloadPDF: 'Download PDF document',
+            downloadSVG: 'Download SVG vector image',
+            contextButtonTitle: 'Chart context menu'
+        });
+
+        // Buttons and menus are collected in a separate config option set called 'navigation'.
+        // This can be extended later to add control buttons like zoom and pan right click menus.
+        defaultOptions.navigation = {
+            buttonOptions: {
+                theme: {},
+                symbolSize: 14,
+                symbolX: 12.5,
+                symbolY: 10.5,
+                align: 'right',
+                buttonSpacing: 3,
+                height: 22,
+                // text: null,
+                verticalAlign: 'top',
+                width: 24
+            }
+        };
+
+
+
+
+        // Add the export related options
+        defaultOptions.exporting = {
+            //enabled: true,
+            //filename: 'chart',
+            type: 'image/png',
+            url: 'https://export.highcharts.com/',
+            //width: undefined,
+            printMaxWidth: 780,
+            scale: 2,
+            buttons: {
+                contextButton: {
+                    className: 'highcharts-contextbutton',
+                    menuClassName: 'highcharts-contextmenu',
+                    //x: -10,
+                    symbol: 'menu',
+                    _titleKey: 'contextButtonTitle',
+                    menuItems: [{
+                            textKey: 'printChart',
+                            onclick: function() {
+                                this.print();
+                            }
+                        }, {
+                            separator: true
+                        }, {
+                            textKey: 'downloadPNG',
+                            onclick: function() {
+                                this.exportChart();
+                            }
+                        }, {
+                            textKey: 'downloadJPEG',
+                            onclick: function() {
+                                this.exportChart({
+                                    type: 'image/jpeg'
+                                });
+                            }
+                        }, {
+                            textKey: 'downloadPDF',
+                            onclick: function() {
+                                this.exportChart({
+                                    type: 'application/pdf'
+                                });
+                            }
+                        }, {
+                            textKey: 'downloadSVG',
+                            onclick: function() {
+                                this.exportChart({
+                                    type: 'image/svg+xml'
+                                });
+                            }
+                        }
+                        // Enable this block to add "View SVG" to the dropdown menu
+                        /*
+                        ,{
+
+                        	text: 'View SVG',
+                        	onclick: function () {
+                        		var svg = this.getSVG()
+                        			.replace(/</g, '\n&lt;')
+                        			.replace(/>/g, '&gt;');
+
+                        		doc.body.innerHTML = '<pre>' + svg + '</pre>';
+                        	}
+                        } // */
+                    ]
+                }
+            }
+        };
+
+        // Add the H.post utility
+        H.post = function(url, data, formAttributes) {
+            var name,
+                form;
+
+            // create the form
+            form = createElement('form', merge({
+                method: 'post',
+                action: url,
+                enctype: 'multipart/form-data'
+            }, formAttributes), {
+                display: 'none'
+            }, doc.body);
+
+            // add the data
+            for (name in data) {
+                createElement('input', {
+                    type: 'hidden',
+                    name: name,
+                    value: data[name]
+                }, null, form);
+            }
+
+            // submit
+            form.submit();
+
+            // clean up
+            discardElement(form);
+        };
+
+        extend(Chart.prototype, {
+
+            /**
+             * A collection of fixes on the produced SVG to account for expando properties,
+             * browser bugs, VML problems and other. Returns a cleaned SVG.
+             */
+            sanitizeSVG: function(svg, options) {
+                // Move HTML into a foreignObject
+                if (options && options.exporting && options.exporting.allowHTML) {
+                    var html = svg.match(/<\/svg>(.*?$)/);
+                    if (html) {
+                        html = '<foreignObject x="0" y="0" ' +
+                            'width="' + options.chart.width + '" ' +
+                            'height="' + options.chart.height + '">' +
+                            '<body xmlns="http://www.w3.org/1999/xhtml">' +
+                            html[1] +
+                            '</body>' +
+                            '</foreignObject>';
+                        svg = svg.replace('</svg>', html + '</svg>');
+                    }
+                }
+
+                svg = svg
+                    .replace(/zIndex="[^"]+"/g, '')
+                    .replace(/isShadow="[^"]+"/g, '')
+                    .replace(/symbolName="[^"]+"/g, '')
+                    .replace(/jQuery[0-9]+="[^"]+"/g, '')
+                    .replace(/url\(("|&quot;)(\S+)("|&quot;)\)/g, 'url($2)')
+                    .replace(/url\([^#]+#/g, 'url(#')
+                    .replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ')
+                    .replace(/ (NS[0-9]+\:)?href=/g, ' xlink:href=') // #3567
+                    .replace(/\n/, ' ')
+                    // Any HTML added to the container after the SVG (#894)
+                    .replace(/<\/svg>.*?$/, '</svg>')
+                    // Batik doesn't support rgba fills and strokes (#3095)
+                    .replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g, '$1="rgb($2)" $1-opacity="$3"')
+                    /* This fails in IE < 8
+                    .replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight
+                    	return s2 +'.'+ s3[0];
+                    })*/
+
+                // Replace HTML entities, issue #347
+                .replace(/&nbsp;/g, '\u00A0') // no-break space
+                    .replace(/&shy;/g, '\u00AD'); // soft hyphen
+
+
+
+                return svg;
+            },
+
+            /**
+             * Return innerHTML of chart. Used as hook for plugins.
+             */
+            getChartHTML: function() {
+
+                this.inlineStyles();
+
+                return this.container.innerHTML;
+            },
+
+            /**
+             * Return an SVG representation of the chart.
+             *
+             * @param additionalOptions {Object} Additional chart options for the
+             *    generated SVG representation. For collections like `xAxis`, `yAxis` or
+             *    `series`, the additional options is either merged in to the orininal
+             *    item of the same `id`, or to the first item if a commin id is not
+             *    found.
+             */
+            getSVG: function(additionalOptions) {
+                var chart = this,
+                    chartCopy,
+                    sandbox,
+                    svg,
+                    seriesOptions,
+                    sourceWidth,
+                    sourceHeight,
+                    cssWidth,
+                    cssHeight,
+                    options = merge(chart.options, additionalOptions); // copy the options and add extra options
+
+
+                // IE compatibility hack for generating SVG content that it doesn't really understand
+                if (!doc.createElementNS) {
+                    doc.createElementNS = function(ns, tagName) {
+                        return doc.createElement(tagName);
+                    };
+                }
+
+                // create a sandbox where a new chart will be generated
+                sandbox = createElement('div', null, {
+                    position: 'absolute',
+                    top: '-9999em',
+                    width: chart.chartWidth + 'px',
+                    height: chart.chartHeight + 'px'
+                }, doc.body);
+
+                // get the source size
+                cssWidth = chart.renderTo.style.width;
+                cssHeight = chart.renderTo.style.height;
+                sourceWidth = options.exporting.sourceWidth ||
+                    options.chart.width ||
+                    (/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||
+                    600;
+                sourceHeight = options.exporting.sourceHeight ||
+                    options.chart.height ||
+                    (/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||
+                    400;
+
+                // override some options
+                extend(options.chart, {
+                    animation: false,
+                    renderTo: sandbox,
+                    forExport: true,
+                    renderer: 'SVGRenderer',
+                    width: sourceWidth,
+                    height: sourceHeight
+                });
+                options.exporting.enabled = false; // hide buttons in print
+                delete options.data; // #3004
+
+                // prepare for replicating the chart
+                options.series = [];
+                each(chart.series, function(serie) {
+                    seriesOptions = merge(serie.userOptions, { // #4912
+                        animation: false, // turn off animation
+                        enableMouseTracking: false,
+                        showCheckbox: false,
+                        visible: serie.visible
+                    });
+
+                    if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set
+                        options.series.push(seriesOptions);
+                    }
+                });
+
+                // Assign an internal key to ensure a one-to-one mapping (#5924)
+                each(chart.axes, function(axis) {
+                    axis.userOptions.internalKey = H.uniqueKey();
+                });
+
+                // generate the chart copy
+                chartCopy = new H.Chart(options, chart.callback);
+
+                // Axis options and series options  (#2022, #3900, #5982)
+                if (additionalOptions) {
+                    each(['xAxis', 'yAxis', 'series'], function(coll) {
+                        var collOptions = {};
+                        if (additionalOptions[coll]) {
+                            collOptions[coll] = additionalOptions[coll];
+                            chartCopy.update(collOptions);
+                        }
+                    });
+                }
+
+                // Reflect axis extremes in the export (#5924)
+                each(chart.axes, function(axis) {
+                    var axisCopy = H.find(chartCopy.axes, function(copy) {
+                            return copy.options.internalKey ===
+                                axis.userOptions.internalKey;
+                        }),
+                        extremes = axis.getExtremes(),
+                        userMin = extremes.userMin,
+                        userMax = extremes.userMax;
+
+                    if (axisCopy && (userMin !== undefined || userMax !== undefined)) {
+                        axisCopy.setExtremes(userMin, userMax, true, false);
+                    }
+                });
+
+                // Get the SVG from the container's innerHTML
+                svg = chartCopy.getChartHTML();
+
+                svg = chart.sanitizeSVG(svg, options);
+
+                // free up memory
+                options = null;
+                chartCopy.destroy();
+                discardElement(sandbox);
+
+                return svg;
+            },
+
+            getSVGForExport: function(options, chartOptions) {
+                var chartExportingOptions = this.options.exporting;
+
+                return this.getSVG(merge({
+                        chart: {
+                            borderRadius: 0
+                        }
+                    },
+                    chartExportingOptions.chartOptions,
+                    chartOptions, {
+                        exporting: {
+                            sourceWidth: (options && options.sourceWidth) || chartExportingOptions.sourceWidth,
+                            sourceHeight: (options && options.sourceHeight) || chartExportingOptions.sourceHeight
+                        }
+                    }
+                ));
+            },
+
+            /**
+             * Submit the SVG representation of the chart to the server
+             * @param {Object} options Exporting options. Possible members are url, type, width and formAttributes.
+             * @param {Object} chartOptions Additional chart options for the SVG representation of the chart
+             */
+            exportChart: function(options, chartOptions) {
+
+                var svg = this.getSVGForExport(options, chartOptions);
+
+                // merge the options
+                options = merge(this.options.exporting, options);
+
+                // do the post
+                H.post(options.url, {
+                    filename: options.filename || 'chart',
+                    type: options.type,
+                    width: options.width || 0, // IE8 fails to post undefined correctly, so use 0
+                    scale: options.scale,
+                    svg: svg
+                }, options.formAttributes);
+
+            },
+
+            /**
+             * Print the chart
+             */
+            print: function() {
+
+                var chart = this,
+                    container = chart.container,
+                    origDisplay = [],
+                    origParent = container.parentNode,
+                    body = doc.body,
+                    childNodes = body.childNodes,
+                    printMaxWidth = chart.options.exporting.printMaxWidth,
+                    resetParams,
+                    handleMaxWidth;
+
+                if (chart.isPrinting) { // block the button while in printing mode
+                    return;
+                }
+
+                chart.isPrinting = true;
+                chart.pointer.reset(null, 0);
+
+                fireEvent(chart, 'beforePrint');
+
+                // Handle printMaxWidth
+                handleMaxWidth = printMaxWidth && chart.chartWidth > printMaxWidth;
+                if (handleMaxWidth) {
+                    resetParams = [chart.options.chart.width, undefined, false];
+                    chart.setSize(printMaxWidth, undefined, false);
+                }
+
+                // hide all body content
+                each(childNodes, function(node, i) {
+                    if (node.nodeType === 1) {
+                        origDisplay[i] = node.style.display;
+                        node.style.display = 'none';
+                    }
+                });
+
+                // pull out the chart
+                body.appendChild(container);
+
+                // print
+                win.focus(); // #1510
+                win.print();
+
+                // allow the browser to prepare before reverting
+                setTimeout(function() {
+
+                    // put the chart back in
+                    origParent.appendChild(container);
+
+                    // restore all body content
+                    each(childNodes, function(node, i) {
+                        if (node.nodeType === 1) {
+                            node.style.display = origDisplay[i];
+                        }
+                    });
+
+                    chart.isPrinting = false;
+
+                    // Reset printMaxWidth
+                    if (handleMaxWidth) {
+                        chart.setSize.apply(chart, resetParams);
+                    }
+
+                    fireEvent(chart, 'afterPrint');
+
+                }, 1000);
+
+            },
+
+            /**
+             * Display a popup menu for choosing the export type
+             *
+             * @param {String} className An identifier for the menu
+             * @param {Array} items A collection with text and onclicks for the items
+             * @param {Number} x The x position of the opener button
+             * @param {Number} y The y position of the opener button
+             * @param {Number} width The width of the opener button
+             * @param {Number} height The height of the opener button
+             */
+            contextMenu: function(className, items, x, y, width, height, button) {
+                var chart = this,
+                    navOptions = chart.options.navigation,
+                    chartWidth = chart.chartWidth,
+                    chartHeight = chart.chartHeight,
+                    cacheName = 'cache-' + className,
+                    menu = chart[cacheName],
+                    menuPadding = Math.max(width, height), // for mouse leave detection
+                    innerMenu,
+                    hide,
+                    menuStyle,
+                    removeMouseUp;
+
+                // create the menu only the first time
+                if (!menu) {
+
+                    // create a HTML element above the SVG
+                    chart[cacheName] = menu = createElement('div', {
+                        className: className
+                    }, {
+                        position: 'absolute',
+                        zIndex: 1000,
+                        padding: menuPadding + 'px'
+                    }, chart.container);
+
+                    innerMenu = createElement('div', {
+                        className: 'highcharts-menu'
+                    }, null, menu);
+
+
+
+                    // hide on mouse out
+                    hide = function() {
+                        css(menu, {
+                            display: 'none'
+                        });
+                        if (button) {
+                            button.setState(0);
+                        }
+                        chart.openMenu = false;
+                    };
+
+                    // Hide the menu some time after mouse leave (#1357)
+                    addEvent(menu, 'mouseleave', function() {
+                        menu.hideTimer = setTimeout(hide, 500);
+                    });
+                    addEvent(menu, 'mouseenter', function() {
+                        clearTimeout(menu.hideTimer);
+                    });
+
+
+                    // Hide it on clicking or touching outside the menu (#2258, #2335,
+                    // #2407)
+                    removeMouseUp = addEvent(doc, 'mouseup', function(e) {
+                        if (!chart.pointer.inClass(e.target, className)) {
+                            hide();
+                        }
+                    });
+                    addEvent(chart, 'destroy', removeMouseUp);
+
+
+                    // create the items
+                    each(items, function(item) {
+                        if (item) {
+                            var element;
+
+                            if (item.separator) {
+                                element = createElement('hr', null, null, innerMenu);
+
+                            } else {
+                                element = createElement('div', {
+                                    className: 'highcharts-menu-item',
+                                    onclick: function(e) {
+                                        if (e) { // IE7
+                                            e.stopPropagation();
+                                        }
+                                        hide();
+                                        if (item.onclick) {
+                                            item.onclick.apply(chart, arguments);
+                                        }
+                                    },
+                                    innerHTML: item.text || chart.options.lang[item.textKey]
+                                }, null, innerMenu);
+
+
+                            }
+
+                            // Keep references to menu divs to be able to destroy them
+                            chart.exportDivElements.push(element);
+                        }
+                    });
+
+                    // Keep references to menu and innerMenu div to be able to destroy them
+                    chart.exportDivElements.push(innerMenu, menu);
+
+                    chart.exportMenuWidth = menu.offsetWidth;
+                    chart.exportMenuHeight = menu.offsetHeight;
+                }
+
+                menuStyle = {
+                    display: 'block'
+                };
+
+                // if outside right, right align it
+                if (x + chart.exportMenuWidth > chartWidth) {
+                    menuStyle.right = (chartWidth - x - width - menuPadding) + 'px';
+                } else {
+                    menuStyle.left = (x - menuPadding) + 'px';
+                }
+                // if outside bottom, bottom align it
+                if (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') {
+                    menuStyle.bottom = (chartHeight - y - menuPadding) + 'px';
+                } else {
+                    menuStyle.top = (y + height - menuPadding) + 'px';
+                }
+
+                css(menu, menuStyle);
+                chart.openMenu = true;
+            },
+
+            /**
+             * Add the export button to the chart
+             */
+            addButton: function(options) {
+                var chart = this,
+                    renderer = chart.renderer,
+                    btnOptions = merge(chart.options.navigation.buttonOptions, options),
+                    onclick = btnOptions.onclick,
+                    menuItems = btnOptions.menuItems,
+                    symbol,
+                    button,
+                    symbolSize = btnOptions.symbolSize || 12;
+                if (!chart.btnCount) {
+                    chart.btnCount = 0;
+                }
+
+                // Keeps references to the button elements
+                if (!chart.exportDivElements) {
+                    chart.exportDivElements = [];
+                    chart.exportSVGElements = [];
+                }
+
+                if (btnOptions.enabled === false) {
+                    return;
+                }
+
+
+                var attr = btnOptions.theme,
+                    states = attr.states,
+                    hover = states && states.hover,
+                    select = states && states.select,
+                    callback;
+
+                delete attr.states;
+
+                if (onclick) {
+                    callback = function(e) {
+                        e.stopPropagation();
+                        onclick.call(chart, e);
+                    };
+
+                } else if (menuItems) {
+                    callback = function() {
+                        chart.contextMenu(
+                            button.menuClassName,
+                            menuItems,
+                            button.translateX,
+                            button.translateY,
+                            button.width,
+                            button.height,
+                            button
+                        );
+                        button.setState(2);
+                    };
+                }
+
+
+                if (btnOptions.text && btnOptions.symbol) {
+                    attr.paddingLeft = pick(attr.paddingLeft, 25);
+
+                } else if (!btnOptions.text) {
+                    extend(attr, {
+                        width: btnOptions.width,
+                        height: btnOptions.height,
+                        padding: 0
+                    });
+                }
+
+                button = renderer.button(btnOptions.text, 0, 0, callback, attr, hover, select)
+                    .addClass(options.className)
+                    .attr({
+
+                        title: chart.options.lang[btnOptions._titleKey],
+                        zIndex: 3 // #4955
+                    });
+                button.menuClassName = options.menuClassName || 'highcharts-menu-' + chart.btnCount++;
+
+                if (btnOptions.symbol) {
+                    symbol = renderer.symbol(
+                            btnOptions.symbol,
+                            btnOptions.symbolX - (symbolSize / 2),
+                            btnOptions.symbolY - (symbolSize / 2),
+                            symbolSize,
+                            symbolSize
+                        )
+                        .addClass('highcharts-button-symbol')
+                        .attr({
+                            zIndex: 1
+                        }).add(button);
+
+
+                }
+
+                button.add()
+                    .align(extend(btnOptions, {
+                        width: button.width,
+                        x: pick(btnOptions.x, chart.buttonOffset) // #1654
+                    }), true, 'spacingBox');
+
+                chart.buttonOffset += (button.width + btnOptions.buttonSpacing) * (btnOptions.align === 'right' ? -1 : 1);
+
+                chart.exportSVGElements.push(button, symbol);
+
+            },
+
+            /**
+             * Destroy the buttons.
+             */
+            destroyExport: function(e) {
+                var chart = e ? e.target : this,
+                    exportSVGElements = chart.exportSVGElements,
+                    exportDivElements = chart.exportDivElements;
+
+                // Destroy the extra buttons added
+                if (exportSVGElements) {
+                    each(exportSVGElements, function(elem, i) {
+
+                        // Destroy and null the svg/vml elements
+                        if (elem) { // #1822
+                            elem.onclick = elem.ontouchstart = null;
+                            chart.exportSVGElements[i] = elem.destroy();
+                        }
+                    });
+                    exportSVGElements.length = 0;
+                }
+
+                // Destroy the divs for the menu
+                if (exportDivElements) {
+                    each(exportDivElements, function(elem, i) {
+
+                        // Remove the event handler
+                        clearTimeout(elem.hideTimer); // #5427
+                        removeEvent(elem, 'mouseleave');
+
+                        // Remove inline events
+                        chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null;
+
+                        // Destroy the div by moving to garbage bin
+                        discardElement(elem);
+                    });
+                    exportDivElements.length = 0;
+                }
+            }
+        });
+
+
+        // These ones are translated to attributes rather than styles
+        SVGRenderer.prototype.inlineToAttributes = [
+            'fill',
+            'stroke',
+            'strokeLinecap',
+            'strokeLinejoin',
+            'strokeWidth',
+            'textAnchor',
+            'x',
+            'y'
+        ];
+        // These CSS properties are not inlined. Remember camelCase.
+        SVGRenderer.prototype.inlineBlacklist = [
+            /-/, // In Firefox, both hyphened and camelCased names are listed
+            /^(clipPath|cssText|d|height|width)$/, // Full words
+            /^font$/, // more specific props are set
+            /[lL]ogical(Width|Height)$/,
+            /perspective/,
+            /TapHighlightColor/,
+            /^transition/
+            // /^text (border|color|cursor|height|webkitBorder)/
+        ];
+        SVGRenderer.prototype.unstyledElements = [
+            'clipPath',
+            'defs',
+            'desc'
+        ];
+
+        /**
+         * Analyze inherited styles from stylesheets and add them inline
+         *
+         * @todo: What are the border styles for text about? In general, text has a lot of properties.
+         * @todo: Make it work with IE9 and IE10.
+         */
+        Chart.prototype.inlineStyles = function() {
+            var renderer = this.renderer,
+                inlineToAttributes = renderer.inlineToAttributes,
+                blacklist = renderer.inlineBlacklist,
+                unstyledElements = renderer.unstyledElements,
+                defaultStyles = {},
+                dummySVG;
+
+            /**
+             * Make hyphenated property names out of camelCase
+             */
+            function hyphenate(prop) {
+                return prop.replace(
+                    /([A-Z])/g,
+                    function(a, b) {
+                        return '-' + b.toLowerCase();
+                    }
+                );
+            }
+
+            /**
+             * Call this on all elements and recurse to children
+             */
+            function recurse(node) {
+                var prop,
+                    styles,
+                    parentStyles,
+                    cssText = '',
+                    dummy,
+                    styleAttr,
+                    blacklisted,
+                    i;
+
+                if (node.nodeType === 1 && unstyledElements.indexOf(node.nodeName) === -1) {
+                    styles = win.getComputedStyle(node, null);
+                    parentStyles = node.nodeName === 'svg' ? {} : win.getComputedStyle(node.parentNode, null);
+
+                    // Get default styles from the browser so that we don't have to add these
+                    if (!defaultStyles[node.nodeName]) {
+                        if (!dummySVG) {
+                            dummySVG = doc.createElementNS(H.SVG_NS, 'svg');
+                            dummySVG.setAttribute('version', '1.1');
+                            doc.body.appendChild(dummySVG);
+                        }
+                        dummy = doc.createElementNS(node.namespaceURI, node.nodeName);
+                        dummySVG.appendChild(dummy);
+                        defaultStyles[node.nodeName] = merge(win.getComputedStyle(dummy, null)); // Copy, so we can remove the node
+                        dummySVG.removeChild(dummy);
+                    }
+
+                    // Loop over all the computed styles and check whether they are in the 
+                    // white list for styles or atttributes.
+                    for (prop in styles) {
+
+                        // Check against blacklist
+                        blacklisted = false;
+                        i = blacklist.length;
+                        while (i-- && !blacklisted) {
+                            blacklisted = blacklist[i].test(prop) || typeof styles[prop] === 'function';
+                        }
+
+                        if (!blacklisted) {
+
+                            // If parent node has the same style, it gets inherited, no need to inline it
+                            if (parentStyles[prop] !== styles[prop] && defaultStyles[node.nodeName][prop] !== styles[prop]) {
+
+                                // Attributes
+                                if (inlineToAttributes.indexOf(prop) !== -1) {
+                                    node.setAttribute(hyphenate(prop), styles[prop]);
+
+                                    // Styles
+                                } else {
+                                    cssText += hyphenate(prop) + ':' + styles[prop] + ';';
+                                }
+                            }
+                        }
+                    }
+
+                    // Apply styles
+                    if (cssText) {
+                        styleAttr = node.getAttribute('style');
+                        node.setAttribute('style', (styleAttr ? styleAttr + ';' : '') + cssText);
+                    }
+
+                    if (node.nodeName === 'text') {
+                        return;
+                    }
+
+                    // Recurse
+                    each(node.children || node.childNodes, recurse);
+                }
+            }
+
+            /**
+             * Remove the dummy objects used to get defaults
+             */
+            function tearDown() {
+                dummySVG.parentNode.removeChild(dummySVG);
+            }
+
+            recurse(this.container.querySelector('svg'));
+            tearDown();
+
+        };
+
+
+
+        symbols.menu = function(x, y, width, height) {
+            var arr = [
+                'M', x, y + 2.5,
+                'L', x + width, y + 2.5,
+                'M', x, y + height / 2 + 0.5,
+                'L', x + width, y + height / 2 + 0.5,
+                'M', x, y + height - 1.5,
+                'L', x + width, y + height - 1.5
+            ];
+            return arr;
+        };
+
+        // Add the buttons on chart load
+        Chart.prototype.renderExporting = function() {
+            var n,
+                exportingOptions = this.options.exporting,
+                buttons = exportingOptions.buttons,
+                isDirty = this.isDirtyExporting || !this.exportSVGElements;
+
+            this.buttonOffset = 0;
+            if (this.isDirtyExporting) {
+                this.destroyExport();
+            }
+
+            if (isDirty && exportingOptions.enabled !== false) {
+
+                for (n in buttons) {
+                    this.addButton(buttons[n]);
+                }
+
+                this.isDirtyExporting = false;
+            }
+
+            // Destroy the export elements at chart destroy
+            addEvent(this, 'destroy', this.destroyExport);
+        };
+
+        Chart.prototype.callbacks.push(function(chart) {
+
+            function update(prop, options, redraw) {
+                chart.isDirtyExporting = true;
+                merge(true, chart.options[prop], options);
+                if (pick(redraw, true)) {
+                    chart.redraw();
+                }
+
+            }
+
+            chart.renderExporting();
+
+            addEvent(chart, 'redraw', chart.renderExporting);
+
+            // Add update methods to handle chart.update and chart.exporting.update
+            // and chart.navigation.update.
+            each(['exporting', 'navigation'], function(prop) {
+                chart[prop] = {
+                    update: function(options, redraw) {
+                        update(prop, options, redraw);
+                    }
+                };
+            });
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 12 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/funnel.js


+ 290 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/funnel.src.js

@@ -0,0 +1,290 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * Highcharts funnel module
+ *
+ * (c) 2010-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * Highcharts funnel module
+         *
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+        /* eslint indent:0 */
+        'use strict';
+
+        // create shortcuts
+        var seriesType = Highcharts.seriesType,
+            seriesTypes = Highcharts.seriesTypes,
+            noop = Highcharts.noop,
+            each = Highcharts.each;
+
+
+        seriesType('funnel', 'pie', {
+                animation: false,
+                center: ['50%', '50%'],
+                width: '90%',
+                neckWidth: '30%',
+                height: '100%',
+                neckHeight: '25%',
+                reversed: false,
+                size: true, // to avoid adapting to data label size in Pie.drawDataLabels
+
+
+            },
+
+            // Properties
+            {
+                animate: noop,
+
+                /**
+                 * Overrides the pie translate method
+                 */
+                translate: function() {
+
+                    var
+                    // Get positions - either an integer or a percentage string must be given
+                        getLength = function(length, relativeTo) {
+                            return (/%$/).test(length) ?
+                                relativeTo * parseInt(length, 10) / 100 :
+                                parseInt(length, 10);
+                        },
+
+                        sum = 0,
+                        series = this,
+                        chart = series.chart,
+                        options = series.options,
+                        reversed = options.reversed,
+                        ignoreHiddenPoint = options.ignoreHiddenPoint,
+                        plotWidth = chart.plotWidth,
+                        plotHeight = chart.plotHeight,
+                        cumulative = 0, // start at top
+                        center = options.center,
+                        centerX = getLength(center[0], plotWidth),
+                        centerY = getLength(center[1], plotHeight),
+                        width = getLength(options.width, plotWidth),
+                        tempWidth,
+                        getWidthAt,
+                        height = getLength(options.height, plotHeight),
+                        neckWidth = getLength(options.neckWidth, plotWidth),
+                        neckHeight = getLength(options.neckHeight, plotHeight),
+                        neckY = (centerY - height / 2) + height - neckHeight,
+                        data = series.data,
+                        path,
+                        fraction,
+                        half = options.dataLabels.position === 'left' ? 1 : 0,
+
+                        x1,
+                        y1,
+                        x2,
+                        x3,
+                        y3,
+                        x4,
+                        y5;
+
+                    // Return the width at a specific y coordinate
+                    series.getWidthAt = getWidthAt = function(y) {
+                        var top = (centerY - height / 2);
+
+                        return y > neckY || height === neckHeight ?
+                            neckWidth :
+                            neckWidth + (width - neckWidth) * (1 - (y - top) / (height - neckHeight));
+                    };
+                    series.getX = function(y, half) {
+                        return centerX + (half ? -1 : 1) * ((getWidthAt(reversed ? 2 * centerY - y : y) / 2) + options.dataLabels.distance);
+                    };
+
+                    // Expose
+                    series.center = [centerX, centerY, height];
+                    series.centerX = centerX;
+
+                    /*
+                     * Individual point coordinate naming:
+                     *
+                     * x1,y1 _________________ x2,y1
+                     *  \                         /
+                     *   \                       /
+                     *    \                     /
+                     *     \                   /
+                     *      \                 /
+                     *     x3,y3 _________ x4,y3
+                     *
+                     * Additional for the base of the neck:
+                     *
+                     *       |               |
+                     *       |               |
+                     *       |               |
+                     *     x3,y5 _________ x4,y5
+                     */
+
+
+
+
+                    // get the total sum
+                    each(data, function(point) {
+                        if (!ignoreHiddenPoint || point.visible !== false) {
+                            sum += point.y;
+                        }
+                    });
+
+                    each(data, function(point) {
+                        // set start and end positions
+                        y5 = null;
+                        fraction = sum ? point.y / sum : 0;
+                        y1 = centerY - height / 2 + cumulative * height;
+                        y3 = y1 + fraction * height;
+                        //tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));
+                        tempWidth = getWidthAt(y1);
+                        x1 = centerX - tempWidth / 2;
+                        x2 = x1 + tempWidth;
+                        tempWidth = getWidthAt(y3);
+                        x3 = centerX - tempWidth / 2;
+                        x4 = x3 + tempWidth;
+
+                        // the entire point is within the neck
+                        if (y1 > neckY) {
+                            x1 = x3 = centerX - neckWidth / 2;
+                            x2 = x4 = centerX + neckWidth / 2;
+
+                            // the base of the neck
+                        } else if (y3 > neckY) {
+                            y5 = y3;
+
+                            tempWidth = getWidthAt(neckY);
+                            x3 = centerX - tempWidth / 2;
+                            x4 = x3 + tempWidth;
+
+                            y3 = neckY;
+                        }
+
+                        if (reversed) {
+                            y1 = 2 * centerY - y1;
+                            y3 = 2 * centerY - y3;
+                            y5 = (y5 ? 2 * centerY - y5 : null);
+                        }
+                        // save the path
+                        path = [
+                            'M',
+                            x1, y1,
+                            'L',
+                            x2, y1,
+                            x4, y3
+                        ];
+                        if (y5) {
+                            path.push(x4, y5, x3, y5);
+                        }
+                        path.push(x3, y3, 'Z');
+
+                        // prepare for using shared dr
+                        point.shapeType = 'path';
+                        point.shapeArgs = {
+                            d: path
+                        };
+
+
+                        // for tooltips and data labels
+                        point.percentage = fraction * 100;
+                        point.plotX = centerX;
+                        point.plotY = (y1 + (y5 || y3)) / 2;
+
+                        // Placement of tooltips and data labels
+                        point.tooltipPos = [
+                            centerX,
+                            point.plotY
+                        ];
+
+                        // Slice is a noop on funnel points
+                        point.slice = noop;
+
+                        // Mimicking pie data label placement logic
+                        point.half = half;
+
+                        if (!ignoreHiddenPoint || point.visible !== false) {
+                            cumulative += fraction;
+                        }
+                    });
+                },
+                /**
+                 * Draw a single point (wedge)
+                 * @param {Object} point The point object
+                 * @param {Object} color The color of the point
+                 * @param {Number} brightness The brightness relative to the color
+                 */
+                drawPoints: seriesTypes.column.prototype.drawPoints,
+
+                /**
+                 * Funnel items don't have angles (#2289)
+                 */
+                sortByAngle: function(points) {
+                    points.sort(function(a, b) {
+                        return a.plotY - b.plotY;
+                    });
+                },
+
+                /**
+                 * Extend the pie data label method
+                 */
+                drawDataLabels: function() {
+                    var data = this.data,
+                        labelDistance = this.options.dataLabels.distance,
+                        leftSide,
+                        sign,
+                        point,
+                        i = data.length,
+                        x,
+                        y;
+
+                    // In the original pie label anticollision logic, the slots are distributed
+                    // from one labelDistance above to one labelDistance below the pie. In funnels
+                    // we don't want this.
+                    this.center[2] -= 2 * labelDistance;
+
+                    // Set the label position array for each point.
+                    while (i--) {
+                        point = data[i];
+                        leftSide = point.half;
+                        sign = leftSide ? 1 : -1;
+                        y = point.plotY;
+                        x = this.getX(y, leftSide);
+
+                        // set the anchor point for data labels
+                        point.labelPos = [
+                            0, // first break of connector
+                            y, // a/a
+                            x + (labelDistance - 5) * sign, // second break, right outside point shape
+                            y, // a/a
+                            x + labelDistance * sign, // landing point for connector
+                            y, // a/a
+                            leftSide ? 'right' : 'left', // alignment
+                            0 // center angle
+                        ];
+                    }
+
+                    seriesTypes.pie.prototype.drawDataLabels.call(this);
+                }
+
+            });
+
+        /** 
+         * Pyramid series type.
+         * A pyramid series is a special type of funnel, without neck and reversed by default.
+         */
+        seriesType('pyramid', 'funnel', {
+            neckWidth: '0%',
+            neckHeight: '0%',
+            reversed: true
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 24 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/gantt.js


+ 791 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/gantt.src.js

@@ -0,0 +1,791 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * Gantt series
+ *
+ * (c) 2016 Lars A. V. Cabrera
+ *
+ * --- WORK IN PROGRESS ---
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2016 Highsoft AS
+         * Authors: Lars A. V. Cabrera
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+
+        var dateFormat = H.dateFormat,
+            each = H.each,
+            isObject = H.isObject,
+            pick = H.pick,
+            wrap = H.wrap,
+            Axis = H.Axis,
+            Chart = H.Chart,
+            Tick = H.Tick;
+
+
+        // Enum for which side the axis is on.
+        // Maps to axis.side
+        var axisSide = {
+            top: 0,
+            right: 1,
+            bottom: 2,
+            left: 3,
+            0: 'top',
+            1: 'right',
+            2: 'bottom',
+            3: 'left'
+        };
+
+        /**
+         * Checks if an axis is the outer axis in its dimension. Since
+         * axes are placed outwards in order, the axis with the highest
+         * index is the outermost axis.
+         *
+         * Example: If there are multiple x-axes at the top of the chart,
+         * this function returns true if the axis supplied is the last
+         * of the x-axes.
+         *
+         * @return true if the axis is the outermost axis in its dimension;
+         *		 false if not
+         */
+        Axis.prototype.isOuterAxis = function() {
+            var axis = this,
+                thisIndex = -1,
+                isOuter = true;
+
+            each(this.chart.axes, function(otherAxis, index) {
+                if (otherAxis.side === axis.side) {
+                    if (otherAxis === axis) {
+                        // Get the index of the axis in question
+                        thisIndex = index;
+
+                        // Check thisIndex >= 0 in case thisIndex has
+                        // not been found yet
+                    } else if (thisIndex >= 0 && index > thisIndex) {
+                        // There was an axis on the same side with a
+                        // higher index. Exit the loop.
+                        isOuter = false;
+                        return;
+                    }
+                }
+            });
+            // There were either no other axes on the same side,
+            // or the other axes were not farther from the chart
+            return isOuter;
+        };
+
+        /**
+         * Shortcut function to Tick.label.getBBox().width.
+         *
+         * @return {number} width - the width of the tick label
+         */
+        Tick.prototype.getLabelWidth = function() {
+            return this.label.getBBox().width;
+        };
+
+        /**
+         * Get the maximum label length.
+         * This function can be used in states where the axis.maxLabelLength has not
+         * been set.
+         *
+         * @param  {boolean} force - Optional parameter to force a new calculation, even
+         *                           if a value has already been set
+         * @return {number} maxLabelLength - the maximum label length of the axis
+         */
+        Axis.prototype.getMaxLabelLength = function(force) {
+            var tickPositions = this.tickPositions,
+                ticks = this.ticks,
+                maxLabelLength = 0;
+
+            if (!this.maxLabelLength || force) {
+                each(tickPositions, function(tick) {
+                    tick = ticks[tick];
+                    if (tick && tick.labelLength > maxLabelLength) {
+                        maxLabelLength = tick.labelLength;
+                    }
+                });
+                this.maxLabelLength = maxLabelLength;
+            }
+            return this.maxLabelLength;
+        };
+
+        /**
+         * Adds the axis defined in axis.options.title
+         */
+        Axis.prototype.addTitle = function() {
+            var axis = this,
+                renderer = axis.chart.renderer,
+                axisParent = axis.axisParent,
+                horiz = axis.horiz,
+                opposite = axis.opposite,
+                options = axis.options,
+                axisTitleOptions = options.title,
+                hasData,
+                showAxis,
+                textAlign;
+
+            // For reuse in Axis.render
+            hasData = axis.hasData();
+            axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
+
+            // Disregard title generation in original Axis.getOffset()
+            options.title = '';
+
+            if (!axis.axisTitle) {
+                textAlign = axisTitleOptions.textAlign;
+                if (!textAlign) {
+                    textAlign = (horiz ? {
+                        low: 'left',
+                        middle: 'center',
+                        high: 'right'
+                    } : {
+                        low: opposite ? 'right' : 'left',
+                        middle: 'center',
+                        high: opposite ? 'left' : 'right'
+                    })[axisTitleOptions.align];
+                }
+                axis.axisTitle = renderer.text(
+                        axisTitleOptions.text,
+                        0,
+                        0,
+                        axisTitleOptions.useHTML
+                    )
+                    .attr({
+                        zIndex: 7,
+                        rotation: axisTitleOptions.rotation || 0,
+                        align: textAlign
+                    })
+                    .addClass('highcharts-axis-title')
+
+                // Add to axisParent instead of axisGroup, to ignore the space
+                // it takes
+                .add(axisParent);
+                axis.axisTitle.isNew = true;
+            }
+
+
+            // hide or show the title depending on whether showEmpty is set
+            axis.axisTitle[showAxis ? 'show' : 'hide'](true);
+        };
+
+        /**
+         * Add custom date formats
+         */
+        H.dateFormats = {
+            // Week number
+            W: function(timestamp) {
+                var date = new Date(timestamp),
+                    day = date.getUTCDay() === 0 ? 7 : date.getUTCDay(),
+                    time = date.getTime(),
+                    startOfYear = new Date(date.getUTCFullYear(), 0, 1, -6),
+                    dayNumber;
+                date.setDate(date.getUTCDate() + 4 - day);
+                dayNumber = Math.floor((time - startOfYear) / 86400000);
+                return 1 + Math.floor(dayNumber / 7);
+            },
+            // First letter of the day of the week, e.g. 'M' for 'Monday'.
+            E: function(timestamp) {
+                return dateFormat('%a', timestamp, true).charAt(0);
+            }
+        };
+
+        /**
+         * Prevents adding the last tick label if the axis is not a category axis.
+         *
+         * Since numeric labels are normally placed at starts and ends of a range of
+         * value, and this module makes the label point at the value, an "extra" label
+         * would appear.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Tick.prototype, 'addLabel', function(proceed) {
+            var axis = this.axis,
+                isCategoryAxis = axis.options.categories !== undefined,
+                tickPositions = axis.tickPositions,
+                lastTick = tickPositions[tickPositions.length - 1],
+                isLastTick = this.pos !== lastTick;
+
+            if (!axis.options.grid || isCategoryAxis || isLastTick) {
+                proceed.apply(this);
+            }
+        });
+
+        /**
+         * Center tick labels vertically and horizontally between ticks
+         *
+         * @param {function} proceed - the original function
+         *
+         * @return {object} object - an object containing x and y positions
+         *						 for the tick
+         */
+        wrap(Tick.prototype, 'getLabelPosition', function(proceed, x, y, label) {
+            var retVal = proceed.apply(this, Array.prototype.slice.call(arguments, 1)),
+                axis = this.axis,
+                options = axis.options,
+                tickInterval = options.tickInterval || 1,
+                newX,
+                newPos,
+                axisHeight,
+                fontSize,
+                labelMetrics,
+                lblB,
+                lblH,
+                labelCenter;
+
+            // Only center tick labels if axis has option grid: true
+            if (options.grid) {
+                fontSize = options.labels.style.fontSize;
+                labelMetrics = axis.chart.renderer.fontMetrics(fontSize, label);
+                lblB = labelMetrics.b;
+                lblH = labelMetrics.h;
+
+                if (axis.horiz && options.categories === undefined) {
+                    // Center x position
+                    axisHeight = axis.axisGroup.getBBox().height;
+                    newPos = this.pos + tickInterval / 2;
+                    retVal.x = axis.translate(newPos) + axis.left;
+                    labelCenter = (axisHeight / 2) + (lblH / 2) - Math.abs(lblH - lblB);
+
+                    // Center y position
+                    if (axis.side === axisSide.top) {
+                        retVal.y = y - labelCenter;
+                    } else {
+                        retVal.y = y + labelCenter;
+                    }
+                } else {
+                    // Center y position
+                    if (options.categories === undefined) {
+                        newPos = this.pos + (tickInterval / 2);
+                        retVal.y = axis.translate(newPos) + axis.top + (lblB / 2);
+                    }
+
+                    // Center x position
+                    newX = (this.getLabelWidth() / 2) - (axis.maxLabelLength / 2);
+                    if (axis.side === axisSide.left) {
+                        retVal.x += newX;
+                    } else {
+                        retVal.x -= newX;
+                    }
+                }
+            }
+            return retVal;
+        });
+
+
+        /**
+         * Draw vertical ticks extra long to create cell floors and roofs.
+         * Overrides the tickLength for vertical axes.
+         *
+         * @param {function} proceed - the original function
+         * @returns {array} retVal -
+         */
+        wrap(Axis.prototype, 'tickSize', function(proceed) {
+            var axis = this,
+                retVal = proceed.apply(axis, Array.prototype.slice.call(arguments, 1)),
+                labelPadding,
+                distance;
+
+            if (axis.options.grid && !axis.horiz) {
+                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);
+                if (!axis.maxLabelLength) {
+                    axis.maxLabelLength = axis.getMaxLabelLength();
+                }
+                distance = axis.maxLabelLength + labelPadding;
+
+                retVal[0] = distance;
+            }
+            return retVal;
+        });
+
+        /**
+         * Disregards space required by axisTitle, by adding axisTitle to axisParent
+         * instead of axisGroup, and disregarding margins and offsets related to
+         * axisTitle.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Axis.prototype, 'getOffset', function(proceed) {
+            var axis = this,
+                axisOffset = axis.chart.axisOffset,
+                side = axis.side,
+                axisHeight,
+                tickSize,
+                options = axis.options,
+                axisTitleOptions = options.title,
+                addTitle = axisTitleOptions &&
+                axisTitleOptions.text &&
+                axisTitleOptions.enabled !== false;
+
+            if (axis.options.grid && isObject(axis.options.title)) {
+
+                tickSize = axis.tickSize('tick')[0];
+                if (axisOffset[side] && tickSize) {
+                    axisHeight = axisOffset[side] + tickSize;
+                }
+
+                if (addTitle) {
+                    // Use the custom addTitle() to add it, while preventing making room
+                    // for it
+                    axis.addTitle();
+                }
+
+                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));
+
+                axisOffset[side] = pick(axisHeight, axisOffset[side]);
+
+
+                // Put axis options back after original Axis.getOffset() has been called
+                options.title = axisTitleOptions;
+
+            } else {
+                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));
+            }
+        });
+
+        /**
+         * Prevents rotation of labels when squished, as rotating them would not
+         * help.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Axis.prototype, 'renderUnsquish', function(proceed) {
+            if (this.options.grid) {
+                this.labelRotation = 0;
+                this.options.labels.rotation = 0;
+            }
+            proceed.apply(this);
+        });
+
+        /**
+         * Places leftmost tick at the start of the axis, to create a left wall.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {
+            var axis = this;
+            if (userOptions.grid && axis.horiz) {
+                userOptions.startOnTick = true;
+                userOptions.minPadding = 0;
+                userOptions.endOnTick = true;
+            }
+            proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+        });
+
+        /**
+         * Draw an extra line on the far side of the the axisLine,
+         * creating cell roofs of a grid.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Axis.prototype, 'render', function(proceed) {
+            var axis = this,
+                options = axis.options,
+                labelPadding,
+                distance,
+                lineWidth,
+                linePath,
+                yStartIndex,
+                yEndIndex,
+                xStartIndex,
+                xEndIndex,
+                renderer = axis.chart.renderer,
+                axisGroupBox;
+
+            if (options.grid) {
+                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);
+                distance = axis.maxLabelLength + labelPadding;
+                lineWidth = options.lineWidth;
+
+                // Remove right wall before rendering
+                if (axis.rightWall) {
+                    axis.rightWall.destroy();
+                }
+
+                // Call original Axis.render() to obtain axis.axisLine and
+                // axis.axisGroup
+                proceed.apply(axis);
+
+                axisGroupBox = axis.axisGroup.getBBox();
+
+                // Add right wall on horizontal axes
+                if (axis.horiz) {
+                    axis.rightWall = renderer.path([
+                            'M',
+                            axisGroupBox.x + axis.width + 1, // account for left wall
+                            axisGroupBox.y,
+                            'L',
+                            axisGroupBox.x + axis.width + 1, // account for left wall
+                            axisGroupBox.y + axisGroupBox.height
+                        ])
+                        .attr({
+                            stroke: options.tickColor || '#ccd6eb',
+                            'stroke-width': options.tickWidth || 1,
+                            zIndex: 7,
+                            class: 'grid-wall'
+                        })
+                        .add(axis.axisGroup);
+                }
+
+                if (axis.isOuterAxis() && axis.axisLine) {
+                    if (axis.horiz) {
+                        // -1 to avoid adding distance each time the chart updates
+                        distance = axisGroupBox.height - 1;
+                    }
+
+                    if (lineWidth) {
+                        linePath = axis.getLinePath(lineWidth);
+                        xStartIndex = linePath.indexOf('M') + 1;
+                        xEndIndex = linePath.indexOf('L') + 1;
+                        yStartIndex = linePath.indexOf('M') + 2;
+                        yEndIndex = linePath.indexOf('L') + 2;
+
+                        // Negate distance if top or left axis
+                        if (axis.side === axisSide.top || axis.side === axisSide.left) {
+                            distance = -distance;
+                        }
+
+                        // If axis is horizontal, reposition line path vertically
+                        if (axis.horiz) {
+                            linePath[yStartIndex] = linePath[yStartIndex] + distance;
+                            linePath[yEndIndex] = linePath[yEndIndex] + distance;
+                        } else {
+                            // If axis is vertical, reposition line path horizontally
+                            linePath[xStartIndex] = linePath[xStartIndex] + distance;
+                            linePath[xEndIndex] = linePath[xEndIndex] + distance;
+                        }
+
+                        if (!axis.axisLineExtra) {
+                            axis.axisLineExtra = renderer.path(linePath)
+                                .attr({
+                                    stroke: options.lineColor,
+                                    'stroke-width': lineWidth,
+                                    zIndex: 7
+                                })
+                                .add(axis.axisGroup);
+                        } else {
+                            axis.axisLineExtra.animate({
+                                d: linePath
+                            });
+                        }
+
+                        // show or hide the line depending on options.showEmpty
+                        axis.axisLine[axis.showAxis ? 'show' : 'hide'](true);
+                    }
+                }
+            } else {
+                proceed.apply(axis);
+            }
+        });
+
+        /**
+         * Wraps chart rendering with the following customizations:
+         * 1. Prohibit timespans of multitudes of a time unit
+         * 2. Draw cell walls on vertical axes
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Chart.prototype, 'render', function(proceed) {
+            // 25 is optimal height for default fontSize (11px)
+            // 25 / 11 ≈ 2.28
+            var fontSizeToCellHeightRatio = 25 / 11,
+                fontMetrics,
+                fontSize;
+
+            each(this.axes, function(axis) {
+                var options = axis.options;
+                if (options.grid) {
+                    fontSize = options.labels.style.fontSize;
+                    fontMetrics = axis.chart.renderer.fontMetrics(fontSize);
+
+                    // Prohibit timespans of multitudes of a time unit,
+                    // e.g. two days, three weeks, etc.
+                    if (options.type === 'datetime') {
+                        options.units = [
+                            ['millisecond', [1]],
+                            ['second', [1]],
+                            ['minute', [1]],
+                            ['hour', [1]],
+                            ['day', [1]],
+                            ['week', [1]],
+                            ['month', [1]],
+                            ['year', null]
+                        ];
+                    }
+
+                    // Make tick marks taller, creating cell walls of a grid.
+                    // Use cellHeight axis option if set
+                    if (axis.horiz) {
+                        options.tickLength = options.cellHeight ||
+                            fontMetrics.h * fontSizeToCellHeightRatio;
+                    } else {
+                        options.tickWidth = 1;
+                        if (!options.lineWidth) {
+                            options.lineWidth = 1;
+                        }
+                    }
+                }
+            });
+
+            // Call original Chart.render()
+            proceed.apply(this);
+        });
+
+    }(Highcharts));
+    (function(H) {
+        /**
+         * (c) 2014-2016 Highsoft AS
+         * Authors: Torstein Honsi, Lars A. V. Cabrera
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+
+        var defaultPlotOptions = H.getOptions().plotOptions,
+            color = H.Color,
+            columnType = H.seriesTypes.column,
+            each = H.each,
+            extendClass = H.extendClass,
+            isNumber = H.isNumber,
+            isObject = H.isObject,
+            merge = H.merge,
+            pick = H.pick,
+            seriesTypes = H.seriesTypes,
+            wrap = H.wrap,
+            Axis = H.Axis,
+            Point = H.Point,
+            Series = H.Series,
+            pointFormat = '<span style="color:{point.color}">' +
+            '\u25CF' +
+            '</span> {series.name}: <b>{point.yCategory}</b><br/>',
+            xrange = 'xrange';
+
+        defaultPlotOptions.xrange = merge(defaultPlotOptions.column, {
+            tooltip: {
+                pointFormat: pointFormat
+            }
+        });
+        seriesTypes.xrange = extendClass(columnType, {
+            pointClass: extendClass(Point, {
+                // Add x2 and yCategory to the available properties for tooltip formats
+                getLabelConfig: function() {
+                    var cfg = Point.prototype.getLabelConfig.call(this);
+
+                    cfg.x2 = this.x2;
+                    cfg.yCategory = this.yCategory = this.series.yAxis.categories && this.series.yAxis.categories[this.y];
+                    return cfg;
+                }
+            }),
+            type: xrange,
+            forceDL: true,
+            parallelArrays: ['x', 'x2', 'y'],
+            requireSorting: false,
+            animate: seriesTypes.line.prototype.animate,
+
+            /**
+             * Borrow the column series metrics, but with swapped axes. This gives free access
+             * to features like groupPadding, grouping, pointWidth etc.
+             */
+            getColumnMetrics: function() {
+                var metrics,
+                    chart = this.chart;
+
+                function swapAxes() {
+                    each(chart.series, function(s) {
+                        var xAxis = s.xAxis;
+                        s.xAxis = s.yAxis;
+                        s.yAxis = xAxis;
+                    });
+                }
+
+                swapAxes();
+
+                this.yAxis.closestPointRange = 1;
+                metrics = columnType.prototype.getColumnMetrics.call(this);
+
+                swapAxes();
+
+                return metrics;
+            },
+
+            /**
+             * Override cropData to show a point where x is outside visible range
+             * but x2 is outside.
+             */
+            cropData: function(xData, yData, min, max) {
+
+                // Replace xData with x2Data to find the appropriate cropStart
+                var cropData = Series.prototype.cropData,
+                    crop = cropData.call(this, this.x2Data, yData, min, max);
+
+                // Re-insert the cropped xData
+                crop.xData = xData.slice(crop.start, crop.end);
+
+                return crop;
+            },
+
+            translate: function() {
+                columnType.prototype.translate.apply(this, arguments);
+                var series = this,
+                    xAxis = series.xAxis,
+                    metrics = series.columnMetrics,
+                    minPointLength = series.options.minPointLength || 0;
+
+                each(series.points, function(point) {
+                    var plotX = point.plotX,
+                        posX = pick(point.x2, point.x + (point.len || 0)),
+                        plotX2 = xAxis.toPixels(posX, true),
+                        width = plotX2 - plotX,
+                        widthDifference,
+                        shapeArgs,
+                        partialFill;
+
+                    if (minPointLength) {
+                        widthDifference = minPointLength - width;
+                        if (widthDifference < 0) {
+                            widthDifference = 0;
+                        }
+                        plotX -= widthDifference / 2;
+                        plotX2 += widthDifference / 2;
+                    }
+
+                    plotX = Math.max(plotX, -10);
+                    plotX2 = Math.min(Math.max(plotX2, -10), xAxis.len + 10);
+
+                    point.shapeArgs = {
+                        x: plotX,
+                        y: point.plotY + metrics.offset,
+                        width: plotX2 - plotX,
+                        height: metrics.width
+                    };
+                    point.tooltipPos[0] += width / 2;
+                    point.tooltipPos[1] -= metrics.width / 2;
+
+                    // Add a partShapeArgs to the point, based on the shapeArgs property
+                    partialFill = point.partialFill;
+                    if (partialFill) {
+                        // Get the partial fill amount
+                        if (isObject(partialFill)) {
+                            partialFill = partialFill.amount;
+                        }
+                        // If it was not a number, assume 0
+                        if (!isNumber(partialFill)) {
+                            partialFill = 0;
+                        }
+                        shapeArgs = point.shapeArgs;
+                        point.partShapeArgs = {
+                            x: shapeArgs.x,
+                            y: shapeArgs.y + 1,
+                            width: shapeArgs.width * partialFill,
+                            height: shapeArgs.height - 2
+                        };
+                    }
+                });
+            },
+
+            drawPoints: function() {
+                var series = this,
+                    chart = this.chart,
+                    options = series.options,
+                    renderer = chart.renderer,
+                    animationLimit = options.animationLimit || 250,
+                    verb = chart.pointCount < animationLimit ? 'animate' : 'attr';
+
+                // draw the columns
+                each(series.points, function(point) {
+                    var plotY = point.plotY,
+                        graphic = point.graphic,
+                        type = point.shapeType,
+                        shapeArgs = point.shapeArgs,
+                        partShapeArgs = point.partShapeArgs,
+                        seriesOpts = series.options,
+                        pfOptions = point.partialFill,
+                        fill,
+                        state = point.selected && 'select',
+                        cutOff = options.stacking && !options.borderRadius;
+
+                    if (isNumber(plotY) && point.y !== null) {
+                        if (graphic) { // update
+                            point.graphicOriginal[verb](
+                                merge(shapeArgs)
+                            );
+                            if (partShapeArgs) {
+                                point.graphicOverlay[verb](
+                                    merge(partShapeArgs)
+                                );
+                            }
+
+                        } else {
+                            point.graphic = graphic = renderer.g('point')
+                                .attr({
+                                    'class': point.getClassName()
+                                })
+                                .add(point.group || series.group);
+
+                            point.graphicOriginal = renderer[type](shapeArgs)
+                                .addClass('highcharts-partfill-original')
+                                .add(graphic);
+                            if (partShapeArgs) {
+                                point.graphicOverlay = renderer[type](partShapeArgs)
+                                    .addClass('highcharts-partfill-overlay')
+                                    .add(graphic);
+                            }
+                        }
+
+
+
+                    } else if (graphic) {
+                        point.graphic = graphic.destroy(); // #1269
+                    }
+                });
+            }
+        });
+
+        /**
+         * Max x2 should be considered in xAxis extremes
+         */
+        wrap(Axis.prototype, 'getSeriesExtremes', function(proceed) {
+            var axis = this,
+                series = axis.series,
+                dataMax,
+                modMax;
+
+            proceed.call(this);
+            if (axis.isXAxis && series.type === xrange) {
+                dataMax = pick(axis.dataMax, Number.MIN_VALUE);
+                each(this.series, function(series) {
+                    each(series.x2Data || [], function(val) {
+                        if (val > dataMax) {
+                            dataMax = val;
+                            modMax = true;
+                        }
+                    });
+                });
+                if (modMax) {
+                    axis.dataMax = dataMax;
+                }
+            }
+        });
+
+    }(Highcharts));
+    (function(H) {
+        /**
+         * (c) 2016 Highsoft AS
+         * Authors: Lars A. V. Cabrera
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+        // 
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 19 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/grid-axis.js


+ 545 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/grid-axis.src.js

@@ -0,0 +1,545 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * GridAxis
+ *
+ * (c) 2016 Lars A. V. Cabrera
+ *
+ * --- WORK IN PROGRESS ---
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2016 Highsoft AS
+         * Authors: Lars A. V. Cabrera
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+
+        var dateFormat = H.dateFormat,
+            each = H.each,
+            isObject = H.isObject,
+            pick = H.pick,
+            wrap = H.wrap,
+            Axis = H.Axis,
+            Chart = H.Chart,
+            Tick = H.Tick;
+
+
+        // Enum for which side the axis is on.
+        // Maps to axis.side
+        var axisSide = {
+            top: 0,
+            right: 1,
+            bottom: 2,
+            left: 3,
+            0: 'top',
+            1: 'right',
+            2: 'bottom',
+            3: 'left'
+        };
+
+        /**
+         * Checks if an axis is the outer axis in its dimension. Since
+         * axes are placed outwards in order, the axis with the highest
+         * index is the outermost axis.
+         *
+         * Example: If there are multiple x-axes at the top of the chart,
+         * this function returns true if the axis supplied is the last
+         * of the x-axes.
+         *
+         * @return true if the axis is the outermost axis in its dimension;
+         *		 false if not
+         */
+        Axis.prototype.isOuterAxis = function() {
+            var axis = this,
+                thisIndex = -1,
+                isOuter = true;
+
+            each(this.chart.axes, function(otherAxis, index) {
+                if (otherAxis.side === axis.side) {
+                    if (otherAxis === axis) {
+                        // Get the index of the axis in question
+                        thisIndex = index;
+
+                        // Check thisIndex >= 0 in case thisIndex has
+                        // not been found yet
+                    } else if (thisIndex >= 0 && index > thisIndex) {
+                        // There was an axis on the same side with a
+                        // higher index. Exit the loop.
+                        isOuter = false;
+                        return;
+                    }
+                }
+            });
+            // There were either no other axes on the same side,
+            // or the other axes were not farther from the chart
+            return isOuter;
+        };
+
+        /**
+         * Shortcut function to Tick.label.getBBox().width.
+         *
+         * @return {number} width - the width of the tick label
+         */
+        Tick.prototype.getLabelWidth = function() {
+            return this.label.getBBox().width;
+        };
+
+        /**
+         * Get the maximum label length.
+         * This function can be used in states where the axis.maxLabelLength has not
+         * been set.
+         *
+         * @param  {boolean} force - Optional parameter to force a new calculation, even
+         *                           if a value has already been set
+         * @return {number} maxLabelLength - the maximum label length of the axis
+         */
+        Axis.prototype.getMaxLabelLength = function(force) {
+            var tickPositions = this.tickPositions,
+                ticks = this.ticks,
+                maxLabelLength = 0;
+
+            if (!this.maxLabelLength || force) {
+                each(tickPositions, function(tick) {
+                    tick = ticks[tick];
+                    if (tick && tick.labelLength > maxLabelLength) {
+                        maxLabelLength = tick.labelLength;
+                    }
+                });
+                this.maxLabelLength = maxLabelLength;
+            }
+            return this.maxLabelLength;
+        };
+
+        /**
+         * Adds the axis defined in axis.options.title
+         */
+        Axis.prototype.addTitle = function() {
+            var axis = this,
+                renderer = axis.chart.renderer,
+                axisParent = axis.axisParent,
+                horiz = axis.horiz,
+                opposite = axis.opposite,
+                options = axis.options,
+                axisTitleOptions = options.title,
+                hasData,
+                showAxis,
+                textAlign;
+
+            // For reuse in Axis.render
+            hasData = axis.hasData();
+            axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
+
+            // Disregard title generation in original Axis.getOffset()
+            options.title = '';
+
+            if (!axis.axisTitle) {
+                textAlign = axisTitleOptions.textAlign;
+                if (!textAlign) {
+                    textAlign = (horiz ? {
+                        low: 'left',
+                        middle: 'center',
+                        high: 'right'
+                    } : {
+                        low: opposite ? 'right' : 'left',
+                        middle: 'center',
+                        high: opposite ? 'left' : 'right'
+                    })[axisTitleOptions.align];
+                }
+                axis.axisTitle = renderer.text(
+                        axisTitleOptions.text,
+                        0,
+                        0,
+                        axisTitleOptions.useHTML
+                    )
+                    .attr({
+                        zIndex: 7,
+                        rotation: axisTitleOptions.rotation || 0,
+                        align: textAlign
+                    })
+                    .addClass('highcharts-axis-title')
+
+                // Add to axisParent instead of axisGroup, to ignore the space
+                // it takes
+                .add(axisParent);
+                axis.axisTitle.isNew = true;
+            }
+
+
+            // hide or show the title depending on whether showEmpty is set
+            axis.axisTitle[showAxis ? 'show' : 'hide'](true);
+        };
+
+        /**
+         * Add custom date formats
+         */
+        H.dateFormats = {
+            // Week number
+            W: function(timestamp) {
+                var date = new Date(timestamp),
+                    day = date.getUTCDay() === 0 ? 7 : date.getUTCDay(),
+                    time = date.getTime(),
+                    startOfYear = new Date(date.getUTCFullYear(), 0, 1, -6),
+                    dayNumber;
+                date.setDate(date.getUTCDate() + 4 - day);
+                dayNumber = Math.floor((time - startOfYear) / 86400000);
+                return 1 + Math.floor(dayNumber / 7);
+            },
+            // First letter of the day of the week, e.g. 'M' for 'Monday'.
+            E: function(timestamp) {
+                return dateFormat('%a', timestamp, true).charAt(0);
+            }
+        };
+
+        /**
+         * Prevents adding the last tick label if the axis is not a category axis.
+         *
+         * Since numeric labels are normally placed at starts and ends of a range of
+         * value, and this module makes the label point at the value, an "extra" label
+         * would appear.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Tick.prototype, 'addLabel', function(proceed) {
+            var axis = this.axis,
+                isCategoryAxis = axis.options.categories !== undefined,
+                tickPositions = axis.tickPositions,
+                lastTick = tickPositions[tickPositions.length - 1],
+                isLastTick = this.pos !== lastTick;
+
+            if (!axis.options.grid || isCategoryAxis || isLastTick) {
+                proceed.apply(this);
+            }
+        });
+
+        /**
+         * Center tick labels vertically and horizontally between ticks
+         *
+         * @param {function} proceed - the original function
+         *
+         * @return {object} object - an object containing x and y positions
+         *						 for the tick
+         */
+        wrap(Tick.prototype, 'getLabelPosition', function(proceed, x, y, label) {
+            var retVal = proceed.apply(this, Array.prototype.slice.call(arguments, 1)),
+                axis = this.axis,
+                options = axis.options,
+                tickInterval = options.tickInterval || 1,
+                newX,
+                newPos,
+                axisHeight,
+                fontSize,
+                labelMetrics,
+                lblB,
+                lblH,
+                labelCenter;
+
+            // Only center tick labels if axis has option grid: true
+            if (options.grid) {
+                fontSize = options.labels.style.fontSize;
+                labelMetrics = axis.chart.renderer.fontMetrics(fontSize, label);
+                lblB = labelMetrics.b;
+                lblH = labelMetrics.h;
+
+                if (axis.horiz && options.categories === undefined) {
+                    // Center x position
+                    axisHeight = axis.axisGroup.getBBox().height;
+                    newPos = this.pos + tickInterval / 2;
+                    retVal.x = axis.translate(newPos) + axis.left;
+                    labelCenter = (axisHeight / 2) + (lblH / 2) - Math.abs(lblH - lblB);
+
+                    // Center y position
+                    if (axis.side === axisSide.top) {
+                        retVal.y = y - labelCenter;
+                    } else {
+                        retVal.y = y + labelCenter;
+                    }
+                } else {
+                    // Center y position
+                    if (options.categories === undefined) {
+                        newPos = this.pos + (tickInterval / 2);
+                        retVal.y = axis.translate(newPos) + axis.top + (lblB / 2);
+                    }
+
+                    // Center x position
+                    newX = (this.getLabelWidth() / 2) - (axis.maxLabelLength / 2);
+                    if (axis.side === axisSide.left) {
+                        retVal.x += newX;
+                    } else {
+                        retVal.x -= newX;
+                    }
+                }
+            }
+            return retVal;
+        });
+
+
+        /**
+         * Draw vertical ticks extra long to create cell floors and roofs.
+         * Overrides the tickLength for vertical axes.
+         *
+         * @param {function} proceed - the original function
+         * @returns {array} retVal -
+         */
+        wrap(Axis.prototype, 'tickSize', function(proceed) {
+            var axis = this,
+                retVal = proceed.apply(axis, Array.prototype.slice.call(arguments, 1)),
+                labelPadding,
+                distance;
+
+            if (axis.options.grid && !axis.horiz) {
+                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);
+                if (!axis.maxLabelLength) {
+                    axis.maxLabelLength = axis.getMaxLabelLength();
+                }
+                distance = axis.maxLabelLength + labelPadding;
+
+                retVal[0] = distance;
+            }
+            return retVal;
+        });
+
+        /**
+         * Disregards space required by axisTitle, by adding axisTitle to axisParent
+         * instead of axisGroup, and disregarding margins and offsets related to
+         * axisTitle.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Axis.prototype, 'getOffset', function(proceed) {
+            var axis = this,
+                axisOffset = axis.chart.axisOffset,
+                side = axis.side,
+                axisHeight,
+                tickSize,
+                options = axis.options,
+                axisTitleOptions = options.title,
+                addTitle = axisTitleOptions &&
+                axisTitleOptions.text &&
+                axisTitleOptions.enabled !== false;
+
+            if (axis.options.grid && isObject(axis.options.title)) {
+
+                tickSize = axis.tickSize('tick')[0];
+                if (axisOffset[side] && tickSize) {
+                    axisHeight = axisOffset[side] + tickSize;
+                }
+
+                if (addTitle) {
+                    // Use the custom addTitle() to add it, while preventing making room
+                    // for it
+                    axis.addTitle();
+                }
+
+                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));
+
+                axisOffset[side] = pick(axisHeight, axisOffset[side]);
+
+
+                // Put axis options back after original Axis.getOffset() has been called
+                options.title = axisTitleOptions;
+
+            } else {
+                proceed.apply(axis, Array.prototype.slice.call(arguments, 1));
+            }
+        });
+
+        /**
+         * Prevents rotation of labels when squished, as rotating them would not
+         * help.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Axis.prototype, 'renderUnsquish', function(proceed) {
+            if (this.options.grid) {
+                this.labelRotation = 0;
+                this.options.labels.rotation = 0;
+            }
+            proceed.apply(this);
+        });
+
+        /**
+         * Places leftmost tick at the start of the axis, to create a left wall.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {
+            var axis = this;
+            if (userOptions.grid && axis.horiz) {
+                userOptions.startOnTick = true;
+                userOptions.minPadding = 0;
+                userOptions.endOnTick = true;
+            }
+            proceed.apply(this, Array.prototype.slice.call(arguments, 1));
+        });
+
+        /**
+         * Draw an extra line on the far side of the the axisLine,
+         * creating cell roofs of a grid.
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Axis.prototype, 'render', function(proceed) {
+            var axis = this,
+                options = axis.options,
+                labelPadding,
+                distance,
+                lineWidth,
+                linePath,
+                yStartIndex,
+                yEndIndex,
+                xStartIndex,
+                xEndIndex,
+                renderer = axis.chart.renderer,
+                axisGroupBox;
+
+            if (options.grid) {
+                labelPadding = (Math.abs(axis.defaultLeftAxisOptions.labels.x) * 2);
+                distance = axis.maxLabelLength + labelPadding;
+                lineWidth = options.lineWidth;
+
+                // Remove right wall before rendering
+                if (axis.rightWall) {
+                    axis.rightWall.destroy();
+                }
+
+                // Call original Axis.render() to obtain axis.axisLine and
+                // axis.axisGroup
+                proceed.apply(axis);
+
+                axisGroupBox = axis.axisGroup.getBBox();
+
+                // Add right wall on horizontal axes
+                if (axis.horiz) {
+                    axis.rightWall = renderer.path([
+                            'M',
+                            axisGroupBox.x + axis.width + 1, // account for left wall
+                            axisGroupBox.y,
+                            'L',
+                            axisGroupBox.x + axis.width + 1, // account for left wall
+                            axisGroupBox.y + axisGroupBox.height
+                        ])
+                        .attr({
+                            stroke: options.tickColor || '#ccd6eb',
+                            'stroke-width': options.tickWidth || 1,
+                            zIndex: 7,
+                            class: 'grid-wall'
+                        })
+                        .add(axis.axisGroup);
+                }
+
+                if (axis.isOuterAxis() && axis.axisLine) {
+                    if (axis.horiz) {
+                        // -1 to avoid adding distance each time the chart updates
+                        distance = axisGroupBox.height - 1;
+                    }
+
+                    if (lineWidth) {
+                        linePath = axis.getLinePath(lineWidth);
+                        xStartIndex = linePath.indexOf('M') + 1;
+                        xEndIndex = linePath.indexOf('L') + 1;
+                        yStartIndex = linePath.indexOf('M') + 2;
+                        yEndIndex = linePath.indexOf('L') + 2;
+
+                        // Negate distance if top or left axis
+                        if (axis.side === axisSide.top || axis.side === axisSide.left) {
+                            distance = -distance;
+                        }
+
+                        // If axis is horizontal, reposition line path vertically
+                        if (axis.horiz) {
+                            linePath[yStartIndex] = linePath[yStartIndex] + distance;
+                            linePath[yEndIndex] = linePath[yEndIndex] + distance;
+                        } else {
+                            // If axis is vertical, reposition line path horizontally
+                            linePath[xStartIndex] = linePath[xStartIndex] + distance;
+                            linePath[xEndIndex] = linePath[xEndIndex] + distance;
+                        }
+
+                        if (!axis.axisLineExtra) {
+                            axis.axisLineExtra = renderer.path(linePath)
+                                .attr({
+                                    stroke: options.lineColor,
+                                    'stroke-width': lineWidth,
+                                    zIndex: 7
+                                })
+                                .add(axis.axisGroup);
+                        } else {
+                            axis.axisLineExtra.animate({
+                                d: linePath
+                            });
+                        }
+
+                        // show or hide the line depending on options.showEmpty
+                        axis.axisLine[axis.showAxis ? 'show' : 'hide'](true);
+                    }
+                }
+            } else {
+                proceed.apply(axis);
+            }
+        });
+
+        /**
+         * Wraps chart rendering with the following customizations:
+         * 1. Prohibit timespans of multitudes of a time unit
+         * 2. Draw cell walls on vertical axes
+         *
+         * @param {function} proceed - the original function
+         */
+        wrap(Chart.prototype, 'render', function(proceed) {
+            // 25 is optimal height for default fontSize (11px)
+            // 25 / 11 ≈ 2.28
+            var fontSizeToCellHeightRatio = 25 / 11,
+                fontMetrics,
+                fontSize;
+
+            each(this.axes, function(axis) {
+                var options = axis.options;
+                if (options.grid) {
+                    fontSize = options.labels.style.fontSize;
+                    fontMetrics = axis.chart.renderer.fontMetrics(fontSize);
+
+                    // Prohibit timespans of multitudes of a time unit,
+                    // e.g. two days, three weeks, etc.
+                    if (options.type === 'datetime') {
+                        options.units = [
+                            ['millisecond', [1]],
+                            ['second', [1]],
+                            ['minute', [1]],
+                            ['hour', [1]],
+                            ['day', [1]],
+                            ['week', [1]],
+                            ['month', [1]],
+                            ['year', null]
+                        ];
+                    }
+
+                    // Make tick marks taller, creating cell walls of a grid.
+                    // Use cellHeight axis option if set
+                    if (axis.horiz) {
+                        options.tickLength = options.cellHeight ||
+                            fontMetrics.h * fontSizeToCellHeightRatio;
+                    } else {
+                        options.tickWidth = 1;
+                        if (!options.lineWidth) {
+                            options.lineWidth = 1;
+                        }
+                    }
+                }
+            });
+
+            // Call original Chart.render()
+            proceed.apply(this);
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 25 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/heatmap.js


+ 798 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/heatmap.src.js

@@ -0,0 +1,798 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+        var Axis = H.Axis,
+            Chart = H.Chart,
+            color = H.color,
+            ColorAxis,
+            each = H.each,
+            extend = H.extend,
+            isNumber = H.isNumber,
+            Legend = H.Legend,
+            LegendSymbolMixin = H.LegendSymbolMixin,
+            noop = H.noop,
+            merge = H.merge,
+            pick = H.pick,
+            wrap = H.wrap;
+
+        /**
+         * The ColorAxis object for inclusion in gradient legends
+         */
+        ColorAxis = H.ColorAxis = function() {
+            this.init.apply(this, arguments);
+        };
+        extend(ColorAxis.prototype, Axis.prototype);
+        extend(ColorAxis.prototype, {
+            defaultColorAxisOptions: {
+                lineWidth: 0,
+                minPadding: 0,
+                maxPadding: 0,
+                gridLineWidth: 1,
+                tickPixelInterval: 72,
+                startOnTick: true,
+                endOnTick: true,
+                offset: 0,
+                marker: {
+                    animation: {
+                        duration: 50
+                    },
+                    width: 0.01
+
+                },
+                labels: {
+                    overflow: 'justify'
+                },
+                minColor: '#e6ebf5',
+                maxColor: '#003399',
+                tickLength: 5,
+                showInLegend: true
+            },
+
+            // Properties to preserve after destroy, for Axis.update (#5881)
+            keepProps: ['legendGroup', 'legendItem', 'legendSymbol']
+                .concat(Axis.prototype.keepProps),
+
+            /**
+             * Initialize the color axis
+             */
+            init: function(chart, userOptions) {
+                var horiz = chart.options.legend.layout !== 'vertical',
+                    options;
+
+                this.coll = 'colorAxis';
+
+                // Build the options
+                options = merge(this.defaultColorAxisOptions, {
+                    side: horiz ? 2 : 1,
+                    reversed: !horiz
+                }, userOptions, {
+                    opposite: !horiz,
+                    showEmpty: false,
+                    title: null
+                });
+
+                Axis.prototype.init.call(this, chart, options);
+
+                // Base init() pushes it to the xAxis array, now pop it again
+                //chart[this.isXAxis ? 'xAxis' : 'yAxis'].pop();
+
+                // Prepare data classes
+                if (userOptions.dataClasses) {
+                    this.initDataClasses(userOptions);
+                }
+                this.initStops(userOptions);
+
+                // Override original axis properties
+                this.horiz = horiz;
+                this.zoomEnabled = false;
+
+                // Add default values		
+                this.defaultLegendLength = 200;
+            },
+
+            /*
+             * Return an intermediate color between two colors, according to pos where 0
+             * is the from color and 1 is the to color.
+             * NOTE: Changes here should be copied
+             * to the same function in drilldown.src.js and solid-gauge-src.js.
+             */
+            tweenColors: function(from, to, pos) {
+                // Check for has alpha, because rgba colors perform worse due to lack of
+                // support in WebKit.
+                var hasAlpha,
+                    ret;
+
+                // Unsupported color, return to-color (#3920)
+                if (!to.rgba.length || !from.rgba.length) {
+                    ret = to.input || 'none';
+
+                    // Interpolate
+                } else {
+                    from = from.rgba;
+                    to = to.rgba;
+                    hasAlpha = (to[3] !== 1 || from[3] !== 1);
+                    ret = (hasAlpha ? 'rgba(' : 'rgb(') +
+                        Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' +
+                        Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' +
+                        Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) +
+                        (hasAlpha ? (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) : '') + ')';
+                }
+                return ret;
+            },
+
+            initDataClasses: function(userOptions) {
+                var axis = this,
+                    chart = this.chart,
+                    dataClasses,
+                    colorCounter = 0,
+                    colorCount = chart.options.chart.colorCount,
+                    options = this.options,
+                    len = userOptions.dataClasses.length;
+                this.dataClasses = dataClasses = [];
+                this.legendItems = [];
+
+                each(userOptions.dataClasses, function(dataClass, i) {
+                    var colors;
+
+                    dataClass = merge(dataClass);
+                    dataClasses.push(dataClass);
+                    if (!dataClass.color) {
+                        if (options.dataClassColor === 'category') {
+
+                            dataClass.colorIndex = colorCounter;
+
+                            // increase and loop back to zero
+                            colorCounter++;
+                            if (colorCounter === colorCount) {
+                                colorCounter = 0;
+                            }
+                        } else {
+                            dataClass.color = axis.tweenColors(
+                                color(options.minColor),
+                                color(options.maxColor),
+                                len < 2 ? 0.5 : i / (len - 1) // #3219
+                            );
+                        }
+                    }
+                });
+            },
+
+            initStops: function(userOptions) {
+                this.stops = userOptions.stops || [
+                    [0, this.options.minColor],
+                    [1, this.options.maxColor]
+                ];
+                each(this.stops, function(stop) {
+                    stop.color = color(stop[1]);
+                });
+            },
+
+            /**
+             * Extend the setOptions method to process extreme colors and color
+             * stops.
+             */
+            setOptions: function(userOptions) {
+                Axis.prototype.setOptions.call(this, userOptions);
+
+                this.options.crosshair = this.options.marker;
+            },
+
+            setAxisSize: function() {
+                var symbol = this.legendSymbol,
+                    chart = this.chart,
+                    legendOptions = chart.options.legend || {},
+                    x,
+                    y,
+                    width,
+                    height;
+
+                if (symbol) {
+                    this.left = x = symbol.attr('x');
+                    this.top = y = symbol.attr('y');
+                    this.width = width = symbol.attr('width');
+                    this.height = height = symbol.attr('height');
+                    this.right = chart.chartWidth - x - width;
+                    this.bottom = chart.chartHeight - y - height;
+
+                    this.len = this.horiz ? width : height;
+                    this.pos = this.horiz ? x : y;
+                } else {
+                    // Fake length for disabled legend to avoid tick issues and such (#5205)
+                    this.len = (this.horiz ? legendOptions.symbolWidth : legendOptions.symbolHeight) || this.defaultLegendLength;
+                }
+            },
+
+            /**
+             * Translate from a value to a color
+             */
+            toColor: function(value, point) {
+                var pos,
+                    stops = this.stops,
+                    from,
+                    to,
+                    color,
+                    dataClasses = this.dataClasses,
+                    dataClass,
+                    i;
+
+                if (dataClasses) {
+                    i = dataClasses.length;
+                    while (i--) {
+                        dataClass = dataClasses[i];
+                        from = dataClass.from;
+                        to = dataClass.to;
+                        if ((from === undefined || value >= from) && (to === undefined || value <= to)) {
+                            color = dataClass.color;
+                            if (point) {
+                                point.dataClass = i;
+                                point.colorIndex = dataClass.colorIndex;
+                            }
+                            break;
+                        }
+                    }
+
+                } else {
+
+                    if (this.isLog) {
+                        value = this.val2lin(value);
+                    }
+                    pos = 1 - ((this.max - value) / ((this.max - this.min) || 1));
+                    i = stops.length;
+                    while (i--) {
+                        if (pos > stops[i][0]) {
+                            break;
+                        }
+                    }
+                    from = stops[i] || stops[i + 1];
+                    to = stops[i + 1] || from;
+
+                    // The position within the gradient
+                    pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);
+
+                    color = this.tweenColors(
+                        from.color,
+                        to.color,
+                        pos
+                    );
+                }
+                return color;
+            },
+
+            /**
+             * Override the getOffset method to add the whole axis groups inside the legend.
+             */
+            getOffset: function() {
+                var group = this.legendGroup,
+                    sideOffset = this.chart.axisOffset[this.side];
+
+                if (group) {
+
+                    // Hook for the getOffset method to add groups to this parent group
+                    this.axisParent = group;
+
+                    // Call the base
+                    Axis.prototype.getOffset.call(this);
+
+                    // First time only
+                    if (!this.added) {
+
+                        this.added = true;
+
+                        this.labelLeft = 0;
+                        this.labelRight = this.width;
+                    }
+                    // Reset it to avoid color axis reserving space
+                    this.chart.axisOffset[this.side] = sideOffset;
+                }
+            },
+
+            /**
+             * Create the color gradient
+             */
+            setLegendColor: function() {
+                var grad,
+                    horiz = this.horiz,
+                    options = this.options,
+                    reversed = this.reversed,
+                    one = reversed ? 1 : 0,
+                    zero = reversed ? 0 : 1;
+
+                grad = horiz ? [one, 0, zero, 0] : [0, zero, 0, one]; // #3190
+                this.legendColor = {
+                    linearGradient: {
+                        x1: grad[0],
+                        y1: grad[1],
+                        x2: grad[2],
+                        y2: grad[3]
+                    },
+                    stops: options.stops || [
+                        [0, options.minColor],
+                        [1, options.maxColor]
+                    ]
+                };
+            },
+
+            /**
+             * The color axis appears inside the legend and has its own legend symbol
+             */
+            drawLegendSymbol: function(legend, item) {
+                var padding = legend.padding,
+                    legendOptions = legend.options,
+                    horiz = this.horiz,
+                    width = pick(legendOptions.symbolWidth, horiz ? this.defaultLegendLength : 12),
+                    height = pick(legendOptions.symbolHeight, horiz ? 12 : this.defaultLegendLength),
+                    labelPadding = pick(legendOptions.labelPadding, horiz ? 16 : 30),
+                    itemDistance = pick(legendOptions.itemDistance, 10);
+
+                this.setLegendColor();
+
+                // Create the gradient
+                item.legendSymbol = this.chart.renderer.rect(
+                    0,
+                    legend.baseline - 11,
+                    width,
+                    height
+                ).attr({
+                    zIndex: 1
+                }).add(item.legendGroup);
+
+                // Set how much space this legend item takes up
+                this.legendItemWidth = width + padding + (horiz ? itemDistance : labelPadding);
+                this.legendItemHeight = height + padding + (horiz ? labelPadding : 0);
+            },
+            /**
+             * Fool the legend
+             */
+            setState: noop,
+            visible: true,
+            setVisible: noop,
+            getSeriesExtremes: function() {
+                var series;
+                if (this.series.length) {
+                    series = this.series[0];
+                    this.dataMin = series.valueMin;
+                    this.dataMax = series.valueMax;
+                }
+            },
+            drawCrosshair: function(e, point) {
+                var plotX = point && point.plotX,
+                    plotY = point && point.plotY,
+                    crossPos,
+                    axisPos = this.pos,
+                    axisLen = this.len;
+
+                if (point) {
+                    crossPos = this.toPixels(point[point.series.colorKey]);
+                    if (crossPos < axisPos) {
+                        crossPos = axisPos - 2;
+                    } else if (crossPos > axisPos + axisLen) {
+                        crossPos = axisPos + axisLen + 2;
+                    }
+
+                    point.plotX = crossPos;
+                    point.plotY = this.len - crossPos;
+                    Axis.prototype.drawCrosshair.call(this, e, point);
+                    point.plotX = plotX;
+                    point.plotY = plotY;
+
+                    if (this.cross) {
+                        this.cross
+                            .addClass('highcharts-coloraxis-marker')
+                            .add(this.legendGroup);
+
+
+
+                    }
+                }
+            },
+            getPlotLinePath: function(a, b, c, d, pos) {
+                return isNumber(pos) ? // crosshairs only // #3969 pos can be 0 !!
+                    (this.horiz ? ['M', pos - 4, this.top - 6, 'L', pos + 4, this.top - 6, pos, this.top, 'Z'] : ['M', this.left, pos, 'L', this.left - 6, pos + 6, this.left - 6, pos - 6, 'Z']) :
+                    Axis.prototype.getPlotLinePath.call(this, a, b, c, d);
+            },
+
+            update: function(newOptions, redraw) {
+                var chart = this.chart,
+                    legend = chart.legend;
+
+                each(this.series, function(series) {
+                    series.isDirtyData = true; // Needed for Axis.update when choropleth colors change
+                });
+
+                // When updating data classes, destroy old items and make sure new ones are created (#3207)
+                if (newOptions.dataClasses && legend.allItems) {
+                    each(legend.allItems, function(item) {
+                        if (item.isDataClass) {
+                            item.legendGroup.destroy();
+                        }
+                    });
+                    chart.isDirtyLegend = true;
+                }
+
+                // Keep the options structure updated for export. Unlike xAxis and yAxis, the colorAxis is
+                // not an array. (#3207)
+                chart.options[this.coll] = merge(this.userOptions, newOptions);
+
+                Axis.prototype.update.call(this, newOptions, redraw);
+                if (this.legendItem) {
+                    this.setLegendColor();
+                    legend.colorizeItem(this, true);
+                }
+            },
+
+            /**
+             * Get the legend item symbols for data classes
+             */
+            getDataClassLegendSymbols: function() {
+                var axis = this,
+                    chart = this.chart,
+                    legendItems = this.legendItems,
+                    legendOptions = chart.options.legend,
+                    valueDecimals = legendOptions.valueDecimals,
+                    valueSuffix = legendOptions.valueSuffix || '',
+                    name;
+
+                if (!legendItems.length) {
+                    each(this.dataClasses, function(dataClass, i) {
+                        var vis = true,
+                            from = dataClass.from,
+                            to = dataClass.to;
+
+                        // Assemble the default name. This can be overridden by legend.options.labelFormatter
+                        name = '';
+                        if (from === undefined) {
+                            name = '< ';
+                        } else if (to === undefined) {
+                            name = '> ';
+                        }
+                        if (from !== undefined) {
+                            name += H.numberFormat(from, valueDecimals) + valueSuffix;
+                        }
+                        if (from !== undefined && to !== undefined) {
+                            name += ' - ';
+                        }
+                        if (to !== undefined) {
+                            name += H.numberFormat(to, valueDecimals) + valueSuffix;
+                        }
+                        // Add a mock object to the legend items
+                        legendItems.push(extend({
+                            chart: chart,
+                            name: name,
+                            options: {},
+                            drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+                            visible: true,
+                            setState: noop,
+                            isDataClass: true,
+                            setVisible: function() {
+                                vis = this.visible = !vis;
+                                each(axis.series, function(series) {
+                                    each(series.points, function(point) {
+                                        if (point.dataClass === i) {
+                                            point.setVisible(vis);
+                                        }
+                                    });
+                                });
+
+                                chart.legend.colorizeItem(this, vis);
+                            }
+                        }, dataClass));
+                    });
+                }
+                return legendItems;
+            },
+            name: '' // Prevents 'undefined' in legend in IE8
+        });
+
+        /**
+         * Handle animation of the color attributes directly
+         */
+        each(['fill', 'stroke'], function(prop) {
+            H.Fx.prototype[prop + 'Setter'] = function() {
+                this.elem.attr(
+                    prop,
+                    ColorAxis.prototype.tweenColors(
+                        color(this.start),
+                        color(this.end),
+                        this.pos
+                    ),
+                    null,
+                    true
+                );
+            };
+        });
+
+        /**
+         * Extend the chart getAxes method to also get the color axis
+         */
+        wrap(Chart.prototype, 'getAxes', function(proceed) {
+
+            var options = this.options,
+                colorAxisOptions = options.colorAxis;
+
+            proceed.call(this);
+
+            this.colorAxis = [];
+            if (colorAxisOptions) {
+                new ColorAxis(this, colorAxisOptions); // eslint-disable-line no-new
+            }
+        });
+
+
+        /**
+         * Wrap the legend getAllItems method to add the color axis. This also removes the
+         * axis' own series to prevent them from showing up individually.
+         */
+        wrap(Legend.prototype, 'getAllItems', function(proceed) {
+            var allItems = [],
+                colorAxis = this.chart.colorAxis[0];
+
+            if (colorAxis && colorAxis.options) {
+                if (colorAxis.options.showInLegend) {
+                    // Data classes
+                    if (colorAxis.options.dataClasses) {
+                        allItems = allItems.concat(colorAxis.getDataClassLegendSymbols());
+                        // Gradient legend
+                    } else {
+                        // Add this axis on top
+                        allItems.push(colorAxis);
+                    }
+                }
+
+                // Don't add the color axis' series
+                each(colorAxis.series, function(series) {
+                    series.options.showInLegend = false;
+                });
+            }
+
+            return allItems.concat(proceed.call(this));
+        });
+
+        wrap(Legend.prototype, 'colorizeItem', function(proceed, item, visible) {
+            proceed.call(this, item, visible);
+            if (visible && item.legendColor) {
+                item.legendSymbol.attr({
+                    fill: item.legendColor
+                });
+            }
+        });
+
+    }(Highcharts));
+    (function(H) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+        var defined = H.defined,
+            each = H.each,
+            noop = H.noop,
+            seriesTypes = H.seriesTypes;
+
+        /**
+         * Mixin for maps and heatmaps
+         */
+        H.colorPointMixin = {
+            /**
+             * Color points have a value option that determines whether or not it is a null point
+             */
+            isValid: function() {
+                return this.value !== null;
+            },
+
+            /**
+             * Set the visibility of a single point
+             */
+            setVisible: function(vis) {
+                var point = this,
+                    method = vis ? 'show' : 'hide';
+
+                // Show and hide associated elements
+                each(['graphic', 'dataLabel'], function(key) {
+                    if (point[key]) {
+                        point[key][method]();
+                    }
+                });
+            },
+            setState: function(state) {
+                H.Point.prototype.setState.call(this, state);
+                if (this.graphic) {
+                    this.graphic.attr({
+                        zIndex: state === 'hover' ? 1 : 0
+                    });
+                }
+            }
+        };
+
+        H.colorSeriesMixin = {
+            pointArrayMap: ['value'],
+            axisTypes: ['xAxis', 'yAxis', 'colorAxis'],
+            optionalAxis: 'colorAxis',
+            trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],
+            getSymbol: noop,
+            parallelArrays: ['x', 'y', 'value'],
+            colorKey: 'value',
+
+
+
+            /**
+             * In choropleth maps, the color is a result of the value, so this needs translation too
+             */
+            translateColors: function() {
+                var series = this,
+                    nullColor = this.options.nullColor,
+                    colorAxis = this.colorAxis,
+                    colorKey = this.colorKey;
+
+                each(this.data, function(point) {
+                    var value = point[colorKey],
+                        color;
+
+                    color = point.options.color ||
+                        (point.isNull ? nullColor : (colorAxis && value !== undefined) ? colorAxis.toColor(value, point) : point.color || series.color);
+
+                    if (color) {
+                        point.color = color;
+                    }
+                });
+            },
+
+            /**
+             * Get the color attibutes to apply on the graphic
+             */
+            colorAttribs: function(point) {
+                var ret = {};
+                if (defined(point.color)) {
+                    ret[this.colorProp || 'fill'] = point.color;
+                }
+                return ret;
+            }
+        };
+
+    }(Highcharts));
+    (function(H) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+        var colorPointMixin = H.colorPointMixin,
+            colorSeriesMixin = H.colorSeriesMixin,
+            each = H.each,
+            LegendSymbolMixin = H.LegendSymbolMixin,
+            merge = H.merge,
+            noop = H.noop,
+            pick = H.pick,
+            Series = H.Series,
+            seriesType = H.seriesType,
+            seriesTypes = H.seriesTypes;
+
+        // The Heatmap series type
+        seriesType('heatmap', 'scatter', {
+            animation: false,
+            borderWidth: 0,
+
+            dataLabels: {
+                formatter: function() { // #2945
+                    return this.point.value;
+                },
+                inside: true,
+                verticalAlign: 'middle',
+                crop: false,
+                overflow: false,
+                padding: 0 // #3837
+            },
+            marker: null,
+            pointRange: null, // dynamically set to colsize by default
+            tooltip: {
+                pointFormat: '{point.x}, {point.y}: {point.value}<br/>'
+            },
+            states: {
+                normal: {
+                    animation: true
+                },
+                hover: {
+                    halo: false, // #3406, halo is not required on heatmaps
+                    brightness: 0.2
+                }
+            }
+        }, merge(colorSeriesMixin, {
+            pointArrayMap: ['y', 'value'],
+            hasPointSpecificOptions: true,
+            supportsDrilldown: true,
+            getExtremesFromAll: true,
+            directTouch: true,
+
+            /**
+             * Override the init method to add point ranges on both axes.
+             */
+            init: function() {
+                var options;
+                seriesTypes.scatter.prototype.init.apply(this, arguments);
+
+                options = this.options;
+                options.pointRange = pick(options.pointRange, options.colsize || 1); // #3758, prevent resetting in setData
+                this.yAxis.axisPointRange = options.rowsize || 1; // general point range
+            },
+            translate: function() {
+                var series = this,
+                    options = series.options,
+                    xAxis = series.xAxis,
+                    yAxis = series.yAxis,
+                    between = function(x, a, b) {
+                        return Math.min(Math.max(a, x), b);
+                    };
+
+                series.generatePoints();
+
+                each(series.points, function(point) {
+                    var xPad = (options.colsize || 1) / 2,
+                        yPad = (options.rowsize || 1) / 2,
+                        x1 = between(Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),
+                        x2 = between(Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),
+                        y1 = between(Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len),
+                        y2 = between(Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len);
+
+                    // Set plotX and plotY for use in K-D-Tree and more
+                    point.plotX = point.clientX = (x1 + x2) / 2;
+                    point.plotY = (y1 + y2) / 2;
+
+                    point.shapeType = 'rect';
+                    point.shapeArgs = {
+                        x: Math.min(x1, x2),
+                        y: Math.min(y1, y2),
+                        width: Math.abs(x2 - x1),
+                        height: Math.abs(y2 - y1)
+                    };
+                });
+
+                series.translateColors();
+            },
+            drawPoints: function() {
+                seriesTypes.column.prototype.drawPoints.call(this);
+
+                each(this.points, function(point) {
+
+                    // In styled mode, use CSS, otherwise the fill used in the style
+                    // sheet will take precesence over the fill attribute.
+                    point.graphic.css(this.colorAttribs(point));
+
+                }, this);
+            },
+            animate: noop,
+            getBox: noop,
+            drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+            alignDataLabel: seriesTypes.column.prototype.alignDataLabel,
+            getExtremes: function() {
+                // Get the extremes from the value data
+                Series.prototype.getExtremes.call(this, this.valueData);
+                this.valueMin = this.dataMin;
+                this.valueMax = this.dataMax;
+
+                // Get the extremes from the y data
+                Series.prototype.getExtremes.call(this);
+            }
+
+        }), colorPointMixin);
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 12 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.js


+ 150 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.src.js

@@ -0,0 +1,150 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * Plugin for displaying a message when there is no data visible in chart.
+ *
+ * (c) 2010-2016 Highsoft AS
+ * Author: Oystein Moseng
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * Plugin for displaying a message when there is no data visible in chart.
+         *
+         * (c) 2010-2016 Highsoft AS
+         * Author: Oystein Moseng
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+
+        var seriesTypes = H.seriesTypes,
+            chartPrototype = H.Chart.prototype,
+            defaultOptions = H.getOptions(),
+            extend = H.extend,
+            each = H.each;
+
+        // Add language option
+        extend(defaultOptions.lang, {
+            noData: 'No data to display'
+        });
+
+        // Add default display options for message
+        defaultOptions.noData = {
+            position: {
+                x: 0,
+                y: 0,
+                align: 'center',
+                verticalAlign: 'middle'
+            }
+            // useHTML: false
+        };
+
+
+
+        /**
+         * Define hasData functions for series. These return true if there are data points on this series within the plot area
+         */
+        function hasDataPie() {
+            return !!this.points.length; /* != 0 */
+        }
+
+        each(['pie', 'gauge', 'waterfall', 'bubble', 'treemap'], function(type) {
+            if (seriesTypes[type]) {
+                seriesTypes[type].prototype.hasData = hasDataPie;
+            }
+        });
+
+        H.Series.prototype.hasData = function() {
+            return this.visible && this.dataMax !== undefined && this.dataMin !== undefined; // #3703
+        };
+
+        /**
+         * Display a no-data message.
+         *
+         * @param {String} str An optional message to show in place of the default one 
+         */
+        chartPrototype.showNoData = function(str) {
+            var chart = this,
+                options = chart.options,
+                text = str || options.lang.noData,
+                noDataOptions = options.noData;
+
+            if (!chart.noDataLabel) {
+                chart.noDataLabel = chart.renderer
+                    .label(
+                        text,
+                        0,
+                        0,
+                        null,
+                        null,
+                        null,
+                        noDataOptions.useHTML,
+                        null,
+                        'no-data'
+                    );
+
+
+
+                chart.noDataLabel.add();
+
+                chart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position), false, 'plotBox');
+            }
+        };
+
+        /**
+         * Hide no-data message	
+         */
+        chartPrototype.hideNoData = function() {
+            var chart = this;
+            if (chart.noDataLabel) {
+                chart.noDataLabel = chart.noDataLabel.destroy();
+            }
+        };
+
+        /**
+         * Returns true if there are data points within the plot area now
+         */
+        chartPrototype.hasData = function() {
+            var chart = this,
+                series = chart.series,
+                i = series.length;
+
+            while (i--) {
+                if (series[i].hasData() && !series[i].options.isInternal) {
+                    return true;
+                }
+            }
+
+            return false;
+        };
+
+        /**
+         * Show no-data message if there is no data in sight. Otherwise, hide it.
+         */
+        function handleNoData() {
+            var chart = this;
+            if (chart.hasData()) {
+                chart.hideNoData();
+            } else {
+                chart.showNoData();
+            }
+        }
+
+        /**
+         * Add event listener to handle automatic display of no-data message
+         */
+        chartPrototype.callbacks.push(function(chart) {
+            H.addEvent(chart, 'load', handleNoData);
+            H.addEvent(chart, 'redraw', handleNoData);
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 18 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/offline-exporting.js


+ 492 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/offline-exporting.src.js

@@ -0,0 +1,492 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * Client side exporting module
+ *
+ * (c) 2015 Torstein Honsi / Oystein Moseng
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * Client side exporting module
+         *
+         * (c) 2015 Torstein Honsi / Oystein Moseng
+         *
+         * License: www.highcharts.com/license
+         */
+
+        'use strict';
+        /*global MSBlobBuilder */
+
+        var merge = Highcharts.merge,
+            win = Highcharts.win,
+            nav = win.navigator,
+            doc = win.document,
+            each = Highcharts.each,
+            domurl = win.URL || win.webkitURL || win,
+            isMSBrowser = /Edge\/|Trident\/|MSIE /.test(nav.userAgent),
+            loadEventDeferDelay = isMSBrowser ? 150 : 0; // Milliseconds to defer image load event handlers to offset IE bug
+
+        // Dummy object so we can reuse our canvas-tools.js without errors
+        Highcharts.CanVGRenderer = {};
+
+
+        /**
+         * Downloads a script and executes a callback when done.
+         * @param {String} scriptLocation
+         * @param {Function} callback
+         */
+        function getScript(scriptLocation, callback) {
+            var head = doc.getElementsByTagName('head')[0],
+                script = doc.createElement('script');
+
+            script.type = 'text/javascript';
+            script.src = scriptLocation;
+            script.onload = callback;
+            script.onerror = function() {
+                console.error('Error loading script', scriptLocation); // eslint-disable-line no-console
+            };
+
+            head.appendChild(script);
+        }
+
+        // Download contents by dataURL/blob
+        Highcharts.downloadURL = function(dataURL, filename) {
+            var a = doc.createElement('a'),
+                windowRef;
+
+            // IE specific blob implementation
+            if (nav.msSaveOrOpenBlob) {
+                nav.msSaveOrOpenBlob(dataURL, filename);
+                return;
+            }
+
+            // Try HTML5 download attr if supported
+            if (a.download !== undefined) {
+                a.href = dataURL;
+                a.download = filename; // HTML5 download attribute
+                a.target = '_blank';
+                doc.body.appendChild(a);
+                a.click();
+                doc.body.removeChild(a);
+            } else {
+                // No download attr, just opening data URI
+                try {
+                    windowRef = win.open(dataURL, 'chart');
+                    if (windowRef === undefined || windowRef === null) {
+                        throw 'Failed to open window';
+                    }
+                } catch (e) {
+                    // window.open failed, trying location.href
+                    win.location.href = dataURL;
+                }
+            }
+        };
+
+        // Get blob URL from SVG code. Falls back to normal data URI.
+        Highcharts.svgToDataUrl = function(svg) {
+            var webKit = nav.userAgent.indexOf('WebKit') > -1 && nav.userAgent.indexOf('Chrome') < 0; // Webkit and not chrome
+            try {
+                // Safari requires data URI since it doesn't allow navigation to blob URLs
+                // Firefox has an issue with Blobs and internal references, leading to gradients not working using Blobs (#4550)
+                if (!webKit && nav.userAgent.toLowerCase().indexOf('firefox') < 0) {
+                    return domurl.createObjectURL(new win.Blob([svg], {
+                        type: 'image/svg+xml;charset-utf-16'
+                    }));
+                }
+            } catch (e) {
+                // Ignore
+            }
+            return 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg);
+        };
+
+        // Get data:URL from image URL
+        // Pass in callbacks to handle results. finallyCallback is always called at the end of the process. Supplying this callback is optional.
+        // All callbacks receive four arguments: imageURL, imageType, callbackArgs and scale. callbackArgs is used only by callbacks and can contain whatever.
+        Highcharts.imageToDataUrl = function(imageURL, imageType, callbackArgs, scale, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) {
+            var img = new win.Image(),
+                taintedHandler,
+                loadHandler = function() {
+                    setTimeout(function() {
+                        var canvas = doc.createElement('canvas'),
+                            ctx = canvas.getContext && canvas.getContext('2d'),
+                            dataURL;
+                        try {
+                            if (!ctx) {
+                                noCanvasSupportCallback(imageURL, imageType, callbackArgs, scale);
+                            } else {
+                                canvas.height = img.height * scale;
+                                canvas.width = img.width * scale;
+                                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
+
+                                // Now we try to get the contents of the canvas.
+                                try {
+                                    dataURL = canvas.toDataURL(imageType);
+                                    successCallback(dataURL, imageType, callbackArgs, scale);
+                                } catch (e) {
+                                    taintedHandler(imageURL, imageType, callbackArgs, scale);
+                                }
+                            }
+                        } finally {
+                            if (finallyCallback) {
+                                finallyCallback(imageURL, imageType, callbackArgs, scale);
+                            }
+                        }
+                    }, loadEventDeferDelay); // IE bug where image is not always ready despite calling load event.
+                },
+                // Image load failed (e.g. invalid URL)
+                errorHandler = function() {
+                    failedLoadCallback(imageURL, imageType, callbackArgs, scale);
+                    if (finallyCallback) {
+                        finallyCallback(imageURL, imageType, callbackArgs, scale);
+                    }
+                };
+
+            // This is called on load if the image drawing to canvas failed with a security error.
+            // We retry the drawing with crossOrigin set to Anonymous.
+            taintedHandler = function() {
+                img = new win.Image();
+                taintedHandler = taintedCallback;
+                img.crossOrigin = 'Anonymous'; // Must be set prior to loading image source
+                img.onload = loadHandler;
+                img.onerror = errorHandler;
+                img.src = imageURL;
+            };
+
+            img.onload = loadHandler;
+            img.onerror = errorHandler;
+            img.src = imageURL;
+        };
+
+        /**
+         * Get data URL to an image of an SVG and call download on it
+         *
+         * options object:
+         *		filename: Name of resulting downloaded file without extension
+         *		type: File type of resulting download
+         *		scale: Scaling factor of downloaded image compared to source
+         *      libURL: URL pointing to location of dependency scripts to download on demand
+         */
+        Highcharts.downloadSVGLocal = function(svg, options, failCallback, successCallback) {
+            var svgurl,
+                blob,
+                objectURLRevoke = true,
+                finallyHandler,
+                libURL = options.libURL || Highcharts.getOptions().exporting.libURL,
+                dummySVGContainer = doc.createElement('div'),
+                imageType = options.type || 'image/png',
+                filename = (options.filename || 'chart') + '.' + (imageType === 'image/svg+xml' ? 'svg' : imageType.split('/')[1]),
+                scale = options.scale || 1;
+
+            libURL = libURL.slice(-1) !== '/' ? libURL + '/' : libURL; // Allow libURL to end with or without fordward slash
+
+            function svgToPdf(svgElement, margin) {
+                var width = svgElement.width.baseVal.value + 2 * margin,
+                    height = svgElement.height.baseVal.value + 2 * margin,
+                    pdf = new win.jsPDF('l', 'pt', [width, height]); // eslint-disable-line new-cap
+                win.svgElementToPdf(svgElement, pdf, {
+                    removeInvalid: true
+                });
+                return pdf.output('datauristring');
+            }
+
+            function downloadPDF() {
+                dummySVGContainer.innerHTML = svg;
+                var textElements = dummySVGContainer.getElementsByTagName('text'),
+                    titleElements,
+                    svgElementStyle = dummySVGContainer.getElementsByTagName('svg')[0].style;
+                // Workaround for the text styling. Making sure it does pick up the root element
+                each(textElements, function(el) {
+                    // Workaround for the text styling. making sure it does pick up the root element
+                    each(['font-family', 'font-size'], function(property) {
+                        if (!el.style[property] && svgElementStyle[property]) {
+                            el.style[property] = svgElementStyle[property];
+                        }
+                    });
+                    el.style['font-family'] = el.style['font-family'] && el.style['font-family'].split(' ').splice(-1);
+                    // Workaround for plotband with width, removing title from text nodes
+                    titleElements = el.getElementsByTagName('title');
+                    each(titleElements, function(titleElement) {
+                        el.removeChild(titleElement);
+                    });
+                });
+                var svgData = svgToPdf(dummySVGContainer.firstChild, 0);
+                Highcharts.downloadURL(svgData, filename);
+                if (successCallback) {
+                    successCallback();
+                }
+            }
+
+            // Initiate download depending on file type
+            if (imageType === 'image/svg+xml') {
+                // SVG download. In this case, we want to use Microsoft specific Blob if available
+                try {
+                    if (nav.msSaveOrOpenBlob) {
+                        blob = new MSBlobBuilder();
+                        blob.append(svg);
+                        svgurl = blob.getBlob('image/svg+xml');
+                    } else {
+                        svgurl = Highcharts.svgToDataUrl(svg);
+                    }
+                    Highcharts.downloadURL(svgurl, filename);
+                    if (successCallback) {
+                        successCallback();
+                    }
+                } catch (e) {
+                    failCallback();
+                }
+            } else if (imageType === 'application/pdf') {
+                if (win.jsPDF && win.svgElementToPdf) {
+                    downloadPDF();
+                } else {
+                    // Must load pdf libraries first
+                    objectURLRevoke = true; // Don't destroy the object URL yet since we are doing things asynchronously. A cleaner solution would be nice, but this will do for now.
+                    getScript(libURL + 'jspdf.js', function() {
+                        getScript(libURL + 'rgbcolor.js', function() {
+                            getScript(libURL + 'svg2pdf.js', function() {
+                                downloadPDF();
+                            });
+                        });
+                    });
+                }
+            } else {
+                // PNG/JPEG download - create bitmap from SVG
+
+                svgurl = Highcharts.svgToDataUrl(svg);
+                finallyHandler = function() {
+                    try {
+                        domurl.revokeObjectURL(svgurl);
+                    } catch (e) {
+                        // Ignore
+                    }
+                };
+                // First, try to get PNG by rendering on canvas
+                Highcharts.imageToDataUrl(svgurl, imageType, { /* args */ }, scale, function(imageURL) {
+                        // Success
+                        try {
+                            Highcharts.downloadURL(imageURL, filename);
+                            if (successCallback) {
+                                successCallback();
+                            }
+                        } catch (e) {
+                            failCallback();
+                        }
+                    }, function() {
+                        // Failed due to tainted canvas
+                        // Create new and untainted canvas
+                        var canvas = doc.createElement('canvas'),
+                            ctx = canvas.getContext('2d'),
+                            imageWidth = svg.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale,
+                            imageHeight = svg.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale,
+                            downloadWithCanVG = function() {
+                                ctx.drawSvg(svg, 0, 0, imageWidth, imageHeight);
+                                try {
+                                    Highcharts.downloadURL(nav.msSaveOrOpenBlob ? canvas.msToBlob() : canvas.toDataURL(imageType), filename);
+                                    if (successCallback) {
+                                        successCallback();
+                                    }
+                                } catch (e) {
+                                    failCallback();
+                                } finally {
+                                    finallyHandler();
+                                }
+                            };
+
+                        canvas.width = imageWidth;
+                        canvas.height = imageHeight;
+                        if (win.canvg) {
+                            // Use preloaded canvg
+                            downloadWithCanVG();
+                        } else {
+                            // Must load canVG first
+                            objectURLRevoke = true; // Don't destroy the object URL yet since we are doing things asynchronously. A cleaner solution would be nice, but this will do for now.
+                            getScript(libURL + 'rgbcolor.js', function() { // Get RGBColor.js first
+                                getScript(libURL + 'canvg.js', function() {
+                                    downloadWithCanVG();
+                                });
+                            });
+                        }
+                    },
+                    // No canvas support
+                    failCallback,
+                    // Failed to load image
+                    failCallback,
+                    // Finally
+                    function() {
+                        if (objectURLRevoke) {
+                            finallyHandler();
+                        }
+                    });
+            }
+        };
+
+        // Get SVG of chart prepared for client side export. This converts embedded images in the SVG to data URIs.
+        // The options and chartOptions arguments are passed to the getSVGForExport function.
+        Highcharts.Chart.prototype.getSVGForLocalExport = function(options, chartOptions, failCallback, successCallback) {
+            var chart = this,
+                images,
+                imagesEmbedded = 0,
+                chartCopyContainer,
+                chartCopyOptions,
+                el,
+                i,
+                l,
+                // After grabbing the SVG of the chart's copy container we need to do sanitation on the SVG
+                sanitize = function(svg) {
+                    return chart.sanitizeSVG(svg, chartCopyOptions);
+                },
+                // Success handler, we converted image to base64!
+                embeddedSuccess = function(imageURL, imageType, callbackArgs) {
+                    ++imagesEmbedded;
+
+                    // Change image href in chart copy
+                    callbackArgs.imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', imageURL);
+
+                    // When done with last image we have our SVG
+                    if (imagesEmbedded === images.length) {
+                        successCallback(sanitize(chartCopyContainer.innerHTML));
+                    }
+                };
+
+            // Hook into getSVG to get a copy of the chart copy's container
+            Highcharts.wrap(
+                Highcharts.Chart.prototype,
+                'getChartHTML',
+                function(proceed) {
+                    var ret = proceed.apply(
+                        this,
+                        Array.prototype.slice.call(arguments, 1)
+                    );
+                    chartCopyOptions = this.options;
+                    chartCopyContainer = this.container.cloneNode(true);
+                    return ret;
+                }
+            );
+
+            // Trigger hook to get chart copy
+            chart.getSVGForExport(options, chartOptions);
+            images = chartCopyContainer.getElementsByTagName('image');
+
+            try {
+                // If there are no images to embed, the SVG is okay now.
+                if (!images.length) {
+                    successCallback(sanitize(chartCopyContainer.innerHTML)); // Use SVG of chart copy
+                    return;
+                }
+
+                // Go through the images we want to embed
+                for (i = 0, l = images.length; i < l; ++i) {
+                    el = images[i];
+                    Highcharts.imageToDataUrl(el.getAttributeNS('http://www.w3.org/1999/xlink', 'href'), 'image/png', {
+                            imageElement: el
+                        }, options.scale,
+                        embeddedSuccess,
+                        // Tainted canvas
+                        failCallback,
+                        // No canvas support
+                        failCallback,
+                        // Failed to load source
+                        failCallback
+                    );
+                }
+            } catch (e) {
+                failCallback();
+            }
+        };
+
+        /**
+         * Add a new method to the Chart object to perform a local download
+         */
+        Highcharts.Chart.prototype.exportChartLocal = function(exportingOptions, chartOptions) {
+            var chart = this,
+                options = Highcharts.merge(chart.options.exporting, exportingOptions),
+                fallbackToExportServer = function() {
+                    if (options.fallbackToExportServer === false) {
+                        if (options.error) {
+                            options.error();
+                        } else {
+                            throw 'Fallback to export server disabled';
+                        }
+                    } else {
+                        chart.exportChart(options);
+                    }
+                },
+                svgSuccess = function(svg) {
+                    // If SVG contains foreignObjects all exports except SVG will fail,
+                    // as both CanVG and svg2pdf choke on this. Gracefully fall back.
+                    if (
+                        svg.indexOf('<foreignObject') > -1 &&
+                        options.type !== 'image/svg+xml'
+                    ) {
+                        fallbackToExportServer();
+                    } else {
+                        Highcharts.downloadSVGLocal(svg, options, fallbackToExportServer);
+                    }
+                };
+
+            // If we have embedded images and are exporting to JPEG/PNG, Microsoft 
+            // browsers won't handle it, so fall back.
+            if (
+                (isMSBrowser && options.type !== 'image/svg+xml' ||
+                    options.type === 'application/pdf') &&
+                chart.container.getElementsByTagName('image').length
+            ) {
+                fallbackToExportServer();
+                return;
+            }
+
+            chart.getSVGForLocalExport(options, chartOptions, fallbackToExportServer, svgSuccess);
+        };
+
+        // Extend the default options to use the local exporter logic
+        merge(true, Highcharts.getOptions().exporting, {
+            libURL: 'https://code.highcharts.com/5.0.6/lib/',
+            buttons: {
+                contextButton: {
+                    menuItems: [{
+                        textKey: 'printChart',
+                        onclick: function() {
+                            this.print();
+                        }
+                    }, {
+                        separator: true
+                    }, {
+                        textKey: 'downloadPNG',
+                        onclick: function() {
+                            this.exportChartLocal();
+                        }
+                    }, {
+                        textKey: 'downloadJPEG',
+                        onclick: function() {
+                            this.exportChartLocal({
+                                type: 'image/jpeg'
+                            });
+                        }
+                    }, {
+                        textKey: 'downloadSVG',
+                        onclick: function() {
+                            this.exportChartLocal({
+                                type: 'image/svg+xml'
+                            });
+                        }
+                    }, {
+                        textKey: 'downloadPDF',
+                        onclick: function() {
+                            this.exportChartLocal({
+                                type: 'application/pdf'
+                            });
+                        }
+                    }]
+                }
+            }
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 10 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/overlapping-datalabels.js


+ 164 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/overlapping-datalabels.src.js

@@ -0,0 +1,164 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2009-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+        /**
+         * Highcharts module to hide overlapping data labels. This module is included in Highcharts.
+         */
+        var Chart = H.Chart,
+            each = H.each,
+            pick = H.pick,
+            addEvent = H.addEvent;
+
+        // Collect potensial overlapping data labels. Stack labels probably don't need to be 
+        // considered because they are usually accompanied by data labels that lie inside the columns.
+        Chart.prototype.callbacks.push(function(chart) {
+            function collectAndHide() {
+                var labels = [];
+
+                each(chart.series, function(series) {
+                    var dlOptions = series.options.dataLabels,
+                        collections = series.dataLabelCollections || ['dataLabel']; // Range series have two collections
+                    if ((dlOptions.enabled || series._hasPointLabels) && !dlOptions.allowOverlap && series.visible) { // #3866
+                        each(collections, function(coll) {
+                            each(series.points, function(point) {
+                                if (point[coll]) {
+                                    point[coll].labelrank = pick(point.labelrank, point.shapeArgs && point.shapeArgs.height); // #4118
+                                    labels.push(point[coll]);
+                                }
+                            });
+                        });
+                    }
+                });
+                chart.hideOverlappingLabels(labels);
+            }
+
+            // Do it now ...
+            collectAndHide();
+
+            // ... and after each chart redraw
+            addEvent(chart, 'redraw', collectAndHide);
+
+        });
+
+        /**
+         * Hide overlapping labels. Labels are moved and faded in and out on zoom to provide a smooth 
+         * visual imression.
+         */
+        Chart.prototype.hideOverlappingLabels = function(labels) {
+
+            var len = labels.length,
+                label,
+                i,
+                j,
+                label1,
+                label2,
+                isIntersecting,
+                pos1,
+                pos2,
+                parent1,
+                parent2,
+                padding,
+                intersectRect = function(x1, y1, w1, h1, x2, y2, w2, h2) {
+                    return !(
+                        x2 > x1 + w1 ||
+                        x2 + w2 < x1 ||
+                        y2 > y1 + h1 ||
+                        y2 + h2 < y1
+                    );
+                };
+
+            // Mark with initial opacity
+            for (i = 0; i < len; i++) {
+                label = labels[i];
+                if (label) {
+                    label.oldOpacity = label.opacity;
+                    label.newOpacity = 1;
+                }
+            }
+
+            // Prevent a situation in a gradually rising slope, that each label
+            // will hide the previous one because the previous one always has
+            // lower rank.
+            labels.sort(function(a, b) {
+                return (b.labelrank || 0) - (a.labelrank || 0);
+            });
+
+            // Detect overlapping labels
+            for (i = 0; i < len; i++) {
+                label1 = labels[i];
+
+                for (j = i + 1; j < len; ++j) {
+                    label2 = labels[j];
+                    if (label1 && label2 && label1.placed && label2.placed && label1.newOpacity !== 0 && label2.newOpacity !== 0) {
+                        pos1 = label1.alignAttr;
+                        pos2 = label2.alignAttr;
+                        parent1 = label1.parentGroup; // Different panes have different positions
+                        parent2 = label2.parentGroup;
+                        padding = 2 * (label1.box ? 0 : label1.padding); // Substract the padding if no background or border (#4333)
+                        isIntersecting = intersectRect(
+                            pos1.x + parent1.translateX,
+                            pos1.y + parent1.translateY,
+                            label1.width - padding,
+                            label1.height - padding,
+                            pos2.x + parent2.translateX,
+                            pos2.y + parent2.translateY,
+                            label2.width - padding,
+                            label2.height - padding
+                        );
+
+                        if (isIntersecting) {
+                            (label1.labelrank < label2.labelrank ? label1 : label2).newOpacity = 0;
+                        }
+                    }
+                }
+            }
+
+            // Hide or show
+            each(labels, function(label) {
+                var complete,
+                    newOpacity;
+
+                if (label) {
+                    newOpacity = label.newOpacity;
+
+                    if (label.oldOpacity !== newOpacity && label.placed) {
+
+                        // Make sure the label is completely hidden to avoid catching clicks (#4362)
+                        if (newOpacity) {
+                            label.show(true);
+                        } else {
+                            complete = function() {
+                                label.hide();
+                            };
+                        }
+
+                        // Animate or set the opacity					
+                        label.alignAttr.opacity = newOpacity;
+                        label[label.isOld ? 'animate' : 'attr'](label.alignAttr, null, complete);
+
+                    }
+                    label.isOld = true;
+                }
+            });
+        };
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 19 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/series-label.js


+ 606 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/series-label.src.js

@@ -0,0 +1,606 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2009-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+        /**
+         * EXPERIMENTAL Highcharts module to place labels next to a series in a natural position.
+         *
+         * TODO:
+         * - add column support (box collision detection, boxesToAvoid logic)
+         * - other series types, area etc.
+         * - avoid data labels, when data labels above, show series label below.
+         * - add more options (connector, format, formatter)
+         * 
+         * http://jsfiddle.net/highcharts/L2u9rpwr/
+         * http://jsfiddle.net/highcharts/y5A37/
+         * http://jsfiddle.net/highcharts/264Nm/
+         * http://jsfiddle.net/highcharts/y5A37/
+         */
+
+        'use strict';
+
+        var labelDistance = 3,
+            wrap = H.wrap,
+            each = H.each,
+            extend = H.extend,
+            isNumber = H.isNumber,
+            Series = H.Series,
+            SVGRenderer = H.SVGRenderer,
+            Chart = H.Chart;
+
+        H.setOptions({
+            plotOptions: {
+                series: {
+                    label: {
+                        enabled: true,
+                        // Allow labels to be placed distant to the graph if necessary, and
+                        // draw a connector line to the graph
+                        connectorAllowed: true,
+                        connectorNeighbourDistance: 24, // If the label is closer than this to a neighbour graph, draw a connector
+                        styles: {
+                            fontWeight: 'bold'
+                        }
+                        // boxesToAvoid: []
+                    }
+                }
+            }
+        });
+
+        /**
+         * Counter-clockwise, part of the fast line intersection logic
+         */
+        function ccw(x1, y1, x2, y2, x3, y3) {
+            var cw = ((y3 - y1) * (x2 - x1)) - ((y2 - y1) * (x3 - x1));
+            return cw > 0 ? true : cw < 0 ? false : true;
+        }
+
+        /**
+         * Detect if two lines intersect
+         */
+        function intersectLine(x1, y1, x2, y2, x3, y3, x4, y4) {
+            return ccw(x1, y1, x3, y3, x4, y4) !== ccw(x2, y2, x3, y3, x4, y4) &&
+                ccw(x1, y1, x2, y2, x3, y3) !== ccw(x1, y1, x2, y2, x4, y4);
+        }
+
+        /**
+         * Detect if a box intersects with a line
+         */
+        function boxIntersectLine(x, y, w, h, x1, y1, x2, y2) {
+            return (
+                intersectLine(x, y, x + w, y, x1, y1, x2, y2) || // top of label
+                intersectLine(x + w, y, x + w, y + h, x1, y1, x2, y2) || // right of label
+                intersectLine(x, y + h, x + w, y + h, x1, y1, x2, y2) || // bottom of label
+                intersectLine(x, y, x, y + h, x1, y1, x2, y2) // left of label
+            );
+        }
+
+        /**
+         * General symbol definition for labels with connector
+         */
+        SVGRenderer.prototype.symbols.connector = function(x, y, w, h, options) {
+            var anchorX = options && options.anchorX,
+                anchorY = options && options.anchorY,
+                path,
+                yOffset,
+                lateral = w / 2;
+
+            if (isNumber(anchorX) && isNumber(anchorY)) {
+
+                path = ['M', anchorX, anchorY];
+
+                // Prefer 45 deg connectors
+                yOffset = y - anchorY;
+                if (yOffset < 0) {
+                    yOffset = -h - yOffset;
+                }
+                if (yOffset < w) {
+                    lateral = anchorX < x + (w / 2) ? yOffset : w - yOffset;
+                }
+
+                // Anchor below label
+                if (anchorY > y + h) {
+                    path.push('L', x + lateral, y + h);
+
+                    // Anchor above label
+                } else if (anchorY < y) {
+                    path.push('L', x + lateral, y);
+
+                    // Anchor left of label
+                } else if (anchorX < x) {
+                    path.push('L', x, y + h / 2);
+
+                    // Anchor right of label
+                } else if (anchorX > x + w) {
+                    path.push('L', x + w, y + h / 2);
+                }
+            }
+            return path || [];
+        };
+
+        /**
+         * Points to avoid. In addition to actual data points, the label should avoid
+         * interpolated positions.
+         */
+        Series.prototype.getPointsOnGraph = function() {
+            var distance = 16,
+                points = this.points,
+                point,
+                last,
+                interpolated = [],
+                i,
+                deltaX,
+                deltaY,
+                delta,
+                len,
+                n,
+                j,
+                d,
+                graph = this.graph || this.area,
+                node = graph.element,
+                inverted = this.chart.inverted,
+                paneLeft = inverted ? this.yAxis.pos : this.xAxis.pos,
+                paneTop = inverted ? this.xAxis.pos : this.yAxis.pos;
+
+            // For splines, get the point at length (possible caveat: peaks are not correctly detected)
+            if (this.getPointSpline && node.getPointAtLength) {
+                // If it is animating towards a path definition, use that briefly, and reset
+                if (graph.toD) {
+                    d = graph.attr('d');
+                    graph.attr({
+                        d: graph.toD
+                    });
+                }
+                len = node.getTotalLength();
+                for (i = 0; i < len; i += distance) {
+                    point = node.getPointAtLength(i);
+                    interpolated.push({
+                        chartX: paneLeft + point.x,
+                        chartY: paneTop + point.y,
+                        plotX: point.x,
+                        plotY: point.y
+                    });
+                }
+                if (d) {
+                    graph.attr({
+                        d: d
+                    });
+                }
+                // Last point
+                point = points[points.length - 1];
+                point.chartX = paneLeft + point.plotX;
+                point.chartY = paneTop + point.plotY;
+                interpolated.push(point);
+
+                // Interpolate
+            } else {
+                len = points.length;
+                for (i = 0; i < len; i += 1) {
+
+                    point = points[i];
+                    last = points[i - 1];
+
+                    // Absolute coordinates so we can compare different panes
+                    point.chartX = paneLeft + point.plotX;
+                    point.chartY = paneTop + point.plotY;
+
+                    // Add interpolated points
+                    if (i > 0) {
+                        deltaX = Math.abs(point.chartX - last.chartX);
+                        deltaY = Math.abs(point.chartY - last.chartY);
+                        delta = Math.max(deltaX, deltaY);
+                        if (delta > distance) {
+
+                            n = Math.ceil(delta / distance);
+
+                            for (j = 1; j < n; j += 1) {
+                                interpolated.push({
+                                    chartX: last.chartX + (point.chartX - last.chartX) * (j / n),
+                                    chartY: last.chartY + (point.chartY - last.chartY) * (j / n),
+                                    plotX: last.plotX + (point.plotX - last.plotX) * (j / n),
+                                    plotY: last.plotY + (point.plotY - last.plotY) * (j / n)
+                                });
+                            }
+                        }
+                    }
+
+                    // Add the real point in order to find positive and negative peaks
+                    if (isNumber(point.plotY)) {
+                        interpolated.push(point);
+                    }
+                }
+            }
+            return interpolated;
+        };
+
+        /**
+         * Check whether a proposed label position is clear of other elements
+         */
+        Series.prototype.checkClearPoint = function(x, y, bBox, checkDistance) {
+            var distToOthersSquared = Number.MAX_VALUE, // distance to other graphs
+                distToPointSquared = Number.MAX_VALUE,
+                dist,
+                connectorPoint,
+                connectorEnabled = this.options.label.connectorAllowed,
+
+                chart = this.chart,
+                series,
+                points,
+                leastDistance = 16,
+                withinRange,
+                i,
+                j;
+
+            function intersectRect(r1, r2) {
+                return !(r2.left > r1.right ||
+                    r2.right < r1.left ||
+                    r2.top > r1.bottom ||
+                    r2.bottom < r1.top);
+            }
+
+            /**
+             * Get the weight in order to determine the ideal position. Larger distance to
+             * other series gives more weight. Smaller distance to the actual point (connector points only)
+             * gives more weight.
+             */
+            function getWeight(distToOthersSquared, distToPointSquared) {
+                return distToOthersSquared - distToPointSquared;
+            }
+
+            // First check for collision with existing labels
+            for (i = 0; i < chart.boxesToAvoid.length; i += 1) {
+                if (intersectRect(chart.boxesToAvoid[i], {
+                        left: x,
+                        right: x + bBox.width,
+                        top: y,
+                        bottom: y + bBox.height
+                    })) {
+                    return false;
+                }
+            }
+
+            // For each position, check if the lines around the label intersect with any of the 
+            // graphs
+            for (i = 0; i < chart.series.length; i += 1) {
+                series = chart.series[i];
+                points = series.interpolatedPoints;
+                if (series.visible && points) {
+                    for (j = 1; j < points.length; j += 1) {
+                        // If any of the box sides intersect with the line, return
+                        if (boxIntersectLine(
+                                x,
+                                y,
+                                bBox.width,
+                                bBox.height,
+                                points[j - 1].chartX,
+                                points[j - 1].chartY,
+                                points[j].chartX,
+                                points[j].chartY
+                            )) {
+                            return false;
+                        }
+
+                        // But if it is too far away (a padded box doesn't intersect), also return
+                        if (this === series && !withinRange && checkDistance) {
+                            withinRange = boxIntersectLine(
+                                x - leastDistance,
+                                y - leastDistance,
+                                bBox.width + 2 * leastDistance,
+                                bBox.height + 2 * leastDistance,
+                                points[j - 1].chartX,
+                                points[j - 1].chartY,
+                                points[j].chartX,
+                                points[j].chartY
+                            );
+                        }
+
+                        // Find the squared distance from the center of the label
+                        if (this !== series) {
+                            distToOthersSquared = Math.min(
+                                distToOthersSquared,
+                                Math.pow(x + bBox.width / 2 - points[j].chartX, 2) + Math.pow(y + bBox.height / 2 - points[j].chartY, 2),
+                                Math.pow(x - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),
+                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),
+                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2),
+                                Math.pow(x - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2)
+                            );
+                        }
+                    }
+
+                    // Do we need a connector? 
+                    if (connectorEnabled && this === series && ((checkDistance && !withinRange) ||
+                            distToOthersSquared < Math.pow(this.options.label.connectorNeighbourDistance, 2))) {
+                        for (j = 1; j < points.length; j += 1) {
+                            dist = Math.min(
+                                Math.pow(x + bBox.width / 2 - points[j].chartX, 2) + Math.pow(y + bBox.height / 2 - points[j].chartY, 2),
+                                Math.pow(x - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),
+                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y - points[j].chartY, 2),
+                                Math.pow(x + bBox.width - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2),
+                                Math.pow(x - points[j].chartX, 2) + Math.pow(y + bBox.height - points[j].chartY, 2)
+                            );
+                            if (dist < distToPointSquared) {
+                                distToPointSquared = dist;
+                                connectorPoint = points[j];
+                            }
+                        }
+                        withinRange = true;
+                    }
+                }
+            }
+
+            return !checkDistance || withinRange ? {
+                x: x,
+                y: y,
+                weight: getWeight(distToOthersSquared, connectorPoint ? distToPointSquared : 0),
+                connectorPoint: connectorPoint
+            } : false;
+
+        };
+
+        /**
+         * The main initiator method that runs on chart level after initiation and redraw. It runs in 
+         * a timeout to prevent locking, and loops over all series, taking all series and labels into
+         * account when placing the labels.
+         */
+        Chart.prototype.drawSeriesLabels = function() {
+            var chart = this,
+                labelSeries = this.labelSeries;
+
+            chart.boxesToAvoid = [];
+
+            // Build the interpolated points
+            each(labelSeries, function(series) {
+                series.interpolatedPoints = series.getPointsOnGraph();
+
+                each(series.options.label.boxesToAvoid || [], function(box) {
+                    chart.boxesToAvoid.push(box);
+                });
+            });
+
+            each(chart.series, function(series) {
+                var bBox,
+                    x,
+                    y,
+                    results = [],
+                    clearPoint,
+                    i,
+                    best,
+                    inverted = chart.inverted,
+                    paneLeft = inverted ? series.yAxis.pos : series.xAxis.pos,
+                    paneTop = inverted ? series.xAxis.pos : series.yAxis.pos,
+                    paneWidth = chart.inverted ? series.yAxis.len : series.xAxis.len,
+                    paneHeight = chart.inverted ? series.xAxis.len : series.yAxis.len,
+                    points = series.interpolatedPoints,
+                    label = series.labelBySeries;
+
+                function insidePane(x, y, bBox) {
+                    return x > paneLeft && x <= paneLeft + paneWidth - bBox.width &&
+                        y >= paneTop && y <= paneTop + paneHeight - bBox.height;
+                }
+
+                if (series.visible && points) {
+                    if (!label) {
+                        series.labelBySeries = label = chart.renderer
+                            .label(series.name, 0, -9999, 'connector')
+                            .css(extend({
+                                color: series.color
+                            }, series.options.label.styles))
+                            .attr({
+                                padding: 0,
+                                opacity: 0,
+                                stroke: series.color,
+                                'stroke-width': 1
+                            })
+                            .add(series.group)
+                            .animate({
+                                opacity: 1
+                            }, {
+                                duration: 200
+                            });
+                    }
+
+                    bBox = label.getBBox();
+                    bBox.width = Math.round(bBox.width);
+
+                    // Ideal positions are centered above or below a point on right side
+                    // of chart
+                    for (i = points.length - 1; i > 0; i -= 1) {
+
+                        // Right - up
+                        x = points[i].chartX + labelDistance;
+                        y = points[i].chartY - bBox.height - labelDistance;
+                        if (insidePane(x, y, bBox)) {
+                            best = series.checkClearPoint(
+                                x,
+                                y,
+                                bBox
+                            );
+                        }
+                        if (best) {
+                            results.push(best);
+                        }
+
+                        // Right - down
+                        x = points[i].chartX + labelDistance;
+                        y = points[i].chartY + labelDistance;
+                        if (insidePane(x, y, bBox)) {
+                            best = series.checkClearPoint(
+                                x,
+                                y,
+                                bBox
+                            );
+                        }
+                        if (best) {
+                            results.push(best);
+                        }
+
+                        // Left - down
+                        x = points[i].chartX - bBox.width - labelDistance;
+                        y = points[i].chartY + labelDistance;
+                        if (insidePane(x, y, bBox)) {
+                            best = series.checkClearPoint(
+                                x,
+                                y,
+                                bBox
+                            );
+                        }
+                        if (best) {
+                            results.push(best);
+                        }
+
+                        // Left - up
+                        x = points[i].chartX - bBox.width - labelDistance;
+                        y = points[i].chartY - bBox.height - labelDistance;
+                        if (insidePane(x, y, bBox)) {
+                            best = series.checkClearPoint(
+                                x,
+                                y,
+                                bBox
+                            );
+                        }
+                        if (best) {
+                            results.push(best);
+                        }
+
+                    }
+
+                    // Brute force, try all positions on the chart in a 16x16 grid
+                    if (!results.length) {
+                        for (x = paneLeft + paneWidth - bBox.width; x >= paneLeft; x -= 16) {
+                            for (y = paneTop; y < paneTop + paneHeight - bBox.height; y += 16) {
+                                clearPoint = series.checkClearPoint(x, y, bBox, true);
+                                if (clearPoint) {
+                                    results.push(clearPoint);
+                                }
+                            }
+                        }
+                    }
+
+                    if (results.length) {
+
+                        results.sort(function(a, b) {
+                            return b.weight - a.weight;
+                        });
+
+                        best = results[0];
+
+                        chart.boxesToAvoid.push({
+                            left: best.x,
+                            right: best.x + bBox.width,
+                            top: best.y,
+                            bottom: best.y + bBox.height
+                        });
+
+                        // Move it if needed
+                        if (Math.round(best.x) !== Math.round(label.x) ||
+                            Math.round(best.y) !== Math.round(label.y)) {
+                            series.labelBySeries
+                                .attr({
+                                    opacity: 0,
+                                    x: best.x - paneLeft,
+                                    y: best.y - paneTop,
+                                    anchorX: best.connectorPoint && best.connectorPoint.plotX,
+                                    anchorY: best.connectorPoint && best.connectorPoint.plotY
+                                })
+                                .animate({
+                                    opacity: 1
+                                });
+
+                            // Record closest point to stick to for sync redraw
+                            series.options.kdNow = true;
+                            series.buildKDTree();
+                            var closest = series.searchPoint({
+                                chartX: best.x,
+                                chartY: best.y
+                            }, true);
+                            label.closest = [
+                                closest,
+                                best.x - paneLeft - closest.plotX,
+                                best.y - paneTop - closest.plotY
+                            ];
+
+                        }
+
+                    } else if (label) {
+                        series.labelBySeries = label.destroy();
+                    }
+                }
+            });
+        };
+
+        /**
+         * Prepare drawing series labels
+         */
+        function drawLabels(proceed) {
+
+            var chart = this,
+                delay = Math.max(
+                    H.animObject(chart.renderer.globalAnimation).duration,
+                    250
+                ),
+                initial = !chart.hasRendered;
+
+            proceed.apply(chart, [].slice.call(arguments, 1));
+
+            chart.labelSeries = [];
+
+            clearTimeout(chart.seriesLabelTimer);
+
+            // Which series should have labels
+            each(chart.series, function(series) {
+                var options = series.options.label,
+                    label = series.labelBySeries,
+                    closest = label && label.closest;
+
+                if (options.enabled && series.visible && (series.graph || series.area)) {
+                    chart.labelSeries.push(series);
+
+                    // The labels are processing heavy, wait until the animation is done
+                    if (initial) {
+                        delay = Math.max(
+                            delay,
+                            H.animObject(series.options.animation).duration
+                        );
+                    }
+
+                    // Keep the position updated to the axis while redrawing
+                    if (closest) {
+                        if (closest[0].plotX !== undefined) {
+                            label.animate({
+                                x: closest[0].plotX + closest[1],
+                                y: closest[0].plotY + closest[2]
+                            });
+                        } else {
+                            label.attr({
+                                opacity: 0
+                            });
+                        }
+                    }
+                }
+            });
+
+            chart.seriesLabelTimer = setTimeout(function() {
+                chart.drawSeriesLabels();
+            }, delay);
+
+        }
+        wrap(Chart.prototype, 'render', drawLabels);
+        wrap(Chart.prototype, 'redraw', drawLabels);
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 14 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/solid-gauge.js


+ 305 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/solid-gauge.src.js

@@ -0,0 +1,305 @@
+/**
+ * @license  Highcharts JS v5.0.6 (2016-12-07)
+ * Solid angular gauge module
+ *
+ * (c) 2010-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * Solid angular gauge module
+         *
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         */
+
+        'use strict';
+
+        var pInt = H.pInt,
+            pick = H.pick,
+            each = H.each,
+            isNumber = H.isNumber,
+            colorAxisMethods;
+
+        // These methods are defined in the ColorAxis object, and copied here.
+        // If we implement an AMD system we should make ColorAxis a dependency.
+        colorAxisMethods = {
+
+
+            initDataClasses: function(userOptions) {
+                var axis = this,
+                    chart = this.chart,
+                    dataClasses,
+                    colorCounter = 0,
+                    options = this.options;
+                this.dataClasses = dataClasses = [];
+
+                each(userOptions.dataClasses, function(dataClass, i) {
+                    var colors;
+
+                    dataClass = H.merge(dataClass);
+                    dataClasses.push(dataClass);
+                    if (!dataClass.color) {
+                        if (options.dataClassColor === 'category') {
+                            colors = chart.options.colors;
+                            dataClass.color = colors[colorCounter++];
+                            // loop back to zero
+                            if (colorCounter === colors.length) {
+                                colorCounter = 0;
+                            }
+                        } else {
+                            dataClass.color = axis.tweenColors(H.color(options.minColor), H.color(options.maxColor), i / (userOptions.dataClasses.length - 1));
+                        }
+                    }
+                });
+            },
+
+            initStops: function(userOptions) {
+                this.stops = userOptions.stops || [
+                    [0, this.options.minColor],
+                    [1, this.options.maxColor]
+                ];
+                each(this.stops, function(stop) {
+                    stop.color = H.color(stop[1]);
+                });
+            },
+            /** 
+             * Translate from a value to a color
+             */
+            toColor: function(value, point) {
+                var pos,
+                    stops = this.stops,
+                    from,
+                    to,
+                    color,
+                    dataClasses = this.dataClasses,
+                    dataClass,
+                    i;
+
+                if (dataClasses) {
+                    i = dataClasses.length;
+                    while (i--) {
+                        dataClass = dataClasses[i];
+                        from = dataClass.from;
+                        to = dataClass.to;
+                        if ((from === undefined || value >= from) && (to === undefined || value <= to)) {
+                            color = dataClass.color;
+                            if (point) {
+                                point.dataClass = i;
+                            }
+                            break;
+                        }
+                    }
+
+                } else {
+
+                    if (this.isLog) {
+                        value = this.val2lin(value);
+                    }
+                    pos = 1 - ((this.max - value) / (this.max - this.min));
+                    i = stops.length;
+                    while (i--) {
+                        if (pos > stops[i][0]) {
+                            break;
+                        }
+                    }
+                    from = stops[i] || stops[i + 1];
+                    to = stops[i + 1] || from;
+
+                    // The position within the gradient
+                    pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);
+
+                    color = this.tweenColors(
+                        from.color,
+                        to.color,
+                        pos
+                    );
+                }
+                return color;
+            },
+            /*
+             * Return an intermediate color between two colors, according to pos where 0
+             * is the from color and 1 is the to color.
+             */
+            tweenColors: function(from, to, pos) {
+                // Check for has alpha, because rgba colors perform worse due to lack of
+                // support in WebKit.
+                var hasAlpha,
+                    ret;
+
+                // Unsupported color, return to-color (#3920)
+                if (!to.rgba.length || !from.rgba.length) {
+                    ret = to.input || 'none';
+
+                    // Interpolate
+                } else {
+                    from = from.rgba;
+                    to = to.rgba;
+                    hasAlpha = (to[3] !== 1 || from[3] !== 1);
+                    ret = (hasAlpha ? 'rgba(' : 'rgb(') +
+                        Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' +
+                        Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' +
+                        Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) +
+                        (hasAlpha ? (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) : '') + ')';
+                }
+                return ret;
+            }
+        };
+
+        /**
+         * Handle animation of the color attributes directly
+         */
+        each(['fill', 'stroke'], function(prop) {
+            H.Fx.prototype[prop + 'Setter'] = function() {
+                this.elem.attr(
+                    prop,
+                    colorAxisMethods.tweenColors(
+                        H.color(this.start),
+                        H.color(this.end),
+                        this.pos
+                    ),
+                    null,
+                    true
+                );
+            };
+        });
+
+        // The solidgauge series type
+        H.seriesType('solidgauge', 'gauge', {
+            colorByPoint: true
+
+        }, {
+
+            /**
+             * Extend the translate function to extend the Y axis with the necessary
+             * decoration (#5895).
+             */
+            translate: function() {
+                var axis = this.yAxis;
+                H.extend(axis, colorAxisMethods);
+
+                // Prepare data classes
+                if (!axis.dataClasses && axis.options.dataClasses) {
+                    axis.initDataClasses(axis.options);
+                }
+                axis.initStops(axis.options);
+
+                // Generate points and inherit data label position
+                H.seriesTypes.gauge.prototype.translate.call(this);
+            },
+
+            /**
+             * Draw the points where each point is one needle
+             */
+            drawPoints: function() {
+                var series = this,
+                    yAxis = series.yAxis,
+                    center = yAxis.center,
+                    options = series.options,
+                    renderer = series.chart.renderer,
+                    overshoot = options.overshoot,
+                    overshootVal = isNumber(overshoot) ? overshoot / 180 * Math.PI : 0,
+                    thresholdAngleRad;
+
+                // Handle the threshold option
+                if (isNumber(options.threshold)) {
+                    thresholdAngleRad = yAxis.startAngleRad + yAxis.translate(
+                        options.threshold,
+                        null,
+                        null,
+                        null,
+                        true
+                    );
+                }
+                this.thresholdAngleRad = pick(thresholdAngleRad, yAxis.startAngleRad);
+
+
+                each(series.points, function(point) {
+                    var graphic = point.graphic,
+                        rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true),
+                        radius = (pInt(pick(point.options.radius, options.radius, 100)) * center[2]) / 200,
+                        innerRadius = (pInt(pick(point.options.innerRadius, options.innerRadius, 60)) * center[2]) / 200,
+                        shapeArgs,
+                        d,
+                        toColor = yAxis.toColor(point.y, point),
+                        axisMinAngle = Math.min(yAxis.startAngleRad, yAxis.endAngleRad),
+                        axisMaxAngle = Math.max(yAxis.startAngleRad, yAxis.endAngleRad),
+                        minAngle,
+                        maxAngle;
+
+                    if (toColor === 'none') { // #3708
+                        toColor = point.color || series.color || 'none';
+                    }
+                    if (toColor !== 'none') {
+                        point.color = toColor;
+                    }
+
+                    // Handle overshoot and clipping to axis max/min
+                    rotation = Math.max(axisMinAngle - overshootVal, Math.min(axisMaxAngle + overshootVal, rotation));
+
+                    // Handle the wrap option
+                    if (options.wrap === false) {
+                        rotation = Math.max(axisMinAngle, Math.min(axisMaxAngle, rotation));
+                    }
+
+                    minAngle = Math.min(rotation, series.thresholdAngleRad);
+                    maxAngle = Math.max(rotation, series.thresholdAngleRad);
+
+                    if (maxAngle - minAngle > 2 * Math.PI) {
+                        maxAngle = minAngle + 2 * Math.PI;
+                    }
+
+                    point.shapeArgs = shapeArgs = {
+                        x: center[0],
+                        y: center[1],
+                        r: radius,
+                        innerR: innerRadius,
+                        start: minAngle,
+                        end: maxAngle,
+                        fill: toColor
+                    };
+                    point.startR = radius; // For PieSeries.animate
+
+                    if (graphic) {
+                        d = shapeArgs.d;
+                        graphic.animate(shapeArgs);
+                        if (d) {
+                            shapeArgs.d = d; // animate alters it
+                        }
+                    } else {
+                        point.graphic = renderer.arc(shapeArgs)
+                            .addClass('highcharts-point')
+                            .attr({
+                                fill: toColor,
+                                'sweep-flag': 0
+                            })
+                            .add(series.group);
+
+
+                    }
+                });
+            },
+
+            /**
+             * Extend the pie slice animation by animating from start angle and up
+             */
+            animate: function(init) {
+
+                if (!init) {
+                    this.startAngleRad = this.thresholdAngleRad;
+                    H.seriesTypes.pie.prototype.animate.call(this, init);
+                }
+            }
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 29 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/treemap.js


+ 881 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/treemap.src.js

@@ -0,0 +1,881 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2014 Highsoft AS
+ * Authors: Jon Arild Nygard / Oystein Moseng
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2014 Highsoft AS
+         * Authors: Jon Arild Nygard / Oystein Moseng
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+
+        var seriesType = H.seriesType,
+            seriesTypes = H.seriesTypes,
+            map = H.map,
+            merge = H.merge,
+            extend = H.extend,
+            noop = H.noop,
+            each = H.each,
+            grep = H.grep,
+            isNumber = H.isNumber,
+            pick = H.pick,
+            Series = H.Series,
+            stableSort = H.stableSort,
+            color = H.Color,
+            eachObject = function(list, func, context) {
+                var key;
+                context = context || this;
+                for (key in list) {
+                    if (list.hasOwnProperty(key)) {
+                        func.call(context, list[key], key, list);
+                    }
+                }
+            },
+            reduce = function(arr, func, previous, context) {
+                context = context || this;
+                arr = arr || []; // @note should each be able to handle empty values automatically?
+                each(arr, function(current, i) {
+                    previous = func.call(context, previous, current, i, arr);
+                });
+                return previous;
+            },
+            // @todo find correct name for this function. 
+            // @todo Similar to reduce, this function is likely redundant
+            recursive = function(item, func, context) {
+                var next;
+                context = context || this;
+                next = func.call(context, item);
+                if (next !== false) {
+                    recursive(next, func, context);
+                }
+            };
+
+        // The Treemap series type
+        seriesType('treemap', 'scatter', {
+            showInLegend: false,
+            marker: false,
+            dataLabels: {
+                enabled: true,
+                defer: false,
+                verticalAlign: 'middle',
+                formatter: function() { // #2945
+                    return this.point.name || this.point.id;
+                },
+                inside: true
+            },
+            tooltip: {
+                headerFormat: '',
+                pointFormat: '<b>{point.name}</b>: {point.value}</b><br/>'
+            },
+            layoutAlgorithm: 'sliceAndDice',
+            layoutStartingDirection: 'vertical',
+            alternateStartingDirection: false,
+            levelIsConstant: true,
+            drillUpButton: {
+                position: {
+                    align: 'right',
+                    x: -10,
+                    y: 10
+                }
+            },
+
+
+            // Prototype members
+        }, {
+            pointArrayMap: ['value'],
+            axisTypes: seriesTypes.heatmap ? ['xAxis', 'yAxis', 'colorAxis'] : ['xAxis', 'yAxis'],
+            optionalAxis: 'colorAxis',
+            getSymbol: noop,
+            parallelArrays: ['x', 'y', 'value', 'colorValue'],
+            colorKey: 'colorValue', // Point color option key
+            translateColors: seriesTypes.heatmap && seriesTypes.heatmap.prototype.translateColors,
+            trackerGroups: ['group', 'dataLabelsGroup'],
+            /**
+             * Creates an object map from parent id to childrens index.
+             * @param {Array} data List of points set in options.
+             * @param {string} data[].parent Parent id of point.
+             * @param {Array} ids List of all point ids.
+             * @return {Object} Map from parent id to children index in data.
+             */
+            getListOfParents: function(data, ids) {
+                var listOfParents = reduce(data, function(prev, curr, i) {
+                    var parent = pick(curr.parent, '');
+                    if (prev[parent] === undefined) {
+                        prev[parent] = [];
+                    }
+                    prev[parent].push(i);
+                    return prev;
+                }, {});
+
+                // If parent does not exist, hoist parent to root of tree.
+                eachObject(listOfParents, function(children, parent, list) {
+                    if ((parent !== '') && (H.inArray(parent, ids) === -1)) {
+                        each(children, function(child) {
+                            list[''].push(child);
+                        });
+                        delete list[parent];
+                    }
+                });
+                return listOfParents;
+            },
+            /**
+             * Creates a tree structured object from the series points
+             */
+            getTree: function() {
+                var tree,
+                    series = this,
+                    allIds = map(this.data, function(d) {
+                        return d.id;
+                    }),
+                    parentList = series.getListOfParents(this.data, allIds);
+
+                series.nodeMap = [];
+                tree = series.buildNode('', -1, 0, parentList, null);
+                // Parents of the root node is by default visible
+                recursive(this.nodeMap[this.rootNode], function(node) {
+                    var next = false,
+                        p = node.parent;
+                    node.visible = true;
+                    if (p || p === '') {
+                        next = series.nodeMap[p];
+                    }
+                    return next;
+                });
+                // Children of the root node is by default visible
+                recursive(this.nodeMap[this.rootNode].children, function(children) {
+                    var next = false;
+                    each(children, function(child) {
+                        child.visible = true;
+                        if (child.children.length) {
+                            next = (next || []).concat(child.children);
+                        }
+                    });
+                    return next;
+                });
+                this.setTreeValues(tree);
+                return tree;
+            },
+            init: function(chart, options) {
+                var series = this;
+                Series.prototype.init.call(series, chart, options);
+                if (series.options.allowDrillToNode) {
+                    series.drillTo();
+                }
+            },
+            buildNode: function(id, i, level, list, parent) {
+                var series = this,
+                    children = [],
+                    point = series.points[i],
+                    node,
+                    child;
+
+                // Actions
+                each((list[id] || []), function(i) {
+                    child = series.buildNode(series.points[i].id, i, (level + 1), list, id);
+                    children.push(child);
+                });
+                node = {
+                    id: id,
+                    i: i,
+                    children: children,
+                    level: level,
+                    parent: parent,
+                    visible: false // @todo move this to better location
+                };
+                series.nodeMap[node.id] = node;
+                if (point) {
+                    point.node = node;
+                }
+                return node;
+            },
+            setTreeValues: function(tree) {
+                var series = this,
+                    options = series.options,
+                    childrenTotal = 0,
+                    children = [],
+                    val,
+                    point = series.points[tree.i];
+
+                // First give the children some values
+                each(tree.children, function(child) {
+                    child = series.setTreeValues(child);
+                    children.push(child);
+
+                    if (!child.ignore) {
+                        childrenTotal += child.val;
+                    } else {
+                        // @todo Add predicate to avoid looping already ignored children
+                        recursive(child.children, function(children) {
+                            var next = false;
+                            each(children, function(node) {
+                                extend(node, {
+                                    ignore: true,
+                                    isLeaf: false,
+                                    visible: false
+                                });
+                                if (node.children.length) {
+                                    next = (next || []).concat(node.children);
+                                }
+                            });
+                            return next;
+                        });
+                    }
+                });
+                // Sort the children
+                stableSort(children, function(a, b) {
+                    return a.sortIndex - b.sortIndex;
+                });
+                // Set the values
+                val = pick(point && point.options.value, childrenTotal);
+                if (point) {
+                    point.value = val;
+                }
+                extend(tree, {
+                    children: children,
+                    childrenTotal: childrenTotal,
+                    // Ignore this node if point is not visible
+                    ignore: !(pick(point && point.visible, true) && (val > 0)),
+                    isLeaf: tree.visible && !childrenTotal,
+                    levelDynamic: (options.levelIsConstant ? tree.level : (tree.level - series.nodeMap[series.rootNode].level)),
+                    name: pick(point && point.name, ''),
+                    sortIndex: pick(point && point.sortIndex, -val),
+                    val: val
+                });
+                return tree;
+            },
+            /**
+             * Recursive function which calculates the area for all children of a node.
+             * @param {Object} node The node which is parent to the children.
+             * @param {Object} area The rectangular area of the parent.
+             */
+            calculateChildrenAreas: function(parent, area) {
+                var series = this,
+                    options = series.options,
+                    level = this.levelMap[parent.levelDynamic + 1],
+                    algorithm = pick((series[level && level.layoutAlgorithm] && level.layoutAlgorithm), options.layoutAlgorithm),
+                    alternate = options.alternateStartingDirection,
+                    childrenValues = [],
+                    children;
+
+                // Collect all children which should be included
+                children = grep(parent.children, function(n) {
+                    return !n.ignore;
+                });
+
+                if (level && level.layoutStartingDirection) {
+                    area.direction = level.layoutStartingDirection === 'vertical' ? 0 : 1;
+                }
+                childrenValues = series[algorithm](area, children);
+                each(children, function(child, index) {
+                    var values = childrenValues[index];
+                    child.values = merge(values, {
+                        val: child.childrenTotal,
+                        direction: (alternate ? 1 - area.direction : area.direction)
+                    });
+                    child.pointValues = merge(values, {
+                        x: (values.x / series.axisRatio),
+                        width: (values.width / series.axisRatio)
+                    });
+                    // If node has children, then call method recursively
+                    if (child.children.length) {
+                        series.calculateChildrenAreas(child, child.values);
+                    }
+                });
+            },
+            setPointValues: function() {
+                var series = this,
+                    xAxis = series.xAxis,
+                    yAxis = series.yAxis;
+                each(series.points, function(point) {
+                    var node = point.node,
+                        values = node.pointValues,
+                        x1,
+                        x2,
+                        y1,
+                        y2,
+                        crispCorr = 0.5; // Assume 1px borderWidth for simplicity
+
+                    // Points which is ignored, have no values.
+                    if (values && node.visible) {
+                        x1 = Math.round(xAxis.translate(values.x, 0, 0, 0, 1)) - crispCorr;
+                        x2 = Math.round(xAxis.translate(values.x + values.width, 0, 0, 0, 1)) - crispCorr;
+                        y1 = Math.round(yAxis.translate(values.y, 0, 0, 0, 1)) - crispCorr;
+                        y2 = Math.round(yAxis.translate(values.y + values.height, 0, 0, 0, 1)) - crispCorr;
+                        // Set point values
+                        point.shapeType = 'rect';
+                        point.shapeArgs = {
+                            x: Math.min(x1, x2),
+                            y: Math.min(y1, y2),
+                            width: Math.abs(x2 - x1),
+                            height: Math.abs(y2 - y1)
+                        };
+                        point.plotX = point.shapeArgs.x + (point.shapeArgs.width / 2);
+                        point.plotY = point.shapeArgs.y + (point.shapeArgs.height / 2);
+                    } else {
+                        // Reset visibility
+                        delete point.plotX;
+                        delete point.plotY;
+                    }
+                });
+            },
+            setColorRecursive: function(node, color, colorIndex) {
+                var series = this,
+                    point,
+                    level;
+                if (node) {
+                    point = series.points[node.i];
+                    level = series.levelMap[node.levelDynamic];
+                    // Select either point color, level color or inherited color.
+                    color = pick(point && point.options.color, level && level.color, color);
+                    colorIndex = pick(point && point.options.colorIndex, level && level.colorIndex, colorIndex);
+                    if (point) {
+                        point.color = color;
+                        point.colorIndex = colorIndex;
+                    }
+
+                    // Do it all again with the children	
+                    if (node.children.length) {
+                        each(node.children, function(child) {
+                            series.setColorRecursive(child, color, colorIndex);
+                        });
+                    }
+                }
+            },
+            algorithmGroup: function(h, w, d, p) {
+                this.height = h;
+                this.width = w;
+                this.plot = p;
+                this.direction = d;
+                this.startDirection = d;
+                this.total = 0;
+                this.nW = 0;
+                this.lW = 0;
+                this.nH = 0;
+                this.lH = 0;
+                this.elArr = [];
+                this.lP = {
+                    total: 0,
+                    lH: 0,
+                    nH: 0,
+                    lW: 0,
+                    nW: 0,
+                    nR: 0,
+                    lR: 0,
+                    aspectRatio: function(w, h) {
+                        return Math.max((w / h), (h / w));
+                    }
+                };
+                this.addElement = function(el) {
+                    this.lP.total = this.elArr[this.elArr.length - 1];
+                    this.total = this.total + el;
+                    if (this.direction === 0) {
+                        // Calculate last point old aspect ratio
+                        this.lW = this.nW;
+                        this.lP.lH = this.lP.total / this.lW;
+                        this.lP.lR = this.lP.aspectRatio(this.lW, this.lP.lH);
+                        // Calculate last point new aspect ratio
+                        this.nW = this.total / this.height;
+                        this.lP.nH = this.lP.total / this.nW;
+                        this.lP.nR = this.lP.aspectRatio(this.nW, this.lP.nH);
+                    } else {
+                        // Calculate last point old aspect ratio
+                        this.lH = this.nH;
+                        this.lP.lW = this.lP.total / this.lH;
+                        this.lP.lR = this.lP.aspectRatio(this.lP.lW, this.lH);
+                        // Calculate last point new aspect ratio
+                        this.nH = this.total / this.width;
+                        this.lP.nW = this.lP.total / this.nH;
+                        this.lP.nR = this.lP.aspectRatio(this.lP.nW, this.nH);
+                    }
+                    this.elArr.push(el);
+                };
+                this.reset = function() {
+                    this.nW = 0;
+                    this.lW = 0;
+                    this.elArr = [];
+                    this.total = 0;
+                };
+            },
+            algorithmCalcPoints: function(directionChange, last, group, childrenArea) {
+                var pX,
+                    pY,
+                    pW,
+                    pH,
+                    gW = group.lW,
+                    gH = group.lH,
+                    plot = group.plot,
+                    keep,
+                    i = 0,
+                    end = group.elArr.length - 1;
+                if (last) {
+                    gW = group.nW;
+                    gH = group.nH;
+                } else {
+                    keep = group.elArr[group.elArr.length - 1];
+                }
+                each(group.elArr, function(p) {
+                    if (last || (i < end)) {
+                        if (group.direction === 0) {
+                            pX = plot.x;
+                            pY = plot.y;
+                            pW = gW;
+                            pH = p / pW;
+                        } else {
+                            pX = plot.x;
+                            pY = plot.y;
+                            pH = gH;
+                            pW = p / pH;
+                        }
+                        childrenArea.push({
+                            x: pX,
+                            y: pY,
+                            width: pW,
+                            height: pH
+                        });
+                        if (group.direction === 0) {
+                            plot.y = plot.y + pH;
+                        } else {
+                            plot.x = plot.x + pW;
+                        }
+                    }
+                    i = i + 1;
+                });
+                // Reset variables
+                group.reset();
+                if (group.direction === 0) {
+                    group.width = group.width - gW;
+                } else {
+                    group.height = group.height - gH;
+                }
+                plot.y = plot.parent.y + (plot.parent.height - group.height);
+                plot.x = plot.parent.x + (plot.parent.width - group.width);
+                if (directionChange) {
+                    group.direction = 1 - group.direction;
+                }
+                // If not last, then add uncalculated element
+                if (!last) {
+                    group.addElement(keep);
+                }
+            },
+            algorithmLowAspectRatio: function(directionChange, parent, children) {
+                var childrenArea = [],
+                    series = this,
+                    pTot,
+                    plot = {
+                        x: parent.x,
+                        y: parent.y,
+                        parent: parent
+                    },
+                    direction = parent.direction,
+                    i = 0,
+                    end = children.length - 1,
+                    group = new this.algorithmGroup(parent.height, parent.width, direction, plot); // eslint-disable-line new-cap
+                // Loop through and calculate all areas
+                each(children, function(child) {
+                    pTot = (parent.width * parent.height) * (child.val / parent.val);
+                    group.addElement(pTot);
+                    if (group.lP.nR > group.lP.lR) {
+                        series.algorithmCalcPoints(directionChange, false, group, childrenArea, plot);
+                    }
+                    // If last child, then calculate all remaining areas
+                    if (i === end) {
+                        series.algorithmCalcPoints(directionChange, true, group, childrenArea, plot);
+                    }
+                    i = i + 1;
+                });
+                return childrenArea;
+            },
+            algorithmFill: function(directionChange, parent, children) {
+                var childrenArea = [],
+                    pTot,
+                    direction = parent.direction,
+                    x = parent.x,
+                    y = parent.y,
+                    width = parent.width,
+                    height = parent.height,
+                    pX,
+                    pY,
+                    pW,
+                    pH;
+                each(children, function(child) {
+                    pTot = (parent.width * parent.height) * (child.val / parent.val);
+                    pX = x;
+                    pY = y;
+                    if (direction === 0) {
+                        pH = height;
+                        pW = pTot / pH;
+                        width = width - pW;
+                        x = x + pW;
+                    } else {
+                        pW = width;
+                        pH = pTot / pW;
+                        height = height - pH;
+                        y = y + pH;
+                    }
+                    childrenArea.push({
+                        x: pX,
+                        y: pY,
+                        width: pW,
+                        height: pH
+                    });
+                    if (directionChange) {
+                        direction = 1 - direction;
+                    }
+                });
+                return childrenArea;
+            },
+            strip: function(parent, children) {
+                return this.algorithmLowAspectRatio(false, parent, children);
+            },
+            squarified: function(parent, children) {
+                return this.algorithmLowAspectRatio(true, parent, children);
+            },
+            sliceAndDice: function(parent, children) {
+                return this.algorithmFill(true, parent, children);
+            },
+            stripes: function(parent, children) {
+                return this.algorithmFill(false, parent, children);
+            },
+            translate: function() {
+                var pointValues,
+                    seriesArea,
+                    tree,
+                    val;
+
+                // Call prototype function
+                Series.prototype.translate.call(this);
+
+                // Assign variables
+                this.rootNode = pick(this.options.rootId, '');
+                // Create a object map from level to options
+                this.levelMap = reduce(this.options.levels, function(arr, item) {
+                    arr[item.level] = item;
+                    return arr;
+                }, {});
+                tree = this.tree = this.getTree(); // @todo Only if series.isDirtyData is true
+
+                // Calculate plotting values.
+                this.axisRatio = (this.xAxis.len / this.yAxis.len);
+                this.nodeMap[''].pointValues = pointValues = {
+                    x: 0,
+                    y: 0,
+                    width: 100,
+                    height: 100
+                };
+                this.nodeMap[''].values = seriesArea = merge(pointValues, {
+                    width: (pointValues.width * this.axisRatio),
+                    direction: (this.options.layoutStartingDirection === 'vertical' ? 0 : 1),
+                    val: tree.val
+                });
+                this.calculateChildrenAreas(tree, seriesArea);
+
+                // Logic for point colors
+                if (this.colorAxis) {
+                    this.translateColors();
+                } else if (!this.options.colorByPoint) {
+                    this.setColorRecursive(this.tree);
+                }
+
+                // Update axis extremes according to the root node.
+                if (this.options.allowDrillToNode) {
+                    val = this.nodeMap[this.rootNode].pointValues;
+                    this.xAxis.setExtremes(val.x, val.x + val.width, false);
+                    this.yAxis.setExtremes(val.y, val.y + val.height, false);
+                    this.xAxis.setScale();
+                    this.yAxis.setScale();
+                }
+
+                // Assign values to points.
+                this.setPointValues();
+            },
+            /**
+             * Extend drawDataLabels with logic to handle custom options related to the treemap series:
+             * - Points which is not a leaf node, has dataLabels disabled by default.
+             * - Options set on series.levels is merged in.
+             * - Width of the dataLabel is set to match the width of the point shape.
+             */
+            drawDataLabels: function() {
+                var series = this,
+                    points = grep(series.points, function(n) {
+                        return n.node.visible;
+                    }),
+                    options,
+                    level;
+                each(points, function(point) {
+                    level = series.levelMap[point.node.levelDynamic];
+                    // Set options to new object to avoid problems with scope
+                    options = {
+                        style: {}
+                    };
+
+                    // If not a leaf, then label should be disabled as default
+                    if (!point.node.isLeaf) {
+                        options.enabled = false;
+                    }
+
+                    // If options for level exists, include them as well
+                    if (level && level.dataLabels) {
+                        options = merge(options, level.dataLabels);
+                        series._hasPointLabels = true;
+                    }
+
+                    // Set dataLabel width to the width of the point shape.
+                    if (point.shapeArgs) {
+                        options.style.width = point.shapeArgs.width;
+                        if (point.dataLabel) {
+                            point.dataLabel.css({
+                                width: point.shapeArgs.width + 'px'
+                            });
+                        }
+                    }
+
+                    // Merge custom options with point options
+                    point.dlOptions = merge(options, point.options.dataLabels);
+                });
+                Series.prototype.drawDataLabels.call(this);
+            },
+
+            /**
+             * Over the alignment method by setting z index
+             */
+            alignDataLabel: function(point) {
+                seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);
+                if (point.dataLabel) {
+                    point.dataLabel.attr({
+                        zIndex: point.node.zIndex + 1
+                    });
+                }
+            },
+
+
+
+            /**
+             * Extending ColumnSeries drawPoints
+             */
+            drawPoints: function() {
+                var series = this,
+                    points = grep(series.points, function(n) {
+                        return n.node.visible;
+                    });
+
+                each(points, function(point) {
+                    var groupKey = 'levelGroup-' + point.node.levelDynamic;
+                    if (!series[groupKey]) {
+                        series[groupKey] = series.chart.renderer.g(groupKey)
+                            .attr({
+                                zIndex: 1000 - point.node.levelDynamic // @todo Set the zIndex based upon the number of levels, instead of using 1000
+                            })
+                            .add(series.group);
+                    }
+                    point.group = series[groupKey];
+
+                });
+                // Call standard drawPoints
+                seriesTypes.column.prototype.drawPoints.call(this);
+
+                // If drillToNode is allowed, set a point cursor on clickables & add drillId to point 
+                if (series.options.allowDrillToNode) {
+                    each(points, function(point) {
+                        if (point.graphic) {
+                            point.drillId = series.options.interactByLeaf ? series.drillToByLeaf(point) : series.drillToByGroup(point);
+                        }
+                    });
+                }
+            },
+            /**
+             * Add drilling on the suitable points
+             */
+            drillTo: function() {
+                var series = this;
+                H.addEvent(series, 'click', function(event) {
+                    var point = event.point,
+                        drillId = point.drillId,
+                        drillName;
+                    // If a drill id is returned, add click event and cursor. 
+                    if (drillId) {
+                        drillName = series.nodeMap[series.rootNode].name || series.rootNode;
+                        point.setState(''); // Remove hover
+                        series.drillToNode(drillId);
+                        series.showDrillUpButton(drillName);
+                    }
+                });
+            },
+            /**
+             * Finds the drill id for a parent node.
+             * Returns false if point should not have a click event
+             * @param {Object} point
+             * @return {string || boolean} Drill to id or false when point should not have a click event
+             */
+            drillToByGroup: function(point) {
+                var series = this,
+                    drillId = false;
+                if ((point.node.level - series.nodeMap[series.rootNode].level) === 1 && !point.node.isLeaf) {
+                    drillId = point.id;
+                }
+                return drillId;
+            },
+            /**
+             * Finds the drill id for a leaf node.
+             * Returns false if point should not have a click event
+             * @param {Object} point
+             * @return {string || boolean} Drill to id or false when point should not have a click event
+             */
+            drillToByLeaf: function(point) {
+                var series = this,
+                    drillId = false,
+                    nodeParent;
+                if ((point.node.parent !== series.rootNode) && (point.node.isLeaf)) {
+                    nodeParent = point.node;
+                    while (!drillId) {
+                        nodeParent = series.nodeMap[nodeParent.parent];
+                        if (nodeParent.parent === series.rootNode) {
+                            drillId = nodeParent.id;
+                        }
+                    }
+                }
+                return drillId;
+            },
+            drillUp: function() {
+                var drillPoint = null,
+                    node,
+                    parent;
+                if (this.rootNode) {
+                    node = this.nodeMap[this.rootNode];
+                    if (node.parent !== null) {
+                        drillPoint = this.nodeMap[node.parent];
+                    } else {
+                        drillPoint = this.nodeMap[''];
+                    }
+                }
+
+                if (drillPoint !== null) {
+                    this.drillToNode(drillPoint.id);
+                    if (drillPoint.id === '') {
+                        this.drillUpButton = this.drillUpButton.destroy();
+                    } else {
+                        parent = this.nodeMap[drillPoint.parent];
+                        this.showDrillUpButton((parent.name || parent.id));
+                    }
+                }
+            },
+            drillToNode: function(id) {
+                this.options.rootId = id;
+                this.isDirty = true; // Force redraw
+                this.chart.redraw();
+            },
+            showDrillUpButton: function(name) {
+                var series = this,
+                    backText = (name || '< Back'),
+                    buttonOptions = series.options.drillUpButton,
+                    attr,
+                    states;
+
+                if (buttonOptions.text) {
+                    backText = buttonOptions.text;
+                }
+                if (!this.drillUpButton) {
+                    attr = buttonOptions.theme;
+                    states = attr && attr.states;
+
+                    this.drillUpButton = this.chart.renderer.button(
+                            backText,
+                            null,
+                            null,
+                            function() {
+                                series.drillUp();
+                            },
+                            attr,
+                            states && states.hover,
+                            states && states.select
+                        )
+                        .attr({
+                            align: buttonOptions.position.align,
+                            zIndex: 7
+                        })
+                        .add()
+                        .align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');
+                } else {
+                    this.drillUpButton.attr({
+                            text: backText
+                        })
+                        .align();
+                }
+            },
+            buildKDTree: noop,
+            drawLegendSymbol: H.LegendSymbolMixin.drawRectangle,
+            getExtremes: function() {
+                // Get the extremes from the value data
+                Series.prototype.getExtremes.call(this, this.colorValueData);
+                this.valueMin = this.dataMin;
+                this.valueMax = this.dataMax;
+
+                // Get the extremes from the y data
+                Series.prototype.getExtremes.call(this);
+            },
+            getExtremesFromAll: true,
+            bindAxes: function() {
+                var treeAxis = {
+                    endOnTick: false,
+                    gridLineWidth: 0,
+                    lineWidth: 0,
+                    min: 0,
+                    dataMin: 0,
+                    minPadding: 0,
+                    max: 100,
+                    dataMax: 100,
+                    maxPadding: 0,
+                    startOnTick: false,
+                    title: null,
+                    tickPositions: []
+                };
+                Series.prototype.bindAxes.call(this);
+                H.extend(this.yAxis.options, treeAxis);
+                H.extend(this.xAxis.options, treeAxis);
+            }
+
+            // Point class
+        }, {
+            getClassName: function() {
+                var className = H.Point.prototype.getClassName.call(this),
+                    series = this.series,
+                    options = series.options;
+
+                // Above the current level
+                if (this.node.level <= series.nodeMap[series.rootNode].level) {
+                    className += ' highcharts-above-level';
+
+                } else if (!this.node.isLeaf && !pick(options.interactByLeaf, !options.allowDrillToNode)) {
+                    className += ' highcharts-internal-node-interactive';
+
+                } else if (!this.node.isLeaf) {
+                    className += ' highcharts-internal-node';
+                }
+                return className;
+            },
+            isValid: function() {
+                return isNumber(this.value);
+            },
+            setState: function(state) {
+                H.Point.prototype.setState.call(this, state);
+                this.graphic.attr({
+                    zIndex: state === 'hover' ? 1 : 0
+                });
+            },
+            setVisible: seriesTypes.pie.prototype.pointClass.prototype.setVisible
+        });
+
+    }(Highcharts));
+}));

Diferenças do arquivo suprimidas por serem muito extensas
+ 15 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/xrange-series.js


+ 254 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/modules/xrange-series.src.js

@@ -0,0 +1,254 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ * X-range series
+ *
+ * (c) 2010-2016 Torstein Honsi, Lars A. V. Cabrera
+ *
+ * --- WORK IN PROGRESS ---
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(H) {
+        /**
+         * (c) 2014-2016 Highsoft AS
+         * Authors: Torstein Honsi, Lars A. V. Cabrera
+         *
+         * License: www.highcharts.com/license
+         */
+        'use strict';
+
+        var defaultPlotOptions = H.getOptions().plotOptions,
+            color = H.Color,
+            columnType = H.seriesTypes.column,
+            each = H.each,
+            extendClass = H.extendClass,
+            isNumber = H.isNumber,
+            isObject = H.isObject,
+            merge = H.merge,
+            pick = H.pick,
+            seriesTypes = H.seriesTypes,
+            wrap = H.wrap,
+            Axis = H.Axis,
+            Point = H.Point,
+            Series = H.Series,
+            pointFormat = '<span style="color:{point.color}">' +
+            '\u25CF' +
+            '</span> {series.name}: <b>{point.yCategory}</b><br/>',
+            xrange = 'xrange';
+
+        defaultPlotOptions.xrange = merge(defaultPlotOptions.column, {
+            tooltip: {
+                pointFormat: pointFormat
+            }
+        });
+        seriesTypes.xrange = extendClass(columnType, {
+            pointClass: extendClass(Point, {
+                // Add x2 and yCategory to the available properties for tooltip formats
+                getLabelConfig: function() {
+                    var cfg = Point.prototype.getLabelConfig.call(this);
+
+                    cfg.x2 = this.x2;
+                    cfg.yCategory = this.yCategory = this.series.yAxis.categories && this.series.yAxis.categories[this.y];
+                    return cfg;
+                }
+            }),
+            type: xrange,
+            forceDL: true,
+            parallelArrays: ['x', 'x2', 'y'],
+            requireSorting: false,
+            animate: seriesTypes.line.prototype.animate,
+
+            /**
+             * Borrow the column series metrics, but with swapped axes. This gives free access
+             * to features like groupPadding, grouping, pointWidth etc.
+             */
+            getColumnMetrics: function() {
+                var metrics,
+                    chart = this.chart;
+
+                function swapAxes() {
+                    each(chart.series, function(s) {
+                        var xAxis = s.xAxis;
+                        s.xAxis = s.yAxis;
+                        s.yAxis = xAxis;
+                    });
+                }
+
+                swapAxes();
+
+                this.yAxis.closestPointRange = 1;
+                metrics = columnType.prototype.getColumnMetrics.call(this);
+
+                swapAxes();
+
+                return metrics;
+            },
+
+            /**
+             * Override cropData to show a point where x is outside visible range
+             * but x2 is outside.
+             */
+            cropData: function(xData, yData, min, max) {
+
+                // Replace xData with x2Data to find the appropriate cropStart
+                var cropData = Series.prototype.cropData,
+                    crop = cropData.call(this, this.x2Data, yData, min, max);
+
+                // Re-insert the cropped xData
+                crop.xData = xData.slice(crop.start, crop.end);
+
+                return crop;
+            },
+
+            translate: function() {
+                columnType.prototype.translate.apply(this, arguments);
+                var series = this,
+                    xAxis = series.xAxis,
+                    metrics = series.columnMetrics,
+                    minPointLength = series.options.minPointLength || 0;
+
+                each(series.points, function(point) {
+                    var plotX = point.plotX,
+                        posX = pick(point.x2, point.x + (point.len || 0)),
+                        plotX2 = xAxis.toPixels(posX, true),
+                        width = plotX2 - plotX,
+                        widthDifference,
+                        shapeArgs,
+                        partialFill;
+
+                    if (minPointLength) {
+                        widthDifference = minPointLength - width;
+                        if (widthDifference < 0) {
+                            widthDifference = 0;
+                        }
+                        plotX -= widthDifference / 2;
+                        plotX2 += widthDifference / 2;
+                    }
+
+                    plotX = Math.max(plotX, -10);
+                    plotX2 = Math.min(Math.max(plotX2, -10), xAxis.len + 10);
+
+                    point.shapeArgs = {
+                        x: plotX,
+                        y: point.plotY + metrics.offset,
+                        width: plotX2 - plotX,
+                        height: metrics.width
+                    };
+                    point.tooltipPos[0] += width / 2;
+                    point.tooltipPos[1] -= metrics.width / 2;
+
+                    // Add a partShapeArgs to the point, based on the shapeArgs property
+                    partialFill = point.partialFill;
+                    if (partialFill) {
+                        // Get the partial fill amount
+                        if (isObject(partialFill)) {
+                            partialFill = partialFill.amount;
+                        }
+                        // If it was not a number, assume 0
+                        if (!isNumber(partialFill)) {
+                            partialFill = 0;
+                        }
+                        shapeArgs = point.shapeArgs;
+                        point.partShapeArgs = {
+                            x: shapeArgs.x,
+                            y: shapeArgs.y + 1,
+                            width: shapeArgs.width * partialFill,
+                            height: shapeArgs.height - 2
+                        };
+                    }
+                });
+            },
+
+            drawPoints: function() {
+                var series = this,
+                    chart = this.chart,
+                    options = series.options,
+                    renderer = chart.renderer,
+                    animationLimit = options.animationLimit || 250,
+                    verb = chart.pointCount < animationLimit ? 'animate' : 'attr';
+
+                // draw the columns
+                each(series.points, function(point) {
+                    var plotY = point.plotY,
+                        graphic = point.graphic,
+                        type = point.shapeType,
+                        shapeArgs = point.shapeArgs,
+                        partShapeArgs = point.partShapeArgs,
+                        seriesOpts = series.options,
+                        pfOptions = point.partialFill,
+                        fill,
+                        state = point.selected && 'select',
+                        cutOff = options.stacking && !options.borderRadius;
+
+                    if (isNumber(plotY) && point.y !== null) {
+                        if (graphic) { // update
+                            point.graphicOriginal[verb](
+                                merge(shapeArgs)
+                            );
+                            if (partShapeArgs) {
+                                point.graphicOverlay[verb](
+                                    merge(partShapeArgs)
+                                );
+                            }
+
+                        } else {
+                            point.graphic = graphic = renderer.g('point')
+                                .attr({
+                                    'class': point.getClassName()
+                                })
+                                .add(point.group || series.group);
+
+                            point.graphicOriginal = renderer[type](shapeArgs)
+                                .addClass('highcharts-partfill-original')
+                                .add(graphic);
+                            if (partShapeArgs) {
+                                point.graphicOverlay = renderer[type](partShapeArgs)
+                                    .addClass('highcharts-partfill-overlay')
+                                    .add(graphic);
+                            }
+                        }
+
+
+
+                    } else if (graphic) {
+                        point.graphic = graphic.destroy(); // #1269
+                    }
+                });
+            }
+        });
+
+        /**
+         * Max x2 should be considered in xAxis extremes
+         */
+        wrap(Axis.prototype, 'getSeriesExtremes', function(proceed) {
+            var axis = this,
+                series = axis.series,
+                dataMax,
+                modMax;
+
+            proceed.call(this);
+            if (axis.isXAxis && series.type === xrange) {
+                dataMax = pick(axis.dataMax, Number.MIN_VALUE);
+                each(this.series, function(series) {
+                    each(series.x2Data || [], function(val) {
+                        if (val > dataMax) {
+                            dataMax = val;
+                            modMax = true;
+                        }
+                    });
+                });
+                if (modMax) {
+                    axis.dataMax = dataMax;
+                }
+            }
+        });
+
+    }(Highcharts));
+}));

+ 317 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/dark-blue.js

@@ -0,0 +1,317 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         *
+         * Dark blue theme for Highcharts JS
+         * @author Torstein Honsi
+         */
+        'use strict';
+        Highcharts.theme = {
+            colors: ['#DDDF0D', '#55BF3B', '#DF5353', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',
+                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'
+            ],
+            chart: {
+                backgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 1,
+                        y2: 1
+                    },
+                    stops: [
+                        [0, 'rgb(48, 48, 96)'],
+                        [1, 'rgb(0, 0, 0)']
+                    ]
+                },
+                borderColor: '#000000',
+                borderWidth: 2,
+                className: 'dark-container',
+                plotBackgroundColor: 'rgba(255, 255, 255, .1)',
+                plotBorderColor: '#CCCCCC',
+                plotBorderWidth: 1
+            },
+            title: {
+                style: {
+                    color: '#C0C0C0',
+                    font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+                }
+            },
+            subtitle: {
+                style: {
+                    color: '#666666',
+                    font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+                }
+            },
+            xAxis: {
+                gridLineColor: '#333333',
+                gridLineWidth: 1,
+                labels: {
+                    style: {
+                        color: '#A0A0A0'
+                    }
+                },
+                lineColor: '#A0A0A0',
+                tickColor: '#A0A0A0',
+                title: {
+                    style: {
+                        color: '#CCC',
+                        fontWeight: 'bold',
+                        fontSize: '12px',
+                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+                    }
+                }
+            },
+            yAxis: {
+                gridLineColor: '#333333',
+                labels: {
+                    style: {
+                        color: '#A0A0A0'
+                    }
+                },
+                lineColor: '#A0A0A0',
+                minorTickInterval: null,
+                tickColor: '#A0A0A0',
+                tickWidth: 1,
+                title: {
+                    style: {
+                        color: '#CCC',
+                        fontWeight: 'bold',
+                        fontSize: '12px',
+                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+                    }
+                }
+            },
+            tooltip: {
+                backgroundColor: 'rgba(0, 0, 0, 0.75)',
+                style: {
+                    color: '#F0F0F0'
+                }
+            },
+            toolbar: {
+                itemStyle: {
+                    color: 'silver'
+                }
+            },
+            plotOptions: {
+                line: {
+                    dataLabels: {
+                        color: '#CCC'
+                    },
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                spline: {
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                scatter: {
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                candlestick: {
+                    lineColor: 'white'
+                }
+            },
+            legend: {
+                itemStyle: {
+                    font: '9pt Trebuchet MS, Verdana, sans-serif',
+                    color: '#A0A0A0'
+                },
+                itemHoverStyle: {
+                    color: '#FFF'
+                },
+                itemHiddenStyle: {
+                    color: '#444'
+                }
+            },
+            credits: {
+                style: {
+                    color: '#666'
+                }
+            },
+            labels: {
+                style: {
+                    color: '#CCC'
+                }
+            },
+
+            navigation: {
+                buttonOptions: {
+                    symbolStroke: '#DDDDDD',
+                    hoverSymbolStroke: '#FFFFFF',
+                    theme: {
+                        fill: {
+                            linearGradient: {
+                                x1: 0,
+                                y1: 0,
+                                x2: 0,
+                                y2: 1
+                            },
+                            stops: [
+                                [0.4, '#606060'],
+                                [0.6, '#333333']
+                            ]
+                        },
+                        stroke: '#000000'
+                    }
+                }
+            },
+
+            // scroll charts
+            rangeSelector: {
+                buttonTheme: {
+                    fill: {
+                        linearGradient: {
+                            x1: 0,
+                            y1: 0,
+                            x2: 0,
+                            y2: 1
+                        },
+                        stops: [
+                            [0.4, '#888'],
+                            [0.6, '#555']
+                        ]
+                    },
+                    stroke: '#000000',
+                    style: {
+                        color: '#CCC',
+                        fontWeight: 'bold'
+                    },
+                    states: {
+                        hover: {
+                            fill: {
+                                linearGradient: {
+                                    x1: 0,
+                                    y1: 0,
+                                    x2: 0,
+                                    y2: 1
+                                },
+                                stops: [
+                                    [0.4, '#BBB'],
+                                    [0.6, '#888']
+                                ]
+                            },
+                            stroke: '#000000',
+                            style: {
+                                color: 'white'
+                            }
+                        },
+                        select: {
+                            fill: {
+                                linearGradient: {
+                                    x1: 0,
+                                    y1: 0,
+                                    x2: 0,
+                                    y2: 1
+                                },
+                                stops: [
+                                    [0.1, '#000'],
+                                    [0.3, '#333']
+                                ]
+                            },
+                            stroke: '#000000',
+                            style: {
+                                color: 'yellow'
+                            }
+                        }
+                    }
+                },
+                inputStyle: {
+                    backgroundColor: '#333',
+                    color: 'silver'
+                },
+                labelStyle: {
+                    color: 'silver'
+                }
+            },
+
+            navigator: {
+                handles: {
+                    backgroundColor: '#666',
+                    borderColor: '#AAA'
+                },
+                outlineColor: '#CCC',
+                maskFill: 'rgba(16, 16, 16, 0.5)',
+                series: {
+                    color: '#7798BF',
+                    lineColor: '#A6C7ED'
+                }
+            },
+
+            scrollbar: {
+                barBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0.4, '#888'],
+                        [0.6, '#555']
+                    ]
+                },
+                barBorderColor: '#CCC',
+                buttonArrowColor: '#CCC',
+                buttonBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0.4, '#888'],
+                        [0.6, '#555']
+                    ]
+                },
+                buttonBorderColor: '#CCC',
+                rifleColor: '#FFF',
+                trackBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0, '#000'],
+                        [1, '#333']
+                    ]
+                },
+                trackBorderColor: '#666'
+            },
+
+            // special colors for some of the
+            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+            background2: 'rgb(35, 35, 70)',
+            dataLabelsColor: '#444',
+            textColor: '#C0C0C0',
+            maskColor: 'rgba(255,255,255,0.3)'
+        };
+
+        // Apply the theme
+        Highcharts.setOptions(Highcharts.theme);
+
+    }(Highcharts));
+}));

+ 314 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/dark-green.js

@@ -0,0 +1,314 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         * 
+         * Dark blue theme for Highcharts JS
+         * @author Torstein Honsi
+         */
+
+        'use strict';
+        Highcharts.theme = {
+            colors: ['#DDDF0D', '#55BF3B', '#DF5353', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',
+                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'
+            ],
+            chart: {
+                backgroundColor: {
+                    linearGradient: [0, 0, 250, 500],
+                    stops: [
+                        [0, 'rgb(48, 96, 48)'],
+                        [1, 'rgb(0, 0, 0)']
+                    ]
+                },
+                borderColor: '#000000',
+                borderWidth: 2,
+                className: 'dark-container',
+                plotBackgroundColor: 'rgba(255, 255, 255, .1)',
+                plotBorderColor: '#CCCCCC',
+                plotBorderWidth: 1
+            },
+            title: {
+                style: {
+                    color: '#C0C0C0',
+                    font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+                }
+            },
+            subtitle: {
+                style: {
+                    color: '#666666',
+                    font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+                }
+            },
+            xAxis: {
+                gridLineColor: '#333333',
+                gridLineWidth: 1,
+                labels: {
+                    style: {
+                        color: '#A0A0A0'
+                    }
+                },
+                lineColor: '#A0A0A0',
+                tickColor: '#A0A0A0',
+                title: {
+                    style: {
+                        color: '#CCC',
+                        fontWeight: 'bold',
+                        fontSize: '12px',
+                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+                    }
+                }
+            },
+            yAxis: {
+                gridLineColor: '#333333',
+                labels: {
+                    style: {
+                        color: '#A0A0A0'
+                    }
+                },
+                lineColor: '#A0A0A0',
+                minorTickInterval: null,
+                tickColor: '#A0A0A0',
+                tickWidth: 1,
+                title: {
+                    style: {
+                        color: '#CCC',
+                        fontWeight: 'bold',
+                        fontSize: '12px',
+                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+                    }
+                }
+            },
+            tooltip: {
+                backgroundColor: 'rgba(0, 0, 0, 0.75)',
+                style: {
+                    color: '#F0F0F0'
+                }
+            },
+            toolbar: {
+                itemStyle: {
+                    color: 'silver'
+                }
+            },
+            plotOptions: {
+                line: {
+                    dataLabels: {
+                        color: '#CCC'
+                    },
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                spline: {
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                scatter: {
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                candlestick: {
+                    lineColor: 'white'
+                }
+            },
+            legend: {
+                itemStyle: {
+                    font: '9pt Trebuchet MS, Verdana, sans-serif',
+                    color: '#A0A0A0'
+                },
+                itemHoverStyle: {
+                    color: '#FFF'
+                },
+                itemHiddenStyle: {
+                    color: '#444'
+                }
+            },
+            credits: {
+                style: {
+                    color: '#666'
+                }
+            },
+            labels: {
+                style: {
+                    color: '#CCC'
+                }
+            },
+
+
+            navigation: {
+                buttonOptions: {
+                    symbolStroke: '#DDDDDD',
+                    hoverSymbolStroke: '#FFFFFF',
+                    theme: {
+                        fill: {
+                            linearGradient: {
+                                x1: 0,
+                                y1: 0,
+                                x2: 0,
+                                y2: 1
+                            },
+                            stops: [
+                                [0.4, '#606060'],
+                                [0.6, '#333333']
+                            ]
+                        },
+                        stroke: '#000000'
+                    }
+                }
+            },
+
+            // scroll charts
+            rangeSelector: {
+                buttonTheme: {
+                    fill: {
+                        linearGradient: {
+                            x1: 0,
+                            y1: 0,
+                            x2: 0,
+                            y2: 1
+                        },
+                        stops: [
+                            [0.4, '#888'],
+                            [0.6, '#555']
+                        ]
+                    },
+                    stroke: '#000000',
+                    style: {
+                        color: '#CCC',
+                        fontWeight: 'bold'
+                    },
+                    states: {
+                        hover: {
+                            fill: {
+                                linearGradient: {
+                                    x1: 0,
+                                    y1: 0,
+                                    x2: 0,
+                                    y2: 1
+                                },
+                                stops: [
+                                    [0.4, '#BBB'],
+                                    [0.6, '#888']
+                                ]
+                            },
+                            stroke: '#000000',
+                            style: {
+                                color: 'white'
+                            }
+                        },
+                        select: {
+                            fill: {
+                                linearGradient: {
+                                    x1: 0,
+                                    y1: 0,
+                                    x2: 0,
+                                    y2: 1
+                                },
+                                stops: [
+                                    [0.1, '#000'],
+                                    [0.3, '#333']
+                                ]
+                            },
+                            stroke: '#000000',
+                            style: {
+                                color: 'yellow'
+                            }
+                        }
+                    }
+                },
+                inputStyle: {
+                    backgroundColor: '#333',
+                    color: 'silver'
+                },
+                labelStyle: {
+                    color: 'silver'
+                }
+            },
+
+            navigator: {
+                handles: {
+                    backgroundColor: '#666',
+                    borderColor: '#AAA'
+                },
+                outlineColor: '#CCC',
+                maskFill: 'rgba(16, 16, 16, 0.5)',
+                series: {
+                    color: '#7798BF',
+                    lineColor: '#A6C7ED'
+                }
+            },
+
+            scrollbar: {
+                barBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0.4, '#888'],
+                        [0.6, '#555']
+                    ]
+                },
+                barBorderColor: '#CCC',
+                buttonArrowColor: '#CCC',
+                buttonBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0.4, '#888'],
+                        [0.6, '#555']
+                    ]
+                },
+                buttonBorderColor: '#CCC',
+                rifleColor: '#FFF',
+                trackBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0, '#000'],
+                        [1, '#333']
+                    ]
+                },
+                trackBorderColor: '#666'
+            },
+
+            // special colors for some of the
+            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+            background2: 'rgb(35, 35, 70)',
+            dataLabelsColor: '#444',
+            textColor: '#C0C0C0',
+            maskColor: 'rgba(255,255,255,0.3)'
+        };
+
+        // Apply the theme
+        Highcharts.setOptions(Highcharts.theme);
+
+    }(Highcharts));
+}));

+ 243 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/dark-unica.js

@@ -0,0 +1,243 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         * 
+         * Dark theme for Highcharts JS
+         * @author Torstein Honsi
+         */
+
+        'use strict';
+        /* global document */
+        // Load the fonts
+        Highcharts.createElement('link', {
+            href: 'https://fonts.googleapis.com/css?family=Unica+One',
+            rel: 'stylesheet',
+            type: 'text/css'
+        }, null, document.getElementsByTagName('head')[0]);
+
+        Highcharts.theme = {
+            colors: ['#2b908f', '#90ee7e', '#f45b5b', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',
+                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'
+            ],
+            chart: {
+                backgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 1,
+                        y2: 1
+                    },
+                    stops: [
+                        [0, '#2a2a2b'],
+                        [1, '#3e3e40']
+                    ]
+                },
+                style: {
+                    fontFamily: '\'Unica One\', sans-serif'
+                },
+                plotBorderColor: '#606063'
+            },
+            title: {
+                style: {
+                    color: '#E0E0E3',
+                    textTransform: 'uppercase',
+                    fontSize: '20px'
+                }
+            },
+            subtitle: {
+                style: {
+                    color: '#E0E0E3',
+                    textTransform: 'uppercase'
+                }
+            },
+            xAxis: {
+                gridLineColor: '#707073',
+                labels: {
+                    style: {
+                        color: '#E0E0E3'
+                    }
+                },
+                lineColor: '#707073',
+                minorGridLineColor: '#505053',
+                tickColor: '#707073',
+                title: {
+                    style: {
+                        color: '#A0A0A3'
+
+                    }
+                }
+            },
+            yAxis: {
+                gridLineColor: '#707073',
+                labels: {
+                    style: {
+                        color: '#E0E0E3'
+                    }
+                },
+                lineColor: '#707073',
+                minorGridLineColor: '#505053',
+                tickColor: '#707073',
+                tickWidth: 1,
+                title: {
+                    style: {
+                        color: '#A0A0A3'
+                    }
+                }
+            },
+            tooltip: {
+                backgroundColor: 'rgba(0, 0, 0, 0.85)',
+                style: {
+                    color: '#F0F0F0'
+                }
+            },
+            plotOptions: {
+                series: {
+                    dataLabels: {
+                        color: '#B0B0B3'
+                    },
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                boxplot: {
+                    fillColor: '#505053'
+                },
+                candlestick: {
+                    lineColor: 'white'
+                },
+                errorbar: {
+                    color: 'white'
+                }
+            },
+            legend: {
+                itemStyle: {
+                    color: '#E0E0E3'
+                },
+                itemHoverStyle: {
+                    color: '#FFF'
+                },
+                itemHiddenStyle: {
+                    color: '#606063'
+                }
+            },
+            credits: {
+                style: {
+                    color: '#666'
+                }
+            },
+            labels: {
+                style: {
+                    color: '#707073'
+                }
+            },
+
+            drilldown: {
+                activeAxisLabelStyle: {
+                    color: '#F0F0F3'
+                },
+                activeDataLabelStyle: {
+                    color: '#F0F0F3'
+                }
+            },
+
+            navigation: {
+                buttonOptions: {
+                    symbolStroke: '#DDDDDD',
+                    theme: {
+                        fill: '#505053'
+                    }
+                }
+            },
+
+            // scroll charts
+            rangeSelector: {
+                buttonTheme: {
+                    fill: '#505053',
+                    stroke: '#000000',
+                    style: {
+                        color: '#CCC'
+                    },
+                    states: {
+                        hover: {
+                            fill: '#707073',
+                            stroke: '#000000',
+                            style: {
+                                color: 'white'
+                            }
+                        },
+                        select: {
+                            fill: '#000003',
+                            stroke: '#000000',
+                            style: {
+                                color: 'white'
+                            }
+                        }
+                    }
+                },
+                inputBoxBorderColor: '#505053',
+                inputStyle: {
+                    backgroundColor: '#333',
+                    color: 'silver'
+                },
+                labelStyle: {
+                    color: 'silver'
+                }
+            },
+
+            navigator: {
+                handles: {
+                    backgroundColor: '#666',
+                    borderColor: '#AAA'
+                },
+                outlineColor: '#CCC',
+                maskFill: 'rgba(255,255,255,0.1)',
+                series: {
+                    color: '#7798BF',
+                    lineColor: '#A6C7ED'
+                },
+                xAxis: {
+                    gridLineColor: '#505053'
+                }
+            },
+
+            scrollbar: {
+                barBackgroundColor: '#808083',
+                barBorderColor: '#808083',
+                buttonArrowColor: '#CCC',
+                buttonBackgroundColor: '#606063',
+                buttonBorderColor: '#606063',
+                rifleColor: '#FFF',
+                trackBackgroundColor: '#404043',
+                trackBorderColor: '#404043'
+            },
+
+            // special colors for some of the
+            legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+            background2: '#505053',
+            dataLabelsColor: '#B0B0B3',
+            textColor: '#C0C0C0',
+            contrastTextColor: '#F0F0F3',
+            maskColor: 'rgba(255,255,255,0.3)'
+        };
+
+        // Apply the theme
+        Highcharts.setOptions(Highcharts.theme);
+
+    }(Highcharts));
+}));

+ 326 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/gray.js

@@ -0,0 +1,326 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         * 
+         * Gray theme for Highcharts JS
+         * @author Torstein Honsi
+         */
+
+        'use strict';
+        Highcharts.theme = {
+            colors: ['#DDDF0D', '#7798BF', '#55BF3B', '#DF5353', '#aaeeee', '#ff0066', '#eeaaee',
+                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'
+            ],
+            chart: {
+                backgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0, 'rgb(96, 96, 96)'],
+                        [1, 'rgb(16, 16, 16)']
+                    ]
+                },
+                borderWidth: 0,
+                borderRadius: 0,
+                plotBackgroundColor: null,
+                plotShadow: false,
+                plotBorderWidth: 0
+            },
+            title: {
+                style: {
+                    color: '#FFF',
+                    font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+                }
+            },
+            subtitle: {
+                style: {
+                    color: '#DDD',
+                    font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+                }
+            },
+            xAxis: {
+                gridLineWidth: 0,
+                lineColor: '#999',
+                tickColor: '#999',
+                labels: {
+                    style: {
+                        color: '#999',
+                        fontWeight: 'bold'
+                    }
+                },
+                title: {
+                    style: {
+                        color: '#AAA',
+                        font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+                    }
+                }
+            },
+            yAxis: {
+                alternateGridColor: null,
+                minorTickInterval: null,
+                gridLineColor: 'rgba(255, 255, 255, .1)',
+                minorGridLineColor: 'rgba(255,255,255,0.07)',
+                lineWidth: 0,
+                tickWidth: 0,
+                labels: {
+                    style: {
+                        color: '#999',
+                        fontWeight: 'bold'
+                    }
+                },
+                title: {
+                    style: {
+                        color: '#AAA',
+                        font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+                    }
+                }
+            },
+            legend: {
+                itemStyle: {
+                    color: '#CCC'
+                },
+                itemHoverStyle: {
+                    color: '#FFF'
+                },
+                itemHiddenStyle: {
+                    color: '#333'
+                }
+            },
+            labels: {
+                style: {
+                    color: '#CCC'
+                }
+            },
+            tooltip: {
+                backgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0, 'rgba(96, 96, 96, .8)'],
+                        [1, 'rgba(16, 16, 16, .8)']
+                    ]
+                },
+                borderWidth: 0,
+                style: {
+                    color: '#FFF'
+                }
+            },
+
+
+            plotOptions: {
+                series: {
+                    nullColor: '#444444'
+                },
+                line: {
+                    dataLabels: {
+                        color: '#CCC'
+                    },
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                spline: {
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                scatter: {
+                    marker: {
+                        lineColor: '#333'
+                    }
+                },
+                candlestick: {
+                    lineColor: 'white'
+                }
+            },
+
+            toolbar: {
+                itemStyle: {
+                    color: '#CCC'
+                }
+            },
+
+            navigation: {
+                buttonOptions: {
+                    symbolStroke: '#DDDDDD',
+                    hoverSymbolStroke: '#FFFFFF',
+                    theme: {
+                        fill: {
+                            linearGradient: {
+                                x1: 0,
+                                y1: 0,
+                                x2: 0,
+                                y2: 1
+                            },
+                            stops: [
+                                [0.4, '#606060'],
+                                [0.6, '#333333']
+                            ]
+                        },
+                        stroke: '#000000'
+                    }
+                }
+            },
+
+            // scroll charts
+            rangeSelector: {
+                buttonTheme: {
+                    fill: {
+                        linearGradient: {
+                            x1: 0,
+                            y1: 0,
+                            x2: 0,
+                            y2: 1
+                        },
+                        stops: [
+                            [0.4, '#888'],
+                            [0.6, '#555']
+                        ]
+                    },
+                    stroke: '#000000',
+                    style: {
+                        color: '#CCC',
+                        fontWeight: 'bold'
+                    },
+                    states: {
+                        hover: {
+                            fill: {
+                                linearGradient: {
+                                    x1: 0,
+                                    y1: 0,
+                                    x2: 0,
+                                    y2: 1
+                                },
+                                stops: [
+                                    [0.4, '#BBB'],
+                                    [0.6, '#888']
+                                ]
+                            },
+                            stroke: '#000000',
+                            style: {
+                                color: 'white'
+                            }
+                        },
+                        select: {
+                            fill: {
+                                linearGradient: {
+                                    x1: 0,
+                                    y1: 0,
+                                    x2: 0,
+                                    y2: 1
+                                },
+                                stops: [
+                                    [0.1, '#000'],
+                                    [0.3, '#333']
+                                ]
+                            },
+                            stroke: '#000000',
+                            style: {
+                                color: 'yellow'
+                            }
+                        }
+                    }
+                },
+                inputStyle: {
+                    backgroundColor: '#333',
+                    color: 'silver'
+                },
+                labelStyle: {
+                    color: 'silver'
+                }
+            },
+
+            navigator: {
+                handles: {
+                    backgroundColor: '#666',
+                    borderColor: '#AAA'
+                },
+                outlineColor: '#CCC',
+                maskFill: 'rgba(16, 16, 16, 0.5)',
+                series: {
+                    color: '#7798BF',
+                    lineColor: '#A6C7ED'
+                }
+            },
+
+            scrollbar: {
+                barBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0.4, '#888'],
+                        [0.6, '#555']
+                    ]
+                },
+                barBorderColor: '#CCC',
+                buttonArrowColor: '#CCC',
+                buttonBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0.4, '#888'],
+                        [0.6, '#555']
+                    ]
+                },
+                buttonBorderColor: '#CCC',
+                rifleColor: '#FFF',
+                trackBackgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 0,
+                        y2: 1
+                    },
+                    stops: [
+                        [0, '#000'],
+                        [1, '#333']
+                    ]
+                },
+                trackBorderColor: '#666'
+            },
+
+            // special colors for some of the demo examples
+            legendBackgroundColor: 'rgba(48, 48, 48, 0.8)',
+            background2: 'rgb(70, 70, 70)',
+            dataLabelsColor: '#444',
+            textColor: '#E0E0E0',
+            maskColor: 'rgba(255,255,255,0.3)'
+        };
+
+        // Apply the theme
+        Highcharts.setOptions(Highcharts.theme);
+
+    }(Highcharts));
+}));

+ 99 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/grid-light.js

@@ -0,0 +1,99 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         * 
+         * Grid-light theme for Highcharts JS
+         * @author Torstein Honsi
+         */
+
+        'use strict';
+        /* global document */
+        // Load the fonts
+        Highcharts.createElement('link', {
+            href: 'https://fonts.googleapis.com/css?family=Dosis:400,600',
+            rel: 'stylesheet',
+            type: 'text/css'
+        }, null, document.getElementsByTagName('head')[0]);
+
+        Highcharts.theme = {
+            colors: ['#7cb5ec', '#f7a35c', '#90ee7e', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',
+                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'
+            ],
+            chart: {
+                backgroundColor: null,
+                style: {
+                    fontFamily: 'Dosis, sans-serif'
+                }
+            },
+            title: {
+                style: {
+                    fontSize: '16px',
+                    fontWeight: 'bold',
+                    textTransform: 'uppercase'
+                }
+            },
+            tooltip: {
+                borderWidth: 0,
+                backgroundColor: 'rgba(219,219,216,0.8)',
+                shadow: false
+            },
+            legend: {
+                itemStyle: {
+                    fontWeight: 'bold',
+                    fontSize: '13px'
+                }
+            },
+            xAxis: {
+                gridLineWidth: 1,
+                labels: {
+                    style: {
+                        fontSize: '12px'
+                    }
+                }
+            },
+            yAxis: {
+                minorTickInterval: 'auto',
+                title: {
+                    style: {
+                        textTransform: 'uppercase'
+                    }
+                },
+                labels: {
+                    style: {
+                        fontSize: '12px'
+                    }
+                }
+            },
+            plotOptions: {
+                candlestick: {
+                    lineColor: '#404048'
+                }
+            },
+
+
+            // General
+            background2: '#F0F0EA'
+
+        };
+
+        // Apply the theme
+        Highcharts.setOptions(Highcharts.theme);
+
+    }(Highcharts));
+}));

+ 131 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/grid.js

@@ -0,0 +1,131 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         * 
+         * Grid theme for Highcharts JS
+         * @author Torstein Honsi
+         */
+
+        'use strict';
+        Highcharts.theme = {
+            colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],
+            chart: {
+                backgroundColor: {
+                    linearGradient: {
+                        x1: 0,
+                        y1: 0,
+                        x2: 1,
+                        y2: 1
+                    },
+                    stops: [
+                        [0, 'rgb(255, 255, 255)'],
+                        [1, 'rgb(240, 240, 255)']
+                    ]
+                },
+                borderWidth: 2,
+                plotBackgroundColor: 'rgba(255, 255, 255, .9)',
+                plotShadow: true,
+                plotBorderWidth: 1
+            },
+            title: {
+                style: {
+                    color: '#000',
+                    font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+                }
+            },
+            subtitle: {
+                style: {
+                    color: '#666666',
+                    font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+                }
+            },
+            xAxis: {
+                gridLineWidth: 1,
+                lineColor: '#000',
+                tickColor: '#000',
+                labels: {
+                    style: {
+                        color: '#000',
+                        font: '11px Trebuchet MS, Verdana, sans-serif'
+                    }
+                },
+                title: {
+                    style: {
+                        color: '#333',
+                        fontWeight: 'bold',
+                        fontSize: '12px',
+                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+                    }
+                }
+            },
+            yAxis: {
+                minorTickInterval: 'auto',
+                lineColor: '#000',
+                lineWidth: 1,
+                tickWidth: 1,
+                tickColor: '#000',
+                labels: {
+                    style: {
+                        color: '#000',
+                        font: '11px Trebuchet MS, Verdana, sans-serif'
+                    }
+                },
+                title: {
+                    style: {
+                        color: '#333',
+                        fontWeight: 'bold',
+                        fontSize: '12px',
+                        fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+                    }
+                }
+            },
+            legend: {
+                itemStyle: {
+                    font: '9pt Trebuchet MS, Verdana, sans-serif',
+                    color: 'black'
+
+                },
+                itemHoverStyle: {
+                    color: '#039'
+                },
+                itemHiddenStyle: {
+                    color: 'gray'
+                }
+            },
+            labels: {
+                style: {
+                    color: '#99b'
+                }
+            },
+
+            navigation: {
+                buttonOptions: {
+                    theme: {
+                        stroke: '#CCCCCC'
+                    }
+                }
+            }
+        };
+
+        // Apply the theme
+        Highcharts.setOptions(Highcharts.theme);
+
+    }(Highcharts));
+}));

+ 129 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/sand-signika.js

@@ -0,0 +1,129 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         * 
+         * Sand-Signika theme for Highcharts JS
+         * @author Torstein Honsi
+         */
+
+        'use strict';
+        /* global document */
+        // Load the fonts
+        Highcharts.createElement('link', {
+            href: 'https://fonts.googleapis.com/css?family=Signika:400,700',
+            rel: 'stylesheet',
+            type: 'text/css'
+        }, null, document.getElementsByTagName('head')[0]);
+
+        // Add the background image to the container
+        Highcharts.wrap(Highcharts.Chart.prototype, 'getContainer', function(proceed) {
+            proceed.call(this);
+            this.container.style.background = 'url(http://www.highcharts.com/samples/graphics/sand.png)';
+        });
+
+
+        Highcharts.theme = {
+            colors: ['#f45b5b', '#8085e9', '#8d4654', '#7798BF', '#aaeeee', '#ff0066', '#eeaaee',
+                '#55BF3B', '#DF5353', '#7798BF', '#aaeeee'
+            ],
+            chart: {
+                backgroundColor: null,
+                style: {
+                    fontFamily: 'Signika, serif'
+                }
+            },
+            title: {
+                style: {
+                    color: 'black',
+                    fontSize: '16px',
+                    fontWeight: 'bold'
+                }
+            },
+            subtitle: {
+                style: {
+                    color: 'black'
+                }
+            },
+            tooltip: {
+                borderWidth: 0
+            },
+            legend: {
+                itemStyle: {
+                    fontWeight: 'bold',
+                    fontSize: '13px'
+                }
+            },
+            xAxis: {
+                labels: {
+                    style: {
+                        color: '#6e6e70'
+                    }
+                }
+            },
+            yAxis: {
+                labels: {
+                    style: {
+                        color: '#6e6e70'
+                    }
+                }
+            },
+            plotOptions: {
+                series: {
+                    shadow: true
+                },
+                candlestick: {
+                    lineColor: '#404048'
+                },
+                map: {
+                    shadow: false
+                }
+            },
+
+            // Highstock specific
+            navigator: {
+                xAxis: {
+                    gridLineColor: '#D0D0D8'
+                }
+            },
+            rangeSelector: {
+                buttonTheme: {
+                    fill: 'white',
+                    stroke: '#C0C0C8',
+                    'stroke-width': 1,
+                    states: {
+                        select: {
+                            fill: '#D0D0D8'
+                        }
+                    }
+                }
+            },
+            scrollbar: {
+                trackBorderColor: '#C0C0C8'
+            },
+
+            // General
+            background2: '#E0E0E8'
+
+        };
+
+        // Apply the theme
+        Highcharts.setOptions(Highcharts.theme);
+
+    }(Highcharts));
+}));

+ 112 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/js/themes/skies.js

@@ -0,0 +1,112 @@
+/**
+ * @license Highcharts JS v5.0.6 (2016-12-07)
+ *
+ * (c) 2009-2016 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+(function(factory) {
+    if (typeof module === 'object' && module.exports) {
+        module.exports = factory;
+    } else {
+        factory(Highcharts);
+    }
+}(function(Highcharts) {
+    (function(Highcharts) {
+        /**
+         * (c) 2010-2016 Torstein Honsi
+         *
+         * License: www.highcharts.com/license
+         * 
+         * Skies theme for Highcharts JS
+         * @author Torstein Honsi
+         */
+
+        'use strict';
+        Highcharts.theme = {
+            colors: ['#514F78', '#42A07B', '#9B5E4A', '#72727F', '#1F949A', '#82914E', '#86777F', '#42A07B'],
+            chart: {
+                className: 'skies',
+                borderWidth: 0,
+                plotShadow: true,
+                plotBackgroundImage: 'http://www.highcharts.com/demo/gfx/skies.jpg',
+                plotBackgroundColor: {
+                    linearGradient: [0, 0, 250, 500],
+                    stops: [
+                        [0, 'rgba(255, 255, 255, 1)'],
+                        [1, 'rgba(255, 255, 255, 0)']
+                    ]
+                },
+                plotBorderWidth: 1
+            },
+            title: {
+                style: {
+                    color: '#3E576F',
+                    font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+                }
+            },
+            subtitle: {
+                style: {
+                    color: '#6D869F',
+                    font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+                }
+            },
+            xAxis: {
+                gridLineWidth: 0,
+                lineColor: '#C0D0E0',
+                tickColor: '#C0D0E0',
+                labels: {
+                    style: {
+                        color: '#666',
+                        fontWeight: 'bold'
+                    }
+                },
+                title: {
+                    style: {
+                        color: '#666',
+                        font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+                    }
+                }
+            },
+            yAxis: {
+                alternateGridColor: 'rgba(255, 255, 255, .5)',
+                lineColor: '#C0D0E0',
+                tickColor: '#C0D0E0',
+                tickWidth: 1,
+                labels: {
+                    style: {
+                        color: '#666',
+                        fontWeight: 'bold'
+                    }
+                },
+                title: {
+                    style: {
+                        color: '#666',
+                        font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+                    }
+                }
+            },
+            legend: {
+                itemStyle: {
+                    font: '9pt Trebuchet MS, Verdana, sans-serif',
+                    color: '#3E576F'
+                },
+                itemHoverStyle: {
+                    color: 'black'
+                },
+                itemHiddenStyle: {
+                    color: 'silver'
+                }
+            },
+            labels: {
+                style: {
+                    color: '#3E576F'
+                }
+            }
+        };
+
+        // Apply the theme
+        Highcharts.setOptions(Highcharts.theme);
+
+    }(Highcharts));
+}));

BIN
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/license.pdf


+ 15 - 0
watero-wechat-web/src/main/webapp/common/lib/hcharts/Highcharts/5.0.6/readme.txt

@@ -0,0 +1,15 @@
+Highcharts JS v5.0.6 (2016-12-07)
+
+License: http://www.highcharts.com.cn/license
+
+Changelog: http://www.hcharts.cn/docs/changelog
+
+Demos: http://www.hcharts.cn/demos/highcharts
+
+Docs: http://www.hcharts.cn/docs
+
+API: http://api.hcharts.cn/highcharts
+
+Copyright @ 2016 Highsoft AS (http://highsoft.com)
+
+中国地区由杭州简数科技有限公司提供服务(http://jianshukeji.com)

Diferenças do arquivo suprimidas por serem muito extensas
+ 12 - 0
watero-wechat-web/src/main/webapp/common/lib/jquery.SuperSlide/2.1.1/jquery.SuperSlide.min.js


+ 144 - 0
watero-wechat-web/src/main/webapp/common/lib/jquery.contextmenu/jquery.contextmenu.r2.js

@@ -0,0 +1,144 @@
+/*
+ * ContextMenu - jQuery plugin for right-click context menus
+ *
+ * Author: Chris Domigan
+ * Contributors: Dan G. Switzer, II
+ * Parts of this plugin are inspired by Joern Zaefferer's Tooltip plugin
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Version: r2
+ * Date: 16 July 2007
+ *
+ * For documentation visit http://www.trendskitchens.co.nz/jquery/contextmenu/
+ *
+ */
+
+(function($) {
+
+ 	var menu, shadow, trigger, content, hash, currentTarget;
+  var defaults = {
+    menuStyle: {
+      listStyle: 'none',
+      padding: '1px',
+      margin: '0px',
+      backgroundColor: '#fff',
+      border: '1px solid #999',
+      width: '100px'
+    },
+    itemStyle: {
+      margin: '0px',
+      color: '#000',
+      display: 'block',
+      cursor: 'default',
+      padding: '3px',
+      border: '1px solid #fff',
+      backgroundColor: 'transparent'
+    },
+    itemHoverStyle: {
+      border: '1px solid #0a246a',
+      backgroundColor: '#b6bdd2'
+    },
+    eventPosX: 'pageX',
+    eventPosY: 'pageY',
+    shadow : true,
+    onContextMenu: null,
+    onShowMenu: null
+ 	};
+
+  $.fn.contextMenu = function(id, options) {
+    if (!menu) {                                      // Create singleton menu
+      menu = $('<div id="jqContextMenu"></div>')
+               .hide()
+               .css({position:'absolute', zIndex:'500'})
+               .appendTo('body')
+               .bind('click', function(e) {
+                 e.stopPropagation();
+               });
+    }
+    if (!shadow) {
+      shadow = $('<div></div>')
+                 .css({backgroundColor:'#000',position:'absolute',opacity:0.2,zIndex:499})
+                 .appendTo('body')
+                 .hide();
+    }
+    hash = hash || [];
+    hash.push({
+      id : id,
+      menuStyle: $.extend({}, defaults.menuStyle, options.menuStyle || {}),
+      itemStyle: $.extend({}, defaults.itemStyle, options.itemStyle || {}),
+      itemHoverStyle: $.extend({}, defaults.itemHoverStyle, options.itemHoverStyle || {}),
+      bindings: options.bindings || {},
+      shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow,
+      onContextMenu: options.onContextMenu || defaults.onContextMenu,
+      onShowMenu: options.onShowMenu || defaults.onShowMenu,
+      eventPosX: options.eventPosX || defaults.eventPosX,
+      eventPosY: options.eventPosY || defaults.eventPosY
+    });
+
+    var index = hash.length - 1;
+    $(this).bind('contextmenu', function(e) {
+      // Check if onContextMenu() defined
+      var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
+      if (bShowContext) display(index, this, e, options);
+      return false;
+    });
+    return this;
+  };
+
+  function display(index, trigger, e, options) {
+    var cur = hash[index];
+    content = $('#'+cur.id).find('ul:first').clone(true);
+    content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(
+      function() {
+        $(this).css(cur.itemHoverStyle);
+      },
+      function(){
+        $(this).css(cur.itemStyle);
+      }
+    ).find('img').css({verticalAlign:'middle',paddingRight:'2px'});
+
+    // Send the content to the menu
+    menu.html(content);
+
+    // if there's an onShowMenu, run it now -- must run after content has been added
+		// if you try to alter the content variable before the menu.html(), IE6 has issues
+		// updating the content
+    if (!!cur.onShowMenu) menu = cur.onShowMenu(e, menu);
+
+    $.each(cur.bindings, function(id, func) {
+      $('#'+id, menu).bind('click', function(e) {
+        hide();
+        func(trigger, currentTarget);
+      });
+    });
+
+    menu.css({'left':e[cur.eventPosX],'top':e[cur.eventPosY]}).show();
+    if (cur.shadow) shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+2,top:e.pageY+2}).show();
+    $(document).one('click', hide);
+  }
+
+  function hide() {
+    menu.hide();
+    shadow.hide();
+  }
+
+  // Apply defaults
+  $.contextMenu = {
+    defaults : function(userDefaults) {
+      $.each(userDefaults, function(i, val) {
+        if (typeof val == 'object' && defaults[i]) {
+          $.extend(defaults[i], val);
+        }
+        else defaults[i] = val;
+      });
+    }
+  };
+
+})(jQuery);
+
+$(function() {
+  $('div.contextMenu').hide();
+});

+ 233 - 0
watero-wechat-web/src/main/webapp/common/lib/jquery.ui/Popt.js

@@ -0,0 +1,233 @@
+Array.prototype.unique = function () {//去数组重复
+    return this.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g, "$1$2$4").replace(/,,+/g, ",").replace(/,$/, "").split(",");
+}
+var Iput = {
+    confg: {
+        hand: "0", //0对像位置1鼠标位置divID滚动位置
+        idIframe: "PoPx", //默认可不用改
+        idBox: "PoPy", //默认可不用改
+        content: "", //传过来的内容
+        ok: null, //弹出框之后执行的函数
+        id: null, //不能为空一般传this对像而不是对像ID
+        event: window.event, //这个必写一般为e就可以了
+        top: 0, //顶部偏移位置
+        left: 0, //左部偏移位置
+        bodyHeight: 0, //在被position:absolute元素下得到HTML真实高度
+        bodyWidth: 0,
+        width: 0,
+        soll: null,
+        pop: null //指定ID点击时不关闭
+    },
+    get: function (obj) { return document.getElementById(obj); },
+    lft: function (e) {
+        var l = 0;
+        while (e) { l += e.offsetLeft; e = e.offsetParent; }
+        return l
+    },
+    ltp: function (e) {
+        var t = 0;
+        while (e) { t += e.offsetTop; e = e.offsetParent; }
+        return t
+    },
+    clear: function () {
+        Iput.confg.hand = "0"; Iput.confg.ok = null; Iput.confg.top = 0; Iput.confg.left = 0; Iput.confg.bodyHeight = 0; Iput.confg.bodyWidth = 0; Iput.confg.width = 0; Iput.confg.pop = null;
+    },
+    stopBubble: function (e) {
+        if (e && e.stopPropagation) {
+            e.stopPropagation();    //w3c
+        } else {
+            window.event.cancelBubble = true; //IE
+        }
+    },
+    pop: function () {
+        var $a = document.getElementsByTagName("body").item(0);
+        var $c = document.createElement("iframe");
+        var $b = document.createElement("div");
+        $c.setAttribute('id', Iput.confg.idIframe);
+        $c.setAttribute("src", "about:blank");
+        $c.style.zindex = '100';
+        $c.frameBorder = "0";
+        $c.style.width = "0px";
+        $c.style.height = "0px";
+        $c.style.position = 'absolute';
+        $b.setAttribute('id', Iput.confg.idBox);
+        $b.setAttribute('align', 'left');
+        $b.style.position = 'absolute';
+        $b.style.background = 'transparent';
+        $b.style.zIndex = '20000';
+        if ($a) {
+            if (Iput.get(Iput.confg.idIframe)) {
+                Iput.colse();
+            }
+            $a.appendChild($c);
+            if ($c) {
+                $c.ownerDocument.body.appendChild($b);
+            }
+            Iput.get(Iput.confg.idBox).innerHTML = Iput.confg.content;
+            Iput.drice(Iput.confg.event);
+        }
+
+        if (!document.all) {
+            window.document.addEventListener("click", Iput.hide, false);
+        }
+        else {
+            window.document.attachEvent("onclick", Iput.hide);
+        }
+    },
+    drice: function (e) {
+        var bodyHith = Iput.confg.bodyHeight == 0 ? document.body.scrollHeight : Iput.confg.bodyHeight;
+        var bodywidth = Iput.confg.bodyWidth == 0 ? document.body.scrollWidth : Iput.confg.bodyWidth;
+        if (!e) e = window.event;
+        var top = 0, left = 0;
+        var a = Iput.get(Iput.confg.idBox);
+        var b = Iput.get(Iput.confg.idIframe);
+        var c = Iput.confg.id.offsetHeight;
+        var d = Iput.confg.id.offsetWidth;
+        var w = 0;
+        var st = 0;
+        var sl = 0;
+        if (Iput.confg.soll != null) {
+            st = document.getElementById(Iput.confg.soll).scrollTop;
+            sl = document.getElementById(Iput.confg.soll).scrollLeft;
+        }
+        if (Iput.get(Iput.confg.idIframe)) {
+            if (Iput.confg.hand == "1") {
+                top = Iput.confg.top + document.body.scrollTop + document.documentElement.scrollTop + e.clientY;
+                left = Iput.confg.left + e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
+                if (a.offsetHeight + top > bodyHith) { top = top - a.offsetHeight + Iput.get(Iput.confg.idBox).firstChild.offsetHeight; }
+                if (a.offsetWidth + left > bodywidth) { left = left - a.offsetWidth + Iput.get(Iput.confg.idBox).firstChild.offsetWidth; }
+                a.style.top = top - st + "px";
+                b.style.top = top - st + "px";
+                a.style.left = left - sl + "px";
+                b.style.left = left - sl + "px";
+            }
+            else if (Iput.confg.hand == "0") {
+                w = Iput.confg.id.offsetWidth + "px";
+                a.style.width = w;
+                b.style.width = w;
+                height = c;
+                top = Iput.confg.top + Iput.ltp(Iput.confg.id);
+                left = Iput.confg.left + Iput.lft(Iput.confg.id);
+                if (a.firstChild.offsetHeight + top + c > bodyHith) { top = top - a.firstChild.offsetHeight - c; }
+                if (a.firstChild.offsetWidth + left > bodywidth) { left = left - a.firstChild.offsetWidth + d; }
+                b.style.top = top - st + "px";
+                a.style.top = top - st + height + "px";
+                b.style.left = left - sl + "px";
+                a.style.left = left - sl + "px";
+            }
+            else {
+                height = c;
+                top = Iput.confg.top - Iput.get(Iput.confg.hand).scrollTop + Iput.ltp(Iput.confg.id);
+                left = Iput.confg.left - Iput.get(Iput.confg.hand).scrollLeft + Iput.lft(Iput.confg.id);
+
+                if (a.offsetHeight + top > bodyHith) { top = top - a.offsetHeight - c; }
+                if (a.offsetWidth + left > bodywidth) { left = left - a.offsetWidth - d; }
+
+                b.style.top = top - st + height + "px";
+                a.style.top = top - st + height + "px";
+                b.style.left = left - sl + "px";
+                a.style.left = left - sl + "px";
+            }
+        }
+    },
+    show: function () {
+        var config = arguments[0]; var that = Iput.confg;
+        Iput.clear();
+        for (var i in that) { if (config[i] != undefined) { that[i] = config[i]; } };
+        Iput.pop();
+        if (Iput.confg.ok != null) {
+            Iput.action(Iput.confg.ok());
+        }
+    },
+    colse: function () {
+        if (Iput.get(Iput.confg.idIframe)) {
+            document.body.removeChild(Iput.get(Iput.confg.idBox));
+            document.body.removeChild(Iput.get(Iput.confg.idIframe));
+        }
+        if (Iput.get(Iput.confg.pop)) {
+            Iput.get(Iput.confg.pop).style.display = "none";
+        }
+    },
+    $colse: function () { Iput.colse(); },
+    hide: function (e) {//点击任何处关闭层
+        e = window.event || e;
+        var srcElement = e.srcElement || e.target;
+        if (Iput.confg.event == undefined) {//输入时用,般在没传入Iput.confg.event请况下使用
+            Iput.colse();
+        }
+        else {
+            var a = Iput.confg.event.srcElement || Iput.confg.event.target;
+            var b = Iput.get(Iput.confg.pop);
+            if (a != srcElement) { Iput.colse(); }
+            if (b != null) {
+                if (b != srcElement && a != srcElement) { Iput.colse(); }
+            }
+        }
+        if (Iput.get(Iput.confg.idIframe)) {
+            Iput.get(Iput.confg.idIframe).onclick = function (e) { Iput.stopBubble(e); };
+            Iput.get(Iput.confg.idBox).onclick = function (e) { Iput.stopBubble(e); };
+        }
+        if (Iput.get(Iput.confg.pop)) {
+            Iput.get(Iput.confg.pop).onclick = function (e) { Iput.stopBubble(e); };
+        }
+
+    },
+    action: function (obj) {
+        eval(obj);
+    },
+    cookie: {
+        Set: function (name, val) {
+            var Days = 30;                          //此 cookie 将被保存 30 天
+            var exp = new Date();                  //new Date("December 31, 9998");
+            exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
+            document.cookie = name + "=" + escape(val) + ";expires=" + exp.toGMTString() + "; path=/";
+        },
+        Get: function (name) {
+            var start = document.cookie.indexOf(name);
+            var end = document.cookie.indexOf(";", start);
+            return start == -1 ? null : unescape(document.cookie.substring(start + name.length + 1, (end > start ? end : document.cookie.length)));
+        },
+        Del: function (name) {
+            var exp = new Date();
+            exp.setTime(exp.getTime() - 1);
+            var cval = this.GetCookie(name);
+            if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
+        }
+    },
+    ischeck: function (bol) {
+        var objs = form1.getElementsByTagName("input");
+        if (bol) {
+            for (var i = 0; i < objs.length; i++) { if (objs[i].type.toLowerCase() == "checkbox") { objs[i].checked = true; } }
+        }
+        else {
+            for (var i = 0; i < objs.length; i++) { if (objs[i].type.toLowerCase() == "checkbox") { objs[i].checked = false; } }
+        }
+    },
+    contains: function (star, end, isIgnoreCase) {
+        if (isIgnoreCase) {
+            star = star.toLowerCase();
+            end = end.toLowerCase();
+        }
+        var startChar = end.substring(0, 1);
+        var strLen = end.length;
+        for (var j = 0; j < star.length - strLen + 1; j++) {
+            if (star.charAt(j) == startChar)//如果匹配起始字符,开始查找
+            {
+                if (star.substring(j, j + strLen) == end)//如果从j开始的字符与str匹配,那ok
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    },
+    gData: function (name, value) {
+        var top = window.top, cache = top['_CACHE'] || {};
+        top['_CACHE'] = cache;
+        return value ? cache[name] = value : cache[name];
+    },
+    rData: function (name) {
+        var cache = window.top['_CACHE'];
+        if (cache && cache[name]) delete cache[name];
+    }
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 2 - 0
watero-wechat-web/src/main/webapp/common/lib/jquery.ui/cityJson.js


+ 136 - 0
watero-wechat-web/src/main/webapp/common/lib/jquery.ui/citySet.js

@@ -0,0 +1,136 @@
+function SelCity(obj,e) {
+    var ths = obj;
+    var dal = '<div class="_citys"><span title="关闭" id="cColse" >×</span><ul id="_citysheng" class="_citys0"><li class="citySel">省份</li><li>城市</li><li>区县</li></ul><div id="_citys0" class="_citys1"></div><div style="display:none" id="_citys1" class="_citys1"></div><div style="display:none" id="_citys2" class="_citys1"></div></div>';
+    Iput.show({ id: ths, event: e, content: dal,width:"470"});
+    $("#cColse").click(function () {
+        Iput.colse();
+    });
+    var tb_province = [];
+    var b = province;
+    for (var i = 0, len = b.length; i < len; i++) {
+        tb_province.push('<a data-level="0" data-id="' + b[i]['id'] + '" data-name="' + b[i]['name'] + '">' + b[i]['name'] + '</a>');
+    }
+    $("#_citys0").append(tb_province.join(""));
+    $("#_citys0 a").click(function () {
+        var g = getCity($(this));
+        $("#_citys1 a").remove();
+        $("#_citys1").append(g);
+        $("._citys1").hide();
+        $("._citys1:eq(1)").show();
+        $("#_citys0 a,#_citys1 a,#_citys2 a").removeClass("AreaS");
+        $(this).addClass("AreaS");
+        var lev = $(this).data("name");
+        ths.value = $(this).data("name");
+        if (document.getElementById("hcity") == null) {
+            var hcitys = $('<input>', {
+                type: 'hidden',
+                name: "hcity",
+                "data-id": $(this).data("id"),
+                id: "hcity",
+                val: lev
+            });
+            $(ths).after(hcitys);
+        }
+        else {
+            $("#hcity").val(lev);
+            $("#hcity").attr("data-id", $(this).data("id"));
+        }
+        $("#_citys1 a").click(function () {
+            $("#_citys1 a,#_citys2 a").removeClass("AreaS");
+            $(this).addClass("AreaS");
+            var lev =  $(this).data("name");
+            if (document.getElementById("hproper") == null) {
+                var hcitys = $('<input>', {
+                    type: 'hidden',
+                    name: "hproper",
+                    "data-id": $(this).data("id"),
+                    id: "hproper",
+                    val: lev
+                });
+                $(ths).after(hcitys);
+            }
+            else {
+                $("#hproper").attr("data-id", $(this).data("id"));
+                $("#hproper").val(lev);
+            }
+            var bc = $("#hcity").val();
+            ths.value = bc+ "-" + $(this).data("name");
+
+            var ar = getArea($(this));
+
+            $("#_citys2 a").remove();
+            $("#_citys2").append(ar);
+            $("._citys1").hide();
+            $("._citys1:eq(2)").show();
+
+            $("#_citys2 a").click(function () {
+                $("#_citys2 a").removeClass("AreaS");
+                $(this).addClass("AreaS");
+                var lev = $(this).data("name");
+                if (document.getElementById("harea") == null) {
+                    var hcitys = $('<input>', {
+                        type: 'hidden',
+                        name: "harea",
+                        "data-id": $(this).data("id"),
+                        id: "harea",
+                        val: lev
+                    });
+                    $(ths).after(hcitys);
+                }
+                else {
+                    $("#harea").val(lev);
+                    $("#harea").attr("data-id", $(this).data("id"));
+                }
+                var bc = $("#hcity").val();
+                var bp = $("#hproper").val();
+                ths.value = bc + "-" + bp + "-" + $(this).data("name");
+                Iput.colse();
+            });
+
+        });
+    });
+    $("#_citysheng li").click(function () {
+        $("#_citysheng li").removeClass("citySel");
+        $(this).addClass("citySel");
+        var s = $("#_citysheng li").index(this);
+        $("._citys1").hide();
+        $("._citys1:eq(" + s + ")").show();
+    });
+}
+
+function getCity(obj) {
+    var c = obj.data('id');
+    var e = province;
+    var f;
+    var g = '';
+    for (var i = 0, plen = e.length; i < plen; i++) {
+        if (e[i]['id'] == parseInt(c)) {
+            f = e[i]['city'];
+            break
+        }
+    }
+    for (var j = 0, clen = f.length; j < clen; j++) {
+        g += '<a data-level="1" data-id="' + f[j]['id'] + '" data-name="' + f[j]['name'] + '" title="' + f[j]['name'] + '">' + f[j]['name'] + '</a>'
+    }
+    $("#_citysheng li").removeClass("citySel");
+    $("#_citysheng li:eq(1)").addClass("citySel");
+    return g;
+}
+function getArea(obj) {
+    var c = obj.data('id');
+    var e = area;
+    var f = [];
+    var g = '';
+    for (var i = 0, plen = e.length; i < plen; i++) {
+        if (e[i]['pid'] == parseInt(c)) {
+            f.push(e[i]);
+        }
+    }
+    for (var j = 0, clen = f.length; j < clen; j++) {
+        g += '<a data-level="1" data-id="' + f[j]['id'] + '" data-name="' + f[j]['name'] + '" title="' + f[j]['name'] + '">' + f[j]['name'] + '</a>'
+    }
+
+    $("#_citysheng li").removeClass("citySel");
+    $("#_citysheng li:eq(2)").addClass("citySel");
+    return g;
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 1283 - 0
watero-wechat-web/src/main/webapp/common/lib/jquery.ui/jquery-ui.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 18706 - 0
watero-wechat-web/src/main/webapp/common/lib/jquery.ui/jquery-ui.js