cxs 7 лет назад
Родитель
Сommit
b4adfb0369
100 измененных файлов с 22852 добавлено и 0 удалено
  1. 92 0
      taiwan/admin/attribute.html
  2. 59 0
      taiwan/admin/countdown.html
  3. 116 0
      taiwan/admin/css/product.css
  4. 106 0
      taiwan/admin/css/productinfo.css
  5. 106 0
      taiwan/admin/css/ui/style.css
  6. 95 0
      taiwan/admin/css/ui/webuploader.css
  7. 158 0
      taiwan/admin/index.html
  8. 158 0
      taiwan/admin/js/attribute.js
  9. 126 0
      taiwan/admin/js/product.js
  10. 11 0
      taiwan/admin/js/ui/H-ui.min.js
  11. 7 0
      taiwan/admin/layer/2.4/skin/layer.css
  12. 1648 0
      taiwan/admin/lib/Hui-iconfont/1.0.8/demo.html
  13. 11 0
      taiwan/admin/lib/Hui-iconfont/1.0.8/iconfont.min.css
  14. BIN
      taiwan/admin/lib/Hui-iconfont/1.0.8/iconfont.ttf
  15. BIN
      taiwan/admin/lib/Hui-iconfont/1.0.8/iconfont.woff
  16. 14 0
      taiwan/admin/lib/My97DatePicker/4.8/lang/zh-cn.js
  17. 14 0
      taiwan/admin/lib/My97DatePicker/4.8/lang/zh-tw.js
  18. 9 0
      taiwan/admin/lib/My97DatePicker/4.8/skin/WdatePicker.css
  19. 339 0
      taiwan/admin/lib/My97DatePicker/4.8/skin/twoer/datepicker-dev.css
  20. BIN
      taiwan/admin/lib/My97DatePicker/4.8/skin/whyGreen/bg.jpg
  21. 256 0
      taiwan/admin/lib/My97DatePicker/4.8/skin/whyGreen/datepicker.css
  22. BIN
      taiwan/admin/lib/My97DatePicker/4.8/skin/whyGreen/img.gif
  23. 152 0
      taiwan/admin/lib/datatables/1.10.0/jquery.dataTables.min.js
  24. 29 0
      taiwan/admin/lib/echarts/3.4.0/echarts.common.min.js
  25. 50 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/highcharts-3d.js
  26. 14 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.js
  27. 26 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/data.js
  28. 756 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/drilldown.src.js
  29. 545 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/grid-axis.src.js
  30. 798 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/heatmap.src.js
  31. 150 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.src.js
  32. 14 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/solid-gauge.js
  33. 29 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/treemap.js
  34. 881 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/treemap.src.js
  35. 15 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/xrange-series.js
  36. 314 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/themes/dark-green.js
  37. 243 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/themes/dark-unica.js
  38. 99 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/themes/grid-light.js
  39. 129 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/themes/sand-signika.js
  40. 15 0
      taiwan/admin/lib/hcharts/Highcharts/5.0.6/readme.txt
  41. 501 0
      taiwan/admin/lib/jselect-1.0.js
  42. 2 0
      taiwan/admin/lib/layer/2.4/layer.js
  43. BIN
      taiwan/admin/lib/layer/2.4/skin/default/icon-ext.png
  44. BIN
      taiwan/admin/lib/layer/2.4/skin/default/icon.png
  45. BIN
      taiwan/admin/lib/layer/2.4/skin/default/loading-1.gif
  46. 21 0
      taiwan/admin/lib/laypage/1.2/skin/laypage.css
  47. 17 0
      taiwan/admin/lib/lightbox2/2.8.1/examples.html
  48. BIN
      taiwan/admin/lib/lightbox2/2.8.1/images/next.png
  49. 9655 0
      taiwan/admin/lib/lightbox2/2.8.1/js/lightbox-plus-jquery.js
  50. 444 0
      taiwan/admin/lib/lightbox2/2.8.1/js/lightbox.js
  51. 13 0
      taiwan/admin/lib/lightbox2/2.8.1/js/lightbox.min.js
  52. 1 0
      taiwan/admin/lib/nprogress/0.2.0/nprogress.min.js
  53. 6 0
      taiwan/admin/lib/respond.min.js
  54. 490 0
      taiwan/admin/lib/squid.js
  55. 60 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/attachment.html
  56. 754 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/attachment.js
  57. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_jpg.gif
  58. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mp3.gif
  59. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_ppt.gif
  60. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_txt.gif
  61. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/bg.png
  62. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/file-icons.gif
  63. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/file-icons.png
  64. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/icons.gif
  65. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/success.gif
  66. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/background/images/bg.png
  67. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/background/images/success.png
  68. 519 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/charts/charts.js
  69. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/charts/images/charts3.png
  70. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/charts/images/charts5.png
  71. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/emotion/images/0.gif
  72. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/emotion/images/jxface2.gif
  73. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/emotion/images/neweditor-tab-bg.png
  74. 82 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/help/help.html
  75. 56 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/help/help.js
  76. 894 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/image/image.css
  77. 120 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/image/image.html
  78. 1139 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/image/image.js
  79. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/image/images/success.png
  80. 98 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/insertframe/insertframe.html
  81. 135 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/map/map.html
  82. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/addimg.png
  83. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/delimgH.png
  84. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/eraser.png
  85. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/redoH.png
  86. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/scaleH.png
  87. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/size.png
  88. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/undo.png
  89. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/undoH.png
  90. 58 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/snapscreen/snapscreen.html
  91. 21 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/spechars/spechars.html
  92. 57 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/spechars/spechars.js
  93. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/table/dragicon.png
  94. 64 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/table/edittable.html
  95. 61 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/table/edittd.html
  96. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/bg.png
  97. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/center_focus.jpg
  98. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/file-icons.png
  99. BIN
      taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/icons.gif
  100. 0 0
      taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/image.png

+ 92 - 0
taiwan/admin/attribute.html

@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
+    <meta http-equiv="Cache-Control" content="no-siteapp">
+    <title>属性管理</title>
+    <!--css-->
+    <link rel="stylesheet" href="css/ui/H-ui.admin.css">
+    <link rel="stylesheet" href="css/ui/H-ui.min.css">
+    <link rel="stylesheet" href="layer/2.4/skin/layer.css">
+    <!--页面css-->
+    <link rel="stylesheet" href="css/attribute.css">
+
+
+    <!--js-->
+    <script src="../js/jquery-2.2.3.min.js"></script>
+    <script src="js/ui/H-ui.min.js"></script>
+    <script src="layer/2.4/layer.js"></script>
+    <!--页面js-->
+    <script src="js/attribute.js"></script>
+
+</head>
+<body>
+<aside class="Hui-aside">
+    <ul>
+        <li href="index.html">订单信息</li>
+        <li>
+            <a href="product.html">所有产品</a>
+        </li>
+        <li class="active">
+            <a>属性管理</a>
+        </li>
+        <li>
+            <a href="countdown.html">倒计时即将产品</a>
+        </li>
+    </ul>
+</aside>
+
+<div class="page-container">
+    <a class="btn btn-primary radius td-button" style="margin-bottom: 20px;" onclick="showAddWarp()">添加属性</a>
+    <div id="loading"
+         style="position: fixed;top: 50%;left: 50%;margin-left: -64px;margin-top: -64px;z-index:999999999999999999999">
+        <img src='../images/loading.gif'/>
+    </div>
+
+    <table class="table table-border table-bordered table-bg">
+        <thead>
+        <tr>
+            <th colspan="4" scope="col">商品属性</th>
+        </tr>
+        <tr class="text-c">
+            <th>属性Id</th>
+            <th>属性名称</th>
+            <th>属性加入时间</th>
+            <th>操作</th>
+        </tr>
+        </thead>
+        <tbody id="warp" style="display: table-row-group;">
+        </tbody>
+    </table>
+</div>
+
+<div id="modal-demo" class="modal fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
+     aria-hidden="false" style="display: none;">
+    <div class="modal-backdrop fade in"></div>
+    <div class="modal-backdrop fade in"></div>
+    <div class="modal-dialog">
+        <div class="modal-content radius">
+            <div class="modal-header">
+                <h3 id="myModalLabel">设置属性名</h3>
+                <a class="close" data-dismiss="modal" aria-hidden="true" href="javascript:void();">×</a>
+            </div>
+            <div class="modal-body">
+                <div>
+                    <span>输入属性名称:</span>
+                    <input type="text" placeholder="请输入属性名称" class="attribute_input" id="AttributeName"/>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button class="btn btn-primary" onclick="setAttribute(true)" id="addAttribute">确定</button>
+                <button class="btn" data-dismiss="modal" aria-hidden="true">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+</body>
+</html>

+ 59 - 0
taiwan/admin/countdown.html

@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <!--css-->
+    <link rel="stylesheet" href="css/ui/H-ui.admin.css">
+    <link rel="stylesheet" href="css/ui/H-ui.min.css">
+    <link rel="stylesheet" href="layer/2.4/skin/layer.css">
+    <!--页面css-->
+    <link rel="stylesheet" href="css/countdown.css">
+    <!--js-->
+    <script src="../js/jquery-2.2.3.min.js"></script>
+    <script src="js/ui/H-ui.min.js"></script>
+    <script src="layer/2.4/layer.js"></script>
+    <!--页面js-->
+    <script src="js/countdown.js"></script>
+</head>
+<body>
+<aside class="Hui-aside">
+    <ul>
+        <li href="index.html">订单信息</li>
+        <li>
+            <a href="product.html">所有产品</a>
+        </li>
+        <li href="attribute.html">
+            <a>属性管理</a>
+        </li>
+        <li class="active">
+            <a>倒计时即将产品</a>
+        </li>
+    </ul>
+</aside>
+<div class="page-container">
+    <a class="btn btn-primary radius td-button" style="margin-bottom: 20px;" onclick="showAddWarp()">添加属性</a>
+    <div id="loading"
+         style="position: fixed;top: 50%;left: 50%;margin-left: -64px;margin-top: -64px;z-index:999999999999999999999">
+        <img src='../images/loading.gif'/>
+    </div>
+
+    <table class="table table-border table-bordered table-bg">
+        <thead>
+        <tr>
+            <th colspan="5" scope="col">商品属性</th>
+        </tr>
+        <tr class="text-c">
+            <th>属性Id</th>
+            <th>编号</th>
+            <th>产品名称</th>
+            <th>到期时间</th>
+            <th>操作</th>
+        </tr>
+        </thead>
+        <tbody id="warp" style="display: table-row-group;">
+        </tbody>
+    </table>
+</div>
+</body>
+</html>

+ 116 - 0
taiwan/admin/css/product.css

@@ -0,0 +1,116 @@
+.Hui-aside {
+    top: 0;
+}
+
+.Hui-aside ul {
+    text-align: center;
+}
+
+.Hui-aside ul li {
+    list-style-type: none;
+    line-height: 45px;
+    font-weight: bold;
+    cursor: pointer;
+}
+
+.Hui-aside ul li.active {
+    font-size: 20px;
+}
+
+.Hui-aside ul li a.active {
+    color: #5a98de;
+}
+
+.page-container {
+    padding: 20px;
+    width: calc(100% - 240px);
+    margin-left: 200px;
+}
+
+.td-button {
+    margin: 5px;
+}
+
+.layui-tab-title {
+    position: relative;
+    left: 0;
+    height: 40px;
+    white-space: nowrap;
+    font-size: 0;
+    border-bottom-width: 1px;
+    border-bottom-style: solid;
+    transition: all .2s;
+    -webkit-transition: all .2s;
+    height: 42px;
+    margin-bottom: 20px;
+    border: none;
+}
+
+.layui-tab-title li {
+    display: inline-block;
+    *display: inline;
+    *zoom: 1;
+    vertical-align: middle;
+    font-size: 14px;
+    transition: all .2s;
+    -webkit-transition: all .2s;
+    position: relative;
+    line-height: 40px;
+    min-width: 65px;
+    padding: 0 15px;
+    text-align: center;
+    cursor: pointer
+}
+
+.layui-tab-title .layui-this {
+    color: #000
+}
+
+.layui-tab-brief > .layui-tab-title .layui-this {
+    color: #009688
+}
+
+.layui-card .layui-tab-brief .layui-tab-title li {
+    margin: 0 15px;
+    padding: 0;
+    line-height: 42px
+}
+
+.layui-card .layui-tab-brief .layui-tab-title li.layui-this {
+    color: #333
+}
+
+.SearchWarp {
+    float: right;
+}
+
+select, input[type="text"] {
+    padding-left: 8px;
+    border: 1px solid #c1c1c1;
+    border-radius: 3px;
+    color: #8cadbc;
+}
+
+.HS_LM_A_Right input[type="text"] {
+    width: 250px;
+    height: 34px;
+    background-color: #f8f8f8;
+    margin-left: 5px;
+}
+
+.HS_LM_Search {
+    float: right;
+    padding: 8px 25px;
+    background-color: #545976;
+    border-radius: 3px;
+    color: White;
+    margin: -1px 0 0 10px;
+    font-size: 13px;
+    cursor: pointer;
+}
+
+.HS_LM_Search:hover {
+    background-color: #454961;
+}
+
+

Разница между файлами не показана из-за своего большого размера
+ 106 - 0
taiwan/admin/css/productinfo.css


+ 106 - 0
taiwan/admin/css/ui/style.css

@@ -0,0 +1,106 @@
+.btn {
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    -ms-border-radius: 3px;
+    -o-border-radius: 3px;
+    border-radius: 3px;
+    background-color: #ff8400;
+    color: #fff;
+    display: inline-block;
+    height: 28px;
+    line-height: 28px;
+    text-align: center;
+    width: 72px;
+    transition: background-color 0.2s linear 0s;
+    border: none;
+    cursor: pointer;
+    margin: 0 0 20px;
+}
+
+.demo {
+    width: 700px;
+    margin: 0 auto
+}
+
+.btn:hover {
+    background-color: #e95a00;
+    text-decoration: none
+}
+
+.ul_pics li {
+    float: left;
+    width: 280px;
+    height: 350px;
+    border: 1px solid #ddd;
+    padding: 2px;
+    text-align: center;
+    margin: 0 5px 5px 0;
+}
+
+.ul_pics li .img {
+    width: 280px;
+    height: 260px;
+    display: table-cell;
+    vertical-align: middle;
+}
+
+.ul_pics li img {
+    max-width: 280px;
+    max-height: 260px;
+    vertical-align: middle;
+}
+
+.ul_pics li .input {
+    width: 260px;
+    height: 30px;
+    border: 1px solid #ddd;
+    text-indent: 10px;
+    margin-top: 10px;
+}
+
+.ul_pics li .span {
+    padding-top: 15px;
+    display: block;
+    cursor: pointer;
+}
+
+.progress {
+    position: relative;
+    padding: 1px;
+    border-radius: 3px;
+    margin: 60px 0 0 0;
+}
+
+.bar {
+    background-color: green;
+    display: block;
+    width: 0%;
+    height: 20px;
+    border-radius: 3px;
+}
+
+.percent {
+    position: absolute;
+    height: 20px;
+    display: inline-block;
+    top: 3px;
+    left: 2%;
+    color: #fff
+}
+
+.Submission {
+    width: 80%;
+    position: relative;
+    display: block;
+    cursor: pointer;
+    background: #3bb4f2;
+    padding: 4px 12px;
+    color: #fff;
+    text-align: center;
+    border-radius: 3px;
+    overflow: hidden;
+    margin: 50px auto;
+    height: 50px;
+    line-height: 50px;
+    font-size: 16px;
+}

Разница между файлами не показана из-за своего большого размера
+ 95 - 0
taiwan/admin/css/ui/webuploader.css


+ 158 - 0
taiwan/admin/index.html

@@ -0,0 +1,158 @@
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
+    <meta http-equiv="Cache-Control" content="no-siteapp">
+    <title>订单详情</title>
+
+    <!--css-->
+    <link rel="stylesheet" href="css/ui/H-ui.admin.css">
+    <link rel="stylesheet" href="css/ui/H-ui.min.css">
+    <link rel="stylesheet" href="layer/2.4/skin/layer.css">
+    <link rel="stylesheet" href="css/ui/pagination.css">
+    <!--页面css-->
+    <link rel="stylesheet" href="css/index.css">
+    <!--js-->
+    <script src="../js/jquery-2.2.3.min.js"></script>
+    <script src="js/ui/H-ui.min.js"></script>
+    <script src="layer/2.4/layer.js"></script>
+    <script src="js/pagination.min.js"></script>
+    <!--页面js-->
+    <script src="js/index.js"></script>
+    <script src="js/ui/laydate.js"></script>
+
+</head>
+<body>
+<aside class="Hui-aside">
+    <ul>
+        <li class="active" onclick="toogle('.Thailand');">泰国站</li>
+        <li class="Thailand">
+            <a href="../../new/admin/index.html">订单信息</a>
+        </li>
+        <li class="Thailand">
+            <a href="../../new/admin/product.html">所有产品</a>
+        </li>
+        <li class="Thailand">
+            <a href="../../new/admin/excel.html">打印表格</a>
+        </li>
+
+        <li class="active" onclick="toogle('.Taiwan');">台湾站</li>
+        <li class="Taiwan">
+            <a href="../../taiwan/admin/index.html" class="active">订单信息</a>
+        </li>
+        <li class="Taiwan">
+            <a href="../../taiwan/admin/product.html">所有产品</a>
+        </li>
+
+        <li class="active" onclick="toogle('.Malai');">马来西亚站</li>
+        <li class="Malai">
+            <a href="../../malai/admin/index.html">订单信息</a>
+        </li>
+        <li class="Malai">
+            <a href="../../malai/admin/product.html">所有产品</a>
+        </li>
+        <li class="Malai">
+            <a href="../../malai/admin/excel.html">打印表格</a>
+        </li>
+        <!-- <li>
+            <a href="attribute.html">属性管理</a>
+        </li>
+        <li>
+            <a href="countdown.html">倒计时即将产品</a>
+        </li> -->
+    <li>
+            <a onclick="window.open('../../new/admin/algorithm.html')">利润率预估</a>
+        </li>
+    </ul>
+</aside>
+
+<div class="page-container">
+    <p class="f-20 text-success">查看订单</p>
+
+    <div class="layui-tab layui-tab-brief">
+        <ul class="layui-tab-title">
+            <li class="layui-this" onclick="changeTab('')">全部订单</li>
+            <li onclick="changeTab(1)">已付款</li>
+            <li onclick="changeTab(2)">已发货</li>
+            <li onclick="changeTab(3)">已收货</li>
+        </ul>
+        <div class="SearchWarp">
+            <div class="HS_LM_A_select">
+                <span>日期选择</span>
+                <div class="HS_LM_A_select_warp">
+                    <!--<select id="orderselect">-->
+                    <!--<option value="">今日</option>-->
+                    <!--<option value="">昨日</option>-->
+                    <!--<option value="">时间段选择</option>-->
+                    <!--</select>-->
+                    <div class="HS_LM_A_select_input" style="display: block">
+
+                        <div class="HS_LM_A_select_input_warp">
+                            <input type="text" id="startTime">
+                            <img src="../images/close.png" onclick="hideSelectClose(this)"/>
+                        </div>
+                        <span>-</span>
+                        <div class="HS_LM_A_select_input_warp">
+                            <input type="text" id="endTime">
+                            <img src="../images/close.png" onclick="hideSelectClose(this)"/>
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+            <div class="HS_LM_A_Right">
+                <input type="text" id="SearchPlaceBtn" onkeydown="keySearchProductInfo();" placeholder="订单号/人名/地址/手机号码">
+                <div class="HS_LM_Search" onclick="searchProductInfo();">
+                    搜索
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <table class="table table-border table-bordered table-bg"
+           style="table-layout: fixed;word-break: break-all;word-wrap: break-word;">
+        <thead>
+        <tr>
+            <th colspan="11" scope="col">信息统计</th>
+        </tr>
+        <tr class="text-c">
+            <th>订单号</th>
+            <th>产品编号</th>
+            <th>产品名称</th>
+            <th>颜色</th>
+            <th>产品单价</th>
+            <th>产品个数</th>
+            <th>订单价格</th>
+            <th>下单时间</th>
+            <th>订单状态</th>
+            <th>采购地址</th>
+            <th>操作</th>
+        </tr>
+        </thead>
+        <tbody id="warp" style="display: none">
+        <tr class="text-c">
+            <!-- <td>201862711346915</td>
+            <td>รุ่ย จือ หยวน (RUI ZHI YUAN)</td>
+            <td>สแตนเลสคุณภาพสูงหน้าปัดสีน้ำเงิน</td>
+            <td>450</td>
+            <td>2</td>
+            <td>900</td>
+            <td>2018-06-26 09:30:37</td>
+            <td>到货</td> -->
+        </tr>
+        </tbody>
+        <div id="loading"
+             style="position: fixed;top: 50%;left: 50%;margin-left: -64px;margin-top: -64px;z-index:999999999999999999999">
+            <img src='../images/loading.gif'/>
+        </div>
+    </table>
+
+    <div id="Page" style="float: right;margin: 30px 0;"></div>
+</div>
+</body>
+</html>

+ 158 - 0
taiwan/admin/js/attribute.js

@@ -0,0 +1,158 @@
+window.onload = function (ev) {
+    init();
+}
+
+init = function () {
+    getAttributeInfo();
+}
+
+getAttributeInfo = function () {
+    var parameter = urlEncode(["SelectAllProductAttribute"]);
+    $.ajax({
+        type: "post",
+        url: "/taiwan/php/index.php",
+        data: {mode: parameter},
+        dataType: "json",
+        success: function (data) {
+            if (data[0].length == 0 || data == -1) {
+                var th = '<th colspan="9" scope="col" class="text-c f-20" style="padding: 50px 0;">暂无数据</th>';
+                $("#warp").html(th);
+                return;
+            }
+            printAttributeInfo(data);
+            console.log(data);
+        }
+    });
+}
+
+printAttributeInfo = function (data) {
+    var warp = $("#warp"),
+        tr,
+        href,
+        title = "'查看商品信息'";
+    warp.html("");
+    for (var i = 0; i < data.length; i++) {
+        href = "'product-add.html?pid=" + data[i].ProductId + "'";
+        tr = $('<tr class="text-c">' +
+            '<td>' + data[i].ProductInfoClassId + '</td>' +
+            '<td>' + data[i].ProductInfoClassName + '</td>' +
+            '<td>' + data[i].InfoClassIdAddTime + '</td>' +
+            '<td>' +
+            '<a class="btn btn-primary radius td-button" onclick=deleteAttribute("' + data[i].ProductInfoClassId + '")>删除</>' +
+            '<a class="btn btn-primary radius td-button" onclick=showUpdateAttribute("' + data[i].ProductInfoClassName + '","' + data[i].ProductInfoClassId + '")>修改</>' +
+            '</td></tr>'
+        )
+        ;
+
+
+        warp.append(tr);
+    }
+    $("#loading").css({"display": "none"});
+    $("#warp").css({"display": "table-row-group"});
+}
+
+
+showAddWarp = function () {
+    $("#modal-demo").modal("show");
+}
+
+setAttribute = function (jugde, text, aid) {
+    var _el = $("#addAttribute");
+    if (jugde) {
+        $(_el).bind("click", function () {
+            addAttribute();
+        });
+    }
+    else {
+        $(_el).bind("click", function () {
+            updateAttribute(text, aid);
+        });
+    }
+}
+
+addAttribute = function () {
+    var name = $("#AttributeName").val();
+    if (name == "" || name.trim() == "") {
+        $.Huimodalalert('请输入属性名!', 2000);
+    }
+    else {
+        var parameter = urlEncode(["InsertAttribute", name]);
+        $.ajax({
+            type: "post",
+            url: "/taiwan/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                $("#AttributeName")[0].value = "";
+                getAttributeInfo();
+            }
+        });
+        $("#warp").css({"display": "none"});
+        $("#modal-demo").modal("hide");
+        $("#loading").css({"display": "block"});
+    }
+}
+
+deleteAttribute = function (aid) {
+    layer.confirm('是否删除属性?', {
+        btn: ['确定', '取消'] //按钮
+    }, function (e, a) {
+        var parameter = urlEncode(["DeleteAttribute", aid]);
+        $.ajax({
+            type: "post",
+            url: "/taiwan/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (data[0].mode == 1) {
+                    getAttributeInfo();
+                    $.Huimodalalert('删除成功', 2000);
+                    console.log(data);
+                }
+            }
+        });
+        $(a).prev().remove();
+        $(a).remove();
+        $("#warp").css({"display": "none"});
+        $("#loading").css({"display": "block"});
+    });
+}
+
+showUpdateAttribute = function (text, aid) {
+    showAddWarp();
+    $("#AttributeName").val(text);
+    setAttribute(false, text, aid);
+}
+
+updateAttribute = function (text, aid) {
+    var name = $("#AttributeName").val();
+    if (name == "" || name.trim() == "") {
+        $.Huimodalalert('请输入属性名!', 2000);
+    }
+    else {
+        var parameter = urlEncode(["UpdateAttributeName", aid, name]);
+        $.ajax({
+            type: "post",
+            url: "/taiwan/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                $("#AttributeName")[0].value = "";
+                getAttributeInfo();
+            }
+        });
+        $("#warp").css({"display": "none"});
+        $("#modal-demo").modal("hide");
+        $("#loading").css({"display": "block"});
+    }
+}
+
+
+urlEncode = function (arr) {
+    var i; //循环初始化
+    for (i = 0; i < arr.length; i++) {
+        arr[i] = encodeURIComponent(encodeURIComponent(arr[i]));
+    }
+    return arr.join();
+}
+

+ 126 - 0
taiwan/admin/js/product.js

@@ -0,0 +1,126 @@
+var test = true;
+window.onload = function (ev) {
+    init();
+}
+
+init = function () {
+    getProductInfo("", 1, 10);
+}
+
+getProductInfo = function (judge, pageindex, pagesize) {
+    var parameter = urlEncode(["SelectAllProduct", judge, pageindex, pagesize]);
+    $.ajax({
+        type: "post",
+        url: "/taiwan/php/index.php",
+        data: {mode: parameter},
+        dataType: "json",
+        success: function (data) {
+            if (data.length == 0 || data == -1) {
+                var th = '<th colspan="8" scope="col" class="text-c f-20" style="padding: 50px 0;">暂无数据</th>';
+                $("#warp").html(th);
+                $("#Page").html("");
+                // $("#warp").append(th);
+                return;
+            }
+
+             if (test) {
+            test = false;
+            var totalSize = data[0].allcount,
+                totalPage = Math.ceil(totalSize / pagesize);
+            $("#Page").html("");
+            // $("#Page").whjPaging("setPage", {currPage: pageindex, totalPage: totalPage, totalSize: totalSize});
+            $("#Page").whjPaging({
+                currPage: pageindex,
+                totalSize: totalSize,//可选,总条数
+                totalPage: totalPage,//可选,总页数
+                isShowRefresh: false,//可选,是否展示刷新,默认true
+                isShowPageSizeOpt: false,//可选,是否展示每页条数下拉框,默认true,如果设置显示,总条数必须设置
+                // isResetPage:true,
+                callBack: function (currPage) {
+                    $("#loading").css({display: "block"});
+                    $("#warp").css({display: "none"});
+                    getProductInfo(judge, currPage, pagesize);
+                    // test = true;
+                    // console.log('currPage:' + currPage + '     pageSize:' + pageSize);
+                }
+            });
+             }
+
+            printProductInfo(data);
+            console.log(data);
+        }
+    });
+}
+
+printProductInfo = function (data) {
+    var warp = $("#warp"),
+        tr,
+        href,
+        title = "'查看商品信息'";
+    warp.html("");
+    for (var i = 0; i < data.length; i++) {
+        href = "'product-add.html?pid=" + data[i].ProductId + "'";
+        tr = $('<tr class="text-c">' +
+            '<td>' + data[i].ProductId + '</td>' +
+            '<td>' + data[i].ProductRemarks + '</td>' +
+            '<td>' + data[i].ProductName + '</td>' +
+            '<td>' + data[i].ProductPrimeCost + '</td>' +
+            '<td>' + data[i].ProductPrice + '</td>' +
+//            '<td>' + data[i].ProductIntroduce + '</td>' +
+'<td><a href="' + data[i].ProductIntroduce + '" target="_blank">' + data[i].ProductIntroduce + '</a></td>' +
+            '<td>' + data[i].ProductAddTime + '</td>' +
+            '<td>' +
+            '<a class="btn btn-primary radius td-button" href="/taiwan/goods.html?pid=' + data[i].ProductId + '">查看H5页面</>' +
+            '<a class="btn btn-primary radius td-button" onclick="product_add(' + title + ',' + href + ')">查看产品信息</a>' +
+            '</td></tr>');
+        warp.append(tr);
+    }
+    $("#loading").css({"display": "none"});
+    $("#warp").css({"display": "table-row-group"});
+}
+
+keySearchProductInfo = function () {
+    if (event.keyCode == 13) {
+        searchProductInfo();
+    }
+}
+
+searchProductInfo = function () {
+    var _val = $("#SearchPlaceBtn").val().trim();
+    if (_val == "") {
+        layer.msg('请输入订单号、人名、地址、手机号其中一个', {icon: 1});
+    }
+    else {
+        getProductInfo(_val, 1, 10);
+    }
+}
+
+
+product_add = function (title, url) {
+    var index = layer.open({
+        type: 2,
+        title: title,
+        content: url
+    });
+    layer.full(index);
+}
+
+urlEncode = function (arr) {
+    var i; //循环初始化
+    for (i = 0; i < arr.length; i++) {
+        arr[i] = encodeURIComponent(encodeURIComponent(arr[i]));
+    }
+    return arr.join();
+}
+
+toogle = function (cs) {
+    var child = $(cs);
+    for (var i = 0; i < child.length; i++) {
+        if (child[i].style.display == "none") {
+            child[i].style.display = "block";
+        } else {
+            child[i].style.display = "none";
+        }
+    }
+}
+

Разница между файлами не показана из-за своего большого размера
+ 11 - 0
taiwan/admin/js/ui/H-ui.min.js


Разница между файлами не показана из-за своего большого размера
+ 7 - 0
taiwan/admin/layer/2.4/skin/layer.css


Разница между файлами не показана из-за своего большого размера
+ 1648 - 0
taiwan/admin/lib/Hui-iconfont/1.0.8/demo.html


Разница между файлами не показана из-за своего большого размера
+ 11 - 0
taiwan/admin/lib/Hui-iconfont/1.0.8/iconfont.min.css


BIN
taiwan/admin/lib/Hui-iconfont/1.0.8/iconfont.ttf


BIN
taiwan/admin/lib/Hui-iconfont/1.0.8/iconfont.woff


+ 14 - 0
taiwan/admin/lib/My97DatePicker/4.8/lang/zh-cn.js

@@ -0,0 +1,14 @@
+var $lang={
+errAlertMsg: "\u4E0D\u5408\u6CD5\u7684\u65E5\u671F\u683C\u5F0F\u6216\u8005\u65E5\u671F\u8D85\u51FA\u9650\u5B9A\u8303\u56F4,\u9700\u8981\u64A4\u9500\u5417?",
+aWeekStr: ["\u5468","\u65E5","\u4E00","\u4E8C","\u4E09","\u56DB","\u4E94","\u516D"],
+aLongWeekStr:["\u5468","\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"],
+aMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00","\u5341\u4E8C"],
+aLongMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"],
+clearStr: "\u6E05\u7A7A",
+todayStr: "\u4ECA\u5929",
+okStr: "\u786E\u5B9A",
+updateStr: "\u786E\u5B9A",
+timeStr: "\u65F6\u95F4",
+quickStr: "\u5FEB\u901F\u9009\u62E9", 
+err_1: '\u6700\u5C0F\u65E5\u671F\u4E0D\u80FD\u5927\u4E8E\u6700\u5927\u65E5\u671F!'
+}

+ 14 - 0
taiwan/admin/lib/My97DatePicker/4.8/lang/zh-tw.js

@@ -0,0 +1,14 @@
+var $lang={
+errAlertMsg: "\u4E0D\u5408\u6CD5\u7684\u65E5\u671F\u683C\u5F0F\u6216\u8005\u65E5\u671F\u8D85\u51FA\u9650\u5B9A\u7BC4\u570D,\u9700\u8981\u64A4\u92B7\u55CE?",
+aWeekStr: ["\u5468","\u65E5","\u4E00","\u4E8C","\u4E09","\u56DB","\u4E94","\u516D"],
+aLongWeekStr:["\u5468","\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"],
+aMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00","\u5341\u4E8C"],
+aLongMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"],
+clearStr: "\u6E05\u7A7A",
+todayStr: "\u4ECA\u5929",
+okStr: "\u78BA\u5B9A",
+updateStr: "\u78BA\u5B9A",
+timeStr: "\u6642\u9593",
+quickStr: "\u5FEB\u901F\u9078\u64C7",
+err_1: '\u6700\u5C0F\u65E5\u671F\u4E0D\u80FD\u5927\u65BC\u6700\u5927\u65E5\u671F!'
+}

+ 9 - 0
taiwan/admin/lib/My97DatePicker/4.8/skin/WdatePicker.css

@@ -0,0 +1,9 @@
+.Wdate{
+	background:#fff url(datePicker.gif) no-repeat right;
+}
+.Wdate::-ms-clear{display:none;}
+
+.WdateFmtErr{
+	font-weight:bold;
+	color:red;
+}

+ 339 - 0
taiwan/admin/lib/My97DatePicker/4.8/skin/twoer/datepicker-dev.css

@@ -0,0 +1,339 @@
+/* 
+ * My97 DatePicker 4.8 
+ * auther : zhangkun , hejianting(design)
+ * email : zhangkun_net@hotmail.com
+ * date : 2012-05-25
+ */ 
+.WdateDiv
+{
+	position:relative;
+	padding:5px;
+	width:180px;
+	*width:190px;
+	font-size:12px;
+	color:#333;
+	border:solid 1px #DEDEDE;
+	background-color:#F2F0F1;
+}
+
+.WdateDiv2
+{
+	width:360px;
+}
+
+.WdateDiv .NavImg a,.WdateDiv .yminput,.WdateDiv .yminputfocus,.WdateDiv #dpQS 
+{
+	background:url(img.gif) no-repeat;
+}
+
+.WdateDiv .NavImg a
+{
+	float:left;
+	width:16px;
+	height:16px;
+	cursor:pointer;
+}
+.WdateDiv .NavImgll a
+{
+	background-position:0px 5px;
+}
+.WdateDiv .NavImgl a
+{
+	background-position:0px -10px;
+}
+.WdateDiv .NavImgr a
+{
+	background-position:0px -25px;
+	float:right;
+}
+.WdateDiv .NavImgrr a
+{
+	background-position:0px -40px;
+	float:right;
+}
+
+.WdateDiv #dpTitle
+{
+	padding:3px 0px 0px 0px;
+	line-height:0px;
+	height:20px;
+	*height:23;
+}
+
+.WdateDiv .yminput,.WdateDiv .yminputfocus
+{
+	margin-left:3px;
+	width:50px;
+	height:20px;
+	line-height:16px;
+	border:solid 1px #F2F0F1;
+	cursor:pointer;
+	background-position:35px -68px;
+}
+
+.WdateDiv .yminputfocus
+{
+	background-color:#fff;
+	border:solid 1px #D8D8D8;
+}
+
+.WdateDiv .menuSel{
+	z-index:1;
+	position:absolute;
+	background-color:#FFFFFF;
+	border:#A3C6C8 1px solid;
+	display:none;
+}
+
+.WdateDiv .menu
+{
+	background:#fff;
+}
+.WdateDiv .menuOn
+{
+	color:#fff;
+	background:#64A3F3;
+}
+
+.WdateDiv .invalidMenu{
+	color:#aaa;
+}
+
+.WdateDiv .MMenu,.WdateDiv .YMenu
+{
+	padding:2px;
+	margin-top:20px;
+	margin-left:-1px;
+	width:68px;
+	border:solid 1px #D9D9D9;
+}
+.WdateDiv .MMenu table,.WdateDiv .YMenu table
+{
+	width:100%;
+}
+.WdateDiv .MMenu table td,.WdateDiv .YMenu table td
+{
+	padding:0px;
+	line-height:20px;
+	text-align:center;
+	font-size:12px;
+	cursor: pointer;
+}
+
+.WdateDiv .Wweek {
+ 	text-align:center;
+	background:#DAF3F5;
+	border-right:#BDEBEE 1px solid;
+ }
+
+.WdateDiv td
+{
+	padding:1px;
+	line-height:20px;
+	font-size:12px;
+	color:#999999;
+	background:#fff;
+	cursor:pointer;
+}
+.WdateDiv .MTitle td
+{
+	line-height:24px;
+	color:#7D7D7D;
+	background:#F2F0F1;
+	cursor: default;
+}
+
+.WdateDiv .WdayTable2
+{
+	border-collapse:collapse;
+	border:#808080 1px solid;
+}
+.WdateDiv .WdayTable2 table
+{
+	border:0;
+}
+
+.WdateDiv .WdayTable{
+	line-height:20px;	
+	color:#13777e;
+	background-color:#edfbfb;
+}
+.WdateDiv .WdayTable td{
+	text-align:center;
+}
+
+.WdateDiv .Wday
+{
+	color:#323232;
+}
+
+.WdateDiv .WdayOn
+{
+	color:#fff;
+	background-color:#65A2F3;	
+}
+
+.WdateDiv .Wwday
+{
+	color:#65A4F3;
+}
+
+.WdateDiv .WwdayOn
+{
+	color:#fff;
+	background-color:#65A2F3;	
+}
+.WdateDiv .Wtoday
+{
+	color:#FF6D10;
+	background:#E0EDFE;
+}
+.WdateDiv .Wselday
+{
+	color:#fff;
+	background-color:#65A2F3;	
+}
+.WdateDiv .WspecialDay{
+	background-color:#66F4DF;
+}
+
+.WdateDiv .WotherDay
+{ 
+	color:#D4D4D4;	
+}
+.WdateDiv .WotherDayOn
+{
+	color:#fff;
+	background-color:#65A2F3;	
+}
+
+.WdateDiv .WinvalidDay{
+	color:#aaa;
+}
+
+.WdateDiv #dpTime
+{
+	position:relative;
+	margin-top:5px;
+}
+
+.WdateDiv #dpTime #dpTimeStr
+{
+	display:inline-block;
+	width:28px;
+	*width:30px;
+	color:#7d7d7d;
+}
+
+.WdateDiv #dpTime input
+{
+	padding:0px;
+	margin:0px;
+	width:25px;
+	height:20px;
+	line-height:20px;
+	text-align:center;
+	color:#333;
+	border:#D9D9D9 1px solid;	
+}
+
+.WdateDiv #dpTime .tm
+{
+	width:7px;
+	border:none;
+	background:#F2F0F1;
+}
+
+.WdateDiv #dpTime #dpTimeUp
+{
+	display:none;
+}
+
+.WdateDiv #dpTime #dpTimeDown
+{
+	display:none;
+}
+
+.WdateDiv #dpQS 
+ {
+ 	float:left;
+	margin-right:3px;
+	margin-top:9px;
+	*margin-top:6px;
+	width:16px;
+	height:16px;
+	cursor:pointer;
+	background-position:0px -90px;
+ }
+.WdateDiv #dpControl 
+{
+	text-align:right;
+	margin-top:3px;
+}
+.WdateDiv .dpButton
+{ 
+	margin-left:2px;
+	line-height:18px;
+	*line-height:16px;
+	width:45px;
+	background-color:#C3C3C3;
+	*background-color:#64A3F3;
+	color:#fff;
+	border:none;
+	cursor: pointer;
+}
+.WdateDiv .dpButton:hover
+{ 
+	background-color:#64A3F3;
+}
+
+.WdateDiv .hhMenu,
+.WdateDiv .mmMenu,
+.WdateDiv .ssMenu
+{
+	position:absolute;
+	padding:3px;
+	font-size:12px;
+	color:#333;
+	border:solid 1px #DEDEDE;
+	background-color:#F2F0F1;
+}
+
+.WdateDiv #dpTime .menu,.WdateDiv #dpTime .menuOn
+{
+	width:18px;
+	height:18px;
+	line-height:18px;
+	text-align:center;
+	background:#fff;
+}
+.WdateDiv #dpTime .menuOn
+{
+	background:#65A2F3;
+}
+
+.WdateDiv #dpTime td
+{
+	background:#F2F0F1;
+}
+
+.WdateDiv .hhMenu
+{
+	top:-87px;
+	left:35px;
+	left:32px\9;
+}
+
+.WdateDiv .mmMenu
+{
+	top:-47px;
+	left:35px;
+	left:32px\9;
+}
+
+.WdateDiv .ssMenu
+{
+	top:-27px;
+	left:35px;
+	left:32px\9;
+}

BIN
taiwan/admin/lib/My97DatePicker/4.8/skin/whyGreen/bg.jpg


+ 256 - 0
taiwan/admin/lib/My97DatePicker/4.8/skin/whyGreen/datepicker.css

@@ -0,0 +1,256 @@
+/* 
+ * My97 DatePicker 4.8 Skin:whyGreen
+ */ 
+.WdateDiv{
+	width:180px;
+	background-color:#fff;
+	border:#C5E1E4 1px solid;
+	padding:2px;
+}
+
+.WdateDiv2{
+	width:360px;
+}
+.WdateDiv *{font-size:9pt;}
+
+.WdateDiv .NavImg a{
+	cursor:pointer;
+	display:block;
+	width:16px;
+	height:16px;
+	margin-top:1px;
+}
+
+.WdateDiv .NavImgll a{
+	float:left;
+	background:url(img.gif) no-repeat;
+}
+.WdateDiv .NavImgl a{
+	float:left;
+	background:url(img.gif) no-repeat -16px 0px;
+}
+.WdateDiv .NavImgr a{
+	float:right;
+	background:url(img.gif) no-repeat -32px 0px;
+}
+.WdateDiv .NavImgrr a{
+	float:right;
+	background:url(img.gif) no-repeat -48px 0px;
+}
+
+.WdateDiv #dpTitle{
+	height:24px;
+	padding:1px;
+	border:#c5d9e8 1px solid;
+	background:url(bg.jpg);
+	margin-bottom:2px;
+}
+
+.WdateDiv .yminput{
+	margin-top:2px;
+	text-align:center;
+	border:0px;
+	height:20px;
+	width:50px;
+	color:#034c50;
+	background-color:transparent;
+	cursor:pointer;
+}
+
+.WdateDiv .yminputfocus{
+	margin-top:2px;
+	text-align:center;
+	border:#939393 1px solid;
+	font-weight:bold;
+	color:#034c50;	
+	height:20px;
+	width:50px;
+}
+
+.WdateDiv .menuSel{
+	z-index:1;
+	position:absolute;
+	background-color:#FFFFFF;
+	border:#A3C6C8 1px solid;
+	display:none;
+}
+
+.WdateDiv .menu{
+	cursor:pointer;
+	background-color:#fff;
+	color:#11777C;
+}
+
+.WdateDiv .menuOn{
+	cursor:pointer;
+	background-color:#BEEBEE;
+}
+
+.WdateDiv .invalidMenu{
+	color:#aaa;
+}
+
+.WdateDiv .YMenu{
+	margin-top:20px;
+}
+
+.WdateDiv .MMenu{
+	margin-top:20px;
+	*width:62px;
+}
+
+.WdateDiv .hhMenu{
+	margin-top:-90px; 
+	margin-left:26px;
+}
+
+.WdateDiv .mmMenu{
+	margin-top:-46px; 
+	margin-left:26px;
+}
+
+.WdateDiv .ssMenu{
+	margin-top:-24px; 
+	margin-left:26px;
+}
+
+ .WdateDiv .Wweek {
+ 	text-align:center;
+	background:#DAF3F5;
+	border-right:#BDEBEE 1px solid;
+ }
+
+.WdateDiv .MTitle{
+	color:#13777e;
+	background-color:#bdebee;
+}
+.WdateDiv .WdayTable2{
+	border-collapse:collapse;
+	border:#BEE9F0 1px solid;
+}
+.WdateDiv .WdayTable2 table{
+	border:0;
+}
+
+.WdateDiv .WdayTable{
+	line-height:20px;	
+	color:#13777e;
+	background-color:#edfbfb;
+	border:#BEE9F0 1px solid;
+}
+.WdateDiv .WdayTable td{
+	text-align:center;
+}
+
+.WdateDiv .Wday{
+	cursor:pointer;
+}
+
+.WdateDiv .WdayOn{
+	cursor:pointer;
+	background-color:#74d2d9 ;
+}
+
+.WdateDiv .Wwday{
+	cursor:pointer;
+	color:#ab1e1e;
+}
+
+.WdateDiv .WwdayOn{
+	cursor:pointer;
+	background-color:#74d2d9;
+}
+.WdateDiv .Wtoday{
+	cursor:pointer;
+	color:blue;
+}
+.WdateDiv .Wselday{
+	background-color:#A7E2E7;
+}
+.WdateDiv .WspecialDay{
+	background-color:#66F4DF;
+}
+
+.WdateDiv .WotherDay{ 
+	cursor:pointer;
+	color:#0099CC;	
+}
+
+.WdateDiv .WotherDayOn{ 
+	cursor:pointer;
+	background-color:#C0EBEF;	
+}
+
+.WdateDiv .WinvalidDay{
+	color:#aaa;
+}
+
+.WdateDiv #dpTime{
+	float:left;
+	margin-top:3px;
+	margin-right:30px;
+}
+
+.WdateDiv #dpTime #dpTimeStr{
+	margin-left:1px;
+	color:#497F7F;
+}
+
+.WdateDiv #dpTime input{
+	height:20px;
+	width:18px;
+	text-align:center;
+	color:#333;
+	border:#61CAD0 1px solid;	
+}
+
+.WdateDiv #dpTime .tB{
+	border-right:0px;
+}
+
+.WdateDiv #dpTime .tE{
+	border-left:0;
+	border-right:0;
+}
+
+.WdateDiv #dpTime .tm{
+	width:7px;
+	border-left:0;
+	border-right:0;
+}
+
+.WdateDiv #dpTime #dpTimeUp{
+	height:10px;
+	width:13px;
+	border:0px;
+	background:url(img.gif) no-repeat -32px -16px;
+}
+
+.WdateDiv #dpTime #dpTimeDown{
+	height:10px;
+	width:13px;
+	border:0px;
+	background:url(img.gif) no-repeat -48px -16px;
+}
+
+ .WdateDiv #dpQS {
+ 	float:left;
+	margin-right:3px;
+	margin-top:3px;
+	background:url(img.gif) no-repeat 0px -16px;
+	width:20px;
+	height:20px;
+	cursor:pointer;
+ }
+.WdateDiv #dpControl {
+	text-align:right;
+	margin-top:3px;
+}
+.WdateDiv .dpButton{ 
+	height:20px;
+	width:45px;
+	margin-top:2px;
+	border:#38B1B9 1px solid;
+	background-color:#CFEBEE;
+	color:#08575B;
+}

BIN
taiwan/admin/lib/My97DatePicker/4.8/skin/whyGreen/img.gif


Разница между файлами не показана из-за своего большого размера
+ 152 - 0
taiwan/admin/lib/datatables/1.10.0/jquery.dataTables.min.js


Разница между файлами не показана из-за своего большого размера
+ 29 - 0
taiwan/admin/lib/echarts/3.4.0/echarts.common.min.js


Разница между файлами не показана из-за своего большого размера
+ 50 - 0
taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/highcharts-3d.js


Разница между файлами не показана из-за своего большого размера
+ 14 - 0
taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.js


Разница между файлами не показана из-за своего большого размера
+ 26 - 0
taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/data.js


+ 756 - 0
taiwan/admin/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));
+}));

+ 545 - 0
taiwan/admin/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));
+}));

+ 798 - 0
taiwan/admin/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));
+}));

+ 150 - 0
taiwan/admin/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));
+}));

Разница между файлами не показана из-за своего большого размера
+ 14 - 0
taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/solid-gauge.js


Разница между файлами не показана из-за своего большого размера
+ 29 - 0
taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/treemap.js


+ 881 - 0
taiwan/admin/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));
+}));

Разница между файлами не показана из-за своего большого размера
+ 15 - 0
taiwan/admin/lib/hcharts/Highcharts/5.0.6/js/modules/xrange-series.js


+ 314 - 0
taiwan/admin/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
taiwan/admin/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));
+}));

+ 99 - 0
taiwan/admin/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));
+}));

+ 129 - 0
taiwan/admin/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));
+}));

+ 15 - 0
taiwan/admin/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)

+ 501 - 0
taiwan/admin/lib/jselect-1.0.js

@@ -0,0 +1,501 @@
+/*!
+ * js模拟系统select v1.0
+ * http://www.cnblogs.com/typeof/ 
+ * 
+ * 主流浏览器对html的select元素渲染都不一样,IE系列(6, 7, 8)也不一样,
+ * firefox,chrome,safari,opera 渲染和事件处理也稍有差异
+ * 该脚本解决了在不同浏览器下渲染和事件响应不一致的问题,对系统select是完全
+ * 意义上的替换。v1.0版本只支持单个select选择即不支持二级或者三级联动且不支持系统select的onchange事件。
+ * 该版本支持模拟select选择的数据和系统select选中数据的同步,不影响form表单的提交 
+ *
+ * 如果page上select有的不想通过该脚本替换,只想维持系统select,可以在相应的select元素添加自定义属性data-enabled="true",
+ * 否则可以在想要通过该脚本替换的select元素上添加自定义属性data-enabled="false"或者不加,会默认为这个select需要
+ * 通过该脚本进行替换
+ *
+ * 日期:2012-11-07 15:38
+ */
+(function(squid) {
+    function JSelect() {
+        this.init()
+    } 
+
+    JSelect.prototype = {
+        constructor: JSelect,
+        init: function(context) {
+            //获取指定上下文所有select元素
+            var elems = squid.getElementsByTagName('select', context)
+            this.globalEvent()
+            this.initView(elems)
+        },
+        initView: function(elems) {
+            var i = 0,
+                elem,
+                length = elems.length,
+                enabled;
+
+            for(; i < length; i++) {
+                elem = elems[i]
+                enabled = elem.getAttribute('data-enabled')
+                //使用系统select
+                if(!enabled || enabled === 'true')
+                    continue
+                if(squid.isVisible(elem))
+                    elem.style.display = 'none'
+                
+                this.create(elem)
+            }
+        },
+        create: function(elem) {
+            var data = [],
+                i = 0,
+                length,
+                option,
+                options,
+                value,
+                text,
+                obj,
+                lis,
+                ul,
+                _default,
+                icon,
+                selectedText,
+                selectedValue,
+                div,
+                wrapper,
+                position,
+                left,
+                top,
+                cssText; 
+
+            options = elem.getElementsByTagName('option') 
+            length = options.length
+            for(; i < length; i++) {
+                option = options[i]
+                value = option.value
+                text = option.innerText || option.textContent
+                
+                obj = {
+                    value: value, 
+                    text: text
+                }
+                if(option.selected) {
+                   selectedValue = value
+                   selectedText = text  
+                   obj['selected'] = true 
+                }
+                data.push(obj)
+            }
+
+            lis = this.render(this.tmpl, data)
+            ul = '<ul class="select-item">' + lis + '</ul>'
+            //
+            div = document.createElement('span')
+            div.style.display = 'none'
+            div.className = 'select-wrapper'
+            //已选元素
+            _default = document.createElement('span')
+            _default.className = 'select-default unselectable'
+            _default.unselectable = 'on'
+            //让div元素能够获取焦点
+            _default.setAttribute('tabindex', '1')
+            _default.setAttribute('data-value', selectedValue)
+            _default.setAttribute('hidefocus', true)
+            _default.innerHTML = selectedText 
+            div.appendChild(_default) 
+            //选择icon
+            icon = document.createElement('i')
+            icon.className = 'select-icon' 
+            div.appendChild(icon)
+            //下拉列表
+            wrapper = document.createElement('span')
+            wrapper.className = 'select-list hide'
+            wrapper.innerHTML = ul
+            //生成新的元素
+            div.appendChild(wrapper)
+            //插入到select元素后面
+            elem.parentNode.insertBefore(div, null)
+            //获取select元素left top值
+            //先设置select显示,取完left, top值后重新隐藏
+            elem.style.display = 'block'
+            //事件绑定
+            this.sysEvent(div)
+            position = squid.position(elem)
+            elem.style.display = 'none'
+            left = position.left
+            top = position.top
+            cssText = ' display: inline-block;'
+            div.style.cssText = cssText
+        },
+        globalEvent: function() {
+            //document 添加click事件,用户处理每个jselect元素展开关闭
+            var target,
+                className,
+                elem,
+                wrapper,
+                status,
+                that = this;
+
+
+            squid.on(document, 'click', function(event) {
+                target = event.target, 
+                className = target.className;
+
+                switch(className) {
+                    case 'select-icon':
+                    case 'select-default unselectable':
+                        elem = target.tagName.toLowerCase() === 'span' ? target : target.previousSibling
+                        wrapper = elem.nextSibling.nextSibling
+                         
+                        //firefox 鼠标右键会触发click事件
+                        //鼠标左键点击执行
+                        if(event.button === 0) {
+                            //初始化选中元素
+                            that.initSelected(elem)
+                            if(squid.isHidden(wrapper)) {
+                                status = 'inline-block'
+                                //关闭所有展开jselect
+                                that.closeSelect() 
+                            }else{
+                                status = 'none' 
+                            }
+                            wrapper.style.display = status 
+                            elem.focus() 
+                        }else if(event.button === 2){
+                            wrapper.style.display = 'none' 
+                        }
+                        that.zIndex(wrapper)
+                        break
+                    case 'select-option':
+                    case 'select-option selected':
+                        if(event.button === 0) {
+                            that.fireSelected(target, target.parentNode.parentNode.previousSibling.previousSibling)
+                            wrapper.style.display = 'none' 
+                        }
+                        break
+                    default:
+                        while(target && target.nodeType !== 9) {
+                            if(target.nodeType === 1) {
+                                if(target.className === 'select-wrapper') {
+                                    return
+                                } 
+                            }
+                            target = target.parentNode
+                        }
+                        that.closeSelect()
+                        break
+                } 
+            })
+        },
+        sysEvent: function(elem) {
+            var stand = elem.firstChild,
+                dropdown = elem.lastChild,
+                target,
+                //firefox = 'MozBinding' in document.documentElement.style,
+                chrome = /chrome/i.test(navigator.userAgent),
+                keyup = chrome ? 'keypress' : 'keyup',
+                that = this;
+
+            squid.on(elem, 'mouseover', function(event) {
+                if(!that.doScrolling) {
+                    target = event.target
+                    that.activate(target)  
+                }
+            })
+
+            squid.on(elem, 'mouseout', function(event) {
+                if(!that.doScrolling) {
+                    target = event.target 
+                    that.deactivate(target)
+                }
+            })
+
+            squid.on(stand, 'keydown', function(event) {
+               var keyCode = event.keyCode;
+
+               switch(keyCode) {
+                   //回车选中
+                   case 13:
+                        that.enter(dropdown) 
+                        break
+                   //向上键
+                   case 38:
+                       that.doScrolling = true
+                       that.up(dropdown) 
+                       break
+                   //向下键
+                   case 40:
+                       that.doScrolling = true
+                       that.down(dropdown) 
+                       break
+                   default:
+                       break
+               } 
+            })
+
+            squid.on(stand, keyup, function(event) {
+               var keyCode = event.keyCode;
+
+               switch(keyCode) {
+                   //回车选中
+                   case 13:
+                        that.doScrolling = false
+                        break
+                   //向上键
+                   case 38:
+                        that.doScrolling = false
+                        break
+                   //向下键
+                   case 40:
+                       that.doScrolling = false
+                       break
+                   default:
+                       break
+               }  
+            })
+        },
+        zIndex: function(elem) {
+            var index = 10,
+                cur = elem.parentNode.parentNode,
+                next = squid.next(cur);
+            
+            if(next) {
+                cur.style.zIndex = index
+                next.style.zIndex = --index
+            }
+        },
+        initSelected: function(elem) {
+            var curText = elem.innerText || elem.textContent,
+                curValue = elem.getAttribute('data-value'),
+                wrapper = elem.nextSibling.nextSibling,
+                n = wrapper.firstChild.firstChild,
+                text,
+                value,
+                dir,
+                min = 0,
+                max,
+                hidden = false;
+
+            for(; n; n = n.nextSibling) {
+                text = n.innerText || n.textContent 
+                value = n.getAttribute('data-value')
+                if(curText === text && curValue === value) {
+                    //显示已选中元素
+                    if(squid.isHidden(wrapper)) {
+                        wrapper.style.display = 'block'
+                        hidden = true
+                    }
+                    max = wrapper.scrollHeight
+                    if(n.offsetTop > (max / 2)) {
+                        if(wrapper.clientHeight + wrapper.scrollTop === max) 
+                            dir = 'up'
+                        else
+                            dir = 'down'
+                    }else{
+                        if(wrapper.scrollTop === min)
+                            dir = 'down'
+                        else
+                            dir = 'up'
+                    }
+                    this.inView(n, wrapper, dir) 
+                    if(hidden)
+                        wrapper.style.display = 'none'
+                    this.activate(n)
+                    break
+                }
+            } 
+        },
+        activate: function(elem) {
+            var tagName = (elem.tagName || '').toLowerCase(),
+                    className = elem.className,
+                    parent = elem.parentNode,
+                    first = parent.firstChild,
+                    last = parent.lastChild;
+
+            switch(tagName) {
+                case 'li':
+                    //li.select-option 元素
+                    if(!~className.indexOf('selected') && (elem !== first || elem !== last)) {
+                        this.deactivate(elem)
+                        elem.className = className + ' selected'
+                    }
+                    break
+                default:
+                    break
+            } 
+        },
+        deactivate: function(elem) {
+             var tagName = (elem.tagName || '').toLowerCase(),
+                 className = (' ' + elem.className + ' ').replace(/[\n\r\t]/, '');
+
+            switch(tagName) {
+                case 'li':
+                    //li.select-option 元素
+                    var i = 0,
+                        lis = squid.siblings(elem),
+                        length = lis.length,
+                        cur;
+
+                    for(; i < length; i++) {
+                        cur = lis[i] 
+                        cur.className = squid.trim(className.replace(' selected ', ''))
+                    }
+                    break
+                default:
+                    break
+            }
+        },
+        fireSelected: function(elem, s) {
+            var text = elem.innerText || elem.textContent,
+                value = elem.getAttribute('data-value'),
+                r;
+
+            s.setAttribute('data-value', value) 
+            if(s.innerText) 
+                s.innerText = text
+            else
+                s.textContent = text
+
+            //触发系统select选中,用于form表单提交
+            r = s.parentNode.previousSibling.previousSibling
+            r.value = value 
+            r.setAttribute('data-text', text)
+        },
+        closeSelect: function() {
+            var elems = squid.getElementsByClassName('select-list'),
+                i = 0,
+                length = elems.length,
+                elem;  
+
+            for(; i < length; i++) {
+                elem = elems[i] 
+                if(squid.isVisible(elem))
+                    elem.style.display = 'none'
+            }
+        },
+        up: function(elem) {
+            var ul = elem.firstChild,
+                lis = ul.childNodes,
+                li = this.getSelectedIndex(lis),
+                cur,
+                i = li.index;
+            
+            if(i > 0) {
+                i-- 
+                cur = lis[i]
+                //判断元素是否in view
+                this.inView(cur, elem, 'up')
+                this.activate(cur) 
+                this.fireSelected(cur, elem.previousSibling.previousSibling) 
+            }
+        },
+        down: function(elem) {
+            var ul = elem.firstChild,
+                lis = ul.childNodes,
+                li = this.getSelectedIndex(lis),
+                cur,
+                i = li.index;
+
+            if(i < lis.length - 1) {
+                 i++ 
+                 cur = lis[i]
+                 //判断元素是否in view
+                 this.inView(cur, elem, 'down') 
+                 this.activate(cur)
+                 this.fireSelected(cur, elem.previousSibling.previousSibling)
+            } 
+        },
+        enter: function(elem) {
+            var ul = elem.firstChild,
+                lis = ul.childNodes,
+                li,
+                i,
+                cur;
+
+            li = this.getSelectedIndex(lis)
+            i = li.index
+            cur = lis[i] 
+            this.fireSelected(cur, elem.previousSibling.previousSibling) 
+            this.closeSelect()
+        },
+        getSelectedIndex: function(elems) {
+            var i = 0,
+                length = elems.length,
+                elem;
+            
+            for(; i < length; i++) {
+                elem = elems[i]
+                if(~elem.className.indexOf('selected')) {
+                    return {
+                        index: i
+                    } 
+                }
+            }
+
+            return {
+                index: -1
+            }
+        },
+        inView: function(elem, wrapper, dir) {
+            var scrollTop = wrapper.scrollTop,
+                offsetTop = elem.offsetTop,
+                top;
+
+            if(dir === 'up') {
+                if(offsetTop === 0) {
+                    wrapper.scrollTop = offsetTop;
+                }else if(offsetTop < scrollTop) {
+                    top = offsetTop - scrollTop
+                    this.scrollInView(wrapper, top) 
+                }
+            }else{
+                var clientHeight = wrapper.clientHeight;
+                
+                if(offsetTop + elem.offsetHeight === wrapper.scrollHeight) {
+                    wrapper.scrollTop = wrapper.scrollHeight - wrapper.clientHeight 
+                }else if(offsetTop + elem.offsetHeight > clientHeight + scrollTop) {
+                    top = (offsetTop + elem.offsetHeight) - (scrollTop + clientHeight)
+                    this.scrollInView(wrapper, top) 
+                }
+            }
+        },
+        scrollInView: function(elem, top) {
+            setTimeout(function() {
+                elem.scrollTop += top
+            }, 10)
+        },
+        doScrolling: false,
+        render: function(tmpl, data) {
+            var i = 0,
+                cur,
+                length = data.length,
+                prop,
+                value,
+                item,
+                r = [];
+
+            for(; i < length; i++) {
+               cur = data[i]
+               item = tmpl.replace(/\{\{\w+\}\}/g, function(a) {
+                   prop = a.replace(/[\{\}]+/g, '')
+                   value = cur[prop] || ''
+                   if(prop === 'class') {
+                        value += 'select-option'
+                        if(cur.selected) {
+                            value += ' selected' 
+                        }
+                   }
+                        
+                   return value
+               })
+               r.push(item)
+            }
+
+            return r.join('')
+        },
+        tmpl: '<li class="{{class}}" data-value="{{value}}">{{text}}</li>'
+    }
+
+    squid.swing.jselect = function() {
+        return new JSelect() 
+    }
+})(squid);

Разница между файлами не показана из-за своего большого размера
+ 2 - 0
taiwan/admin/lib/layer/2.4/layer.js


BIN
taiwan/admin/lib/layer/2.4/skin/default/icon-ext.png


BIN
taiwan/admin/lib/layer/2.4/skin/default/icon.png


BIN
taiwan/admin/lib/layer/2.4/skin/default/loading-1.gif


+ 21 - 0
taiwan/admin/lib/laypage/1.2/skin/laypage.css

@@ -0,0 +1,21 @@
+/*!
+ laypage默认样式
+*/
+.laypage_main{font-size:0; clear:both; color:#666}
+.laypage_main *{display:inline-block; vertical-align: top; font-size:12px}
+.laypage_main a{height:26px; line-height:26px; text-decoration:none; color:#666}
+.laypage_main a, .laypage_main span{margin:0 3px 6px; padding:0 10px}
+.laypage_main span{height:26px; line-height:26px}
+.laypage_main input, .laypage_main button{ border:1px solid #ccc; background-color:#fff}
+.laypage_main input{width:40px; height:26px; line-height:26px; margin:0 5px; padding:0 5px}
+.laypage_main button{height:28px; line-height:28px; margin-left:5px; padding:0 10px; color:#666}
+
+/* 默认皮肤 */
+.laypageskin_default a{border:1px solid #ddd; background-color:#fff}
+.laypageskin_default a:hover{ background-color:#5a98de; border-color:#5a98de; color:#fff}
+.laypageskin_default span{height:28px; line-height:28px; color:#999}
+.laypageskin_default .laypage_curr{font-weight:700; color:#666}
+
+/* 一般用于信息流加载 */
+.laypageskin_flow{text-align:center}
+.laypageskin_flow .page_nomore{color:#999}

Разница между файлами не показана из-за своего большого размера
+ 17 - 0
taiwan/admin/lib/lightbox2/2.8.1/examples.html


BIN
taiwan/admin/lib/lightbox2/2.8.1/images/next.png


Разница между файлами не показана из-за своего большого размера
+ 9655 - 0
taiwan/admin/lib/lightbox2/2.8.1/js/lightbox-plus-jquery.js


Разница между файлами не показана из-за своего большого размера
+ 444 - 0
taiwan/admin/lib/lightbox2/2.8.1/js/lightbox.js


Разница между файлами не показана из-за своего большого размера
+ 13 - 0
taiwan/admin/lib/lightbox2/2.8.1/js/lightbox.min.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
taiwan/admin/lib/nprogress/0.2.0/nprogress.min.js


Разница между файлами не показана из-за своего большого размера
+ 6 - 0
taiwan/admin/lib/respond.min.js


+ 490 - 0
taiwan/admin/lib/squid.js

@@ -0,0 +1,490 @@
+/*!
+ * Squid 总结、积累、收集的一些基础方法
+ * http://www.cnblogs.com/typeof/
+ *
+ * 所有plugins、swing所做的扩展都是基于Squid对象
+ */
+(function(window) {
+    //定义squid
+    var Squid = function() {},
+        slice = Array.prototype.slice,
+        splice = Array.prototype.splice,
+        trim = String.prototype.trim;
+
+    //浅度拷贝
+    Squid.extend = function() {
+        var target = arguments[0],
+            i = 1,
+            length = arguments.length,
+            options,
+            prop;
+
+        if(typeof target !== 'object') {
+            target = {};
+        }
+
+        if(length === i) {
+            target = this;
+            --i;
+        }
+
+        for(; i < length; i++) {
+            if((options = arguments[i]) != null) {
+                for(prop in options) {
+                    target[prop] = options[prop];
+                }
+            }
+        }
+
+        return target;
+    };
+
+    //DOM 方法
+    Squid.extend({
+        getElementById: function(id) {
+            var elem = document.getElementById(id);
+            
+            if(elem && elem.parentNode) {
+                if(elem.id !== id) {
+                    elem = null;
+                    var elems = document.getElementsByTagName(id),
+                        i = 0,
+                        length = elems.length,
+                        cur;
+
+                    for(; i < length; i++) {
+                        cur = elems[i];
+                        if(cur.id === id) {
+                            elem = cur;
+                            break;
+                        }
+                    }
+                }
+                
+                return elem;
+            } 
+        },
+        getElementsByTagName: function(tagName, context) {
+            context = context || document;
+
+            var elems = context.getElementsByTagName(tagName),
+                r = [];
+            
+            try {
+                r = slice.call(elems, 0);
+            }catch(e) {
+                var i = 0,
+                    length = elems.length,
+                    elem;
+
+                for(; i < length; i++) {
+                    elem = elems[i];
+                    r.push(elem);
+                }
+            }
+
+            return r;
+        },
+        getElementsByClassName: function(className, context) {
+            //执行上下文,默认为document
+            context = context || document; 
+
+            var r = [];
+
+            if(context.getElementsByClassName) {
+                var elems = context.getElementsByClassName(className);				
+                r = slice.call(elems, 0);
+            }else{
+                var elems,
+                    elem,
+                    i = 0,
+                    length;
+
+                elems = context.getElementsByTagName('*');		
+                length = elems.length;
+                for(; i < length; i++) {
+                    elem = elems[i];
+                    if(elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(className) >= 0) {
+                        r.push(elem);	
+                    }
+                }
+            }
+
+            return r;    
+        },
+        children: function(elem) {
+
+        },
+        first: function(elem) {
+            return this.sibling(elem.firstChild)[0];	
+        },
+        next: function(elem) {
+            return this.nth(elem, 2, 'nextSibling');
+        },
+        siblings: function(elem) {
+            return this.sibling(elem.parentNode.firstChild, elem); 
+        },
+        nth: function(cur, r, dir) {
+            r = r || 1;
+            var i = 0;
+
+            for(; cur; cur = cur[dir]) {
+                if(cur.nodeType === 1 && ++i === r) {
+                    break; 
+                }
+            }
+
+            return cur;
+        },
+        sibling: function(n, elem) {
+            var r = [];
+
+            for(; n; n = n.nextSibling) {
+                if(n.nodeType === 1 && n !== elem) {
+                    r.push(n);	
+                }	
+            }
+
+            return r;
+        },
+        isVisible: function(elem) {
+            return !this.isHidden(elem); 
+        },
+        isHidden: function(elem) {
+            if(elem) {
+                var width = elem.offsetWidth,
+                    height = elem.offsetHeight;
+
+                return (width === 0 && height === 0) || elem.style.display === 'none'
+            } 
+        },
+        getOffset: function(elem) {
+            var body = document.body,
+                docElem = document.documentElement;
+
+            if('getBoundingClientRect' in document.documentElement) {
+                var box;
+
+                try {
+                    box = elem.getBoundingClientRect()
+                }catch(e) {}
+
+                if(!box || !elem.parentNode) {
+                    return box ? {top: box.top, left: box.left} : {top: 0, left: 0}
+                }
+
+                var win = window,
+                    clientTop = docElem.clientTop || body.clientTop || 0,
+                    clientLeft = docElem.clientLeft || body.clientLeft || 0,
+                    scrollTop = win.pageYOffset || docElem.scrollTop || body.scrollTop,
+                    scrollLeft = win.pageXOffset || docElem.scrollLeft || body.scrollLeft,
+                    top = box.top + scrollTop - clientTop,
+                    left = box.left + scrollLeft - clientLeft; 
+
+                return {top: top, left: left}
+            }else{
+                var offsetParent = elem.offsetParent,
+                    top = elem.offsetTop,
+                    left = elem.offsetLeft;
+
+                while((elem = elem.parentNode) && elem !== body && elem !== docElem) {
+                    if(elem === offsetParent) {
+                        top = elem.offsetTop
+                        left = elem.offsetLeft
+
+                        offsetParent = elem.offsetParent
+                    }
+                }
+
+                return {top: top, left: left}
+            }
+        },
+        position: function(elem) {
+            if(!elem) {
+                return null; 
+            }
+
+            var offsetParent = elem.offsetParent,
+                offset = this.getOffset(elem),
+                parentOffset = this.getOffset(offsetParent);
+
+            return {
+                top: offset.top - parentOffset.top,
+                left: offset.left - parentOffset.left
+            };
+        }
+    });
+    
+    //全局缓存对象
+    var cache = {};
+
+    Squid.extend({
+        guid: 1,
+        uuid: 0,
+        expando: 'squid' + (Math.random() + '').replace(/\D/g, ''),
+        data: function(elem, name) {
+            var internalKey = squid.expando,
+                id,
+                thisCache,
+                r;
+
+            id = elem[squid.expando];
+            if(!id) {
+                elem[squid.expando] = id = ++squid.uuid;
+            }
+            if(!cache[id]) {
+                cache[id] = {};
+            }
+
+            if(typeof name === 'object' || typeof name === 'function') {
+                cache[id][internalKey] = name;
+            }
+
+            thisCache = cache[id];
+
+            if(!thisCache[internalKey]) {
+                thisCache[internalKey] = {};
+            }
+            thisCache = thisCache[internalKey];
+
+            if(name === 'events' && !thisCache[name]) {
+                return thisCache[internalKey] && thisCache[internalKey].events;
+            }
+
+            if(typeof name === 'string') {
+                r = thisCache[name];
+            }else{
+                r = thisCache;
+            }
+
+            return r;			
+        },
+        removeData: function(elem, name) {
+            var internalKey = squid.expando,
+                id = elem[squid.expando],
+                internalCache;
+
+            if(!cache[id]) {
+                return;
+            }
+            try{
+                delete cache[id];
+            }catch(e) {
+                cache[id] = null;
+            }
+            if(elem.removeAttribute) {
+                elem.removeAttribute(squid.expando);
+            }else{
+                elem[squid.expando] = null;
+            }
+        }
+    });
+
+    //事件处理
+    Squid.event = {
+        add: function(elem, type, handler) {
+            var elemData,
+            events,
+            eventHandler,
+            handleObj,
+            handlers;
+
+            if(elem.nodeType === 3 || elem.nodeType === 8) {
+                return;
+            }
+            if(!handler) {
+                return;
+            }
+            if(!handler.guid) {
+                handler.guid = squid.guid++;
+            }
+
+            elemData = squid.data(elem);
+            if(!elemData) {
+                return;
+            }
+
+            events = elemData.events;
+            eventHandler = elemData.handle;
+            if(!events) {
+                elemData.events = events = {};
+            }
+
+            if(!eventHandler) {
+                elemData.handle = eventHandler = function(event) {
+                    return squid.event.handle.apply(eventHandler.elem, arguments); 
+                };
+                eventHandler.elem = elem;
+            }
+            
+            handleObj = {
+                handler: handler
+            };
+            handleObj.type = type;
+            if(!handleObj.guid) {
+                handleObj.guid = handler.guid;
+            }
+            handlers = events[type];
+            if(!handlers) {
+                handlers = events[type] = [];
+                if(elem.addEventListener) {
+                    elem.addEventListener(type, eventHandler, false);
+                }else if(elem.attachEvent){
+                    elem.attachEvent('on' + type, eventHandler);
+                }
+            }
+
+            handlers.push(handleObj);
+        },
+        remove: function(elem, type, handler) {
+            var elemData,
+                events,
+                eventType,
+                i = 0,
+                handleObj;
+                
+            if(elem.nodeType === 3 || elem.nodeType === 8) {
+                return;
+            }	
+            
+            elemData = squid.data(elem);
+            events = elemData.events;
+            if(!events) {
+                return;
+            }
+            eventType = events[type] || [];
+            if(!handler) {
+                for(; i < eventType.length; i++) {
+                    handleObj = eventType[i];
+                    squid.event.remove(elem, type, handleObj.handler);
+                    eventType.splice(i--, 1);
+                }
+            }
+        
+            if(eventType.length === 0) {
+                if(elem.removeEventListener) {
+                    elem.removeEventListener(type, elemData.handle, false);
+                }else if(elem.detachEvent) {
+                    elem.detachEvent('on' + type, elemData.handle);
+                }
+            }
+            
+            squid.removeData(elem);
+        },
+        handle: function(event) {
+            var i = 0,
+                length,
+                handlers,
+                handleObj,
+                args = Array.prototype.slice.call(arguments, 0);
+
+            event = squid.event.fix(event);
+            handlers = ((squid.data(this, 'events') || {})[event.type] || []).slice(0);
+
+            args[0] = event;
+
+            length = handlers.length;
+            for(; i < length; i++) {
+                handleObj = handlers[i];
+                event.handler = handleObj.handler;
+                event.handleObj = handleObj;
+
+                handleObj.handler.apply(this, args);
+            }
+        },
+        fix: function(event) {
+            if(!event.target) {
+                event.target = event.srcElement || document;
+            }
+
+            if(event.target.nodeType === 3) {
+                event.target = event.target.parentNode;
+            }
+            
+            if(!event.relateTarget && event.fromElement) {
+                event.relateTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+            }
+
+            if(!event.preventDefault) {
+                event.preventDefault = function() {
+                    event.returnValue = false;
+                };
+            }
+
+            if(!event.stopPropagation) {
+                event.stopPropagation = function() {
+                    event.cancelBubble = true;
+                };
+            }
+            
+            if(event.pageX == null) {
+                var eventDoc = event.target.ownerDocument || document,
+                    doc = eventDoc.documentElment,
+                    body = eventDoc.body;
+                
+                event.pageX = event.clientX + (doc && document.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+                event.pageY = event.clientY + (doc && document.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+            }
+
+            return event;
+        }
+    };
+
+    //事件处理
+    Squid.extend({
+        on: function(elem, type, handler) {
+            return this.event.add(elem, type, handler);	
+        },
+        off: function(elem, type, handler) {
+            return this.event.remove(elem, type, handler);
+        },
+        //把函数放到特定上下文执行
+        proxy: function(fn, context) {
+            var slice = Array.prototype.slice,
+                args = slice.call(arguments, 2),
+            proxy = function() {
+                return fn.apply(context, args.concat(slice.call(arguments))); 
+            };
+
+            proxy.guid = fn.guid = fn.guid || proxy.guid || squid.guid++;
+
+            return proxy;
+        }
+    });
+
+    var fnThrottleId = 0;
+    //工具函数
+    Squid.extend({
+        trim: trim ? function(text) {
+            return trim.call(text);
+        } : function(text) {
+            return text.toString().replace(/^\s+/, '').replace(/\s+$/, '');
+        },
+        throttle: function(fn, delay, context) {
+            delay = delay || 100;
+            context  = context || null;  
+            
+            return function() {
+                var args = arguments;
+                
+                clearTimeout(fnThrottleId);
+                fnThrottleId = setTimeout(function() {
+                    fn.apply(context, args);
+                }, delay);
+            };
+        },
+        isEmpty: function(obj) {
+            for(var prop in obj) {
+                return false; 
+            }
+            
+            return true;
+        }
+    });
+
+    //基于Squid扩展的插件
+    Squid.plugin = function() {};
+    //解决浏览器对默认组件渲染不一样
+    Squid.swing = function() {};    
+    window.squid = Squid;
+})(window);

+ 60 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/attachment.html

@@ -0,0 +1,60 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>ueditor图片对话框</title>
+    <script type="text/javascript" src="../internal.js"></script>
+
+    <!-- jquery -->
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
+
+    <!-- webuploader -->
+    <script src="../../third-party/webuploader/webuploader.min.js"></script>
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
+
+    <!-- attachment dialog -->
+    <link rel="stylesheet" href="attachment.css" type="text/css" />
+</head>
+<body>
+
+    <div class="wrapper">
+        <div id="tabhead" class="tabhead">
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
+            <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
+        </div>
+        <div id="tabbody" class="tabbody">
+            <!-- 上传图片 -->
+            <div id="upload" class="panel focus">
+                <div id="queueList" class="queueList">
+                    <div class="statusBar element-invisible">
+                        <div class="progress">
+                            <span class="text">0%</span>
+                            <span class="percentage"></span>
+                        </div><div class="info"></div>
+                        <div class="btns">
+                            <div id="filePickerBtn"></div>
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
+                        </div>
+                    </div>
+                    <div id="dndArea" class="placeholder">
+                        <div class="filePickerContainer">
+                            <div id="filePickerReady"></div>
+                        </div>
+                    </div>
+                    <ul class="filelist element-invisible">
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
+                    </ul>
+                </div>
+            </div>
+
+            <!-- 在线图片 -->
+            <div id="online" class="panel">
+                <div id="fileList"><var id="lang_imgLoading"></var></div>
+            </div>
+
+        </div>
+    </div>
+    <script type="text/javascript" src="attachment.js"></script>
+
+</body>
+</html>

+ 754 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/attachment.js

@@ -0,0 +1,754 @@
+/**
+ * User: Jinqn
+ * Date: 14-04-08
+ * Time: 下午16:34
+ * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
+ */
+
+(function () {
+
+    var uploadFile,
+        onlineFile;
+
+    window.onload = function () {
+        initTabs();
+        initButtons();
+    };
+
+    /* 初始化tab标签 */
+    function initTabs() {
+        var tabs = $G('tabhead').children;
+        for (var i = 0; i < tabs.length; i++) {
+            domUtils.on(tabs[i], "click", function (e) {
+                var target = e.target || e.srcElement;
+                setTabFocus(target.getAttribute('data-content-id'));
+            });
+        }
+
+        setTabFocus('upload');
+    }
+
+    /* 初始化tabbody */
+    function setTabFocus(id) {
+        if(!id) return;
+        var i, bodyId, tabs = $G('tabhead').children;
+        for (i = 0; i < tabs.length; i++) {
+            bodyId = tabs[i].getAttribute('data-content-id')
+            if (bodyId == id) {
+                domUtils.addClass(tabs[i], 'focus');
+                domUtils.addClass($G(bodyId), 'focus');
+            } else {
+                domUtils.removeClasses(tabs[i], 'focus');
+                domUtils.removeClasses($G(bodyId), 'focus');
+            }
+        }
+        switch (id) {
+            case 'upload':
+                uploadFile = uploadFile || new UploadFile('queueList');
+                break;
+            case 'online':
+                onlineFile = onlineFile || new OnlineFile('fileList');
+                break;
+        }
+    }
+
+    /* 初始化onok事件 */
+    function initButtons() {
+
+        dialog.onok = function () {
+            var list = [], id, tabs = $G('tabhead').children;
+            for (var i = 0; i < tabs.length; i++) {
+                if (domUtils.hasClass(tabs[i], 'focus')) {
+                    id = tabs[i].getAttribute('data-content-id');
+                    break;
+                }
+            }
+
+            switch (id) {
+                case 'upload':
+                    list = uploadFile.getInsertList();
+                    var count = uploadFile.getQueueCount();
+                    if (count) {
+                        $('.info', '#queueList').html('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
+                        return false;
+                    }
+                    break;
+                case 'online':
+                    list = onlineFile.getInsertList();
+                    break;
+            }
+
+            editor.execCommand('insertfile', list);
+        };
+    }
+
+
+    /* 上传附件 */
+    function UploadFile(target) {
+        this.$wrap = target.constructor == String ? $('#' + target) : $(target);
+        this.init();
+    }
+    UploadFile.prototype = {
+        init: function () {
+            this.fileList = [];
+            this.initContainer();
+            this.initUploader();
+        },
+        initContainer: function () {
+            this.$queue = this.$wrap.find('.filelist');
+        },
+        /* 初始化容器 */
+        initUploader: function () {
+            var _this = this,
+                $ = jQuery,    // just in case. Make sure it's not an other libaray.
+                $wrap = _this.$wrap,
+            // 图片容器
+                $queue = $wrap.find('.filelist'),
+            // 状态栏,包括进度和控制按钮
+                $statusBar = $wrap.find('.statusBar'),
+            // 文件总体选择信息。
+                $info = $statusBar.find('.info'),
+            // 上传按钮
+                $upload = $wrap.find('.uploadBtn'),
+            // 上传按钮
+                $filePickerBtn = $wrap.find('.filePickerBtn'),
+            // 上传按钮
+                $filePickerBlock = $wrap.find('.filePickerBlock'),
+            // 没选择文件之前的内容。
+                $placeHolder = $wrap.find('.placeholder'),
+            // 总体进度条
+                $progress = $statusBar.find('.progress').hide(),
+            // 添加的文件数量
+                fileCount = 0,
+            // 添加的文件总大小
+                fileSize = 0,
+            // 优化retina, 在retina下这个值是2
+                ratio = window.devicePixelRatio || 1,
+            // 缩略图大小
+                thumbnailWidth = 113 * ratio,
+                thumbnailHeight = 113 * ratio,
+            // 可能有pedding, ready, uploading, confirm, done.
+                state = '',
+            // 所有文件的进度信息,key为file id
+                percentages = {},
+                supportTransition = (function () {
+                    var s = document.createElement('p').style,
+                        r = 'transition' in s ||
+                            'WebkitTransition' in s ||
+                            'MozTransition' in s ||
+                            'msTransition' in s ||
+                            'OTransition' in s;
+                    s = null;
+                    return r;
+                })(),
+            // WebUploader实例
+                uploader,
+                actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),
+                fileMaxSize = editor.getOpt('fileMaxSize'),
+                acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');;
+
+            if (!WebUploader.Uploader.support()) {
+                $('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();
+                return;
+            } else if (!editor.getOpt('fileActionName')) {
+                $('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();
+                return;
+            }
+
+            uploader = _this.uploader = WebUploader.create({
+                pick: {
+                    id: '#filePickerReady',
+                    label: lang.uploadSelectFile
+                },
+                swf: '../../third-party/webuploader/Uploader.swf',
+                server: actionUrl,
+                fileVal: editor.getOpt('fileFieldName'),
+                duplicate: true,
+                fileSingleSizeLimit: fileMaxSize,
+                compress: false
+            });
+            uploader.addButton({
+                id: '#filePickerBlock'
+            });
+            uploader.addButton({
+                id: '#filePickerBtn',
+                label: lang.uploadAddFile
+            });
+
+            setState('pedding');
+
+            // 当有文件添加进来时执行,负责view的创建
+            function addFile(file) {
+                var $li = $('<li id="' + file.id + '">' +
+                        '<p class="title">' + file.name + '</p>' +
+                        '<p class="imgWrap"></p>' +
+                        '<p class="progress"><span></span></p>' +
+                        '</li>'),
+
+                    $btns = $('<div class="file-panel">' +
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
+                    $prgress = $li.find('p.progress span'),
+                    $wrap = $li.find('p.imgWrap'),
+                    $info = $('<p class="error"></p>').hide().appendTo($li),
+
+                    showError = function (code) {
+                        switch (code) {
+                            case 'exceed_size':
+                                text = lang.errorExceedSize;
+                                break;
+                            case 'interrupt':
+                                text = lang.errorInterrupt;
+                                break;
+                            case 'http':
+                                text = lang.errorHttp;
+                                break;
+                            case 'not_allow_type':
+                                text = lang.errorFileType;
+                                break;
+                            default:
+                                text = lang.errorUploadRetry;
+                                break;
+                        }
+                        $info.text(text).show();
+                    };
+
+                if (file.getStatus() === 'invalid') {
+                    showError(file.statusText);
+                } else {
+                    $wrap.text(lang.uploadPreview);
+                    if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {
+                        $wrap.empty().addClass('notimage').append('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
+                        '<span class="file-title" title="' + file.name + '">' + file.name + '</span>');
+                    } else {
+                        if (browser.ie && browser.version <= 7) {
+                            $wrap.text(lang.uploadNoPreview);
+                        } else {
+                            uploader.makeThumb(file, function (error, src) {
+                                if (error || !src) {
+                                    $wrap.text(lang.uploadNoPreview);
+                                } else {
+                                    var $img = $('<img src="' + src + '">');
+                                    $wrap.empty().append($img);
+                                    $img.on('error', function () {
+                                        $wrap.text(lang.uploadNoPreview);
+                                    });
+                                }
+                            }, thumbnailWidth, thumbnailHeight);
+                        }
+                    }
+                    percentages[ file.id ] = [ file.size, 0 ];
+                    file.rotation = 0;
+
+                    /* 检查文件格式 */
+                    if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
+                        showError('not_allow_type');
+                        uploader.removeFile(file);
+                    }
+                }
+
+                file.on('statuschange', function (cur, prev) {
+                    if (prev === 'progress') {
+                        $prgress.hide().width(0);
+                    } else if (prev === 'queued') {
+                        $li.off('mouseenter mouseleave');
+                        $btns.remove();
+                    }
+                    // 成功
+                    if (cur === 'error' || cur === 'invalid') {
+                        showError(file.statusText);
+                        percentages[ file.id ][ 1 ] = 1;
+                    } else if (cur === 'interrupt') {
+                        showError('interrupt');
+                    } else if (cur === 'queued') {
+                        percentages[ file.id ][ 1 ] = 0;
+                    } else if (cur === 'progress') {
+                        $info.hide();
+                        $prgress.css('display', 'block');
+                    } else if (cur === 'complete') {
+                    }
+
+                    $li.removeClass('state-' + prev).addClass('state-' + cur);
+                });
+
+                $li.on('mouseenter', function () {
+                    $btns.stop().animate({height: 30});
+                });
+                $li.on('mouseleave', function () {
+                    $btns.stop().animate({height: 0});
+                });
+
+                $btns.on('click', 'span', function () {
+                    var index = $(this).index(),
+                        deg;
+
+                    switch (index) {
+                        case 0:
+                            uploader.removeFile(file);
+                            return;
+                        case 1:
+                            file.rotation += 90;
+                            break;
+                        case 2:
+                            file.rotation -= 90;
+                            break;
+                    }
+
+                    if (supportTransition) {
+                        deg = 'rotate(' + file.rotation + 'deg)';
+                        $wrap.css({
+                            '-webkit-transform': deg,
+                            '-mos-transform': deg,
+                            '-o-transform': deg,
+                            'transform': deg
+                        });
+                    } else {
+                        $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
+                    }
+
+                });
+
+                $li.insertBefore($filePickerBlock);
+            }
+
+            // 负责view的销毁
+            function removeFile(file) {
+                var $li = $('#' + file.id);
+                delete percentages[ file.id ];
+                updateTotalProgress();
+                $li.off().find('.file-panel').off().end().remove();
+            }
+
+            function updateTotalProgress() {
+                var loaded = 0,
+                    total = 0,
+                    spans = $progress.children(),
+                    percent;
+
+                $.each(percentages, function (k, v) {
+                    total += v[ 0 ];
+                    loaded += v[ 0 ] * v[ 1 ];
+                });
+
+                percent = total ? loaded / total : 0;
+
+                spans.eq(0).text(Math.round(percent * 100) + '%');
+                spans.eq(1).css('width', Math.round(percent * 100) + '%');
+                updateStatus();
+            }
+
+            function setState(val, files) {
+
+                if (val != state) {
+
+                    var stats = uploader.getStats();
+
+                    $upload.removeClass('state-' + state);
+                    $upload.addClass('state-' + val);
+
+                    switch (val) {
+
+                        /* 未选择文件 */
+                        case 'pedding':
+                            $queue.addClass('element-invisible');
+                            $statusBar.addClass('element-invisible');
+                            $placeHolder.removeClass('element-invisible');
+                            $progress.hide(); $info.hide();
+                            uploader.refresh();
+                            break;
+
+                        /* 可以开始上传 */
+                        case 'ready':
+                            $placeHolder.addClass('element-invisible');
+                            $queue.removeClass('element-invisible');
+                            $statusBar.removeClass('element-invisible');
+                            $progress.hide(); $info.show();
+                            $upload.text(lang.uploadStart);
+                            uploader.refresh();
+                            break;
+
+                        /* 上传中 */
+                        case 'uploading':
+                            $progress.show(); $info.hide();
+                            $upload.text(lang.uploadPause);
+                            break;
+
+                        /* 暂停上传 */
+                        case 'paused':
+                            $progress.show(); $info.hide();
+                            $upload.text(lang.uploadContinue);
+                            break;
+
+                        case 'confirm':
+                            $progress.show(); $info.hide();
+                            $upload.text(lang.uploadStart);
+
+                            stats = uploader.getStats();
+                            if (stats.successNum && !stats.uploadFailNum) {
+                                setState('finish');
+                                return;
+                            }
+                            break;
+
+                        case 'finish':
+                            $progress.hide(); $info.show();
+                            if (stats.uploadFailNum) {
+                                $upload.text(lang.uploadRetry);
+                            } else {
+                                $upload.text(lang.uploadStart);
+                            }
+                            break;
+                    }
+
+                    state = val;
+                    updateStatus();
+
+                }
+
+                if (!_this.getQueueCount()) {
+                    $upload.addClass('disabled')
+                } else {
+                    $upload.removeClass('disabled')
+                }
+
+            }
+
+            function updateStatus() {
+                var text = '', stats;
+
+                if (state === 'ready') {
+                    text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
+                } else if (state === 'confirm') {
+                    stats = uploader.getStats();
+                    if (stats.uploadFailNum) {
+                        text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
+                    }
+                } else {
+                    stats = uploader.getStats();
+                    text = lang.updateStatusFinish.replace('_', fileCount).
+                        replace('_KB', WebUploader.formatSize(fileSize)).
+                        replace('_', stats.successNum);
+
+                    if (stats.uploadFailNum) {
+                        text += lang.updateStatusError.replace('_', stats.uploadFailNum);
+                    }
+                }
+
+                $info.html(text);
+            }
+
+            uploader.on('fileQueued', function (file) {
+                fileCount++;
+                fileSize += file.size;
+
+                if (fileCount === 1) {
+                    $placeHolder.addClass('element-invisible');
+                    $statusBar.show();
+                }
+
+                addFile(file);
+            });
+
+            uploader.on('fileDequeued', function (file) {
+                fileCount--;
+                fileSize -= file.size;
+
+                removeFile(file);
+                updateTotalProgress();
+            });
+
+            uploader.on('filesQueued', function (file) {
+                if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
+                    setState('ready');
+                }
+                updateTotalProgress();
+            });
+
+            uploader.on('all', function (type, files) {
+                switch (type) {
+                    case 'uploadFinished':
+                        setState('confirm', files);
+                        break;
+                    case 'startUpload':
+                        /* 添加额外的GET参数 */
+                        var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+                            url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);
+                        uploader.option('server', url);
+                        setState('uploading', files);
+                        break;
+                    case 'stopUpload':
+                        setState('paused', files);
+                        break;
+                }
+            });
+
+            uploader.on('uploadBeforeSend', function (file, data, header) {
+                //这里可以通过data对象添加POST参数
+                header['X_Requested_With'] = 'XMLHttpRequest';
+            });
+
+            uploader.on('uploadProgress', function (file, percentage) {
+                var $li = $('#' + file.id),
+                    $percent = $li.find('.progress span');
+
+                $percent.css('width', percentage * 100 + '%');
+                percentages[ file.id ][ 1 ] = percentage;
+                updateTotalProgress();
+            });
+
+            uploader.on('uploadSuccess', function (file, ret) {
+                var $file = $('#' + file.id);
+                try {
+                    var responseText = (ret._raw || ret),
+                        json = utils.str2json(responseText);
+                    if (json.state == 'SUCCESS') {
+                        _this.fileList.push(json);
+                        $file.append('<span class="success"></span>');
+                    } else {
+                        $file.find('.error').text(json.state).show();
+                    }
+                } catch (e) {
+                    $file.find('.error').text(lang.errorServerUpload).show();
+                }
+            });
+
+            uploader.on('uploadError', function (file, code) {
+            });
+            uploader.on('error', function (code, file) {
+                if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
+                    addFile(file);
+                }
+            });
+            uploader.on('uploadComplete', function (file, ret) {
+            });
+
+            $upload.on('click', function () {
+                if ($(this).hasClass('disabled')) {
+                    return false;
+                }
+
+                if (state === 'ready') {
+                    uploader.upload();
+                } else if (state === 'paused') {
+                    uploader.upload();
+                } else if (state === 'uploading') {
+                    uploader.stop();
+                }
+            });
+
+            $upload.addClass('state-' + state);
+            updateTotalProgress();
+        },
+        getQueueCount: function () {
+            var file, i, status, readyFile = 0, files = this.uploader.getFiles();
+            for (i = 0; file = files[i++]; ) {
+                status = file.getStatus();
+                if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
+            }
+            return readyFile;
+        },
+        getInsertList: function () {
+            var i, link, data, list = [],
+                prefix = editor.getOpt('fileUrlPrefix');
+            for (i = 0; i < this.fileList.length; i++) {
+                data = this.fileList[i];
+                link = data.url;
+                list.push({
+                    title: data.original || link.substr(link.lastIndexOf('/') + 1),
+                    url: prefix + link
+                });
+            }
+            return list;
+        }
+    };
+
+
+    /* 在线附件 */
+    function OnlineFile(target) {
+        this.container = utils.isString(target) ? document.getElementById(target) : target;
+        this.init();
+    }
+    OnlineFile.prototype = {
+        init: function () {
+            this.initContainer();
+            this.initEvents();
+            this.initData();
+        },
+        /* 初始化容器 */
+        initContainer: function () {
+            this.container.innerHTML = '';
+            this.list = document.createElement('ul');
+            this.clearFloat = document.createElement('li');
+
+            domUtils.addClass(this.list, 'list');
+            domUtils.addClass(this.clearFloat, 'clearFloat');
+
+            this.list.appendChild(this.clearFloat);
+            this.container.appendChild(this.list);
+        },
+        /* 初始化滚动事件,滚动到地步自动拉取数据 */
+        initEvents: function () {
+            var _this = this;
+
+            /* 滚动拉取图片 */
+            domUtils.on($G('fileList'), 'scroll', function(e){
+                var panel = this;
+                if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
+                    _this.getFileData();
+                }
+            });
+            /* 选中图片 */
+            domUtils.on(this.list, 'click', function (e) {
+                var target = e.target || e.srcElement,
+                    li = target.parentNode;
+
+                if (li.tagName.toLowerCase() == 'li') {
+                    if (domUtils.hasClass(li, 'selected')) {
+                        domUtils.removeClasses(li, 'selected');
+                    } else {
+                        domUtils.addClass(li, 'selected');
+                    }
+                }
+            });
+        },
+        /* 初始化第一次的数据 */
+        initData: function () {
+
+            /* 拉取数据需要使用的值 */
+            this.state = 0;
+            this.listSize = editor.getOpt('fileManagerListSize');
+            this.listIndex = 0;
+            this.listEnd = false;
+
+            /* 第一次拉取数据 */
+            this.getFileData();
+        },
+        /* 向后台拉取图片列表数据 */
+        getFileData: function () {
+            var _this = this;
+
+            if(!_this.listEnd && !this.isLoadingData) {
+                this.isLoadingData = true;
+                ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {
+                    timeout: 100000,
+                    data: utils.extend({
+                            start: this.listIndex,
+                            size: this.listSize
+                        }, editor.queryCommandValue('serverparam')),
+                    method: 'get',
+                    onsuccess: function (r) {
+                        try {
+                            var json = eval('(' + r.responseText + ')');
+                            if (json.state == 'SUCCESS') {
+                                _this.pushData(json.list);
+                                _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
+                                if(_this.listIndex >= json.total) {
+                                    _this.listEnd = true;
+                                }
+                                _this.isLoadingData = false;
+                            }
+                        } catch (e) {
+                            if(r.responseText.indexOf('ue_separate_ue') != -1) {
+                                var list = r.responseText.split(r.responseText);
+                                _this.pushData(list);
+                                _this.listIndex = parseInt(list.length);
+                                _this.listEnd = true;
+                                _this.isLoadingData = false;
+                            }
+                        }
+                    },
+                    onerror: function () {
+                        _this.isLoadingData = false;
+                    }
+                });
+            }
+        },
+        /* 添加图片到列表界面上 */
+        pushData: function (list) {
+            var i, item, img, filetype, preview, icon, _this = this,
+                urlPrefix = editor.getOpt('fileManagerUrlPrefix');
+            for (i = 0; i < list.length; i++) {
+                if(list[i] && list[i].url) {
+                    item = document.createElement('li');
+                    icon = document.createElement('span');
+                    filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
+
+                    if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) {
+                        preview = document.createElement('img');
+                        domUtils.on(preview, 'load', (function(image){
+                            return function(){
+                                _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
+                            };
+                        })(preview));
+                        preview.width = 113;
+                        preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
+                    } else {
+                        var ic = document.createElement('i'),
+                            textSpan = document.createElement('span');
+                        textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
+                        preview = document.createElement('div');
+                        preview.appendChild(ic);
+                        preview.appendChild(textSpan);
+                        domUtils.addClass(preview, 'file-wrapper');
+                        domUtils.addClass(textSpan, 'file-title');
+                        domUtils.addClass(ic, 'file-type-' + filetype);
+                        domUtils.addClass(ic, 'file-preview');
+                    }
+                    domUtils.addClass(icon, 'icon');
+                    item.setAttribute('data-url', urlPrefix + list[i].url);
+                    if (list[i].original) {
+                        item.setAttribute('data-title', list[i].original);
+                    }
+
+                    item.appendChild(preview);
+                    item.appendChild(icon);
+                    this.list.insertBefore(item, this.clearFloat);
+                }
+            }
+        },
+        /* 改变图片大小 */
+        scale: function (img, w, h, type) {
+            var ow = img.width,
+                oh = img.height;
+
+            if (type == 'justify') {
+                if (ow >= oh) {
+                    img.width = w;
+                    img.height = h * oh / ow;
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+                } else {
+                    img.width = w * ow / oh;
+                    img.height = h;
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+                }
+            } else {
+                if (ow >= oh) {
+                    img.width = w * ow / oh;
+                    img.height = h;
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+                } else {
+                    img.width = w;
+                    img.height = h * oh / ow;
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+                }
+            }
+        },
+        getInsertList: function () {
+            var i, lis = this.list.children, list = [];
+            for (i = 0; i < lis.length; i++) {
+                if (domUtils.hasClass(lis[i], 'selected')) {
+                    var url = lis[i].getAttribute('data-url');
+                    var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);
+                    list.push({
+                        title: title,
+                        url: url
+                    });
+                }
+            }
+            return list;
+        }
+    };
+
+
+})();

BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_jpg.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mp3.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_ppt.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_txt.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/bg.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/file-icons.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/file-icons.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/icons.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/attachment/images/success.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/background/images/bg.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/background/images/success.png


+ 519 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/charts/charts.js

@@ -0,0 +1,519 @@
+/*
+ * 图片转换对话框脚本
+ **/
+
+var tableData = [],
+    //编辑器页面table
+    editorTable = null,
+    chartsConfig = window.typeConfig,
+    resizeTimer = null,
+    //初始默认图表类型
+    currentChartType = 0;
+
+window.onload = function () {
+
+    editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);
+
+    //未找到表格, 显示错误页面
+    if ( !editorTable ) {
+        document.body.innerHTML = "<div class='edui-charts-not-data'>未找到数据</div>";
+        return;
+    }
+
+    //初始化图表类型选择
+    initChartsTypeView();
+    renderTable( editorTable );
+    initEvent();
+    initUserConfig( editorTable.getAttribute( "data-chart" ) );
+    $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" );
+    updateViewType( currentChartType );
+
+    dialog.addListener( "resize", function () {
+
+        if ( resizeTimer != null ) {
+            window.clearTimeout( resizeTimer );
+        }
+
+        resizeTimer = window.setTimeout( function () {
+
+            resizeTimer = null;
+
+            renderCharts();
+
+        }, 500 );
+
+    } );
+
+};
+
+function initChartsTypeView () {
+
+    var contents = [];
+
+    for ( var i = 0, len = chartsConfig.length; i<len; i++ ) {
+
+        contents.push( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' );
+
+    }
+
+    $( "#scrollBed" ).html( contents.join( "" ) );
+
+}
+
+//渲染table, 以便用户修改数据
+function renderTable ( table ) {
+
+    var tableHtml = [];
+
+    //构造数据
+    for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
+
+        tableData[ i ] = [];
+        tableHtml[ i ] = [];
+
+        for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
+
+            var value = getCellValue( cell );
+
+            if ( i > 0 && j > 0 ) {
+                value = +value;
+            }
+
+            if ( i === 0 || j === 0 ) {
+                tableHtml[ i ].push( '<th>'+ value +'</th>' );
+            } else {
+                tableHtml[ i ].push( '<td><input type="text" class="data-item" value="'+ value +'"></td>' );
+            }
+
+            tableData[ i ][ j ] = value;
+
+        }
+
+        tableHtml[ i ] = tableHtml[ i ].join( "" );
+
+    }
+
+    //draw 表格
+    $( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' );
+
+}
+
+/*
+ * 根据表格已有的图表属性初始化当前图表属性
+ */
+function initUserConfig ( config ) {
+
+    var parsedConfig = {};
+
+    if ( !config ) {
+        return;
+    }
+
+    config = config.split( ";" );
+
+    $.each( config, function ( index, item ) {
+
+        item = item.split( ":" );
+        parsedConfig[ item[ 0 ] ] = item[ 1 ];
+
+    } );
+
+    setUserConfig( parsedConfig );
+
+}
+
+function initEvent () {
+
+    var cacheValue = null,
+        //图表类型数
+        typeViewCount = chartsConfig.length- 1,
+        $chartsTypeViewBox = $( '#scrollBed .view-box' );
+
+    $( ".charts-format" ).delegate( ".format-ctrl", "change", function () {
+
+        renderCharts();
+
+    } )
+
+    $( ".table-view" ).delegate( ".data-item", "focus", function () {
+
+        cacheValue = this.value;
+
+    } ).delegate( ".data-item", "blur", function () {
+
+        if ( this.value !== cacheValue ) {
+            renderCharts();
+        }
+
+        cacheValue = null;
+
+    } );
+
+    $( "#buttonContainer" ).delegate( "a", "click", function (e) {
+
+        e.preventDefault();
+
+        if ( this.getAttribute( "data-title" ) === 'prev' ) {
+
+            if ( currentChartType > 0 ) {
+                currentChartType--;
+                updateViewType( currentChartType );
+            }
+
+        } else {
+
+            if ( currentChartType < typeViewCount ) {
+                currentChartType++;
+                updateViewType( currentChartType );
+            }
+
+        }
+
+    } );
+
+    //图表类型变化
+    $( '#scrollBed' ).delegate( ".view-box", "click", function (e) {
+
+        var index = $( this ).attr( "data-chart-type" );
+        $chartsTypeViewBox.removeClass( "selected" );
+        $( $chartsTypeViewBox[ index ] ).addClass( "selected" );
+
+        currentChartType = index | 0;
+
+        //饼图, 禁用部分配置
+        if ( currentChartType === chartsConfig.length - 1 ) {
+
+            disableNotPieConfig();
+
+        //启用完整配置
+        } else {
+
+            enableNotPieConfig();
+
+        }
+
+        renderCharts();
+
+    } );
+
+}
+
+function renderCharts () {
+
+    var data = collectData();
+
+    $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {
+
+        credits: {
+            enabled: false
+        },
+        exporting: {
+            enabled: false
+        },
+        title: {
+            text: data.title,
+            x: -20 //center
+        },
+        subtitle: {
+            text: data.subTitle,
+            x: -20
+        },
+        xAxis: {
+            title: {
+                text: data.xTitle
+            },
+            categories: data.categories
+        },
+        yAxis: {
+            title: {
+                text: data.yTitle
+            },
+            plotLines: [{
+                value: 0,
+                width: 1,
+                color: '#808080'
+            }]
+        },
+        tooltip: {
+            enabled: true,
+            valueSuffix: data.suffix
+        },
+        legend: {
+            layout: 'vertical',
+            align: 'right',
+            verticalAlign: 'middle',
+            borderWidth: 1
+        },
+        series: data.series
+
+    } ));
+
+}
+
+function updateViewType ( index ) {
+
+    $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' );
+
+}
+
+function collectData () {
+
+    var form = document.forms[ 'data-form' ],
+        data = null;
+
+    if ( currentChartType !== chartsConfig.length - 1 ) {
+
+        data = getSeriesAndCategories();
+        $.extend( data, getUserConfig() );
+
+    //饼图数据格式
+    } else {
+        data = getSeriesForPieChart();
+        data.title = form[ 'title' ].value;
+        data.suffix = form[ 'unit' ].value;
+    }
+
+    return data;
+
+}
+
+/**
+ * 获取用户配置信息
+ */
+function getUserConfig () {
+
+    var form = document.forms[ 'data-form' ],
+        info = {
+            title: form[ 'title' ].value,
+            subTitle: form[ 'sub-title' ].value,
+            xTitle: form[ 'x-title' ].value,
+            yTitle: form[ 'y-title' ].value,
+            suffix: form[ 'unit' ].value,
+            //数据对齐方式
+            tableDataFormat: getTableDataFormat (),
+            //饼图提示文字
+            tip: $( "#tipInput" ).val()
+        };
+
+    return info;
+
+}
+
+function setUserConfig ( config ) {
+
+    var form = document.forms[ 'data-form' ];
+
+    config.title && ( form[ 'title' ].value = config.title );
+    config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );
+    config.xTitle && ( form[ 'x-title' ].value = config.xTitle );
+    config.yTitle && ( form[ 'y-title' ].value = config.yTitle );
+    config.suffix && ( form[ 'unit' ].value = config.suffix );
+    config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true );
+    config.tip && ( form[ 'tip' ].value = config.tip );
+    currentChartType = config.chartType || 0;
+
+}
+
+function getSeriesAndCategories () {
+
+    var form = document.forms[ 'data-form' ],
+        series = [],
+        categories = [],
+        tmp = [],
+        tableData = getTableData();
+
+    //反转数据
+    if ( getTableDataFormat() === "-1" ) {
+
+        for ( var i = 0, len = tableData.length; i < len; i++ ) {
+
+            for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {
+
+                if ( !tmp[ j ] ) {
+                    tmp[ j ] = [];
+                }
+
+                tmp[ j ][ i ] = tableData[ i ][ j ];
+
+            }
+
+        }
+
+        tableData = tmp;
+
+    }
+
+    categories = tableData[0].slice( 1 );
+
+    for ( var i = 1, data; data = tableData[ i ]; i++ ) {
+
+        series.push( {
+            name: data[ 0 ],
+            data: data.slice( 1 )
+        } );
+
+    }
+
+    return {
+        series: series,
+        categories: categories
+    };
+
+}
+
+/*
+ * 获取数据源数据对齐方式
+ */
+function getTableDataFormat () {
+
+    var form = document.forms[ 'data-form' ],
+        items = form['charts-format'];
+
+    return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;
+
+}
+
+/*
+ * 禁用非饼图类型的配置项
+ */
+function disableNotPieConfig() {
+
+    updateConfigItem( 'disable' );
+
+}
+
+/*
+ * 启用非饼图类型的配置项
+ */
+function enableNotPieConfig() {
+
+    updateConfigItem( 'enable' );
+
+}
+
+function updateConfigItem ( value ) {
+
+    var table = $( "#showTable" )[ 0 ],
+        isDisable = value === 'disable' ? true : false;
+
+    //table中的input处理
+    for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {
+
+        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
+
+            $( "input", cell ).attr( "disabled", isDisable );
+
+        }
+
+    }
+
+    //其他项处理
+    $( "input.not-pie-item" ).attr( "disabled", isDisable );
+    $( "#tipInput" ).attr( "disabled", !isDisable )
+
+}
+
+/*
+ * 获取饼图数据
+ * 饼图的数据只取第一行的
+ **/
+function getSeriesForPieChart () {
+
+    var series = {
+            type: 'pie',
+            name: $("#tipInput").val(),
+            data: []
+        },
+        tableData = getTableData();
+
+
+    for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {
+
+        var title = tableData[ 0 ][ j ],
+            val = tableData[ 1 ][ j ];
+
+        series.data.push( [ title, val ] );
+
+    }
+
+    return {
+        series: [ series ]
+    };
+
+}
+
+function getTableData () {
+
+    var table = document.getElementById( "showTable" ),
+        xCount = table.rows[0].cells.length - 1,
+        values = getTableInputValue();
+
+    for ( var i = 0, value; value = values[ i ]; i++ ) {
+
+        tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];
+
+    }
+
+    return tableData;
+
+}
+
+function getTableInputValue () {
+
+    var table = document.getElementById( "showTable" ),
+        inputs = table.getElementsByTagName( "input" ),
+        values = [];
+
+    for ( var i = 0, input; input = inputs[ i ]; i++ ) {
+        values.push( input.value | 0 );
+    }
+
+    return values;
+
+}
+
+function getCellValue ( cell ) {
+
+    var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );
+
+    return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' );
+
+}
+
+
+//dialog确认事件
+dialog.onok = function () {
+
+    //收集信息
+    var form = document.forms[ 'data-form' ],
+        info = getUserConfig();
+
+    //添加图表类型
+    info.chartType = currentChartType;
+
+    //同步表格数据到编辑器
+    syncTableData();
+
+    //执行图表命令
+    editor.execCommand( 'charts', info );
+
+};
+
+/*
+ * 同步图表编辑视图的表格数据到编辑器里的原始表格
+ */
+function syncTableData () {
+
+    var tableData = getTableData();
+
+    for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {
+
+        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
+
+            cell.innerHTML = tableData[ i ] [ j ];
+
+        }
+
+    }
+
+}

BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/charts/images/charts3.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/charts/images/charts5.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/emotion/images/0.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/emotion/images/jxface2.gif


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/emotion/images/neweditor-tab-bg.png


+ 82 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/help/help.html

@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title>帮助</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="help.css">
+</head>
+<body>
+<div class="wrapper" id="helptab">
+    <div id="tabHeads" class="tabhead">
+        <span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
+        <span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
+    </div>
+    <div id="tabBodys" class="tabbody">
+        <div id="about" class="panel">
+            <h1>UEditor</h1>
+            <p id="version"></p>
+            <p><var id="lang_input_introduction"></var></p>
+        </div>
+        <div id="shortcuts" class="panel">
+            <table>
+                <thead>
+                <tr>
+                    <td><var id="lang_Txt_shortcuts"></var></td>
+                    <td><var id="lang_Txt_func"></var></td>
+                </tr>
+                </thead>
+                <tbody>
+                <tr>
+                    <td>ctrl+b</td>
+                    <td><var id="lang_Txt_bold"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+c</td>
+                    <td><var id="lang_Txt_copy"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+x</td>
+                    <td><var id="lang_Txt_cut"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+v</td>
+                    <td><var id="lang_Txt_Paste"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+y</td>
+                    <td><var id="lang_Txt_undo"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+z</td>
+                    <td><var id="lang_Txt_redo"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+i</td>
+                    <td><var id="lang_Txt_italic"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+u</td>
+                    <td><var id="lang_Txt_underline"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+a</td>
+                    <td><var id="lang_Txt_selectAll"></var></td>
+                </tr>
+                <tr>
+                    <td>shift+enter</td>
+                    <td><var id="lang_Txt_visualEnter"></var></td>
+                </tr>
+                <tr>
+                    <td>alt+z</td>
+                    <td><var id="lang_Txt_fullscreen"></var></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="help.js"></script>
+</body>
+</html>

+ 56 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/help/help.js

@@ -0,0 +1,56 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: xuheng
+ * Date: 12-9-26
+ * Time: 下午1:06
+ * To change this template use File | Settings | File Templates.
+ */
+/**
+ * tab点击处理事件
+ * @param tabHeads
+ * @param tabBodys
+ * @param obj
+ */
+function clickHandler( tabHeads,tabBodys,obj ) {
+    //head样式更改
+    for ( var k = 0, len = tabHeads.length; k < len; k++ ) {
+        tabHeads[k].className = "";
+    }
+    obj.className = "focus";
+    //body显隐
+    var tabSrc = obj.getAttribute( "tabSrc" );
+    for ( var j = 0, length = tabBodys.length; j < length; j++ ) {
+        var body = tabBodys[j],
+            id = body.getAttribute( "id" );
+        body.onclick = function(){
+            this.style.zoom = 1;
+        };
+        if ( id != tabSrc ) {
+            body.style.zIndex = 1;
+        } else {
+            body.style.zIndex = 200;
+        }
+    }
+
+}
+
+/**
+ * TAB切换
+ * @param tabParentId  tab的父节点ID或者对象本身
+ */
+function switchTab( tabParentId ) {
+    var tabElements = $G( tabParentId ).children,
+        tabHeads = tabElements[0].children,
+        tabBodys = tabElements[1].children;
+
+    for ( var i = 0, length = tabHeads.length; i < length; i++ ) {
+        var head = tabHeads[i];
+        if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head );
+        head.onclick = function () {
+            clickHandler(tabHeads,tabBodys,this);
+        }
+    }
+}
+switchTab("helptab");
+
+document.getElementById('version').innerHTML = parent.UE.version;

+ 894 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/image/image.css

@@ -0,0 +1,894 @@
+@charset "utf-8";
+/* dialog样式 */
+.wrapper {
+    zoom: 1;
+    width: 630px;
+    *width: 626px;
+    height: 380px;
+    margin: 0 auto;
+    padding: 10px;
+    position: relative;
+    font-family: sans-serif;
+}
+
+/*tab样式框大小*/
+.tabhead {
+    float:left;
+}
+.tabbody {
+    width: 100%;
+    height: 346px;
+    position: relative;
+    clear: both;
+}
+
+.tabbody .panel {
+    position: absolute;
+    width: 0;
+    height: 0;
+    background: #fff;
+    overflow: hidden;
+    display: none;
+}
+
+.tabbody .panel.focus {
+    width: 100%;
+    height: 346px;
+    display: block;
+}
+
+/* 图片对齐方式 */
+.alignBar{
+    float:right;
+    margin-top: 5px;
+    position: relative;
+}
+
+.alignBar .algnLabel{
+    float:left;
+    height: 20px;
+    line-height: 20px;
+}
+
+.alignBar #alignIcon{
+    zoom:1;
+    _display: inline;
+    display: inline-block;
+    position: relative;
+}
+.alignBar #alignIcon span{
+    float: left;
+    cursor: pointer;
+    display: block;
+    width: 19px;
+    height: 17px;
+    margin-right: 3px;
+    margin-left: 3px;
+    background-image: url(./images/alignicon.jpg);
+}
+.alignBar #alignIcon .none-align{
+    background-position: 0 -18px;
+}
+.alignBar #alignIcon .left-align{
+    background-position: -20px -18px;
+}
+.alignBar #alignIcon .right-align{
+    background-position: -40px -18px;
+}
+.alignBar #alignIcon .center-align{
+    background-position: -60px -18px;
+}
+.alignBar #alignIcon .none-align.focus{
+    background-position: 0 0;
+}
+.alignBar #alignIcon .left-align.focus{
+    background-position: -20px 0;
+}
+.alignBar #alignIcon .right-align.focus{
+    background-position: -40px 0;
+}
+.alignBar #alignIcon .center-align.focus{
+    background-position: -60px 0;
+}
+
+
+
+
+/* 远程图片样式 */
+#remote {
+    z-index: 200;
+}
+
+#remote .top{
+    width: 100%;
+    margin-top: 25px;
+}
+#remote .left{
+    display: block;
+    float: left;
+    width: 300px;
+    height:10px;
+}
+#remote .right{
+    display: block;
+    float: right;
+    width: 300px;
+    height:10px;
+}
+#remote .row{
+    margin-left: 20px;
+    clear: both;
+    height: 40px;
+}
+
+#remote .row label{
+    text-align: center;
+    width: 50px;
+    zoom:1;
+    _display: inline;
+    display:inline-block;
+    vertical-align: middle;
+}
+#remote .row label.algnLabel{
+    float: left;
+
+}
+
+#remote input.text{
+    width: 150px;
+    padding: 3px 6px;
+    font-size: 14px;
+    line-height: 1.42857143;
+    color: #555;
+    background-color: #fff;
+    background-image: none;
+    border: 1px solid #ccc;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+#remote input.text:focus {
+    border-color: #66afe9;
+    outline: 0;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+}
+#remote #url{
+    width: 500px;
+    margin-bottom: 2px;
+}
+#remote #width,
+#remote #height{
+    width: 20px;
+    margin-left: 2px;
+    margin-right: 2px;
+}
+#remote #border,
+#remote #vhSpace,
+#remote #title{
+    width: 180px;
+    margin-right: 5px;
+}
+#remote #lock{
+}
+#remote #lockicon{
+    zoom: 1;
+    _display:inline;
+    display: inline-block;
+    width: 20px;
+    height: 20px;
+    background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat;
+    vertical-align: middle;
+}
+#remote #preview{
+    clear: both;
+    width: 260px;
+    height: 240px;
+    z-index: 9999;
+    margin-top: 10px;
+    background-color: #eee;
+    overflow: hidden;
+}
+
+/* 上传图片 */
+.tabbody #upload.panel {
+    width: 0;
+    height: 0;
+    overflow: hidden;
+    position: absolute !important;
+    clip: rect(1px, 1px, 1px, 1px);
+    background: #fff;
+    display: block;
+}
+
+.tabbody #upload.panel.focus {
+    width: 100%;
+    height: 346px;
+    display: block;
+    clip: auto;
+}
+
+#upload .queueList {
+    margin: 0;
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    overflow: hidden;
+}
+
+#upload p {
+    margin: 0;
+}
+
+.element-invisible {
+    width: 0 !important;
+    height: 0 !important;
+    border: 0;
+    padding: 0;
+    margin: 0;
+    overflow: hidden;
+    position: absolute !important;
+    clip: rect(1px, 1px, 1px, 1px);
+}
+
+#upload .placeholder {
+    margin: 10px;
+    border: 2px dashed #e6e6e6;
+    *border: 0px dashed #e6e6e6;
+    height: 172px;
+    padding-top: 150px;
+    text-align: center;
+    background: url(./images/image.png) center 70px no-repeat;
+    color: #cccccc;
+    font-size: 18px;
+    position: relative;
+    top:0;
+    *top: 10px;
+}
+
+#upload .placeholder .webuploader-pick {
+    font-size: 18px;
+    background: #00b7ee;
+    border-radius: 3px;
+    line-height: 44px;
+    padding: 0 30px;
+    *width: 120px;
+    color: #fff;
+    display: inline-block;
+    margin: 0 auto 20px auto;
+    cursor: pointer;
+    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+
+#upload .placeholder .webuploader-pick-hover {
+    background: #00a2d4;
+}
+
+
+#filePickerContainer {
+    text-align: center;
+}
+
+#upload .placeholder .flashTip {
+    color: #666666;
+    font-size: 12px;
+    position: absolute;
+    width: 100%;
+    text-align: center;
+    bottom: 20px;
+}
+
+#upload .placeholder .flashTip a {
+    color: #0785d1;
+    text-decoration: none;
+}
+
+#upload .placeholder .flashTip a:hover {
+    text-decoration: underline;
+}
+
+#upload .placeholder.webuploader-dnd-over {
+    border-color: #999999;
+}
+
+#upload .filelist {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+    overflow-x: hidden;
+    overflow-y: auto;
+    position: relative;
+    height: 300px;
+}
+
+#upload .filelist:after {
+    content: '';
+    display: block;
+    width: 0;
+    height: 0;
+    overflow: hidden;
+    clear: both;
+    position: relative;
+}
+
+#upload .filelist li {
+    width: 113px;
+    height: 113px;
+    background: url(./images/bg.png);
+    text-align: center;
+    margin: 9px 0 0 9px;
+    *margin: 6px 0 0 6px;
+    position: relative;
+    display: block;
+    float: left;
+    overflow: hidden;
+    font-size: 12px;
+}
+
+#upload .filelist li p.log {
+    position: relative;
+    top: -45px;
+}
+
+#upload .filelist li p.title {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    top: 5px;
+    text-indent: 5px;
+    text-align: left;
+}
+
+#upload .filelist li p.progress {
+    position: absolute;
+    width: 100%;
+    bottom: 0;
+    left: 0;
+    height: 8px;
+    overflow: hidden;
+    z-index: 50;
+    margin: 0;
+    border-radius: 0;
+    background: none;
+    -webkit-box-shadow: 0 0 0;
+}
+
+#upload .filelist li p.progress span {
+    display: none;
+    overflow: hidden;
+    width: 0;
+    height: 100%;
+    background: #1483d8 url(./images/progress.png) repeat-x;
+
+    -webit-transition: width 200ms linear;
+    -moz-transition: width 200ms linear;
+    -o-transition: width 200ms linear;
+    -ms-transition: width 200ms linear;
+    transition: width 200ms linear;
+
+    -webkit-animation: progressmove 2s linear infinite;
+    -moz-animation: progressmove 2s linear infinite;
+    -o-animation: progressmove 2s linear infinite;
+    -ms-animation: progressmove 2s linear infinite;
+    animation: progressmove 2s linear infinite;
+
+    -webkit-transform: translateZ(0);
+}
+
+@-webkit-keyframes progressmove {
+    0% {
+        background-position: 0 0;
+    }
+    100% {
+        background-position: 17px 0;
+    }
+}
+
+@-moz-keyframes progressmove {
+    0% {
+        background-position: 0 0;
+    }
+    100% {
+        background-position: 17px 0;
+    }
+}
+
+@keyframes progressmove {
+    0% {
+        background-position: 0 0;
+    }
+    100% {
+        background-position: 17px 0;
+    }
+}
+
+#upload .filelist li p.imgWrap {
+    position: relative;
+    z-index: 2;
+    line-height: 113px;
+    vertical-align: middle;
+    overflow: hidden;
+    width: 113px;
+    height: 113px;
+
+    -webkit-transform-origin: 50% 50%;
+    -moz-transform-origin: 50% 50%;
+    -o-transform-origin: 50% 50%;
+    -ms-transform-origin: 50% 50%;
+    transform-origin: 50% 50%;
+
+    -webit-transition: 200ms ease-out;
+    -moz-transition: 200ms ease-out;
+    -o-transition: 200ms ease-out;
+    -ms-transition: 200ms ease-out;
+    transition: 200ms ease-out;
+}
+
+#upload .filelist li img {
+    width: 100%;
+}
+
+#upload .filelist li p.error {
+    background: #f43838;
+    color: #fff;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    height: 28px;
+    line-height: 28px;
+    width: 100%;
+    z-index: 100;
+    display:none;
+}
+
+#upload .filelist li .success {
+    display: block;
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    height: 40px;
+    width: 100%;
+    z-index: 200;
+    background: url(./images/success.png) no-repeat right bottom;
+    background: url(./images/success.gif) no-repeat right bottom \9;
+}
+
+#upload .filelist li.filePickerBlock {
+    width: 113px;
+    height: 113px;
+    background: url(./images/image.png) no-repeat center 12px;
+    border: 1px solid #eeeeee;
+    border-radius: 0;
+}
+#upload .filelist li.filePickerBlock div.webuploader-pick  {
+    width: 100%;
+    height: 100%;
+    margin: 0;
+    padding: 0;
+    opacity: 0;
+    background: none;
+    font-size: 0;
+}
+
+#upload .filelist div.file-panel {
+    position: absolute;
+    height: 0;
+    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
+    background: rgba(0, 0, 0, 0.5);
+    width: 100%;
+    top: 0;
+    left: 0;
+    overflow: hidden;
+    z-index: 300;
+}
+
+#upload .filelist div.file-panel span {
+    width: 24px;
+    height: 24px;
+    display: inline;
+    float: right;
+    text-indent: -9999px;
+    overflow: hidden;
+    background: url(./images/icons.png) no-repeat;
+    background: url(./images/icons.gif) no-repeat \9;
+    margin: 5px 1px 1px;
+    cursor: pointer;
+    -webkit-tap-highlight-color: rgba(0,0,0,0);
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+#upload .filelist div.file-panel span.rotateLeft {
+    display:none;
+    background-position: 0 -24px;
+}
+
+#upload .filelist div.file-panel span.rotateLeft:hover {
+    background-position: 0 0;
+}
+
+#upload .filelist div.file-panel span.rotateRight {
+    display:none;
+    background-position: -24px -24px;
+}
+
+#upload .filelist div.file-panel span.rotateRight:hover {
+    background-position: -24px 0;
+}
+
+#upload .filelist div.file-panel span.cancel {
+    background-position: -48px -24px;
+}
+
+#upload .filelist div.file-panel span.cancel:hover {
+    background-position: -48px 0;
+}
+
+#upload .statusBar {
+    height: 45px;
+    border-bottom: 1px solid #dadada;
+    margin: 0 10px;
+    padding: 0;
+    line-height: 45px;
+    vertical-align: middle;
+    position: relative;
+}
+
+#upload .statusBar .progress {
+    border: 1px solid #1483d8;
+    width: 198px;
+    background: #fff;
+    height: 18px;
+    position: absolute;
+    top: 12px;
+    display: none;
+    text-align: center;
+    line-height: 18px;
+    color: #6dbfff;
+    margin: 0 10px 0 0;
+}
+#upload .statusBar .progress span.percentage {
+    width: 0;
+    height: 100%;
+    left: 0;
+    top: 0;
+    background: #1483d8;
+    position: absolute;
+}
+#upload .statusBar .progress span.text {
+    position: relative;
+    z-index: 10;
+}
+
+#upload .statusBar .info {
+    display: inline-block;
+    font-size: 14px;
+    color: #666666;
+}
+
+#upload .statusBar .btns {
+    position: absolute;
+    top: 7px;
+    right: 0;
+    line-height: 30px;
+}
+
+#filePickerBtn {
+    display: inline-block;
+    float: left;
+}
+#upload .statusBar .btns .webuploader-pick,
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-uploading,
+#upload .statusBar .btns .uploadBtn.state-paused {
+    background: #ffffff;
+    border: 1px solid #cfcfcf;
+    color: #565656;
+    padding: 0 18px;
+    display: inline-block;
+    border-radius: 3px;
+    margin-left: 10px;
+    cursor: pointer;
+    font-size: 14px;
+    float: left;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+#upload .statusBar .btns .webuploader-pick-hover,
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
+    background: #f0f0f0;
+}
+
+#upload .statusBar .btns .uploadBtn,
+#upload .statusBar .btns .uploadBtn.state-paused{
+    background: #00b7ee;
+    color: #fff;
+    border-color: transparent;
+}
+#upload .statusBar .btns .uploadBtn:hover,
+#upload .statusBar .btns .uploadBtn.state-paused:hover{
+    background: #00a2d4;
+}
+
+#upload .statusBar .btns .uploadBtn.disabled {
+    pointer-events: none;
+    filter:alpha(opacity=60);
+    -moz-opacity:0.6;
+    -khtml-opacity: 0.6;
+    opacity: 0.6;
+}
+
+
+
+/* 图片管理样式 */
+#online {
+    width: 100%;
+    height: 336px;
+    padding: 10px 0 0 0;
+}
+#online #imageList{
+    width: 100%;
+    height: 100%;
+    overflow-x: hidden;
+    overflow-y: auto;
+    position: relative;
+}
+#online ul {
+    display: block;
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+#online li {
+    float: left;
+    display: block;
+    list-style: none;
+    padding: 0;
+    width: 113px;
+    height: 113px;
+    margin: 0 0 9px 9px;
+    *margin: 0 0 6px 6px;
+    background-color: #eee;
+    overflow: hidden;
+    cursor: pointer;
+    position: relative;
+}
+#online li.clearFloat {
+    float: none;
+    clear: both;
+    display: block;
+    width:0;
+    height:0;
+    margin: 0;
+    padding: 0;
+}
+#online li img {
+    cursor: pointer;
+}
+#online li .icon {
+    cursor: pointer;
+    width: 113px;
+    height: 113px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 2;
+    border: 0;
+    background-repeat: no-repeat;
+}
+#online li .icon:hover {
+    width: 107px;
+    height: 107px;
+    border: 3px solid #1094fa;
+}
+#online li.selected .icon {
+    background-image: url(images/success.png);
+    background-image: url(images/success.gif)\9;
+    background-position: 75px 75px;
+}
+#online li.selected .icon:hover {
+    width: 107px;
+    height: 107px;
+    border: 3px solid #1094fa;
+    background-position: 72px 72px;
+}
+
+
+/* 图片搜索样式 */
+#search .searchBar {
+    width: 100%;
+    height: 30px;
+    margin: 10px 0 5px 0;
+    padding: 0;
+}
+
+#search input.text{
+    width: 150px;
+    padding: 3px 6px;
+    font-size: 14px;
+    line-height: 1.42857143;
+    color: #555;
+    background-color: #fff;
+    background-image: none;
+    border: 1px solid #ccc;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+#search input.text:focus {
+    border-color: #66afe9;
+    outline: 0;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+}
+#search input.searchTxt {
+    margin-left:5px;
+    padding-left: 5px;
+    background: #FFF;
+    width: 300px;
+    *width: 260px;
+    height: 21px;
+    line-height: 21px;
+    float: left;
+    dislay: block;
+}
+
+#search .searchType {
+    width: 65px;
+    height: 28px;
+    padding:0;
+    line-height: 28px;
+    border: 1px solid #d7d7d7;
+    border-radius: 0;
+    vertical-align: top;
+    margin-left: 5px;
+    float: left;
+    dislay: block;
+}
+
+#search #searchBtn,
+#search #searchReset {
+    display: inline-block;
+    margin-bottom: 0;
+    margin-right: 5px;
+    padding: 4px 10px;
+    font-weight: 400;
+    text-align: center;
+    vertical-align: middle;
+    cursor: pointer;
+    background-image: none;
+    border: 1px solid transparent;
+    white-space: nowrap;
+    font-size: 14px;
+    border-radius: 4px;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    vertical-align: top;
+    float: right;
+}
+
+#search #searchBtn {
+    color: white;
+    border-color: #285e8e;
+    background-color: #3b97d7;
+}
+#search #searchReset {
+    color: #333;
+    border-color: #ccc;
+    background-color: #fff;
+}
+#search #searchBtn:hover {
+    background-color: #3276b1;
+}
+#search #searchReset:hover {
+    background-color: #eee;
+}
+
+#search .msg {
+    margin-left: 5px;
+}
+
+#search .searchList{
+    width: 100%;
+    height: 300px;
+    overflow: hidden;
+    clear: both;
+}
+#search .searchList ul{
+    margin:0;
+    padding:0;
+    list-style:none;
+    clear: both;
+    width: 100%;
+    height: 100%;
+    overflow-x: hidden;
+    overflow-y: auto;
+    zoom: 1;
+    position: relative;
+}
+
+#search .searchList li {
+    list-style:none;
+    float: left;
+    display: block;
+    width: 115px;
+    margin: 5px 10px 5px 20px;
+    *margin: 5px 10px 5px 15px;
+    padding:0;
+    font-size: 12px;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
+    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
+    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
+    position: relative;
+    vertical-align: top;
+    text-align: center;
+    overflow: hidden;
+    cursor: pointer;
+    filter: alpha(Opacity=100);
+    -moz-opacity: 1;
+    opacity: 1;
+    border: 2px solid #eee;
+}
+
+#search .searchList li.selected {
+    filter: alpha(Opacity=40);
+    -moz-opacity: 0.4;
+    opacity: 0.4;
+    border: 2px solid #00a0e9;
+}
+
+#search .searchList li p {
+    background-color: #eee;
+    margin: 0;
+    padding: 0;
+    position: relative;
+    width:100%;
+    height:115px;
+    overflow: hidden;
+}
+
+#search .searchList li p img {
+    cursor: pointer;
+    border: 0;
+}
+
+#search .searchList li a {
+    color: #999;
+    border-top: 1px solid #F2F2F2;
+    background: #FAFAFA;
+    text-align: center;
+    display: block;
+    padding: 0 5px;
+    width: 105px;
+    height:32px;
+    line-height:32px;
+    white-space:nowrap;
+    text-overflow:ellipsis;
+    text-decoration: none;
+    overflow: hidden;
+    word-break: break-all;
+}
+
+#search .searchList a:hover {
+    text-decoration: underline;
+    color: #333;
+}
+#search .searchList .clearFloat{
+    clear: both;
+}

+ 120 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/image/image.html

@@ -0,0 +1,120 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>ueditor图片对话框</title>
+    <script type="text/javascript" src="../internal.js"></script>
+
+    <!-- jquery -->
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
+
+    <!-- webuploader -->
+    <script src="../../third-party/webuploader/webuploader.min.js"></script>
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
+
+    <!-- image dialog -->
+    <link rel="stylesheet" href="image.css" type="text/css" />
+</head>
+<body>
+
+    <div class="wrapper">
+        <div id="tabhead" class="tabhead">
+            <span class="tab" data-content-id="remote"><var id="lang_tab_remote"></var></span>
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
+            <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
+            <span class="tab" data-content-id="search"><var id="lang_tab_search"></var></span>
+        </div>
+        <div class="alignBar">
+            <label class="algnLabel"><var id="lang_input_align"></var></label>
+                    <span id="alignIcon">
+                        <span id="noneAlign" class="none-align focus" data-align="none"></span>
+                        <span id="leftAlign" class="left-align" data-align="left"></span>
+                        <span id="rightAlign" class="right-align" data-align="right"></span>
+                        <span id="centerAlign" class="center-align" data-align="center"></span>
+                    </span>
+            <input id="align" name="align" type="hidden" value="none"/>
+        </div>
+        <div id="tabbody" class="tabbody">
+
+            <!-- 远程图片 -->
+            <div id="remote" class="panel">
+                <div class="top">
+                    <div class="row">
+                        <label for="url"><var id="lang_input_url"></var></label>
+                        <span><input class="text" id="url" type="text"/></span>
+                    </div>
+                </div>
+                <div class="left">
+                    <div class="row">
+                        <label><var id="lang_input_size"></var></label>
+                        <span><var id="lang_input_width">&nbsp;&nbsp;</var><input class="text" type="text" id="width"/>px </span>
+                        <span><var id="lang_input_height">&nbsp;&nbsp;</var><input class="text" type="text" id="height"/>px </span>
+                        <span><input id="lock" type="checkbox" disabled="disabled"><span id="lockicon"></span></span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_border"></var></label>
+                        <span><input class="text" type="text" id="border"/>px </span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_vhspace"></var></label>
+                        <span><input class="text" type="text" id="vhSpace"/>px </span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_title"></var></label>
+                        <span><input class="text" type="text" id="title"/></span>
+                    </div>
+                </div>
+                <div class="right"><div id="preview"></div></div>
+            </div>
+
+            <!-- 上传图片 -->
+            <div id="upload" class="panel focus">
+                <div id="queueList" class="queueList">
+                    <div class="statusBar element-invisible">
+                        <div class="progress">
+                            <span class="text">0%</span>
+                            <span class="percentage"></span>
+                        </div><div class="info"></div>
+                        <div class="btns">
+                            <div id="filePickerBtn"></div>
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
+                        </div>
+                    </div>
+                    <div id="dndArea" class="placeholder">
+                        <div class="filePickerContainer">
+                            <div id="filePickerReady"></div>
+                        </div>
+                    </div>
+                    <ul class="filelist element-invisible">
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
+                    </ul>
+                </div>
+            </div>
+
+            <!-- 在线图片 -->
+            <div id="online" class="panel">
+                <div id="imageList"><var id="lang_imgLoading"></var></div>
+            </div>
+
+            <!-- 搜索图片 -->
+            <div id="search" class="panel">
+                <div class="searchBar">
+                    <input id="searchTxt" class="searchTxt text" type="text" />
+                    <select id="searchType" class="searchType">
+                        <option value="&s=4&z=0"></option>
+                        <option value="&s=1&z=19"></option>
+                        <option value="&s=2&z=0"></option>
+                        <option value="&s=3&z=0"></option>
+                    </select>
+                    <input id="searchReset" type="button"  />
+                    <input id="searchBtn" type="button"  />
+                </div>
+                <div id="searchList" class="searchList"><ul id="searchListUl"></ul></div>
+            </div>
+
+        </div>
+    </div>
+    <script type="text/javascript" src="image.js"></script>
+
+</body>
+</html>

Разница между файлами не показана из-за своего большого размера
+ 1139 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/image/image.js


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/image/images/success.png


+ 98 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/insertframe/insertframe.html

@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .warp {width: 320px;height: 153px;margin-left:5px;padding: 20px 0 0 15px;position: relative;}
+        #url {width: 290px; margin-bottom: 2px; margin-left: -6px; margin-left: -2px\9;*margin-left:0;_margin-left:0; }
+        .format span{display: inline-block; width: 58px;text-align: center; zoom:1;}
+        table td{padding:5px 0;}
+        #align{width: 65px;height: 23px;line-height: 22px;}
+    </style>
+</head>
+<body>
+<div class="warp">
+        <table width="300" cellpadding="0" cellspacing="0">
+            <tr>
+                <td colspan="2" class="format">
+                    <span><var id="lang_input_address"></var></span>
+                    <input style="width:200px" id="url" type="text" value=""/>
+                </td>
+            </tr>
+            <tr>
+                <td colspan="2" class="format"><span><var id="lang_input_width"></var></span><input style="width:200px" type="text" id="width"/> px</td>
+
+            </tr>
+            <tr>
+                <td colspan="2" class="format"><span><var id="lang_input_height"></var></span><input style="width:200px" type="text" id="height"/> px</td>
+            </tr>
+            <tr>
+                <td><span><var id="lang_input_isScroll"></var></span><input type="checkbox" id="scroll"/> </td>
+                <td><span><var id="lang_input_frameborder"></var></span><input type="checkbox" id="frameborder"/> </td>
+            </tr>
+
+            <tr>
+                <td colspan="2"><span><var id="lang_input_alignMode"></var></span>
+                    <select id="align">
+                        <option value=""></option>
+                        <option value="left"></option>
+                        <option value="right"></option>
+                    </select>
+                </td>
+            </tr>
+        </table>
+</div>
+<script type="text/javascript">
+    var iframe = editor._iframe;
+    if(iframe){
+        $G("url").value = iframe.getAttribute("src")||"";
+        $G("width").value = iframe.getAttribute("width")||iframe.style.width.replace("px","")||"";
+        $G("height").value = iframe.getAttribute("height") || iframe.style.height.replace("px","") ||"";
+        $G("scroll").checked = (iframe.getAttribute("scrolling") == "yes") ? true : false;
+        $G("frameborder").checked = (iframe.getAttribute("frameborder") == "1") ? true : false;
+        $G("align").value = iframe.align ? iframe.align : "";
+    }
+    function queding(){
+        var  url = $G("url").value.replace(/^\s*|\s*$/ig,""),
+                width = $G("width").value,
+                height = $G("height").value,
+                scroll = $G("scroll"),
+                frameborder = $G("frameborder"),
+                float = $G("align").value,
+                newIframe = editor.document.createElement("iframe"),
+                div;
+        if(!url){
+            alert(lang.enterAddress);
+            return false;
+        }
+        newIframe.setAttribute("src",/http:\/\/|https:\/\//ig.test(url) ? url : "http://"+url);
+        /^[1-9]+[.]?\d*$/g.test( width ) ? newIframe.setAttribute("width",width) : "";
+        /^[1-9]+[.]?\d*$/g.test( height ) ? newIframe.setAttribute("height",height) : "";
+        scroll.checked ?  newIframe.setAttribute("scrolling","yes") : newIframe.setAttribute("scrolling","no");
+        frameborder.checked ?  newIframe.setAttribute("frameborder","1",0) : newIframe.setAttribute("frameborder","0",0);
+        float ? newIframe.setAttribute("align",float) :  newIframe.setAttribute("align","");
+        if(iframe){
+            iframe.parentNode.insertBefore(newIframe,iframe);
+            domUtils.remove(iframe);
+        }else{
+            div = editor.document.createElement("div");
+            div.appendChild(newIframe);
+            editor.execCommand("inserthtml",div.innerHTML);
+        }
+        editor._iframe = null;
+        dialog.close();
+    }
+    dialog.onok = queding;
+    $G("url").onkeydown = function(evt){
+        evt = evt || event;
+        if(evt.keyCode == 13){
+            queding();
+        }
+    };
+    $focus($G( "url" ));
+
+</script>
+</body>
+</html>

+ 135 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/map/map.html

@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.1&services=true"></script>
+    <style type="text/css">
+        .content{width:530px; height: 350px;margin: 10px auto;}
+        .content table{width: 100%}
+        .content table td{vertical-align: middle;}
+        #city,#address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
+        #city{width:60px}
+        #address{width:130px}
+        #is_dynamic_label span{vertical-align:middle;margin: 3px 0px 3px 3px;}
+        #is_dynamic_label input{vertical-align:middle;margin: 3px 3px 3px 50px;}
+    </style>
+</head>
+<body>
+<div class="content">
+    <table>
+        <tr>
+            <td><var id="lang_city"></var>:</td>
+            <td><input id="city" type="text" /></td>
+            <td><var id="lang_address"></var>:</td>
+            <td><input id="address" type="text" value="" /></td>
+            <td><a href="javascript:doSearch()" class="button"><var id="lang_search"></var></a></td>
+            <td><label id="is_dynamic_label" for="is_dynamic"><input id="is_dynamic" type="checkbox" name="is_dynamic" /><span><var id="lang_dynamicmap"></var></span></label></td>
+        </tr>
+    </table>
+    <div style="width:100%;height:340px;margin:5px auto;border:1px solid gray" id="container"></div>
+
+</div>
+<script type="text/javascript">
+    var map = new BMap.Map("container"),marker,point,styleStr;
+    map.enableScrollWheelZoom();
+    map.enableContinuousZoom();
+    function doSearch(){
+        if (!document.getElementById('city').value) {
+            alert(lang.cityMsg);
+            return;
+        }
+        var search = new BMap.LocalSearch(document.getElementById('city').value, {
+            onSearchComplete: function (results){
+                if (results && results.getNumPois()) {
+                    var points = [];
+                    for (var i=0; i<results.getCurrentNumPois(); i++) {
+                        points.push(results.getPoi(i).point);
+                    }
+                    if (points.length > 1) {
+                        map.setViewport(points);
+                    } else {
+                        map.centerAndZoom(points[0], 13);
+                    }
+                    point = map.getCenter();
+                    marker.setPoint(point);
+                } else {
+                    alert(lang.errorMsg);
+                }
+            }
+        });
+        search.search(document.getElementById('address').value || document.getElementById('city').value);
+    }
+    //获得参数
+    function getPars(str,par){
+        var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
+        return reg.exec(str)[1];
+    }
+    function init(){
+        var mapNode = editor.selection.getRange().getClosedNode(),
+            isMapImg = mapNode && /api[.]map[.]baidu[.]com/ig.test(mapNode.getAttribute("src")),
+            isMapIframe = mapNode && domUtils.hasClass(mapNode, 'ueditor_baidumap');
+        if(isMapImg || isMapIframe){
+            var url, centerPos, markerPos;
+            if(isMapIframe) {
+                url = decodeURIComponent(mapNode.getAttribute("src"));
+                $G('is_dynamic').checked = true;
+                styleStr = mapNode.style.cssText;
+            } else {
+                url = mapNode.getAttribute("src");
+                styleStr = mapNode.style.cssText;
+            }
+
+            centerPos = getPars(url,"center").split(",");
+            markerPos = getPars(url, "markers").split(",");
+            point = new BMap.Point(Number(centerPos[0]),Number(centerPos[1]));
+            marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1])));
+            map.addControl(new BMap.NavigationControl());
+            map.centerAndZoom(point, Number(getPars(url,"zoom")));
+        }else{
+            point = new BMap.Point(116.404, 39.915);    // 创建点坐标
+            marker = new BMap.Marker(point);
+            map.addControl(new BMap.NavigationControl());
+            map.centerAndZoom(point, 10);                     // 初始化地图,设置中心点坐标和地图级别。
+        }
+        marker.enableDragging();
+        map.addOverlay(marker);
+    }
+    init();
+    document.getElementById('address').onkeydown = function (evt){
+        evt = evt || event;
+        if (evt.keyCode == 13) {
+            doSearch();
+        }
+    };
+    dialog.onok = function (){
+        var center = map.getCenter();
+        var zoom = map.zoomLevel;
+        var size = map.getSize();
+        var mapWidth = size.width;
+        var mapHeight = size.height;
+        var point = marker.getPoint();
+
+        if($G('is_dynamic').checked) {
+            var URL = editor.options.UEDITOR_HOME_URL,
+                url = [URL + (/\/$/.test(URL) ? '':'/') + "dialogs/map/show.html" +
+                    '#center=' + center.lng + ',' + center.lat,
+                    '&zoom=' + zoom,
+                    '&width=' + mapWidth,
+                    '&height=' + mapHeight,
+                    '&markers=' + point.lng + ',' + point.lat,
+                    '&markerStyles=' + 'l,A'].join('');
+            editor.execCommand('inserthtml', '<iframe class="ueditor_baidumap" src="' + url + '"' + (styleStr ? ' style="' + styleStr + '"' :'') + ' frameborder="0" width="' + (mapWidth+4) + '" height="' + (mapHeight+4) + '"></iframe>');
+        } else {
+            var url = "http://api.map.baidu.com/staticimage?center=" + center.lng + ',' + center.lat +
+                    "&zoom=" + zoom + "&width=" + size.width + '&height=' + size.height + "&markers=" + point.lng + ',' + point.lat;
+            editor.execCommand('inserthtml', '<img width="'+ size.width +'"height="'+ size.height +'" src="' + url + '"' + (styleStr ? ' style="' + styleStr + '"' :'') + '/>');
+        }
+    };
+    document.getElementById("address").focus();
+</script>
+
+
+</body>
+</html>

BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/addimg.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/delimgH.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/eraser.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/redoH.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/scaleH.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/size.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/undo.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/scrawl/images/undoH.png


+ 58 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/snapscreen/snapscreen.html

@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <title></title>
+        <script type="text/javascript" src="../internal.js"></script>
+        <style type="text/css">
+            *{color: #838383}
+            html,body {
+                font-size: 12px;
+                width:100%;
+                height:100%;
+                overflow: hidden;
+                margin:0px;
+                padding:0px;
+            }
+            h2 { font-size: 16px; margin: 20px auto;}
+            .content{
+                padding:5px 15px 0 15px;
+                height:100%;
+            }
+            dt,dd { margin-left: 0; padding-left: 0;}
+            dt a { display: block;
+                    height: 30px;
+                    line-height: 30px;
+                    width: 55px;
+                    background: #EFEFEF;
+                    border: 1px solid #CCC;
+                    padding: 0 10px;
+                    text-decoration: none;
+            }
+            dt a:hover{
+                background: #e0e0e0;
+                border-color: #999
+            }
+            dt a:active{
+                background: #ccc;
+                border-color: #999;
+                color: #666;
+            }
+            dd { line-height:20px;margin-top: 10px;}
+            span{ padding-right:4px;}
+            input{width:210px;height:21px;background: #FFF;border:1px solid #d7d7d7;padding: 0px; margin: 0px; }
+
+
+        </style>
+    </head>
+    <body>
+        <div class="content">
+            <h2><var id="lang_showMsg"></var></h2>
+            <dl>
+                <dt><a href="../../third-party/snapscreen/UEditorSnapscreen.exe" target="_blank" id="downlink"><var id="lang_download"></var></a></dt>
+                <dd><var id="lang_step1"></var></dd>
+                <dd><var id="lang_step2"></var></dd>
+            </dl>
+        </div>
+    </body>
+</html>

+ 21 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/spechars/spechars.html

@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        html,body{overflow:hidden;}
+        #specharsTab{width: 97%;margin: 10px auto; zoom:1;position: relative}
+        .tabbody {height:447px;}
+        .tabbody span{ margin: 5px 3px;text-align: center;display:inline-block;width: 40px;height:16px;line-height: 16px;cursor: pointer; }
+    </style>
+</head>
+<body>
+    <div id="specharsTab">
+        <div id="tabHeads" class="tabhead"></div><div id="tabBodys" class="tabbody"></div>
+    </div>
+<script type="text/javascript" src="spechars.js"></script>
+</body>
+</html>

Разница между файлами не показана из-за своего большого размера
+ 57 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/spechars/spechars.js


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/table/dragicon.png


+ 64 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/table/edittable.html

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="edittable.css">
+</head>
+<body>
+<div class="wrapper">
+    <div class="left">
+        <div class="section">
+            <h3><var id="lang_tableStyle"></var></h3>
+            <ul>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_title" name="style"/><var id="lang_insertTitle"></var></label>
+                </li>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_titleCol" name="style"/><var id="lang_insertTitleCol"></var></label>
+                </li>
+            </ul>
+            <ul>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_caption" name="style"/><var id="lang_insertCaption"></var></label>
+                </li>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_sorttable" name="style"/><var id="lang_orderbycontent"></var></label>
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+        <div class="section">
+            <h3><var id="lang_tableSize"></var></h3>
+            <ul>
+                <li>
+                    <label><input type="radio" id="J_autoSizeContent" name="size"/><var id="lang_autoSizeContent"></var></label>
+                </li>
+                <li>
+                    <label><input type="radio" id="J_autoSizePage" name="size"/><var id="lang_autoSizePage"></var></label>
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+        <div class="section">
+            <h3><var id="lang_borderStyle"></var></h3>
+            <ul>
+                <li>
+                    <span><var id="lang_color"></var></span>
+                    <input type="text" class="tone" id="J_tone" readonly='readonly' />
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+    </div>
+    <div class="right">
+        <div class="section">
+            <h3><var id="lang_example"></var></h3>
+            <div class="preview" id="J_preview">
+            </div>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="edittable.js"></script>
+</body>
+</html>

+ 61 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/table/edittd.html

@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .section {
+            text-align: center;
+            margin-top: 10px;
+        }
+        .section input {
+            margin-left: 5px;
+            width: 70px;
+        }
+    </style>
+</head>
+<body>
+<div class="section">
+    <span><var id="lang_tdBkColor"></var></span>
+    <input type="text" id="J_tone"/>
+</div>
+<script type="text/javascript">
+    var tone = $G("J_tone"),
+            colorPiker = new UE.ui.ColorPicker({
+                editor:editor
+            }),
+            colorPop = new UE.ui.Popup({
+                editor:editor,
+                content:colorPiker
+            });
+    domUtils.on(tone, "click", function () {
+        colorPop.showAnchor(tone);
+    });
+    domUtils.on(document, 'mousedown', function () {
+        colorPop.hide();
+    });
+    colorPiker.addListener("pickcolor", function () {
+        tone.value = arguments[1];
+        colorPop.hide();
+    });
+    colorPiker.addListener("picknocolor", function () {
+        tone.value="";
+        colorPop.hide();
+    });
+    dialog.onok=function(){
+        editor.execCommand("edittd",tone.value);
+    };
+
+    var start = editor.selection.getStart(),
+        cell = start && domUtils.findParentByTagName(start, ["td", "th"], true);
+    if(cell){
+        var color = domUtils.getComputedStyle(cell,'background-color');
+        if(/^#/.test(color)){
+            tone.value = color
+        }
+
+    }
+
+</script>
+</body>
+</html>

BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/bg.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/center_focus.jpg


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/file-icons.png


BIN
taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/icons.gif


+ 0 - 0
taiwan/admin/lib/ueditor/1.4.3/dialogs/video/images/image.png


Некоторые файлы не были показаны из-за большого количества измененных файлов