3 Commity 95a6dcf9b9 ... b4adfb0369

Autor SHA1 Správa Dátum
  cxs b4adfb0369 11月14日版本 7 rokov pred
  cxs 111198dc16 11月14日版本 7 rokov pred
  cxs 4e6c1d9941 11月14日版本 7 rokov pred
100 zmenil súbory, kde vykonal 17325 pridanie a 0 odobranie
  1. 62 0
      malai/404.html
  2. 92 0
      malai/admin/attribute.html
  3. 59 0
      malai/admin/countdown.html
  4. 84 0
      malai/admin/css/attribute.css
  5. 84 0
      malai/admin/css/countdown.css
  6. 168 0
      malai/admin/css/index.css
  7. 3 0
      malai/admin/css/ip.css
  8. 103 0
      malai/admin/css/orderinfo.css
  9. 265 0
      malai/admin/css/product-add.css
  10. 114 0
      malai/admin/css/product.css
  11. 106 0
      malai/admin/css/productinfo.css
  12. 17 0
      malai/admin/css/ui/H-ui.admin.css
  13. 12 0
      malai/admin/css/ui/H-ui.min.css
  14. 79 0
      malai/admin/css/ui/common.css
  15. 381 0
      malai/admin/css/ui/pagination.css
  16. 106 0
      malai/admin/css/ui/style.css
  17. 95 0
      malai/admin/css/ui/webuploader.css
  18. 142 0
      malai/admin/excel.html
  19. 167 0
      malai/admin/index.html
  20. 56 0
      malai/admin/ip.html
  21. 158 0
      malai/admin/js/attribute.js
  22. 71 0
      malai/admin/js/countdown.js
  23. 212 0
      malai/admin/js/excel.js
  24. 561 0
      malai/admin/js/index.js
  25. 81 0
      malai/admin/js/ip.js
  26. 0 0
      malai/admin/js/login.js
  27. 86 0
      malai/admin/js/orderinfo.js
  28. 10 0
      malai/admin/js/pagination.min.js
  29. 765 0
      malai/admin/js/product-add.js
  30. 270 0
      malai/admin/js/product.js
  31. 72 0
      malai/admin/js/productinfo.js
  32. 11 0
      malai/admin/js/ui/H-ui.min.js
  33. 2 0
      malai/admin/js/ui/laydate.js
  34. 28 0
      malai/admin/js/ui/plupload.full.min.js
  35. BIN
      malai/admin/js/ui/theme/default/font/iconfont.eot
  36. 45 0
      malai/admin/js/ui/theme/default/font/iconfont.svg
  37. BIN
      malai/admin/js/ui/theme/default/font/iconfont.ttf
  38. BIN
      malai/admin/js/ui/theme/default/font/iconfont.woff
  39. 2 0
      malai/admin/js/ui/theme/default/laydate.css
  40. 2 0
      malai/admin/layer/2.4/layer.js
  41. BIN
      malai/admin/layer/2.4/skin/default/icon-ext.png
  42. BIN
      malai/admin/layer/2.4/skin/default/icon.png
  43. BIN
      malai/admin/layer/2.4/skin/default/loading-0.gif
  44. BIN
      malai/admin/layer/2.4/skin/default/loading-1.gif
  45. BIN
      malai/admin/layer/2.4/skin/default/loading-2.gif
  46. 7 0
      malai/admin/layer/2.4/skin/layer.css
  47. 13 0
      malai/admin/lib/DD_belatedPNG_0.0.8a-min.js
  48. 1648 0
      malai/admin/lib/Hui-iconfont/1.0.8/demo.html
  49. 328 0
      malai/admin/lib/Hui-iconfont/1.0.8/iconfont.css
  50. BIN
      malai/admin/lib/Hui-iconfont/1.0.8/iconfont.eot
  51. 11 0
      malai/admin/lib/Hui-iconfont/1.0.8/iconfont.min.css
  52. 1265 0
      malai/admin/lib/Hui-iconfont/1.0.8/iconfont.svg
  53. BIN
      malai/admin/lib/Hui-iconfont/1.0.8/iconfont.ttf
  54. BIN
      malai/admin/lib/Hui-iconfont/1.0.8/iconfont.woff
  55. 57 0
      malai/admin/lib/My97DatePicker/4.8/WdatePicker.js
  56. 5 0
      malai/admin/lib/My97DatePicker/4.8/calendar.js
  57. 14 0
      malai/admin/lib/My97DatePicker/4.8/lang/en.js
  58. 14 0
      malai/admin/lib/My97DatePicker/4.8/lang/zh-cn.js
  59. 14 0
      malai/admin/lib/My97DatePicker/4.8/lang/zh-tw.js
  60. 9 0
      malai/admin/lib/My97DatePicker/4.8/skin/WdatePicker.css
  61. BIN
      malai/admin/lib/My97DatePicker/4.8/skin/datePicker.gif
  62. 250 0
      malai/admin/lib/My97DatePicker/4.8/skin/default/datepicker.css
  63. BIN
      malai/admin/lib/My97DatePicker/4.8/skin/default/img.gif
  64. 339 0
      malai/admin/lib/My97DatePicker/4.8/skin/twoer/datepicker-dev.css
  65. 1 0
      malai/admin/lib/My97DatePicker/4.8/skin/twoer/datepicker.css
  66. BIN
      malai/admin/lib/My97DatePicker/4.8/skin/twoer/img.gif
  67. BIN
      malai/admin/lib/My97DatePicker/4.8/skin/twoer/img.png
  68. BIN
      malai/admin/lib/My97DatePicker/4.8/skin/whyGreen/bg.jpg
  69. 256 0
      malai/admin/lib/My97DatePicker/4.8/skin/whyGreen/datepicker.css
  70. BIN
      malai/admin/lib/My97DatePicker/4.8/skin/whyGreen/img.gif
  71. 152 0
      malai/admin/lib/datatables/1.10.0/jquery.dataTables.min.js
  72. 29 0
      malai/admin/lib/echarts/3.4.0/echarts.common.min.js
  73. BIN
      malai/admin/lib/expressInstall.swf
  74. 50 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/highcharts-3d.js
  75. 60 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/highcharts-more.js
  76. 383 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/highcharts.js
  77. 46 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/accessibility.js
  78. 1072 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/accessibility.src.js
  79. 14 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.js
  80. 408 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.src.js
  81. 22 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/boost.js
  82. 652 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/boost.src.js
  83. 14 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/broken-axis.js
  84. 338 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/broken-axis.src.js
  85. 26 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/data.js
  86. 981 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/data.src.js
  87. 25 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/drilldown.js
  88. 756 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/drilldown.src.js
  89. 26 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/exporting.js
  90. 953 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/exporting.src.js
  91. 12 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/funnel.js
  92. 290 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/funnel.src.js
  93. 24 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/gantt.js
  94. 791 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/gantt.src.js
  95. 19 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/grid-axis.js
  96. 545 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/grid-axis.src.js
  97. 25 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/heatmap.js
  98. 798 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/heatmap.src.js
  99. 12 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.js
  100. 0 0
      malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.src.js

+ 62 - 0
malai/404.html

@@ -0,0 +1,62 @@
+<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>404页面</title>
+
+    <style>
+        .page-404 {
+            padding-right: 15px;
+            padding-left: 15px;
+            margin-right: auto;
+            margin-left: auto;
+            color: #afb5bf;
+            padding-top: 60px;
+            padding-bottom: 90px;
+            text-align: center;
+        }
+
+        .page-404 .error-title {
+            width: 350px;
+            font-size: 80px;
+            margin: 0 auto;
+            overflow: hidden;
+        }
+
+        .page-404 .icon{
+            display: block;
+            background-image: url(images/404.png);
+            width: 120px;
+            height: 120px;
+            background-repeat: no-repeat;
+            background-size: cover;
+            float: left;
+        }
+
+        .page-404 .va-m {
+            vertical-align: middle!important;
+            float: left;
+            padding-left: 50px;
+        }
+
+        .page-404 .error-description {
+            font-size: 24px;
+        }
+
+    </style>
+
+</head>
+<body>
+<div class="page-404 ">
+    <div class="error-title">
+        <p class="icon" style="font-size:80px"></p>
+        <p class="va-m"> 404</span>
+    </div>
+    <p class="error-description">ขอโทษที่คุณเข้าเยี่ยมชมหน้าเว็บที่ไม่มีอยู่ ~ ~ ~ ~ ~ ~ ~</p>
+
+</div>
+
+</body></html>

+ 92 - 0
malai/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
malai/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>

+ 84 - 0
malai/admin/css/attribute.css

@@ -0,0 +1,84 @@
+.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 {
+    color: #5a98de
+}
+
+.page-container {
+    padding: 20px;
+    width: calc(100% - 240px);
+    margin-left: 200px;
+}
+
+.td-button {
+    margin-right: 10px;
+}
+
+.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
+}
+
+.attribute_input {
+    width: 80%;
+    border: 1px solid #cecece;
+    line-height: 30px;
+    padding-left: 10px;
+}

+ 84 - 0
malai/admin/css/countdown.css

@@ -0,0 +1,84 @@
+.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 {
+    color: #5a98de
+}
+
+.page-container {
+    padding: 20px;
+    width: calc(100% - 240px);
+    margin-left: 200px;
+}
+
+.td-button {
+    margin-right: 10px;
+}
+
+.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
+}
+
+.attribute_input {
+    width: 80%;
+    border: 1px solid #cecece;
+    line-height: 30px;
+    padding-left: 10px;
+}

+ 168 - 0
malai/admin/css/index.css

@@ -0,0 +1,168 @@
+.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;
+    float: left;
+}
+
+.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;
+    float: left;
+}
+
+.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;
+    overflow: hidden;
+}
+
+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;
+}
+
+.HS_LM_A_select {
+    float: left;
+}
+
+.HS_LM_A_select span {
+    display: block;
+    float: left;
+    line-height: 34px;
+}
+
+.HS_LM_A_select_warp {
+    overflow: hidden;
+}
+
+.HS_LM_A_select_warp select {
+    height: 34px;
+    width: 100px;
+    margin-left: 10px;
+    float: left;
+}
+
+.HS_LM_A_select_input_warp {
+    position: relative;
+    float: left;
+    overflow: hidden;
+}
+
+.HS_LM_A_select_input_warp input {
+    height: 34px;
+    width: 180px;
+    margin: 0 5px;
+    padding-left: 10px;
+}
+
+.HS_LM_A_select_input_warp img {
+    position: absolute;
+    width: 20px;
+    right: 20px;
+    top: 7px;
+    cursor: pointer;
+    display: none;
+}
+
+.HS_LM_A_select_input, .HS_LM_A_select_input input {
+    float: left;
+}
+.HS_LM_A_Right {
+    float: left;
+}
+
+
+

+ 3 - 0
malai/admin/css/ip.css

@@ -0,0 +1,3 @@
+.page-container {
+    padding: 20px;
+}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 103 - 0
malai/admin/css/orderinfo.css


+ 265 - 0
malai/admin/css/product-add.css

@@ -0,0 +1,265 @@
+.webuploader-container {
+    position: relative;
+    display: inline-block;
+    vertical-align: top
+}
+
+.webuploader-pick {
+    position: relative;
+    display: inline-block;
+    cursor: pointer;
+    background: #3bb4f2;
+    padding: 4px 12px;
+    color: #fff;
+    text-align: center;
+    border-radius: 3px;
+    overflow: hidden
+}
+
+.banner_file {
+    width: 100px;
+    height: 30px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    opacity: 0;
+}
+
+.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;
+}
+
+.ul_pics3 li {
+    float: left;
+    width: 280px;
+    height: 90px;
+    border: 1px solid #ddd;
+    padding: 2px;
+    text-align: center;
+    margin: 0 5px 5px 0;
+}
+
+.ul_pics3 li .input {
+    width: 260px;
+    height: 30px;
+    border: 1px solid #ddd;
+    text-indent: 10px;
+    margin-top: 10px;
+}
+
+.ul_pics3 li .span {
+    padding-top: 15px;
+    display: block;
+    cursor: pointer;
+}
+
+#ul_pics4 li {
+    height: 170px;
+}
+
+#ul_pics4 li lable{
+    display: block;
+    float: left;
+    margin-left: 10px;
+}
+
+#ul_pics4 li .number_select{
+    text-align: left;
+    text-indent: 10px;
+    margin-top: 10px;
+}
+
+#ul_pics4 li .number_select select{
+    width: 100px;
+    margin-left: 10px;
+}
+
+.ul_pics_comment {
+
+}
+
+.ul_pics_comment li {
+    width: 500px;
+    border: 1px solid #ddd;
+    margin: 10px;
+    padding: 10px 0;
+    float: left;
+}
+
+.ul_pics_comment .comment_header {
+    padding: 5px 10px;
+}
+
+.ul_pics_comment .comment_header .comment_username {
+    width: 260px;
+    height: 30px;
+    border: 1px solid #ddd;
+    text-indent: 10px;
+}
+
+.ul_pics_comment .comment_header .comment_delete {
+    float: right;
+    cursor: pointer;
+}
+
+.comment_content {
+    padding: 5px 10px;
+}
+
+.comment_content textarea {
+    width: 100%;
+    display: block;
+    text-indent: 10px;
+    resize:none
+}
+
+.comment_picture_warp {
+    padding: 5px;
+    overflow: hidden;
+
+}
+
+.comment_picture {
+    width: 80px;
+    height: 80px;
+    float: left;
+    position: relative;
+    margin: 5px;
+}
+
+.comment_picture img {
+    width: 100%;
+    height: 100%;
+    cursor: auto;
+}
+
+.comment_picture .closeimg{
+    position: absolute;
+    width: 20px;
+    height: 20px;
+    top: -5px;
+    right: 0;
+    cursor: pointer;
+    display: none;
+}
+
+.comment_picture:hover .closeimg{
+    display: block;
+}
+
+.comment_footer{
+    padding: 5px;
+    overflow: hidden;
+}
+
+.comment_footer_input{
+    width: 150px;
+    height: 20px;
+    border: 1px solid #ddd;
+    text-indent: 10px;
+    display: block;
+    float: right;
+}

+ 114 - 0
malai/admin/css/product.css

@@ -0,0 +1,114 @@
+.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;
+}
+
+

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 106 - 0
malai/admin/css/productinfo.css


+ 17 - 0
malai/admin/css/ui/H-ui.admin.css

@@ -0,0 +1,17 @@
+@charset "utf-8";
+html{height:100%}
+body{min-height: 100%;position: relative;font-size:14px;color:#333; background-color:#fff}
+a{color:#333}a:hover,a:focus,.maincolor,.maincolor a{color:#06c}
+.bg-1{ background-color:#f5fafe}
+h4{line-height:30px}
+
+/*页面框架*/
+.Hui-header{position:absolute;top:0; right:0; left:0;height:44px;z-index:999; padding:0 15px}
+.Hui-aside{position: absolute;top:44px;bottom:0;left:0;padding-top:10px;width:199px;z-index:99;overflow:auto; background-color:rgba(238,238,238,0.98);_background-color:rgb(238,238,238);border-right: 1px solid #e5e5e5}
+.Hui-article-box{position: absolute;top:44px;right:0;bottom: 0;left:199px; overflow:hidden; z-index:1; background-color:#fff}
+.Hui-article{position: absolute;top:34px;bottom:0;left:0; right:0;overflow:auto;z-index:1}
+.Hui-container{ padding:45px 0 0}
+.Hui-aside,.Hui-article-box,.dislpayArrow{-moz-transition: all 0.2s ease 0s;-webkit-transition: all 0.2s ease 0s;-ms-transition: all 0.2s ease 0s;-o-transition: all 0.2s ease 0s;transition: all 0.2s ease 0s}
+.big-page .Hui-article-box,.big-page .dislpayArrow,.big-page .breadcrumb{left:0px}
+.big-page .Hui-aside{ left:-200px}
+.page-container{ padding:20px}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 12 - 0
malai/admin/css/ui/H-ui.min.css


+ 79 - 0
malai/admin/css/ui/common.css

@@ -0,0 +1,79 @@
+html, body, div, span, h1, h2, h3, h4, h5, h6, p, pre, a, code, em, img, small, strong, sub, sup, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent }
+a { color: #007bc4; text-decoration: none; cursor: pointer; }
+.table_parameters a:hover { text-decoration: none }
+a:hover { text-decoration: underline }
+ol, ul { list-style: none }
+table { border-collapse: collapse; border-spacing: 0 }
+body { height: 100%; font: 12px/18px "Microsoft Yahei", Tahoma, Helvetica, Arial, Verdana, "\5b8b\4f53", sans-serif; color: #51555c }
+img { border: 0; cursor: pointer; }
+.clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0 }
+.head { border-bottom: 1px solid #dadada; padding: 0 0 5px }
+.head_inner { margin: 0 auto; width: 980px }
+.container { width: 980px; min-height: 600px; margin: 30px auto 0 auto; border: 1px solid #d3d3d3; background: #fff; -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px }
+.demo>h2.title { margin: 4px 0 30px; padding: 15px 0 10px 20px; border-bottom: 1px solid #d3d3d3; font-size: 18px; color: #a84c10; background: url(../images/arrow.jpg) no-repeat 2px 14px }
+.foot { height: 60px; padding: 10px 2px; line-height: 24px; text-align: center }
+.foot a:hover { color: #51555c }
+.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; padding: 0 12px; transition: background-color .2s linear 0s; border: 0; cursor: pointer }
+.btn:hover { background-color: #e95a00; text-decoration: none }
+.demo { width: 700px; margin: 0 auto }
+ul.ul_demo li { background: url("../images/demo_icon.gif") no-repeat scroll 0 6px; line-height: 28px; padding-left: 20px }
+.input, .table input[type='text'] { border: 1px solid #ccc; padding: 0 5px; width: 220px; height: 26px; line-height: 26px }
+#nav { float: right; margin: 30px 0 0 }
+#nav li { float: left; font-size: 16px; margin-right: 20px }
+.btn.loading { opacity: .5 }
+h3 a.cur { color: #f30; }
+.demo h3 a { font-size: 14px; margin: 0 10px 5px 0; display: inline-block }
+.red { color: red }
+.notice { font-size: 14px; margin-bottom: 10px; }
+.table_parameters { border-left: 1px solid #d3d3d3; border-top: 1px solid #d3d3d3; margin: 6px auto; font-size: 14px }
+.table_parameters tr.tr_head { background: none repeat scroll 0 0 #f7f7f7; font-weight: bold; padding: 6px; text-align: center }
+.table_parameters td, .table_parameters th { border-bottom: 1px solid #d3d3d3; border-right: 1px solid #d3d3d3; line-height: 26px; padding: 2px }
+h1 { font: 32px "Microsoft Yahei"; margin: 40px auto; text-align: center; }
+h2 { font-size: 16px; margin: 10px 0; }
+.menu { height: 30px; margin-bottom: 30px; padding: 10px; background-color: #f0f0f0; text-align: center; }
+.menu a { display: inline-block; height: 30px; padding: 0 20px; line-height: 30px; font-size: 14px; color: #333; text-decoration: none; }
+.menu a:hover { color: #000; background-color: #e9e9e9; }
+.menu .cur { background-color: #ddd !important; color: #000; }
+.vad { margin: 80px 0 5px; font-family: arial, 瀹嬩綋, sans-serif; text-align: center; }
+.vad a { display: inline-block; height: 36px; line-height: 36px; margin: 0 5px; padding: 0 50px; font-size: 14px; text-align: center; color: #eee; text-decoration: none; background-color: #222; }
+.vad a:hover { color: #fff; background-color: #000; }
+.thead { width: 728px; height: 90px; margin: 0 auto; }
+.wrap { width: 960px; margin: 0 auto; font: 14px Tahoma, Helvetica, Arial, "瀹嬩綋"; }
+.wrap p { margin: 14px 0; text-align: center; }
+.wrap h2 { margin-bottom: 20px; padding: 5px 2px; border-bottom: 1px solid #ccc; font: 500 24px "Microsoft Yahei"; }
+.wrap ul { margin-top: 20px; list-style-type: none; overflow: hidden; zoom: 1; }
+.wrap ul li { position: relative; float: left; width: 300px; margin: 0 10px 20px; }
+.wrap ul a { float: left; width: 300px; height: 60px; line-height: 60px; color: #333; text-align: center; text-decoration: none; background-color: #eee; }
+.wrap ul .downLink { position: absolute; right: 0; bottom: 0; width: auto; height: auto; padding: 5px 10px; line-height: normal; font-size: 12px; color: #666; background-color: #ddd; }
+.wrap ul .downLink:hover { color: #000; }
+.per { border-bottom: 1px dotted #ddd; padding: 20px 0 }
+.per h3 { margin-bottom: 6px; font-size: 14px }
+.per p { margin: 3px 0 }
+.parea p { margin: 12px 0; font-size: 14px }
+textarea { border: 1px solid #ccc; font-size: 12px; height: 100px; line-height: 18px; padding: 5px; width: 300px; }
+.table td { padding: 10px 0 }
+.error { color: red }
+.disabled { opacity: .6; filter: alpha(opacity=60) }
+.notice { font-weight: bold; font-size: 16px; }
+.demo>p { line-height: 30px; font-size: 14px }
+.demo>p a { font-size: 14px }
+.demo h3 { font-size: 16px; margin: 20px 0 }
+select { background-color: #fff; background-position: right center; background-repeat: no-repeat; border: 1px solid #888; border-radius: 3px; box-sizing: border-box; font: 12px/1.5 Tahoma, Arial, sans-serif; height: 30px; padding: 0 4px; }
+fieldset { border: 1px solid #ccc; border-radius: 5px; margin: 1em 0; padding: 10px 20px; }
+dl.row dt { width: 2em; }
+dl.row dt { clear: left; float: left; line-height: 30px; padding: 5px; text-align: right; width: 6em; }
+dl.row dd { float: left; padding: 5px; }
+fieldset legend { font: bold 14px/2 "寰蒋闆呴粦"; }
+.pager { text-align: right; }
+.pager a { padding: 3px 8px; margin-left: 3px; line-height: 20px; background: #f9f9f9; border: 1px solid #DBDBDB; text-decoration: none }
+.pager a:hover, .pager a.current { background-color: #7CD5B1; color: #fff; border: 1px solid #7CD5B1; cursor: pointer; }
+.page { text-align: center; margin: 50px 0 }
+.page a, .page span.prev_disabled { border: 1px solid #ededed; color: #3d3d3d; font-weight: 700; height: 35px; line-height: 35px; margin-left: 5px; min-width: 9px; padding: 0 13px; text-align: center; text-decoration: none; vertical-align: top; font-family: "simsun"; display: inline-block }
+.page span.prev_disabled { cursor: default; color: #ccc; margin: 0 10px 0 0 }
+.page a.current { background-color: #f40; border-color: #f40; color: #fff; font-weight: 700; position: relative; z-index: 1; }
+.page .extra { display: inline-block; margin-left: 10px; height: 35px; line-height: 35px; color: #656565; }
+.page .page-num { border: 1px solid #ededed; height: 21px; text-align: center; width: 35px; display: inline-block }
+.page .page-submit { background-clip: padding-box; border: 1px solid #ededed; border-radius: 2px; cursor: pointer; height: 21px; line-height: 21px; text-align: center; width: 43px; display: inline-block }
+.page .page-submit:hover { border-color: #f40; color: #f40; }
+.page a:focus, .page a:hover { border-color: #f40; z-index: 1; }
+.loading { margin: 30px 0; text-align: center }

+ 381 - 0
malai/admin/css/ui/pagination.css

@@ -0,0 +1,381 @@
+@charset "UTF-8";
+
+/**
+ * @version: v1.7
+ * @author: xgc-whj
+ * @date: 2018-05-25 21:40:00
+ * @license: MIT license release
+ * @jq22 address: http://www.jq22.com/jquery-info17548
+ * @GitHub: https://github.com/w0624/jquery-pagination
+ * @description: jQuery分页插件,可自定义样式,默认有五套样式,可自定义插件选项,简单方便,兼容IE8
+ */
+
+/*ccs-1*/
+.whj_jqueryPaginationCss-1 {
+    display: inline-block;
+    user-select: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+}
+
+.whj_jqueryPaginationCss-1 div {
+    display: inline-block;
+    vertical-align: bottom;
+    height: 24px;
+    line-height: 24px;
+}
+
+.whj_jqueryPaginationCss-1 .whj_padding {
+    padding: 1px 9px;
+}
+
+.whj_jqueryPaginationCss-1 .whj_bgc {
+    background-color: #fff;
+    color: #698ca9;
+}
+
+.whj_jqueryPaginationCss-1 .whj_border {
+    border: 1px solid #5b9fd6;
+}
+
+.whj_jqueryPaginationCss-1 .whj_color {
+    color: #698ca9;
+}
+
+.whj_jqueryPaginationCss-1 .whj_hover:hover {
+    background-color: #d4f1ff;
+    color: #698ca9;
+    cursor: pointer;
+}
+
+.whj_jqueryPaginationCss-1 .whj_checked {
+    background-color: #d4f1ff;
+    color: #698ca9;
+}
+
+.whj_jqueryPaginationCss-1 .whj_hoverDisable {
+    opacity: 0.5;
+    filter: alpha(opacity=50);
+}
+
+.whj_jqueryPaginationCss-1 select {
+    height: 28px;
+    vertical-align: bottom;
+    padding: 0px;
+    outline: none;
+}
+
+.whj_jqueryPaginationCss-1 input {
+    padding: 0px;
+    height: 26px;
+    outline: none;
+    text-align: center;
+    width: 60px;
+    vertical-align: bottom;
+}
+
+.whj_jqueryPaginationCss-1 div, .whj_jqueryPaginationCss-1 input, .whj_jqueryPaginationCss-1 select {
+    margin: 2px;
+}
+
+/*只有设置显示总页数时,该样式才生效*/
+.whj_jqueryPaginationCss-1 .whj_totalSizeSingle {
+    margin-left: -8px;
+}
+
+/*ccs-2*/
+.whj_jqueryPaginationCss-2 {
+    display: inline-block;
+    user-select: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+}
+
+.whj_jqueryPaginationCss-2 div {
+    display: inline-block;
+    vertical-align: bottom;
+    height: 24px;
+    line-height: 24px;
+}
+
+.whj_jqueryPaginationCss-2 .whj_padding {
+    padding: 1px 9px;
+}
+
+.whj_jqueryPaginationCss-2 .whj_bgc {
+    background-color: #5194ca;
+    color: #fff;
+}
+
+.whj_jqueryPaginationCss-2 .whj_border {
+    border: 1px solid #5194ca;
+}
+
+.whj_jqueryPaginationCss-2 .whj_color {
+    color: #5194ca;
+}
+
+.whj_jqueryPaginationCss-2 .whj_hover:hover {
+    background-color: #d4f1ff;
+    color: #5194ca;
+    cursor: pointer;
+}
+
+.whj_jqueryPaginationCss-2 .whj_checked {
+    background-color: #d4f1ff;
+    color: #5194ca;
+}
+
+.whj_jqueryPaginationCss-2 .whj_hoverDisable {
+    opacity: 0.7;
+    filter: alpha(opacity=70);
+}
+
+.whj_jqueryPaginationCss-2 select {
+    height: 28px;
+    vertical-align: bottom;
+    padding: 0px;
+    outline: none;
+}
+
+.whj_jqueryPaginationCss-2 input {
+    padding: 0px;
+    height: 26px;
+    outline: none;
+    text-align: center;
+    width: 60px;
+    vertical-align: bottom;
+}
+
+.whj_jqueryPaginationCss-2 div, .whj_jqueryPaginationCss-2 input, .whj_jqueryPaginationCss-2 select {
+    margin: 2px;
+}
+
+/*只有设置显示总页数时,该样式才生效*/
+.whj_jqueryPaginationCss-2 .whj_totalSizeSingle {
+    margin-left: -8px;
+}
+
+/*ccs-3*/
+.whj_jqueryPaginationCss-3 {
+    display: inline-block;
+    user-select: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+}
+
+.whj_jqueryPaginationCss-3 div {
+    display: inline-block;
+    vertical-align: bottom;
+    height: 24px;
+    line-height: 24px;
+}
+
+.whj_jqueryPaginationCss-3 .whj_padding {
+    padding: 1px 9px;
+}
+
+.whj_jqueryPaginationCss-3 .whj_bgc {
+    background-color: #7a7b7b;
+    color: #fff;
+}
+
+.whj_jqueryPaginationCss-3 .whj_border {
+    border: 1px solid #929292;
+}
+
+.whj_jqueryPaginationCss-3 .whj_color {
+    color: #929292;
+}
+
+.whj_jqueryPaginationCss-3 .whj_hover:hover {
+    background-color: #e0dddd;
+    color: #7a7b7b;
+    cursor: pointer;
+}
+
+.whj_jqueryPaginationCss-3 .whj_checked {
+    background-color: #e0dddd;
+    color: #7a7b7b;
+}
+
+.whj_jqueryPaginationCss-3 .whj_hoverDisable {
+    opacity: 0.5;
+    filter: alpha(opacity=50);
+}
+
+.whj_jqueryPaginationCss-3 select {
+    height: 28px;
+    vertical-align: bottom;
+    padding: 0px;
+    outline: none;
+}
+
+.whj_jqueryPaginationCss-3 input {
+    padding: 0px;
+    height: 26px;
+    outline: none;
+    text-align: center;
+    width: 60px;
+    vertical-align: bottom;
+}
+
+.whj_jqueryPaginationCss-3 div, .whj_jqueryPaginationCss-3 input, .whj_jqueryPaginationCss-3 select {
+    margin: 2px;
+}
+
+/*只有设置显示总页数时,该样式才生效*/
+.whj_jqueryPaginationCss-3 .whj_totalSizeSingle {
+    margin-left: -8px;
+}
+
+/*ccs-4*/
+.whj_jqueryPaginationCss-4 {
+    display: inline-block;
+    user-select: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+}
+
+.whj_jqueryPaginationCss-4 div {
+    display: inline-block;
+    vertical-align: bottom;
+    height: 24px;
+    line-height: 24px;
+}
+
+.whj_jqueryPaginationCss-4 .whj_padding {
+    padding: 1px 9px;
+}
+
+.whj_jqueryPaginationCss-4 .whj_bgc {
+    background-color: #f5f5f5;
+    color: #907272;
+}
+
+.whj_jqueryPaginationCss-4 .whj_border {
+    border: 1px solid #907272;
+}
+
+.whj_jqueryPaginationCss-4 .whj_color {
+    color: #907272;
+}
+
+.whj_jqueryPaginationCss-4 .whj_hover:hover {
+    background-color: #afacac;
+    color: #fff;
+    cursor: pointer;
+}
+
+.whj_jqueryPaginationCss-4 .whj_checked {
+    background-color: #afacac;
+    color: #fff;
+}
+
+.whj_jqueryPaginationCss-4 .whj_hoverDisable {
+    opacity: 0.5;
+    filter: alpha(opacity=50);
+}
+
+.whj_jqueryPaginationCss-4 select {
+    height: 28px;
+    vertical-align: bottom;
+    padding: 0px;
+    outline: none;
+}
+
+.whj_jqueryPaginationCss-4 input {
+    padding: 0px;
+    height: 26px;
+    outline: none;
+    text-align: center;
+    width: 60px;
+    vertical-align: bottom;
+}
+
+.whj_jqueryPaginationCss-4 div, .whj_jqueryPaginationCss-4 input, .whj_jqueryPaginationCss-4 select {
+    margin: 2px;
+}
+
+/*只有设置显示总页数时,该样式才生效*/
+.whj_jqueryPaginationCss-4 .whj_totalSizeSingle {
+    margin-left: -8px;
+}
+
+/*ccs-5*/
+.whj_jqueryPaginationCss-5 {
+    display: inline-block;
+    user-select: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+}
+
+.whj_jqueryPaginationCss-5 div {
+    display: inline-block;
+    vertical-align: bottom;
+    height: 24px;
+    line-height: 24px;
+}
+
+.whj_jqueryPaginationCss-5 .whj_padding {
+    padding: 1px 9px;
+}
+
+.whj_jqueryPaginationCss-5 .whj_bgc {
+    background-color: #199eaf;
+    color: #fff;
+}
+
+.whj_jqueryPaginationCss-5 .whj_border {
+    border: 1px solid #199eaf;
+}
+
+.whj_jqueryPaginationCss-5 .whj_color {
+    color: #199eaf;
+}
+
+.whj_jqueryPaginationCss-5 .whj_hover:hover {
+    background-color: #d4f1ff;
+    color: #199eaf;
+    cursor: pointer;
+}
+
+.whj_jqueryPaginationCss-5 .whj_checked {
+    background-color: #d4f1ff;
+    color: #199eaf;
+}
+
+.whj_jqueryPaginationCss-5 .whj_hoverDisable {
+    opacity: 0.5;
+    filter: alpha(opacity=50);
+}
+
+.whj_jqueryPaginationCss-5 select {
+    height: 28px;
+    vertical-align: bottom;
+    padding: 0px;
+    outline: none;
+}
+
+.whj_jqueryPaginationCss-5 input {
+    padding: 0px;
+    height: 26px;
+    outline: none;
+    text-align: center;
+    width: 60px;
+    vertical-align: bottom;
+}
+
+.whj_jqueryPaginationCss-5 div, .whj_jqueryPaginationCss-5 input, .whj_jqueryPaginationCss-5 select {
+    margin: 2px;
+}
+
+/*只有设置显示总页数时,该样式才生效*/
+.whj_jqueryPaginationCss-5 .whj_totalSizeSingle {
+    margin-left: -8px;
+}

+ 106 - 0
malai/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;
+}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 95 - 0
malai/admin/css/ui/webuploader.css


+ 142 - 0
malai/admin/excel.html

@@ -0,0 +1,142 @@
+<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/excel.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">订单信息</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="Thailand">
+            <a  class="active">打印表格</a>
+        </li>
+    <li>
+            <a onclick="window.open('../../new/admin/algorithm.html')">利润率预估</a>
+        </li>
+        <!-- <li>
+            <a href="attribute.html">属性管理</a>
+        </li>
+        <li>
+            <a href="countdown.html">倒计时即将产品</a>
+        </li> -->
+    </ul>
+</aside>
+
+<div class="page-container">
+    <p class="f-20 text-success">打印表格</p>
+
+    <div class="layui-tab layui-tab-brief">
+        <div style="float:left;margin-bottom: 20px;" 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">
+                <div class="HS_LM_Search" onclick="searchExcel();">
+                    搜索
+                </div>
+            </div>
+            <div class="HS_LM_A_Right">
+                <div class="HS_LM_Search" id="getValue">
+                    打印
+                </div>
+            </div>
+        </div>
+    </div>
+    <div style="clear: both;"></div>
+<div id="loading" style="position: fixed; top: 50%; left: 50%; margin-left: -64px; margin-top: -64px; z-index: 2147483647; display: none;">
+            <img src="../images/loading.gif">
+        </div>
+    <table class="table table-border table-bordered table-bg"
+           style="word-break: break-all;word-wrap: break-word;"
+           id="checkBox">
+        <thead>
+        <tr>
+            <th colspan="11" scope="col">信息统计</th>
+        </tr>
+        <tr class="text-c">
+            <th ><label><input type="checkbox" value="全选" id="selectAll"/>全选   </label>订单号</th>
+            <th >产品编号</th>
+            <th >颜色</th>
+            <th >单价</th>
+            <th >个数</th>
+            <th >订单价格</th>
+            <th >下单时间</th>
+            <th >订单状态</th>
+        </tr>
+        </thead>
+        <tbody id="warp">
+<th colspan="8" scope="col" class="text-c f-20" style="padding: 50px 0;">请选择日期,并且点击搜索</th>
+        </tbody>
+    </table>
+
+</div>
+</body>
+</html>

+ 167 - 0
malai/admin/index.html

@@ -0,0 +1,167 @@
+<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>
+
+
+
+<audio src="../images/1.mp3" controls="controls" style="margin-left: 215px;display: none;" id="audio">
+</audio>
+
+
+
+
+<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">订单信息</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" class="active">订单信息</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>

+ 56 - 0
malai/admin/ip.html

@@ -0,0 +1,56 @@
+<!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">
+    <link rel="stylesheet" href="css/ui/pagination.css">
+    <!--页面css-->
+    <link rel="stylesheet" href="css/ip.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/ip.js"></script>
+</head>
+<body>
+<div class="page-container">
+    <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="5" scope="col">信息统计</th>
+        </tr>
+        <tr class="text-c">
+            <th>订单号</th>
+            <th>公网ip地址</th>
+            <th>ip地址所在的国家</th>
+            <th>ip地址所在的城市</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>
+        </tr>
+        </tbody>
+    </table>
+    <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>
+</div>
+
+<div id="Page" style="float: right;margin: 30px 0;">
+</div>
+</body>
+</html>

+ 158 - 0
malai/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: "/malai/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: "/malai/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: "/malai/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: "/malai/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();
+}
+

+ 71 - 0
malai/admin/js/countdown.js

@@ -0,0 +1,71 @@
+window.onload = function (ev) {
+    init();
+}
+
+init = function () {
+    getAttributeInfo();
+}
+
+getAttributeInfo = function () {
+    var parameter = urlEncode(["SelectcountDown"]);
+    $.ajax({
+        type: "post",
+        url: "/malai/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].ProductId + '</td>' +
+            '<td>' + data[i].ProductRemarks + '</td>' +
+            '<td>' + data[i].ProductName + '</td>' +
+            '<td>' + data[i].CountDown + '</td>' +
+            '<td>' +
+            '<a class="btn btn-primary radius td-button" href="/malai/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"});
+}
+
+
+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();
+}
+

+ 212 - 0
malai/admin/js/excel.js

@@ -0,0 +1,212 @@
+var test = true,
+    orderState = "";
+window.onload = function (ev) {
+    init();
+    //日历控件
+    laydate.render({
+        elem: '#startTime', //指定元素
+        type: 'datetime',
+        // value: getFormatDate(false),
+        max: getFormatDate(true),
+        done: function (value, date, endDate) {
+            $("#startTime").next().show();
+        }
+    });
+    //日历控件
+    laydate.render({
+        elem: '#endTime', //指定元素
+        type: 'datetime',
+        // value: getFormatDate(true),
+        max: getFormatDate(true),
+        done: function (value, date, endDate) {
+            $("#endTime").next().show();
+        }
+    });
+    excel();
+
+}
+
+
+init = function () {
+    var today = getFormatDate(false),
+        // var today = '2018-10-10 00:00:00',
+        now = getFormatDate(true),
+        val = "",
+        state = orderState;
+    $("#startTime").val(today);
+    $("#endTime").val(now);
+    $("#startTime").next().show();
+    $("#endTime").next().show();
+}
+
+
+//搜索-打印表格
+searchExcel = function () {
+    $("#loading").css({"display": "block"});
+    $("#warp").css({"display": "none"});
+    var starttime = $("#startTime")[0].value,
+        endtime = $("#endTime")[0].value;
+    var parameter = urlEncode(["SelectExcel", starttime, endtime]);
+    $.ajax({
+        type: "post",
+        url: "/malai/php/index.php",
+        data: {mode: parameter},
+        dataType: "json",
+        success: function (data) {
+            if (data.length == 0 || data == -1) {
+                $("#loading").css({"display": "none"});
+                $("#warp").css({"display": "table-row-group"});
+                $("#warp").html("");
+                var th = '<th colspan="8" scope="col" class="text-c f-20" style="padding: 50px 0;">暂无数据</th>';
+                $("#warp").html(th);
+                return;
+            }
+            printExcel(data);
+        }
+    });
+}
+
+printExcel = function (data) {
+    var warp = $("#warp"),
+        tr,
+        state = {1: "已付款,<p style='color:red'>等待发货</p>", 2: "已发货<p style='color:red'>等待收货</p>", 3: "已收货"},
+        title = "'订单详情'";
+    var ordernum,
+        product_remarks,
+        order_class, order_class_color, order_class_div,
+        product_price,
+        order_number,
+        order_price,
+        order_time,
+        order_state,
+        order_operation, order_operation_delivergoods, order_operation_buygood, order_operation_href, odrer_address;
+
+    warp.html("");
+    for (var i = 0; i < data.length; i++) {
+        order_class_div = "";
+        ordernum = '<td><label><input type="checkbox" value=' + data[i].OrderNum + ' >' + data[i].OrderNum + '</label></td>';
+        product_remarks = '<td>' + data[i].ProductRemarks + '</td>';
+        product_price = '<td>' + Math.ceil(data[i].ProductPrice) + '</td>';
+        if (data[i].ProductInfoClassId == "") {
+            order_class_color = data[i].ProductAttributeId.split(",")[1];
+            order_class = '<td><div>' +
+                order_class_color;
+            order_number = '<td>' + data[i].ProductNumber + '</td>';
+            order_price = '</td>' + '<td>' + data[i].Payment + '</td>';
+        }
+        else {
+            data[i].ProductInfoClassId = JSON.parse(unescape(data[i].ProductInfoClassId));
+            for (var j in data[i].ProductInfoClassId) {
+                if (j == 0) {
+                    order_number = '<td>' + data[i].ProductInfoClassId[0].Number + '</td>';
+                    order_price = '<td>' + parseInt(data[i].ProductInfoClassId[0].Money) * parseInt(data[i].ProductInfoClassId[0].Number) + '</td>';
+                }
+                else {
+                    order_class_color = data[i].ProductInfoClassId[j].color;
+                    order_class_div += '<div>' +
+                        order_class_color +
+                        '</div>';
+                    order_class = '<td>' + order_class_div + '</td>';
+                }
+            }
+        }
+        order_time = '<td><p>' + data[i].OrderAddtime.split(" ")[0] + '</p><p>' + data[i].OrderAddtime.split(" ")[1] + '</p></td>';
+        order_state = '<td class="state">' + state[data[i].OrderState] + '</td>';
+        if (data[i].OrderState == 1) {
+            order_operation_delivergoods = '<a class="btn btn-primary radius td-button" onclick="deliverGoods(\'' + data[i].OrderId + '\',this)">发货</a>';
+        }
+        else if (data[i].OrderState == 2) {
+            order_operation_delivergoods = '<a class="btn btn-primary radius td-button" onclick="collectGoods(\'' + data[i].OrderId + '\',this)">确认买家已收货</a>';
+        }
+        else if (data[i].OrderState == 3) {
+            order_operation_delivergoods = "";
+        }
+
+        if (data[i].BuyGoods == 0 || !data[i].BuyGoods) {
+            order_operation_buygood = '<a class="btn btn-primary radius td-button" onclick="buygood(\'' + data[i].OrderId + '\',this)">采购</a>';
+        }
+        else {
+            order_operation_buygood = '<a class="btn btn-primary radius td-button">已采购</a>';
+        }
+        order_operation_href = "'orderinfo.html?oid=" + data[i].OrderId + "&pid=" + data[i].ProductId + "'";
+        order_operation = '<td>' + order_operation_delivergoods + order_operation_buygood +
+            '<a class="btn btn-primary radius td-button" onclick="product_add(' + title + ',' + order_operation_href + ')">查看订单信息</a>' +
+            '<a class="btn btn-primary radius td-button" onclick="deleteProduct(\'' + data[i].OrderId + '\',this)">删除</a>' +
+            '</td>';
+        //        odrer_address = '<td>' + data[i].ProductIntroduce + '</td>';
+        odrer_address = '<td><a href="' + data[i].ProductIntroduce + '">' + data[i].ProductIntroduce + '</a></td>';
+        tr = $('<tr class="text-c">' + ordernum + product_remarks + order_class + product_price + order_number + order_price + order_time + order_state + '</tr>');
+        warp.append(tr);
+    }
+    $("#loading").css({"display": "none"});
+    $("#warp").css({"display": "table-row-group"});
+}
+
+excel = function () {
+    $("#getValue").click(function () {
+        var valArr = new Array;
+        $("#warp :checkbox").each(function (i) {
+            if (this.checked === true) {
+                valArr.push($(this).val());
+            }
+        });
+        var vals = valArr.join(',');
+        var valsJ = JSON.stringify(vals);
+        window.open("../php/excel.php?" + "vals=" + valsJ);
+        // alert(vals);
+    });
+}
+
+
+getJsonObjLength = function (jsonObj) {
+    var Length = 0;
+    for (var item in jsonObj) {
+        Length++;
+    }
+    return Length;
+}
+
+urlEncode = function (arr) {
+    var i; //循环初始化
+    for (i = 0; i < arr.length; i++) {
+        arr[i] = encodeURIComponent(encodeURIComponent(arr[i]));
+    }
+    return arr.join();
+}
+
+getFormatDate = function (flag) {
+    var nowDate = new Date();
+    var year = nowDate.getFullYear();
+    var month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1) : nowDate.getMonth() + 1;
+    var date = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate.getDate();
+    var hour = nowDate.getHours() < 10 ? "0" + nowDate.getHours() : nowDate.getHours();
+    var minute = nowDate.getMinutes() < 10 ? "0" + nowDate.getMinutes() : nowDate.getMinutes();
+    var second = nowDate.getSeconds() < 10 ? "0" + nowDate.getSeconds() : nowDate.getSeconds();
+    var val;
+    if (flag == true) {
+        val = year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;
+    }
+    else if (flag == false) {
+        val = year + "-" + month + "-" + date + " 00:00:00";
+    }
+    else if (flag == -1) {
+        val = year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;
+    }
+    return val;
+}
+
+hideSelectClose = function (el) {
+    $(el).hide();
+    $("#" + $(el).prev().attr("id")).val("");
+}
+
+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";
+        }
+    }
+}

+ 561 - 0
malai/admin/js/index.js

@@ -0,0 +1,561 @@
+var test = true,
+    orderState = "",
+    webNotice = false,
+    webNoticeId = "",
+    oldOrderInfo = false,
+    oldOrderInfo_malai = false;
+
+
+
+
+window.onload = function (ev) {
+    init();
+    //日历控件
+    laydate.render({
+        elem: '#startTime', //指定元素
+        type: 'datetime',
+        // value: getFormatDate(false),
+        max: getFormatDate(true),
+        done: function (value, date, endDate) {
+            $("#startTime").next().show();
+        }
+    });
+    //日历控件
+    laydate.render({
+        elem: '#endTime', //指定元素
+        type: 'datetime',
+        // value: getFormatDate(true),
+        max: getFormatDate(true),
+        done: function (value, date, endDate) {
+            $("#endTime").next().show();
+        }
+    });
+}
+
+
+init = function () {
+    var today = getFormatDate(false),
+        // var today = '2018-10-10 00:00:00',
+        now = getFormatDate(true),
+        val = "",
+        state = orderState;
+    $("#startTime").val(today);
+    $("#endTime").val(now);
+    $("#startTime").next().show();
+    $("#endTime").next().show();
+    getProductInfo(today, now, val, state, 1, 10, true);
+    pagenotify();
+
+}
+
+
+pagenotify = function () {
+    notifyMe();
+    orderWheelSearch();
+    orderWheelSearchMaLai();
+}
+notifyMe = function () {
+    // 先检查浏览器是否支持
+    if (!("Notification" in window)) {
+        //alert("本浏览器不支持网页通知提示,如需要网页提示,请使用chrome浏览器打开此网站。");
+    }
+    else {
+        Notification.requestPermission(function (permission) {
+            if (permission === "granted") {
+                webNotice = true;
+            }
+            else if (Notification.permission === "denied") {
+               // alert("请打开网页通知权限,或者质询技术人员协助打开。");
+            }
+        });
+    }
+}
+
+orderWheelSearch = function () {
+    setInterval(function () {
+        var parameter = urlEncode(["OrderWheelSearch"]);
+        $.ajax({
+            type: "post",
+            url: "/new/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (oldOrderInfo == false) {
+                    oldOrderInfo = data[0];
+                }
+                else {
+                    if (oldOrderInfo.OrderId == data[0].OrderId) {
+
+                    }
+                    else {
+                        oldOrderInfo = data[0];
+                        orderNoticeBody(1, oldOrderInfo);
+                        $("#audio")[0].play();
+                    }
+                }
+                console.log(oldOrderInfo);
+            }
+        });
+    }, 5000);
+}
+
+orderWheelSearchMaLai = function () {
+    setInterval(function () {
+        var parameter = urlEncode(["OrderWheelSearch"]);
+        $.ajax({
+            type: "post",
+            url: "/malai/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (oldOrderInfo_malai == false) {
+                    oldOrderInfo_malai = data[0];
+                }
+                else {
+                    if (oldOrderInfo_malai.OrderId == data[0].OrderId) {
+
+                    }
+                    else {
+                        oldOrderInfo_malai = data[0];
+                        orderNoticeBodyMaLai(3, oldOrderInfo_malai);
+                        $("#audio")[0].play();
+                    }
+                }
+            }
+        });
+    }, 5000);
+}
+
+orderNoticeBody = function (type, data) {
+    var title, obj;
+    if (type == 1) {
+        title = "泰国来订单啦";
+    }
+    else if (type == 2) {
+        title = "台湾来订单啦";
+    }
+    else if (type == 3) {
+        title = "马来西亚来订单啦";
+    }
+    webNoticeId = data.OrderId + '<>' + data.ProductId;
+    obj = {
+        dir: "auto",
+        body: "订单号:" + data.OrderNum + "\n" +
+        "产品编号:" + data.ProductRemarks,
+        // tag: webNoticeId,
+        icon: JSON.parse(data.ProductInfoClassId)[1].img,
+        renotify: false
+    }
+    var notification = new Notification(title, obj);
+    notification.onclick = function (event, data) {
+        event.preventDefault(); // prevent the browser from focusing the Notification's tab
+        var oid = webNoticeId.split("<>")[0],
+            pid = webNoticeId.split("<>")[1];
+        window.open('https://kjdspro.com/new/admin/orderinfo.html?oid=' + oid + '&pid=' + pid, '_blank');
+    }
+}
+
+orderNoticeBodyMaLai  = function (type, data) {
+    var title, obj;
+    if (type == 1) {
+        title = "泰国来订单啦";
+    }
+    else if (type == 2) {
+        title = "台湾来订单啦";
+    }
+    else if (type == 3) {
+        title = "马来西亚来订单啦";
+    }
+    webNoticeId = data.OrderId + '<>' + data.ProductId;
+    obj = {
+        dir: "auto",
+        body: "订单号:" + data.OrderNum + "\n" +
+        "产品编号:" + data.ProductRemarks,
+        // tag: webNoticeId,
+        icon: JSON.parse(data.ProductInfoClassId)[1].img,
+        renotify: false
+    }
+    var notification = new Notification(title, obj);
+    notification.onclick = function (event, data) {
+        event.preventDefault(); // prevent the browser from focusing the Notification's tab
+        var oid = webNoticeId.split("<>")[0],
+            pid = webNoticeId.split("<>")[1];
+        window.open('https://kjdspro.com/malai/admin/orderinfo.html?oid=' + oid + '&pid=' + pid, '_blank');
+    }
+}
+
+
+
+
+
+getProductInfo = function (today, now, val, state, pageindex, pagesize, flag) {
+    var parameter = urlEncode(["SelectOrderInfo", today, now, val, state, pageindex, pagesize]);
+    $.ajax({
+        type: "post",
+        url: "/malai/php/index.php",
+        data: {mode: parameter},
+        dataType: "json",
+        success: function (data) {
+
+            if (data.length == 0 || data == -1) {
+                $("#loading").css({"display": "none"});
+                $("#warp").css({"display": "table-row-group"});
+                var th = '<th colspan="11" scope="col" class="text-c f-20" style="padding: 50px 0;">暂无数据</th>';
+                $("#warp").html(th);
+                $("#Page").html("");
+                // $("#warp").append(th);
+                return;
+            }
+
+            printProductInfo(data);
+
+            if (!flag) {
+                test = true;
+            }
+
+            if (test) {
+                test = false;
+                var totalSize = data[0].allcount,
+                    totalPage = Math.ceil(totalSize / pagesize);
+                // $("#Page").whjPaging("setPage", {currPage: pageindex, totalPage: totalPage, totalSize: totalSize});
+                $("#Page").html("");
+                $("#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(today, now, val, orderState, currPage, pagesize, true);
+                        // console.log('currPage:' + currPage + '     pageSize:' + pageSize);
+                    }
+                });
+            }
+
+            console.log(data);
+        }
+    });
+}
+
+
+changeTab = function (state) {
+    var starttime = $("#startTime").val(),
+        endtime = $("#endTime").val(),
+        val = $("#SearchPlaceBtn").val(),
+        state = state;
+    getProductInfo(starttime, endtime, val, state, 1, 10, false);
+
+    // var li = $(el).parent().children();
+    // li.removeClass("layui-this");
+    // $(el).addClass("layui-this");
+    // $("#loading").css({display: "table-row-group"});
+    // $("#warp").css({display: "none"});
+    // test = true;
+    // getProductInfo(oid, pid, state, pageindex, pagesize);
+    // $("#SearchPlaceBtn").val("");
+}
+
+printProductInfo = function (data) {
+    // data = data[0];
+    var warp = $("#warp"),
+        tr,
+        state = {1: "已付款,<p style='color:red'>等待发货</p>", 2: "已发货<p style='color:red'>等待收货</p>", 3: "已收货"},
+        title = "'订单详情'";
+    var ordernum,
+        product_remarks,
+        product_name,
+        order_class, order_class_img, order_class_color, order_class_size, order_class_div,
+        product_price,
+        order_number,
+        order_price,
+        order_time,
+        order_state,
+        order_operation, order_operation_delivergoods, order_operation_buygood, order_operation_href, odrer_address;
+
+    warp.html("");
+    for (var i = 0; i < data.length; i++) {
+        order_class_div = "";
+        ordernum = '<td>' + data[i].OrderNum + '</td>';
+        product_remarks = '<td>' + data[i].ProductRemarks + '</td>';
+        product_name = '<td>' + data[i].ProductName + '</td>';
+        product_price = '<td>' + Math.ceil(data[i].ProductPrice) + '</td>';
+        if (data[i].ProductInfoClassId == "") {
+            order_class_img = '<img src="' + data[i].ProductAttributeId.split(",")[0] + '" style="width: 80px;"/>';
+            order_class_color = data[i].ProductAttributeId.split(",")[1];
+            order_class_size = (data[i].ProductAttributeId.split(",")[2] && data[i].ProductAttributeId.split(",")[2] != "" && data[i].ProductAttributeId.split(",")[2] != "undefined") ? data[i].ProductAttributeId.split(",")[2] : "无";
+            order_class = '<td style="text-align: initial;"><div>' +
+                '<p>颜色:' + order_class_color + '</p>' +
+                '<p>图片:' + order_class_img + '</p>' +
+                '<p>尺寸:' + order_class_size + '</p></div></td>';
+            order_number = '<td>' + data[i].ProductNumber + '</td>';
+            order_price = '</td>' + '<td>' + data[i].Payment + '</td>';
+        }
+        else {
+            data[i].ProductInfoClassId = JSON.parse(unescape(data[i].ProductInfoClassId));
+            for (var j in data[i].ProductInfoClassId) {
+                if (j == 0) {
+                    order_number = '<td>' + data[i].ProductInfoClassId[0].Number + '</td>';
+                    order_price = '<td>' + parseInt(data[i].ProductInfoClassId[0].Money) * parseInt(data[i].ProductInfoClassId[0].Number) + '</td>';
+                }
+                else {
+                    order_class_img = '<img src="' + data[i].ProductInfoClassId[j].img + '" style="width: 80px;"/>';
+                    order_class_color = data[i].ProductInfoClassId[j].color;
+                    order_class_size = data[i].ProductInfoClassId[j].size ? data[i].ProductInfoClassId[j].size : "无";
+                    order_class_div += '<div style="margin-bottom: 10px;border-bottom: 1px solid #cecece;">' +
+                        '<p>颜色:' + order_class_color + '</p>' +
+                        '<p>图片:' + order_class_img + '</p>' +
+                        '<p>尺寸:' + order_class_size + '</p>' +
+                        '</div>';
+                    order_class = '<td style="text-align: initial;">' + order_class_div + '</td>';
+                }
+            }
+        }
+        order_time = '<td><p>' + data[i].OrderAddtime.split(" ")[0] + '</p><p>' + data[i].OrderAddtime.split(" ")[1] + '</p></td>';
+        order_state = '<td class="state">' + state[data[i].OrderState] + '</td>';
+        if (data[i].OrderState == 1) {
+            order_operation_delivergoods = '<a class="btn btn-primary radius td-button" onclick="deliverGoods(\'' + data[i].OrderId + '\',this)">发货</a>';
+        }
+        else if (data[i].OrderState == 2) {
+            order_operation_delivergoods = '<a class="btn btn-primary radius td-button" onclick="collectGoods(\'' + data[i].OrderId + '\',this)">确认买家已收货</a>';
+        }
+        else if (data[i].OrderState == 3) {
+            order_operation_delivergoods = "";
+        }
+
+        if (data[i].BuyGoods == 0 || !data[i].BuyGoods) {
+            order_operation_buygood = '<a class="btn btn-primary radius td-button" onclick="buygood(\'' + data[i].OrderId + '\',this)">采购</a>';
+        }
+        else {
+            order_operation_buygood = '<a class="btn btn-primary radius td-button">已采购</a>';
+        }
+        order_operation_href = "'orderinfo.html?oid=" + data[i].OrderId + "&pid=" + data[i].ProductId + "'";
+        order_operation = '<td>' + order_operation_delivergoods + order_operation_buygood +
+            '<a class="btn btn-primary radius td-button" onclick="product_add(' + title + ',' + order_operation_href + ')">查看订单信息</a>' +
+            '<a class="btn btn-primary radius td-button" onclick="deleteProduct(\'' + data[i].OrderId + '\',this)">删除</a>' +
+            '</td>';
+        odrer_address = '<td><a href="' + data[i].ProductIntroduce + '">' + data[i].ProductIntroduce + '</a></td>';
+        tr = $('<tr class="text-c">' + ordernum + product_remarks + product_name + order_class + product_price + order_number + order_price + order_time + order_state + odrer_address + order_operation + '</tr>');
+        warp.append(tr);
+    }
+    $("#loading").css({"display": "none"});
+    $("#warp").css({"display": "table-row-group"});
+}
+
+
+//搜索
+searchProductInfo = function () {
+
+    var starttime = $("#startTime").val(),
+        endtime = $("#endTime").val(),
+        val = $("#SearchPlaceBtn").val(),
+        state = orderState;
+    getProductInfo(starttime, endtime, val, state, 1, 10, false);
+
+
+    // var _val = $("#SearchPlaceBtn").val().trim();
+    // if (_val == "") {
+    //     layer.msg('请输入订单号、人名、地址、手机号其中一个', {icon: 1});
+    // }
+    // else {
+    //     $("#loading").css({display: "table-row-group"});
+    //     $("#warp").css({display: "none"});
+    //     test = true;
+    //     var parameter = urlEncode(["OrderInfoSearch", _val, 1, 10]);
+    //     $.ajax({
+    //         type: "post",
+    //         url: "/new/php/index.php",
+    //         data: {mode: parameter},
+    //         dataType: "json",
+    //         success: function (data) {
+    //             $("#Page").html("");
+    //             if (data.length == 0 || data == -1) {
+    //                 $("#loading").css({"display": "none"});
+    //                 $("#warp").css({"display": "table-row-group"});
+    //                 var th = '<th colspan="10" scope="col" class="text-c f-20" style="padding: 50px 0;">暂无数据</th>';
+    //                 $("#warp").html(th);
+    //                 // $("#warp").append(th);
+    //                 return;
+    //             }
+    //             printProductInfo(data);
+    //             console.log(data);
+    //         }
+    //     });
+    // }
+}
+
+
+keySearchProductInfo = function () {
+    if (event.keyCode == 13) {
+        searchProductInfo();
+    }
+}
+
+//发货
+deliverGoods = function (oid, e) {
+    var el = e;
+    layer.confirm('是否确定发货?', {
+        btn: ['确定', '取消'] //按钮
+    }, function () {
+        $("#loading").css({"display": "block"});
+        var parameter = urlEncode(["UpdateOrderState", oid, 2]);
+        $.ajax({
+            type: "post",
+            url: "/malai/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (data === 1) {
+                    layer.msg('发货成功', {icon: 1});
+                    // $(el).parents().children(".state").html("已发货");
+                    $("#loading").css({"display": "none"});
+                    $(el).remove();
+                }
+            }
+        });
+    })
+}
+
+//收货
+collectGoods = function (oid, e) {
+    var el = e;
+    layer.confirm('是否确定买家已经收货了?', {
+        btn: ['确定', '取消'] //按钮
+    }, function () {
+        $("#loading").css({"display": "block"});
+        var parameter = urlEncode(["UpdateOrderState", oid, 3]);
+        $.ajax({
+            type: "post",
+            url: "/malai/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (data === 1) {
+                    layer.msg('确认成功', {icon: 1});
+                    // $("#asd").parents().children(".state")[0].html("已完成");
+                    // $("#loading").css({"display": "none"});
+                    $(el).parent().parent('tr')[0].remove();
+                    $("#loading").css({"display": "none"});
+                }
+            }
+        });
+    })
+}
+
+//删除
+deleteProduct = function (oid, e) {
+    var el = e;
+    layer.confirm('是否删除订单?', {
+        btn: ['确定', '取消'] //按钮
+    }, function () {
+        $("#loading").css({"display": "block"});
+        var parameter = urlEncode(["DeleteOrderRecycleBin", oid, 1]);
+        $.ajax({
+            type: "post",
+            url: "/malai/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (data === 1) {
+                    layer.msg('删除成功', {icon: 1});
+                    $(el).parent().parent('tr')[0].remove();
+                    $("#loading").css({"display": "none"});
+                }
+            }
+        });
+    })
+}
+
+//是否采购
+buygood = function (oid, e) {
+    var el = e;
+    if ($(el).html() == "采购") {
+        layer.confirm('是否确认采购?', {
+            btn: ['确定', '取消'] //按钮
+        }, function () {
+            var parameter = urlEncode(["OrderBuyGoods", oid]);
+            $.ajax({
+                type: "post",
+                url: "/malai/php/index.php",
+                data: {mode: parameter},
+                dataType: "json",
+                success: function (data) {
+                    if (data === 1) {
+                        $(el).html("已采购");
+                    }
+                    layer.msg('采购成功', {icon: 1});
+                }
+            });
+        });
+    }
+}
+
+
+getJsonObjLength = function (jsonObj) {
+    var Length = 0;
+    for (var item in jsonObj) {
+        Length++;
+    }
+    return Length;
+}
+
+
+function product_add(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();
+}
+
+
+getFormatDate = function (flag) {
+    var nowDate = new Date();
+    var year = nowDate.getFullYear();
+    var month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1) : nowDate.getMonth() + 1;
+    var date = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate.getDate();
+    var hour = nowDate.getHours() < 10 ? "0" + nowDate.getHours() : nowDate.getHours();
+    var minute = nowDate.getMinutes() < 10 ? "0" + nowDate.getMinutes() : nowDate.getMinutes();
+    var second = nowDate.getSeconds() < 10 ? "0" + nowDate.getSeconds() : nowDate.getSeconds();
+    var val;
+    if (flag == true) {
+        val = year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;
+    }
+    else if (flag == false) {
+        val = year + "-" + month + "-" + date + " 00:00:00";
+    }
+    else if (flag == -1) {
+        val = year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second;
+    }
+    return val;
+}
+
+
+hideSelectClose = function (el) {
+    $(el).hide();
+    $("#" + $(el).prev().attr("id")).val("");
+}
+
+
+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";
+        }
+    }
+}

+ 81 - 0
malai/admin/js/ip.js

@@ -0,0 +1,81 @@
+var test = true;
+window.onload = function (ev) {
+    init();
+}
+
+init = function () {
+    getOrderInfo(1, 10);
+}
+
+
+getOrderInfo = function (pageindex, pagesize) {
+    var parameter = urlEncode(["SelectIpAddress", pageindex, pagesize]);
+    $.ajax({
+        type: "post",
+        url: "/taiwan/php/index.php",
+        data: {mode: parameter},
+        dataType: "json",
+        success: function (data) {
+            if (data.length == 0 || data == -1) {
+                $("#loading").css({"display": "none"});
+                $("#warp").css({"display": "table-row-group"});
+                var th = '<th colspan="10" scope="col" class="text-c f-20" style="padding: 50px 0;">暂无数据</th>';
+                $("#warp").html(th);
+                $("#Page").html("");
+                // $("#warp").append(th);
+                return;
+            }
+            printOrderInfo(data);
+            if (test) {
+                test = false;
+                var totalSize = data[0].allcount,
+                    totalPage = Math.ceil(totalSize / pagesize);
+                // $("#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"});
+                        getOrderInfo(currPage, pagesize);
+                        // console.log('currPage:' + currPage + '     pageSize:' + pageSize);
+                    }
+                });
+            }
+        }
+    });
+}
+
+printOrderInfo = function (data) {
+    var warp = $("#warp"),
+        tr;
+    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].OrderNum + '</td>' +
+            '<td>' + data[i].IPAddress + '</td>' +
+            '<td>' + data[i].Country + '</td>' +
+            '<td>' + data[i].City + '</td>' +
+            '<td>' + data[i].AddTime + '</td>' +
+            '</tr>';
+        warp.append(tr);
+    }
+    $("#loading").css({"display": "none"});
+    $("#warp").css({"display": "table-row-group"});
+}
+
+
+urlEncode = function (arr) {
+    var i; //循环初始化
+    for (i = 0; i < arr.length; i++) {
+        arr[i] = encodeURIComponent(encodeURIComponent(arr[i]));
+    }
+    return arr.join();
+}
+
+

+ 0 - 0
malai/admin/js/login.js


+ 86 - 0
malai/admin/js/orderinfo.js

@@ -0,0 +1,86 @@
+window.onload = function (ev) {
+    init();
+}
+
+
+init = function () {
+    getOrderInfo();
+}
+
+getOrderInfo = function () {
+    var oid = getUrlParam("oid");
+    var parameter = urlEncode(["OrderInfoSearch", oid]);
+    $.ajax({
+        type: "post",
+        url: "/malai/php/index.php",
+        data: {mode: parameter},
+        dataType: "json",
+        success: function (data) {
+            printOrderInfo(data);
+        }
+    });
+}
+
+printOrderInfo = function (data) {
+    var input = $('input[type="text"]'),
+        id,
+        value = data[0];
+    for (var i = 0; i < input.length; i++) {
+        id = input.eq(i).attr("id");
+        input.eq(i).attr("value", value[id]);
+    }
+    $("#Remarks").val(value.Remarks);
+
+
+    $(".filelist").html("");
+
+
+    if (value.ProductInfoClassId == "") {
+        var color = value.ProductAttributeId.split(",")[1],
+            colorimg = value.ProductAttributeId.split(",")[0],
+            size = value.ProductAttributeId.split(",")[2];
+        $("#Color").val(color);
+        $("#Size").val(size);
+        $(".filelist").append($('<li><p class="imgWrap"><img src="' + colorimg + '"></p></li>'));
+    }
+    else {
+        $("#Color").parents().eq(1).hide();
+        $("#Size").parents().eq(1).hide();
+        $(".uploader-list-container").parents().eq(1).children().eq(0).text("订单数据:");
+        var obj = JSON.parse(unescape(value.ProductInfoClassId));
+        for (var i in obj) {
+            if (i == 0) {
+
+                $("#ProductNumber").val(obj[i].Number);
+                $("#ProductPrice").val(obj[i].Money);
+                $("#Payment").val(parseInt(obj[i].Money) * parseInt(obj[i].Number));
+            }
+            if (i != 0) {
+                var li = '<li>' +
+                    '<p>颜色分类:' + obj[i].color + '</p>' +
+                    (obj[i].size ? '<p>尺寸:' + obj[i].size + '</p>' : '') +
+                    '<p class="imgWrap"><img src="' + obj[i].img + '"></p></li>';
+                $(".filelist").append(li);
+            }
+        }
+    }
+
+    $("#loading").css({"display": "none"});
+    $(".form").css({"display": "block"});
+}
+
+
+getUrlParam = function (name) {
+    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
+    var r = window.location.search.substr(1).match(reg);  //匹配目标参数
+    if (r != null) return unescape(r[2]);
+    return null; //返回参数值
+}
+
+urlEncode = function (arr) {
+    var i; //循环初始化
+    for (i = 0; i < arr.length; i++) {
+        arr[i] = encodeURIComponent(encodeURIComponent(arr[i]));
+    }
+    return arr.join();
+}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 10 - 0
malai/admin/js/pagination.min.js


+ 765 - 0
malai/admin/js/product-add.js

@@ -0,0 +1,765 @@
+BannerJson = {}
+ColoeJson = {}
+pattr = []
+PageType = true;
+ProductId = "";
+window.onload = function () {
+    var uploader = new plupload.Uploader({ //创建实例的构造方法
+        runtimes: 'html5,flash,silverlight,html4', //上传插件初始化选用那种方式的优先级顺序
+        // browse_button: 'bannerbtn', // 上传按钮
+        browse_button: $("#bannerbtn")[0], // 上传按钮
+        url: "upload.php", //远程上传地址
+        flash_swf_url: 'plupload/Moxie.swf', //flash文件地址
+        silverlight_xap_url: 'plupload/Moxie.xap', //silverlight文件地址
+        filters: {
+            max_file_size: '200mb', //最大上传文件大小(格式100b, 10kb, 10mb, 1gb)
+            mime_types: [ //允许文件上传类型
+                {
+                    title: "files",
+                    extensions: "jpg,png,gif,ico"
+                }
+            ]
+        },
+        multi_selection: true, //true:ctrl多文件上传, false 单文件上传
+        init: {
+            FilesAdded: function (up, files) { //文件上传前
+                if ($("#ul_pics").children("li").length > 30) {
+                    alert("您上传的图片太多了!");
+                    uploader.destroy();
+                } else {
+                    var li = '';
+                    plupload.each(files, function (file) { //遍历文件
+                        li += "<li id='" + file['id'] + "'><div class='progress'><span class='bar'></span><span class='percent'>0%</span></div></li>";
+                    });
+                    $("#ul_pics").append(li);
+                    uploader.start();
+                }
+            },
+            UploadProgress: function (up, file) { //上传中,显示进度条
+                var percent = file.percent;
+                $("#" + file.id).find('.bar').css({
+                    "width": percent + "%"
+                });
+                $("#" + file.id).find(".percent").text(percent + "%");
+            },
+            FileUploaded: function (up, file, info) { //文件上传成功的时候触发
+                var data = eval("(" + info.response + ")");
+                // $("#" + file.id).html("<div class='img'><img src='" + data.pic + "'/></div><input type='' value='' class='input'><span class='span'>删除</span>");
+                // $("#" + file.id).html("<div class='img'><img src='" + data.pic + "'/></div><p>" + file.name + "</p><span class='span' onclick='DeleteBanner(" + file.id + ")'>删除</span>");
+                $("#" + file.id).html(CreateBanner(data.pic, file.name, file.id));
+
+                BannerJson[file.id] = data;
+            },
+            Error: function (up, err) { //上传出错的时候触发
+                // alert(err.message);
+                $.Huimodalalert('服务器错误!请联系管理员', 3000);
+            }
+        },
+    });
+    var uploader2 = new plupload.Uploader({ //创建实例的构造方法
+        runtimes: 'html5,flash,silverlight,html4', //上传插件初始化选用那种方式的优先级顺序
+        browse_button: 'colorbtn', // 上传按钮
+        url: "upload.php", //远程上传地址
+        flash_swf_url: 'plupload/Moxie.swf', //flash文件地址
+        silverlight_xap_url: 'plupload/Moxie.xap', //silverlight文件地址
+        filters: {
+            max_file_size: '200mb', //最大上传文件大小(格式100b, 10kb, 10mb, 1gb)
+            mime_types: [ //允许文件上传类型
+                {
+                    title: "files",
+                    extensions: "jpg,png,gif,ico"
+                }
+            ]
+        },
+        multi_selection: true, //true:ctrl多文件上传, false 单文件上传
+        init: {
+            FilesAdded: function (up, files) { //文件上传前
+                if ($("#ul_pics2").children("li").length > 30) {
+                    alert("您上传的图片太多了!");
+                    uploader2.destroy();
+                } else {
+                    var li = '';
+                    plupload.each(files, function (file) { //遍历文件
+                        li += "<li id='" + file['id'] + "'><div class='progress'><span class='bar'></span><span class='percent'>0%</span></div></li>";
+                    });
+                    $("#ul_pics2").append(li);
+                    uploader2.start();
+                }
+            },
+            UploadProgress: function (up, file) { //上传中,显示进度条
+                var percent = file.percent;
+                $("#" + file.id).find('.bar').css({
+                    "width": percent + "%"
+                });
+                $("#" + file.id).find(".percent").text(percent + "%");
+            },
+            FileUploaded: function (up, file, info) { //文件上传成功的时候触发
+                var data = eval("(" + info.response + ")");
+                // $("#" + file.id).html("<div class='img'><img src='" + data.pic + "'/></div><input type='' value='' class='input' placeholder='请输入颜色分类或其他说明'><span class='span' onclick='DeleteColor(" + file.id + ")'>删除</span>");
+                $("#" + file.id).html(CreateColor(data.pic, "", file.id));
+                ColoeJson[file.id] = data;
+            },
+            Error: function (up, err) { //上传出错的时候触发
+                // alert(err.message);
+                $.Huimodalalert('服务器错误!请联系管理员', 3000);
+            }
+        },
+    });
+    uploader.init();
+    uploader2.init();
+
+    //日历控件
+    laydate.render({
+        elem: '#CountDown', //指定元素
+        type: 'datetime',
+        // format: 'y/M/d',
+        // format: 'd/M/y',
+    });
+    GetProductInfo();
+}
+
+//获取产品信息
+var GetProductInfo = function () {
+    var pid = GetUrlParam("pid");
+    ProductId = pid;
+    var parameter = pid ? urlEncode(["SelectProduct", pid]) : urlEncode(["SelectProductNumber"]);
+    $.ajax({
+        type: "post",
+        url: "/malai/php/index.php",
+        data: {mode: parameter},
+        dataType: "json",
+        success: function (data) {
+            if (!pid) {
+                // if (data[0].number == null) {
+                //     data[0].number += 1;
+                // }
+                // $("#ProductRemarks").val(data[0].number);
+                PageType = true;
+            }
+            else {
+                PrintProductInfo(data);
+                PageType = false;
+            }
+        }
+    });
+}
+
+//打印产品信息
+var PrintProductInfo = function (data) {
+    var input = $('input[type="text"]'), id, value = data[0][0];
+    for (var i = 0; i < input.length; i++) {
+        id = input.eq(i).attr("id");
+        input.eq(i).attr("value", value[id]);
+    }
+    $("#ProductIntroduce").html(value.ProductIntroduce);
+    // $("#ueditor_0").contents().find("body").html($("#ueditor_0").contents().find("body").html() + value.ProductInfo);
+    //$("#ueditor_0").contents().find("body").html(value.ProductInfo);
+    $("#ueditor_0").contents().find("body").html(unescape(value.ProductInfo));
+
+    var banner = JSON.parse(value.ProductAttr)["7b824b9c-738b-11e8-a479-0610c52349b6"],
+        color = JSON.parse(value.ProductAttr)["69d4e108-738a-11e8-a479-0610c52349b6"],
+        size = JSON.parse(value.ProductAttr)['d6d6361b-acea-11e8-bbc6-0a4b7569e232'],
+        classs = JSON.parse(value.ProductAttr)["cfb738c4-bff6-11e8-bbc6-0a4b7569e232"],
+        comment = JSON.parse(value.ProductAttr)["d5cca263-c224-11e8-bbc6-0a4b7569e232"];
+    for (var i in banner) {
+        for (var j in banner[i]) {
+            var id = NewGuid(),
+                li = "<li id='" + id + "'></li>";
+            $("#ul_pics").append(li);
+            $("#" + id).html(CreateBanner(banner[i][j], "", id));
+            // BannerJson[id] = banner[i][j];
+        }
+    }
+
+    for (var i in color) {
+        var id = NewGuid(),
+            li = "<li id='" + id + "'></li>";
+        $("#ul_pics2").append(li);
+        $("#" + id).html(CreateColor(color[i], id));
+        // ColoeJson[id] = color[i][j];
+        // continue;
+        // for (var j in color[i]) {
+        //     var id = NewGuid(),
+        //         li = "<li id='" + id + "'></li>";
+        //     $("#ul_pics2").append(li);
+        //     $("#" + id).html(CreateColor(color[i][j], j,color[i].cname, id));
+        //     // ColoeJson[id] = color[i][j];
+        //     continue;
+        // }
+    }
+
+    for (var i in size) {
+        for (var j in size[i]) {
+            AddSize(false, size[i][j]);
+        }
+    }
+
+    $.each(classs, function (i, val) {
+        AddClass(false, i, val);
+    })
+
+
+    for (var i in comment) {
+        CreateComment(false, comment[i]);
+    }
+
+    $(".Submission").html("修改产品信息");
+}
+
+//创建banner、打印banner
+var CreateBanner = function (src, name, id) {
+    if (src.split("/malai").length > 1) {
+        src = src;
+    }
+    else {
+        src = "/malai/" + src;
+    }
+
+    var str = "<div class='img'><img src='" + src + "'/></div><p>" + name + "</p><span class='span' onclick='DeleteBanner(\"" + id + "\")'>删除</span>";
+    return str;
+}
+
+//删除banner图
+var DeleteBanner = function (el) {
+    var flag = confirm("是否确定删除banner图?");
+    if (flag) {
+        var id = el.id;
+        // delete BannerJson[id];
+        $("#" + el).remove();
+    }
+}
+
+// //创建颜色分类、打印颜色分类
+// var CreateColor = function (src, name, id) {
+//     if (src.split("/new").length > 1) {
+//         src = src;
+//     }
+//     else {
+//         src = "/new/" + src;
+//     }
+//     name == "" ? "" : name;
+//     var str = "<div class='img'><img src='" + src + "'/></div><input type='' value='" + name + "' class='input' placeholder='请输入颜色分类或其他说明'><span class='span' onclick='DeleteColor(\"" + id + "\")'>删除</span>";
+//     return str;
+// }
+//
+
+//判断是否为字符串
+var isString = function (str){
+    return (typeof str=='string')&&str.constructor==String;
+}
+
+//创建颜色分类、打印颜色分类
+var CreateColor = function (obj, id) {
+
+    if(isString(obj)){
+        if (obj.split("/malai").length > 1) {
+            obj = obj;
+        }
+        else {
+            obj = "/malai/" + obj;
+        }
+        name ="" ;
+        cname = "";
+        var str = "<div class='img'><img src='" + obj + "'/></div><input type='' value='" + name + "' class='input' placeholder='请输入颜色分类或其他说明'><input type='' value='" + cname + "' class='input' placeholder='请输入中文颜色分类或其他说明'><span class='span' onclick='DeleteColor(\"" + id + "\")'>删除</span>";
+        return str;
+    }
+    else {
+        var img, src, name, cname;
+        for (var i in obj) {
+            if (i == "cname") {
+                cname = obj[i];
+            }
+            else {
+                img = obj[i];
+                if (img.split("/malai").length > 1) {
+                    src = img;
+                }
+                else {
+                    src = "/malai/" + img;
+                }
+                name = i;
+            }
+        }
+        name == "" ? "" : name;
+        cname == "" ? "" : cname;
+        var str = "<div class='img'><img src='" + src + "'/></div><input type='' value='" + name + "' class='input' placeholder='请输入颜色分类或其他说明'><input type='' value='" + cname + "' class='input' placeholder='请输入中文颜色分类或其他说明'><span class='span' onclick='DeleteColor(\"" + id + "\")'>删除</span>";
+        return str;
+    }
+}
+
+
+//删除颜色分类图片
+var DeleteColor = function (el) {
+    var flag = confirm("是否确定删除颜色分类?");
+    if (flag) {
+        var id = el.id;
+        delete ColoeJson[id];
+        $("#" + el).remove();
+    }
+}
+
+//添加尺寸
+var AddSize = function (flag, size) {
+    if (flag) {
+        var li = '<li><input type="" value="" class="input" placeholder="请输入尺寸"><span class="span" onclick="DeleteSize()">删除</span></li>';
+    }
+    else {
+        var li = '<li><input type="" value="' + size + '" class="input" placeholder="请输入尺寸"><span class="span" onclick="DeleteSize()">删除</span></li>';
+    }
+    $("#ul_pics3").append(li);
+}
+
+//删除尺寸
+var DeleteSize = function () {
+    var flag = confirm("是否确定删除尺寸?");
+    if (flag) {
+        event.target.parentNode.remove();
+    }
+}
+
+//添加套餐
+var AddClass = function (flag, indexof, obj) {
+    var li, ul, ul_length;
+    li = '<li>' +
+        '<div class="number_select">' +
+        '<span>销售数量选择</span>' +
+        '<select>' +
+        '<option>0</option>' +
+        '<option>1</option>' +
+        '<option>2</option>' +
+        '<option>3</option>' +
+        '<option>4</option>' +
+        '<option>5</option>' +
+        '</select>' +
+        '</div>' +
+        '<input type="" value="" class="input" placeholder="请输入套餐说明">' +
+        '<input type="" value="" class="input" placeholder="请输入套餐价格">' +
+        '<span class="span" onclick="DeleteClass()">删除</span>' +
+        '</li>';
+
+    ul = $("#ul_pics4").append($(li));
+    if (flag) {
+        ul_length = ul.find("li").length;
+        ul.find("select").eq(ul_length - 1).val(ul_length);
+        if (ul_length == 1) {
+            ul.find("input").eq(1).val($("#ProductPrice").val())
+        }
+    }
+    else {
+        $.each(obj, function (i, val) {
+            if (i == "type") {
+                ul.find("select").eq(indexof).val(val);
+            }
+            else {
+                ul.find("li").eq(indexof).find("input").eq(0).val(val);
+                ul.find("li").eq(indexof).find("input").eq(1).val(i);
+            }
+        });
+    }
+}
+
+//删除套餐
+var DeleteClass = function () {
+    var flag = confirm("是否确定删除套餐?");
+    if (flag) {
+        event.target.parentNode.remove();
+    }
+}
+
+//添加评价
+var CreateComment = function (flag, obj) {
+    var id = NewGuid();
+    var li = '<li>' +
+        '<div class="comment_header">' +
+        '<input class="comment_username" placeholder="请输入用户名" type="text"/>' +
+        '<span class="comment_delete" onclick="DeleteComment()">删除</span>' +
+        '</div>' +
+        '<div class="comment_content">' +
+        '<textarea placeholder="请输入评价"></textarea>' +
+        '</div>' +
+        '<div class="comment_picture_warp">' +
+        '<div class="comment_picture" id="' + id + '" style="cursor: pointer">' +
+        '<img src="../images/addphoto.png"  style="cursor: pointer"/>' +
+        '</div>' +
+        '</div>' +
+        '<div class="comment_footer">' +
+        '<input type="text" class="comment_footer_input" placeholder="请输入评价日期">' +
+        '</div>' +
+        '</li>';
+    $(".ul_pics_comment").append(li);
+    var el = $("#" + id)[0];
+    FileUpload(el, function (r) {
+        CreateCommentImg(el, r.pic, true);
+        console.log(r);
+    });
+
+    //日历控件
+    laydate.render({
+        elem: $(el).parents().eq(1).find(".comment_footer_input").eq(0)[0], //指定元素
+        type: 'datetime',
+        format: 'd/M/y'
+    });
+
+
+    if (!flag) {
+        $(el).parents().eq(1).find("input[type=text]").eq(0).val(obj['name']);
+        $(el).parents().eq(1).find("textarea").val(obj['text']);
+        $(el).parents().eq(1).find("input[type=text]").eq(1).val(obj['time']);
+        var img = obj['imgurl'].split(",");
+        img.forEach(function (val) {
+            CreateCommentImg(el, val, false);
+        });
+    }
+}
+
+var CreateCommentImg = function (el, img, flag) {
+    if (img == "" && !flag) {
+        return;
+    }
+    img = flag ? '/malai/' + img : img;
+    var div = '<div class="comment_picture" ><img src="' + img + '"><img src="../images/close.png" class="closeimg" onclick="CreateCommentImgDelete()"/></div>';
+    $(el).parents().eq(0).append(div);
+}
+
+var CreateCommentImgDelete = function () {
+    var flag = confirm("是否确定此图片?");
+    if (flag) {
+        event.target.parentNode.remove();
+    }
+}
+
+//删除评价
+var DeleteComment = function () {
+    var flag = confirm("是否确定删除评价?");
+    if (flag) {
+        event.target.parentNode.parentNode.remove();
+    }
+}
+
+//上传产品
+var UploadNewProduct = function () {
+    var pn = $("#ProductName").val(),
+        en = $("#EnglishName").val(),
+        pt1 = $("#ProductIntroduce").val(),
+        pt2 = $("#ueditor_0").contents().find("body")[0].innerHTML,
+        pr1 = $("#ProductPrice").val(),
+        pr2 = $("#ProductPrimeCost").val(),
+        num = $("#ProductRemarks").val(),
+        dis = $("#Discount").val(),
+        so = $("#Sold").val(),
+        prom = $("#Promotion").val(),
+        cd = $("#CountDown").val(),
+        meal = $("#ul_pics4 li");
+
+    if (pn.trim() == "") {
+        $.Huimodalalert('请输入产品名称', 3000);
+    }
+    else if (en.trim() == "") {
+        $.Huimodalalert('请输入产品英文名称', 3000);
+    }
+    // else if (pt1.trim() == "") {
+    //     $.Huimodalalert('产品介绍', 3000);
+    //     return;
+    // }
+    else if (pr1.trim() == "") {
+        $.Huimodalalert('请输入产品原价', 3000);
+    }
+    else if (pr2.trim() == "") {
+        $.Huimodalalert('请输入产品售价', 3000);
+    }
+    else if (dis.trim() == "") {
+        $.Huimodalalert('请输入产品折扣', 3000);
+    }
+    else if (so.trim() == "") {
+        $.Huimodalalert('请输入产品已售', 3000);
+    }
+    else if (prom.trim() == "") {
+        $.Huimodalalert('请输入产品促销信息', 3000);
+    }
+    else if (cd.trim() == "") {
+        $.Huimodalalert('请输入产品倒计时', 3000);
+    }
+    // else if ($.isEmptyObject(BannerJson)) {
+    //     $.Huimodalalert('请上传banner图', 3000);
+    // }
+    // else if ($.isEmptyObject(ColoeJson)) {
+    //     $.Huimodalalert('请上传颜色分类图片', 3000);
+    // }
+    else if (pr2 == "<p><br></p>") {
+        $.Huimodalalert('请填写详细内容', 3000);
+    }
+    else if (meal.length == 0) {
+        $.Huimodalalert('请填写产品套餐', 3000);
+    }
+    else {
+        //公用变量
+        var flag,
+            src,
+            obj = {},
+            colorarray = [],
+            bannerarray = [],
+            sizearray = [],
+            classsarray = [],
+            commentarray = [];
+
+
+        /************************************************************************************banner整合(必填)************************************************************************************/
+
+        var banner = $("#ul_pics li img");
+        if (banner.length == 0) {
+            $.Huimodalalert('请上传banner图', 3000);
+            return;
+        }
+        else {
+            for (var i = 0; i < banner.length; i++) {
+                flag = i;
+                src = banner.eq(i).attr("src");
+                obj = {};
+                obj[flag] = src;
+                bannerarray.push(obj);
+            }
+            pattr["7b824b9c-738b-11e8-a479-0610c52349b6"] = bannerarray;
+        }
+
+        /************************************************************************************产品颜色分类整合(必填)*******************************************************************************/
+
+        var color = $("#ul_pics2 li"),
+            color_input = $("#ul_pics2 li input");
+        if (color.length == 0) {
+            $.Huimodalalert('请上传颜色分类图', 3000);
+            return;
+        }
+        else {
+            for (var i = 0; i < color_input.length; i++) {
+                if (color_input.eq(i).val().trim() == "") {
+                    $.Huimodalalert('请输入第' + (i + 1) + '个颜色或者说明', 3000);
+                    return;
+                }
+                else {
+                    obj = {};
+                    if (i % 2 == 0) {
+                        flag = color_input.eq(i).val();
+                        src = $($("#ul_pics2 li input")[i]).parent().find("img").attr("src");
+                        obj[flag] = src;
+                        cname = color_input.eq(i + 1).val();
+                        obj['cname'] = cname;
+                        colorarray.push(obj);
+                    }
+                    pattr["69d4e108-738a-11e8-a479-0610c52349b6"] = colorarray;
+                }
+            }
+        }
+
+        /************************************************************************************尺寸整合(可填)***************************************************************************************/
+
+        var size = $("#ul_pics3 .input");
+        for (var i = 0; i < size.length; i++) {
+            if (size.eq(i).val().trim() == "") {
+                $.Huimodalalert('请输入尺寸', 3000);
+                return;
+            }
+            flag = i;
+            src = size.eq(i).val();
+            obj = {};
+            obj[flag] = src;
+            sizearray.push(obj);
+        }
+        pattr["d6d6361b-acea-11e8-bbc6-0a4b7569e232"] = sizearray;
+
+        /************************************************************************************套餐整合(必填)***************************************************************************************/
+
+        var classs = $("#ul_pics4 li"),
+            classs_select, classs_input;
+        for (var i = 0; i < classs.length; i++) {
+            obj = {};
+            classs_select = classs.eq(i).find("select");
+            if (classs_select == 0) {
+                $.Huimodalalert('请选择第' + (i + 1) + "个套餐框中的销售数量", 3000);
+                return;
+            }
+            obj["type"] = classs_select.eq(0).val();
+            classs_input = classs.eq(i).find("input");
+            for (var j = 0; j < classs_input.length; j++) {
+                if (classs_input.eq(j).val() == "") {
+                    $.Huimodalalert('请填写第' + (i + 1) + '个套餐框中的第' + (j + 1) + '个输入框说明', 3000);
+                    return;
+                }
+            }
+
+            flag = classs_input.eq(1).val();
+            src = classs_input.eq(0).val();
+            obj[flag] = src;
+            classsarray.push(obj);
+        }
+        pattr['cfb738c4-bff6-11e8-bbc6-0a4b7569e232'] = classsarray;
+
+        /************************************************************************************评价整合(可填)***************************************************************************************/
+
+        var comment = $(".ul_pics_comment li");
+        for (var i = 0; i < comment.length; i++) {
+            if (comment.eq(i).find('input[type=text]').eq(0).val().trim() == "") {
+                $.Huimodalalert('请输入第' + (i + 1) + "个评价框中的用户名", 3000);
+                return;
+            }
+            if (comment.eq(i).find('textarea').val().trim() == "") {
+                $.Huimodalalert('请输入第' + (i + 1) + "个评价框中的评价内容", 3000);
+                return;
+            }
+
+            if (comment.eq(i).find('input[type=text]').eq(1).val().trim() == "") {
+                $.Huimodalalert('请输入第' + (i + 1) + "个评价框中的评价时间", 3000);
+                return;
+            }
+
+            obj = {};
+            obj['name'] = comment.eq(i).children().eq(0).children('input').val();
+            obj['text'] = comment.eq(i).children().eq(1).children().val();
+            obj['time'] = comment.eq(i).find("input[type=text]").eq(1).val();
+            flag = comment.eq(i).children().eq(2).children(".comment_picture");
+            src = "";
+            for (var j = 1; j < flag.length; j++) {
+                j == 1 ? "" : src += ',';
+                src += flag.eq(j).children("img").eq(0).attr("src");
+            }
+            obj['imgurl'] = src;
+            commentarray.push(obj);
+        }
+        pattr["d5cca263-c224-11e8-bbc6-0a4b7569e232"] = commentarray;
+
+        /************************************************************************************所有整合结束***************************************************************************************/
+
+        var str = JsonToString(pattr);
+        var parameter = PageType ? urlEncode(["UploadNewProduct", pn, en,pt1, escape(pt2), pr1, pr2, num, str, dis, so, prom, cd]) : urlEncode(["UpdateProductInfo", ProductId, pn, en,pt1, escape(pt2), pr1, pr2, str, dis, so, prom, cd]);
+        // $(".Submission")[0].onclick = function () {
+        // }
+        $.ajax({
+            type: "post",
+            url: "/malai/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (PageType) {
+                    if (data.length == 1 && data != -1) {
+                        alert("上传成功!");
+                        window.location.href = "product.html?pid=" + data[0].ProductId;
+                    }
+                }
+                else {
+                    if (data.length == 1 && data != -1) {
+                        alert("修改成功!");
+                        window.location.href = "product-add.html?pid=" + data[0].ProductId;
+                    }
+                }
+            }
+        });
+    }
+}
+
+//文件上传接口
+var FileUpload = function (el, cb) {
+    var file = new plupload.Uploader({ //创建实例的构造方法
+        runtimes: 'html5,flash,silverlight,html4', //上传插件初始化选用那种方式的优先级顺序
+        browse_button: el, // 上传按钮
+        url: "upload.php", //远程上传地址
+        flash_swf_url: 'plupload/Moxie.swf', //flash文件地址
+        silverlight_xap_url: 'plupload/Moxie.xap', //silverlight文件地址
+        filters: {
+            max_file_size: '200mb', //最大上传文件大小(格式100b, 10kb, 10mb, 1gb)
+            mime_types: [ //允许文件上传类型
+                {
+                    title: "files",
+                    extensions: "jpg,png,gif,ico"
+                }
+            ]
+        },
+        multi_selection: true, //true:ctrl多文件上传, false 单文件上传
+        init: {
+            FilesAdded: function (up, files) { //文件上传前
+                file.start();
+            },
+            UploadProgress: function (up, file) { //上传中,显示进度条
+            },
+            FileUploaded: function (up, file, info) { //文件上传成功的时候触发
+                var data = eval("(" + info.response + ")");
+                cb && cb(data);
+            },
+            Error: function (up, err) { //上传出错的时候触发
+                // alert(err.message);
+                alert();
+                $.Huimodalalert('服务器错误!请联系管理员', 3000);
+            }
+        },
+    });
+    file.init();
+}
+
+//连接字符串
+var urlEncode = function (arr) {
+    var i; //循环初始化
+    for (i = 0; i < arr.length; i++) {
+        arr[i] = encodeURIComponent(encodeURIComponent(arr[i]));
+    }
+    return arr.join();
+}
+
+//获取网址
+var GetUrlParam = function (name) {
+    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
+    var r = window.location.search.substr(1).match(reg);  //匹配目标参数
+    if (r != null) return unescape(r[2]);
+    return null; //返回参数值
+}
+
+//json转换为string
+var JsonToString = function (obj) {
+    var i,
+        _type = false,
+        _str = "",
+        _type = typeof (obj); //获取类型
+    //开始序列化
+    if (obj == null) {
+    }
+    else {
+        obj = obj.valueOf(); //获取值 同时类型也为对应
+        if ("boolean,number".indexOf(_type) > -1) {//bool和number类型转化
+            _str = obj.toString();
+        }
+        else if (_type == "string") {//json处理字符串时需要加上 "\""符号
+            _str = "\"" + obj + "\"";
+        }
+        else if (typeof obj == "array") { //数组处理
+            _str = "[";
+            for (i = 0; i < obj.length; i++) {
+                _str += JsonToString(obj[i]) + ((i < obj.length - 1) ? "," : "")
+            }
+            ;_str += "]";
+            return _str
+        }
+        else {//object处理
+            _str = "{";
+            for (i in obj) {
+                if (obj.hasOwnProperty(i)) {
+                    if (_str.length > 1) {
+                        _str += ","
+                    }
+                    ;_str += "\"" + i + "\":" + JsonToString(obj[i]);
+                }
+            }
+            _str += "}";
+        }
+        return _str;
+    }
+}
+
+//生成GUID
+var NewGuid = function () {
+    var _UN, i, _UGID = "";
+    for (i = 0; i < 32; i++) {
+        _UGID += Math.floor(Math.random() * 16).toString(16); //随机0  - 16 的数字 转变为16进制的字符串
+        _UN = Math.floor((i - 7) / 4);                        //计算 (i-7)除4
+        if (_UN > -1 && _UN < 4 && (i == (7 + 4 * _UN))) {    //会使guid中间加 "-"   形式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
+            _UGID += "-";
+        }
+    }
+    return _UGID;
+}

+ 270 - 0
malai/admin/js/product.js

@@ -0,0 +1,270 @@
+var test = true,
+    webNotice = false,
+    webNoticeId = "",
+    oldOrderInfo = false,
+    oldOrderInfo_malai = false;
+window.onload = function (ev) {
+    init();
+}
+
+init = function () {
+    getProductInfo("", 1, 10);
+	pagenotify();
+}
+
+
+pagenotify = function () {
+    notifyMe();
+    orderWheelSearch();
+    orderWheelSearchMaLai();
+}
+
+notifyMe = function () {
+    // 先检查浏览器是否支持
+    if (!("Notification" in window)) {
+        //alert("本浏览器不支持网页通知提示,如需要网页提示,请使用chrome浏览器打开此网站。");
+    }
+    else {
+        Notification.requestPermission(function (permission) {
+            if (permission === "granted") {
+                webNotice = true;
+            }
+            else if (Notification.permission === "denied") {
+                //alert("请打开网页通知权限,或者质询技术人员协助打开。");
+            }
+        });
+    }
+}
+
+orderWheelSearch = function () {
+    setInterval(function () {
+        var parameter = urlEncode(["OrderWheelSearch"]);
+        $.ajax({
+            type: "post",
+            url: "/new/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (oldOrderInfo == false) {
+                    oldOrderInfo = data[0];
+                }
+                else {
+                    if (oldOrderInfo.OrderId == data[0].OrderId) {
+
+                    }
+                    else {
+                        oldOrderInfo = data[0];
+                        orderNoticeBody(oldOrderInfo);
+                        $("#audio")[0].play();
+                    }
+                }
+                console.log(oldOrderInfo);
+            }
+        });
+    }, 5000);
+}
+
+orderWheelSearchMaLai = function () {
+    setInterval(function () {
+        var parameter = urlEncode(["OrderWheelSearch"]);
+        $.ajax({
+            type: "post",
+            url: "/malai/php/index.php",
+            data: {mode: parameter},
+            dataType: "json",
+            success: function (data) {
+                if (oldOrderInfo_malai == false) {
+                    oldOrderInfo_malai = data[0];
+                }
+                else {
+                    if (oldOrderInfo_malai.OrderId == data[0].OrderId) {
+
+                    }
+                    else {
+                        oldOrderInfo_malai = data[0];
+                        orderNoticeBodyMaLai(3, oldOrderInfo_malai);
+                        $("#audio")[0].play();
+                    }
+                }
+            }
+        });
+    }, 5000);
+}
+
+orderNoticeBody = function (type, data) {
+    var title, obj;
+    if (type == 1) {
+        title = "泰国来订单啦";
+    }
+    else if (type == 2) {
+        title = "台湾来订单啦";
+    }
+    else if (type == 3) {
+        title = "马来西亚来订单啦";
+    }
+    webNoticeId = data.OrderId + '<>' + data.ProductId;
+    obj = {
+        dir: "auto",
+        body: "订单号:" + data.OrderNum + "\n" +
+        "产品编号:" + data.ProductRemarks,
+        // tag: webNoticeId,
+        icon: JSON.parse(data.ProductInfoClassId)[1].img,
+        renotify: false
+    }
+    var notification = new Notification(title, obj);
+    notification.onclick = function (event, data) {
+        event.preventDefault(); // prevent the browser from focusing the Notification's tab
+        var oid = webNoticeId.split("<>")[0],
+            pid = webNoticeId.split("<>")[1];
+        window.open('https://kjdspro.com/new/admin/orderinfo.html?oid=' + oid + '&pid=' + pid, '_blank');
+    }
+}
+
+orderNoticeBodyMaLai = function (type, data) {
+    var title, obj;
+    if (type == 1) {
+        title = "泰国来订单啦";
+    }
+    else if (type == 2) {
+        title = "台湾来订单啦";
+    }
+    else if (type == 3) {
+        title = "马来西亚来订单啦";
+    }
+    webNoticeId = data.OrderId + '<>' + data.ProductId;
+    obj = {
+        dir: "auto",
+        body: "订单号:" + data.OrderNum + "\n" +
+        "产品编号:" + data.ProductRemarks,
+        // tag: webNoticeId,
+        icon: JSON.parse(data.ProductInfoClassId)[1].img,
+        renotify: false
+    }
+    var notification = new Notification(title, obj);
+    notification.onclick = function (event, data) {
+        event.preventDefault(); // prevent the browser from focusing the Notification's tab
+        var oid = webNoticeId.split("<>")[0],
+            pid = webNoticeId.split("<>")[1];
+        window.open('https://kjdspro.com/malai/admin/orderinfo.html?oid=' + oid + '&pid=' + pid, '_blank');
+    }
+}
+
+
+
+
+getProductInfo = function (judge, pageindex, pagesize) {
+    var parameter = urlEncode(["SelectAllProduct", judge, pageindex, pagesize]);
+    $.ajax({
+        type: "post",
+        url: "/malai/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><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="/malai/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";
+        }
+    }
+}
+

+ 72 - 0
malai/admin/js/productinfo.js

@@ -0,0 +1,72 @@
+window.onload = function (ev) {
+    init();
+}
+
+init = function () {
+    getOrderInfo();
+}
+
+getOrderInfo = function () {
+    var pid = getUrlParam("pid");
+    var parameter = urlEncode(["SelectProduct",pid]);
+    $.ajax({
+        type: "post",
+        url: "/malai/php/index.php",
+        data: {mode: parameter},
+        dataType: "json",
+        success: function (data) {
+            printOrderInfo(data);
+        }
+    });
+}
+
+printOrderInfo = function (data) {
+
+    var input = $('input[type="text"]'),
+        id,
+        value = data[0][0],
+        img = data[1];
+
+    /*打印基本信息*/
+    for (var i = 0; i < input.length; i++) {
+        id = input.eq(i).attr("id");
+        input.eq(i).attr("value", value[id]);
+    }
+
+    $("#ProductIntroduce").html(value.ProductIntroduce);
+
+
+    /*打印颜色*/
+    for(var i =0;i<data[1].length;i++){
+        $("#Productcolor")[0].value +=data[1][i].ProductAttrbuteName+",";
+    }
+
+    /*打印预览图*/
+    for (var i = 0; i < data[2].length; i++) {
+        $(".filelist").append($('<li><p class="imgWrap"><img src="' + data[2][i].ProductAttrbuteName + '"></p></li>'));
+    }
+    $("#PageProductInfo").html(value.ProductInfo);
+    $("#PageProductInfo").html(value.ProductInfo);
+    $("#PageProductInfo #ProductInfo div").remove();
+
+
+    $("#loading").css({"display": "none"});
+    $(".form").css({"display": "block"});
+}
+
+
+getUrlParam = function (name) {
+    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
+    var r = window.location.search.substr(1).match(reg);  //匹配目标参数
+    if (r != null) return unescape(r[2]);
+    return null; //返回参数值
+}
+
+urlEncode = function (arr) {
+    var i; //循环初始化
+    for (i = 0; i < arr.length; i++) {
+        arr[i] = encodeURIComponent(encodeURIComponent(arr[i]));
+    }
+    return arr.join();
+}
+

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 11 - 0
malai/admin/js/ui/H-ui.min.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 2 - 0
malai/admin/js/ui/laydate.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 28 - 0
malai/admin/js/ui/plupload.full.min.js


BIN
malai/admin/js/ui/theme/default/font/iconfont.eot


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 45 - 0
malai/admin/js/ui/theme/default/font/iconfont.svg


BIN
malai/admin/js/ui/theme/default/font/iconfont.ttf


BIN
malai/admin/js/ui/theme/default/font/iconfont.woff


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 2 - 0
malai/admin/js/ui/theme/default/laydate.css


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 2 - 0
malai/admin/layer/2.4/layer.js


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


BIN
malai/admin/layer/2.4/skin/default/icon.png


BIN
malai/admin/layer/2.4/skin/default/loading-0.gif


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


BIN
malai/admin/layer/2.4/skin/default/loading-2.gif


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 7 - 0
malai/admin/layer/2.4/skin/layer.css


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 13 - 0
malai/admin/lib/DD_belatedPNG_0.0.8a-min.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1648 - 0
malai/admin/lib/Hui-iconfont/1.0.8/demo.html


+ 328 - 0
malai/admin/lib/Hui-iconfont/1.0.8/iconfont.css

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

BIN
malai/admin/lib/Hui-iconfont/1.0.8/iconfont.eot


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 11 - 0
malai/admin/lib/Hui-iconfont/1.0.8/iconfont.min.css


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1265 - 0
malai/admin/lib/Hui-iconfont/1.0.8/iconfont.svg


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


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


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 57 - 0
malai/admin/lib/My97DatePicker/4.8/WdatePicker.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 5 - 0
malai/admin/lib/My97DatePicker/4.8/calendar.js


+ 14 - 0
malai/admin/lib/My97DatePicker/4.8/lang/en.js

@@ -0,0 +1,14 @@
+var $lang={
+errAlertMsg: "Invalid date or the date out of range,redo or not?",
+aWeekStr: ["wk", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
+aLongWeekStr:["wk","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],
+aMonStr: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+aLongMonStr: ["January","February","March","April","May","June","July","August","September","October","November","December"],
+clearStr: "Clear",
+todayStr: "Today",
+okStr: "OK",
+updateStr: "OK",
+timeStr: "Time",
+quickStr: "Quick Selection",
+err_1: 'MinDate Cannot be bigger than MaxDate!'
+}

+ 14 - 0
malai/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
malai/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
malai/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;
+}

BIN
malai/admin/lib/My97DatePicker/4.8/skin/datePicker.gif


+ 250 - 0
malai/admin/lib/My97DatePicker/4.8/skin/default/datepicker.css

@@ -0,0 +1,250 @@
+/* 
+ * My97 DatePicker 4.8
+ */
+
+.WdateDiv{
+	width:180px;
+	background-color:#FFFFFF;
+	border:#bbb 1px solid;
+	padding:2px;
+}
+
+.WdateDiv2{
+	width:360px;
+}
+.WdateDiv *{font-size:9pt;}
+
+.WdateDiv .NavImg a{
+	display:block;
+	cursor:pointer;
+	height:16px;
+	width:16px;
+}
+
+.WdateDiv .NavImgll a{
+	float:left;
+	background:transparent url(img.gif) no-repeat scroll 0 0;
+}
+.WdateDiv .NavImgl a{
+	float:left;
+	background:transparent url(img.gif) no-repeat scroll -16px 0;
+}
+.WdateDiv .NavImgr a{
+	float:right;
+	background:transparent url(img.gif) no-repeat scroll -32px 0;
+}
+.WdateDiv .NavImgrr a{
+	float:right;
+	background:transparent url(img.gif) no-repeat scroll -48px 0;
+}
+
+.WdateDiv #dpTitle{
+	height:24px;
+	margin-bottom:2px;
+	padding:1px;
+}
+
+.WdateDiv .yminput{
+	margin-top:2px;
+	text-align:center;
+	height:20px;
+	border:0px;
+	width:50px;
+	cursor:pointer;		
+}
+
+.WdateDiv .yminputfocus{
+	margin-top:2px;
+	text-align:center;
+	font-weight:bold;
+	height:20px;
+	color:blue;
+	border:#ccc 1px solid;
+	width:50px;
+}
+
+.WdateDiv .menuSel{
+	z-index:1;
+	position:absolute;
+	background-color:#FFFFFF;	
+	border:#ddd 1px solid;
+	display:none;
+}
+
+.WdateDiv .menu{
+	cursor:pointer;
+	background-color:#fff;
+}
+
+.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:#ddd 1px solid;
+ }
+
+.WdateDiv .MTitle{
+	background-color:#222;
+	color:#fff
+}
+.WdateDiv .WdayTable2{
+	border-collapse:collapse;
+	border:#c5d9e8 1px solid;
+}
+.WdateDiv .WdayTable2 table{
+	border:0;
+}
+
+.WdateDiv .WdayTable{
+	line-height:20px;
+	border:#c5d9e8 1px solid;
+}
+.WdateDiv .WdayTable td{
+	text-align:center;
+}
+
+.WdateDiv .Wday{
+	cursor:pointer;
+}
+
+.WdateDiv .WdayOn{
+	cursor:pointer;
+	background-color:#222;
+	color:#fff
+}
+
+.WdateDiv .Wwday{
+	cursor:pointer;
+	color:#FF2F2F;
+}
+
+.WdateDiv .WwdayOn{
+	cursor:pointer;
+	color:#fff;
+	background-color:#222;
+}
+.WdateDiv .Wtoday{
+	cursor:pointer;
+	color:blue;
+}
+.WdateDiv .Wselday{
+	background-color:#222;
+	color:#fff
+}
+.WdateDiv .WspecialDay{
+	background-color:#66F4DF;
+}
+
+.WdateDiv .WotherDay{ 
+	cursor:pointer;
+	color:#428BCA;	
+}
+
+.WdateDiv .WotherDayOn{ 
+	cursor:pointer;
+	background-color:#222;
+	color:#fff	
+}
+
+.WdateDiv .WinvalidDay{
+	color:#aaa;
+}
+
+.WdateDiv #dpTime{
+	float:left;
+	margin-top:3px;
+	margin-right:30px;
+}
+
+.WdateDiv #dpTime #dpTimeStr{
+	margin-left:1px;
+}
+
+.WdateDiv #dpTime input{
+	width:18px;
+	height:20px;
+	text-align:center;
+	border:#ccc 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;	
+}
+.WdateDiv .dpButton{ 
+	height:20px;
+	width:45px;
+	border:#ccc 1px solid;
+	margin-top:2px;
+	margin-right:1px;
+}

BIN
malai/admin/lib/My97DatePicker/4.8/skin/default/img.gif


+ 339 - 0
malai/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;
+}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1 - 0
malai/admin/lib/My97DatePicker/4.8/skin/twoer/datepicker.css


BIN
malai/admin/lib/My97DatePicker/4.8/skin/twoer/img.gif


BIN
malai/admin/lib/My97DatePicker/4.8/skin/twoer/img.png


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


+ 256 - 0
malai/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
malai/admin/lib/My97DatePicker/4.8/skin/whyGreen/img.gif


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 152 - 0
malai/admin/lib/datatables/1.10.0/jquery.dataTables.min.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 29 - 0
malai/admin/lib/echarts/3.4.0/echarts.common.min.js


BIN
malai/admin/lib/expressInstall.swf


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 50 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/highcharts-3d.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 60 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/highcharts-more.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 383 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/highcharts.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 46 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/accessibility.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1072 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/accessibility.src.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 14 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.js


+ 408 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/annotations.src.js

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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 22 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/boost.js


+ 652 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/boost.src.js

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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 14 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/broken-axis.js


+ 338 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/broken-axis.src.js

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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 26 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/data.js


+ 981 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/data.src.js

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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 25 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/drilldown.js


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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 26 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/exporting.js


+ 953 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/exporting.src.js

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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 12 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/funnel.js


+ 290 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/funnel.src.js

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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 24 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/gantt.js


+ 791 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/gantt.src.js

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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 19 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/grid-axis.js


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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 25 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/heatmap.js


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

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 12 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.js


+ 0 - 0
malai/admin/lib/hcharts/Highcharts/5.0.6/js/modules/no-data-to-display.src.js


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov