chenshilong 7 年之前
父節點
當前提交
864583cf73
共有 100 個文件被更改,包括 30681 次插入0 次删除
  1. 3 0
      .babelrc
  2. 11 0
      .gitignore
  3. 15 0
      Dockerfile_pp
  4. 17 0
      Dockerfile_qa
  5. 15 0
      Dockerfile_test
  6. 14 0
      config/cacheCfg.js
  7. 84 0
      config/config.js
  8. 67 0
      config/db/db_manager.js
  9. 272 0
      config/gulpConfig.js
  10. 220 0
      config/redis.js
  11. 369 0
      gulpfile.js
  12. 149 0
      gulpfile.js.copy
  13. 337 0
      lib/JSExpressionEval_src/Date.js
  14. 1050 0
      lib/JSExpressionEval_src/Evaluator.js
  15. 129 0
      lib/JSExpressionEval_src/ExpressionTester.htm
  16. 141 0
      lib/JSExpressionEval_src/JsHashMap.js
  17. 133 0
      lib/JSExpressionEval_src/License.txt
  18. 105 0
      lib/JSExpressionEval_src/Stack.js
  19. 108 0
      lib/JSExpressionEval_src/StackImpl.htm
  20. 119 0
      lib/JSExpressionEval_src/StackTester.htm
  21. 54 0
      lib/JSExpressionEval_src/TokanTester.htm
  22. 493 0
      lib/JSExpressionEval_src/Tokanizer.js
  23. 47 0
      lib/JSExpressionEval_src/VBEval.htm
  24. 123 0
      lib/JSExpressionEval_src/postfix.txt
  25. 657 0
      lib/bootstrap/bootstrap-paginator.js
  26. 7 0
      lib/bootstrap/bootstrap.min.js
  27. 7 0
      lib/bootstrap/css/bootstrap.min.css
  28. 4 0
      lib/font-awesome/font-awesome.min.css
  29. 二進制
      lib/font-awesome/fonts/FontAwesome.otf
  30. 二進制
      lib/font-awesome/fonts/fontawesome-webfont.eot
  31. 2671 0
      lib/font-awesome/fonts/fontawesome-webfont.svg
  32. 二進制
      lib/font-awesome/fonts/fontawesome-webfont.ttf
  33. 二進制
      lib/font-awesome/fonts/fontawesome-webfont.woff
  34. 二進制
      lib/font-awesome/fonts/fontawesome-webfont.woff2
  35. 二進制
      lib/jquery-contextmenu/font/context-menu-icons.eot
  36. 二進制
      lib/jquery-contextmenu/font/context-menu-icons.ttf
  37. 二進制
      lib/jquery-contextmenu/font/context-menu-icons.woff
  38. 二進制
      lib/jquery-contextmenu/font/context-menu-icons.woff2
  39. 287 0
      lib/jquery-contextmenu/jquery.contextMenu.css
  40. 2051 0
      lib/jquery-contextmenu/jquery.contextMenu.js
  41. 16 0
      lib/jquery-contextmenu/jquery.contextMenu.min.css
  42. 1 0
      lib/jquery-contextmenu/jquery.contextMenu.min.css.map
  43. 2 0
      lib/jquery-contextmenu/jquery.contextMenu.min.js
  44. 1 0
      lib/jquery-contextmenu/jquery.contextMenu.min.js.map
  45. 513 0
      lib/jquery-contextmenu/jquery.ui.position.js
  46. 6 0
      lib/jquery-contextmenu/jquery.ui.position.min.js
  47. 11 0
      lib/jquery-editable-select/jquery.editable-select.min.css
  48. 7 0
      lib/jquery-editable-select/jquery.editable-select.min.js
  49. 二進制
      lib/jquery-ui/images/ui-icons_444444_256x240.png
  50. 二進制
      lib/jquery-ui/images/ui-icons_555555_256x240.png
  51. 二進制
      lib/jquery-ui/images/ui-icons_777620_256x240.png
  52. 二進制
      lib/jquery-ui/images/ui-icons_777777_256x240.png
  53. 二進制
      lib/jquery-ui/images/ui-icons_cc0000_256x240.png
  54. 二進制
      lib/jquery-ui/images/ui-icons_ffffff_256x240.png
  55. 36 0
      lib/jquery-ui/jquery-ui-datepickerCN.js
  56. 1312 0
      lib/jquery-ui/jquery-ui.css
  57. 13 0
      lib/jquery-ui/jquery-ui.min.js
  58. 4 0
      lib/jquery/jquery-3.2.1.min.js
  59. 16 0
      lib/js-xlsx/xlsx.core.min.js
  60. 12557 0
      lib/lodash/lodash.js
  61. 1 0
      lib/lz-string/lz-string.min.js
  62. 5 0
      lib/popper/popper.min.js
  63. 785 0
      lib/spreadjs/sheets/css/gc.spread.sheets.10.0.1.css
  64. 855 0
      lib/spreadjs/sheets/css/gc.spread.sheets.excel2013darkGray.10.0.1.css
  65. 857 0
      lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css
  66. 850 0
      lib/spreadjs/sheets/css/gc.spread.sheets.excel2013white.10.0.1.css
  67. 857 0
      lib/spreadjs/sheets/css/gc.spread.sheets.excel2016colorful.10.0.1.css
  68. 850 0
      lib/spreadjs/sheets/css/gc.spread.sheets.excel2016darkGray.10.0.1.css
  69. 864 0
      lib/spreadjs/sheets/css/gc.spread.sheets.sc.css
  70. 62 0
      lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js
  71. 36 0
      lib/spreadjs/sheets/interop/gc.spread.excelio.11.1.2.min.js
  72. 17 0
      lib/spreadjs/sheets/pluggable/gc.spread.calcengine.10.0.1.min.js
  73. 15 0
      lib/spreadjs/sheets/pluggable/gc.spread.calcengine.advancedfunctions.10.0.1.min.js
  74. 13 0
      lib/spreadjs/sheets/pluggable/gc.spread.calcengine.basicfunctions.10.0.1.min.js
  75. 16 0
      lib/spreadjs/sheets/pluggable/gc.spread.common.10.0.1.min.js
  76. 13 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.bindings.10.0.1.min.js
  77. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.celltypes.10.0.1.min.js
  78. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.comments.10.0.1.min.js
  79. 15 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.conditionalformatting.10.0.1.min.js
  80. 27 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.core.10.0.1.min.js
  81. 13 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.datavalidation.10.0.1.min.js
  82. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.fill.10.0.1.min.js
  83. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.filter.10.0.1.min.js
  84. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.floatingobjects.10.0.1.min.js
  85. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.formulatextbox.10.0.1.min.js
  86. 13 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.outlines.10.0.1.min.js
  87. 13 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.print.10.0.1.min.js
  88. 13 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.search.10.0.1.min.js
  89. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.slicers.10.0.1.min.js
  90. 13 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.sparklines.10.0.1.min.js
  91. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.tables.10.0.1.min.js
  92. 14 0
      lib/spreadjs/sheets/pluggable/gc.spread.sheets.touch.10.0.1.min.js
  93. 16 0
      lib/spreadjs/sheets/resources/ja/gc.spread.sheets.resources.ja.10.0.1.min.js
  94. 15 0
      lib/spreadjs/sheets/resources/zh/gc.spread.sheets.resources.zh.10.0.1.min.js
  95. 4 0
      lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js
  96. 13 0
      lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css
  97. 24 0
      lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js
  98. 13 0
      lib/spreadjs/views/locale/gc.spread.views.dataView.locale.en-US.10.0.0.min.js
  99. 13 0
      lib/spreadjs/views/locale/gc.spread.views.dataView.locale.ja-JP.10.0.0.min.js
  100. 0 0
      lib/spreadjs/views/locale/gc.spread.views.dataView.locale.zh-CN.10.0.0.min.js

+ 3 - 0
.babelrc

@@ -0,0 +1,3 @@
+{
+  "presets": ["es2015", "stage-2"]
+}

+ 11 - 0
.gitignore

@@ -0,0 +1,11 @@
+node_modules/
+.git/
+dist/
+.idea/
+tmp/*.xlsx
+tmp/*.pdf
+tmp/*.jsp
+test/unit/logs
+*.log
+modules/reports/util/pdf_base_files/*.ttf
+modules/reports/util/pdf_base_files/*.ttc

+ 15 - 0
Dockerfile_pp

@@ -0,0 +1,15 @@
+FROM costbase:2.0
+
+WORKDIR /home/ConstructionCost
+
+COPY . /home/ConstructionCost
+
+RUN cnpm install
+
+RUN gulp build
+
+EXPOSE 6060
+
+ENV NODE_ENV=pp
+
+ENTRYPOINT babel-node server.js

+ 17 - 0
Dockerfile_qa

@@ -0,0 +1,17 @@
+FROM costbase:2.0
+
+WORKDIR /home/ConstructionCost
+
+COPY . /home/ConstructionCost
+
+RUN cnpm install
+
+RUN gulp build
+
+EXPOSE 6060
+
+ENV NODE_ENV=qa
+
+ENTRYPOINT babel-node server.js
+
+

+ 15 - 0
Dockerfile_test

@@ -0,0 +1,15 @@
+FROM costbase:latest
+
+WORKDIR /home/ConstructionCost
+
+RUN git pull http://192.168.1.12:3000/SmartCost/ConstructionCost master
+
+RUN cnpm install
+
+RUN gulp build
+
+EXPOSE 6060
+
+ENV NODE_ENV=qa
+
+ENTRYPOINT babel-node server.js

+ 14 - 0
config/cacheCfg.js

@@ -0,0 +1,14 @@
+/**
+ * Created by Tony on 2017/3/24.
+ */
+var rptUtil = require("../modules/reports/util/rpt_util");
+var stdTypesUtil = require("../public/cache/std_glj_type_util");
+//rptUtil.setReportDefaultCache();
+
+module.exports = {
+    setupDftCache: function() {
+        rptUtil.setReportDefaultCache();
+        stdTypesUtil.setStdGljTypeCache();
+        //and others...(if any)
+    }
+}

文件差異過大導致無法顯示
+ 84 - 0
config/config.js


+ 67 - 0
config/db/db_manager.js

@@ -0,0 +1,67 @@
+/**
+ * Created by Tony on 2017/3/9.
+ */
+var mg = require('mongoose');
+//var Promise = require('bluebird');
+mg.Promise = require('bluebird');
+//mg.connect('mongodb://localhost/Demo');
+module.exports = {
+    getConnection : function(server, port, dbName) {
+        //*/
+        var dbURL = 'mongodb://' + server + ":" + port + '/' + dbName;
+        return mg.createConnection(dbURL);
+        /*/
+        if (port) {
+            mg.connect('mongodb://' + server + ":" + port + '/' + dbName);
+        } else {
+            mg.connect('mongodb://' + server + '/' + dbName);
+        }
+        return mg;
+        //*/
+    },
+    getQAConnection: function(dbName) {
+        //*/
+        return mg.createConnection("mongodb://192.168.1.184:60666/" + dbName);
+        /*/
+        mg.connect('mongodb://192.168.1.184:60666/' + dbName);
+        return mg;
+        //*/
+    },
+    getLocalConnection: function(dbName) {
+        //*/
+        return mg.createConnection("mongodb://localhost/" + dbName);
+        /*/
+        mg.connect('mongodb://localhost:27017/' + dbName);
+        return mg;
+        //*/
+    },
+    getCfgConnection: function(dbName) {
+        var config = require("../config.js");
+        //*/
+        var port = config.current.port;
+        var dbURL = 'mongodb://' + config.current.server + ":" + config.current.port + '/' + dbName;
+        return mg.createConnection(dbURL);
+        /*/
+        mg.connect('mongodb://' + config.current.server + ":" + config.current.port + '/' + dbName);
+        return mg;
+        //*/
+    },
+    connect:function (env="local") {
+        var config = require("../config.js");
+        var dbURL = 'mongodb://' + config[env].server + ":" + config[env].port + '/yanghu';
+        if(config[env].dbURL){
+            mg.connect(config[env].dbURL,{connectTimeoutMS: 20000,useMongoClient: true});
+        } else if(config[env].options){
+            mg.connect(dbURL,config[env].options);
+        }else {
+            mg.connect(dbURL,{connectTimeoutMS: 20000,useMongoClient: true});//useMongoClient': true*! //报 DeprecationWarning: `open()` is deprecated in mongoose这个错
+        }
+        var db = mg.connection;
+        db.on("error",function (err) {
+            console.log('Could not connect to MongoDB!');
+            console.log(err);
+            process.exit(-1);
+        })
+        return mg;
+    }
+};

+ 272 - 0
config/gulpConfig.js

@@ -0,0 +1,272 @@
+/**
+ * Created by zhang on 2017/9/27.
+ */
+
+module.exports = {
+    version:'1.0.1',
+    common_jspaths:[
+        'lib/jquery/jquery-3.2.1.min.js',
+        'lib/jquery-ui/jquery-ui.min.js',
+        'lib/popper/popper.min.js',
+        'lib/bootstrap/bootstrap.min.js',
+        'web/building_saas/js/*.js',
+        'public/web/scMathUtil.js',
+        'public/web/gljUtil.js',
+        'public/web/PerfectLoad.js',
+        'lib/lodash/lodash.js',
+        'public/web/commonAlert.js',
+        'public/web/headerOpr.js',
+        'lib/jquery-editable-select/jquery.editable-select.min.js'
+    ],
+    common_css:[
+        'lib/jquery-ui/jquery-ui.css',
+        'lib/bootstrap/css/bootstrap.min.css',
+        'lib/spreadjs/sheets/css/gc.spread.sheets.sc.css',
+        'web/building_saas/css/main.css',
+        'web/building_saas/css/custom.css',
+        'lib/font-awesome/font-awesome.min.css',
+        'lib/jquery-editable-select/jquery.editable-select.min.css'
+    ],
+    login_jspaths:[
+        'public/web/url_util.js',
+        'web/users/js/login.js',
+    ],
+    pm_css:[
+        'lib/ztree/css/zTreeStyle.css',
+        'lib/jquery-contextmenu/jquery.contextMenu.css'
+    ],
+    pm_jspaths:[
+        'public/web/uuid.js',
+        'public/web/date_util.js',
+        'public/web/id_tree.js',
+        'public/web/tree_sheet/tree_sheet_helper.js',
+        'public/web/sheet/sheet_data_helper.js',
+        'public/web/sheet/sheet_common.js',
+        'public/web/common_ajax.js',
+        'lib/JSExpressionEval_src/Date.js',
+        'web/building_saas/glj/js/socket.io.slim.js',
+        'public/web/socket/connection.js',
+        'web/building_saas/pm/js/**/*.js',
+        'lib/ztree/*.js',
+        'lib/jquery-contextmenu/jquery.contextMenu.min.js'
+    ],
+    main_css:[
+        'lib/ztree/css/zTreeStyle.css',
+        //'lib/jquery-ui/jquery-ui.css',
+        //'lib/spreadjs/sheets/css/gc.spread.sheets.sc.css',
+        'lib/jquery-contextmenu/jquery.contextMenu.css'
+    ],
+    main_jspaths:[
+        'lib/JSExpressionEval_src/*.js',
+        '!lib/JSExpressionEval_src/JsHashMap.js',
+       /* 'lib/jquery-ui/jquery-ui.min.js',
+        'lib/jquery-ui/jquery-ui-datepickerCN.js',
+        'lib/jquery-contextmenu/!*.js',*/
+        //'lib/lodash/lodash.js',
+        // 'test/tmp_data/test_ration_calc/ration_calc_base.js',
+        'web/building_saas/main/js/models/main_consts.js',
+        'public/web/common_util.js',
+        'web/building_saas/glj/js/project_glj.js',
+        'web/building_saas/glj/js/composition.js',
+        'web/building_saas/glj/js/common_spread.js',
+        'web/building_saas/glj/js/composition_spread.js',
+        'web/building_saas/glj/js/project_glj_spread.js',
+        'web/building_saas/glj/js/socket.io.slim.js',
+        'public/web/socket/connection.js',
+        'public/web/uuid.js',
+        'public/web/sheet/sheet_common.js',
+        'web/building_saas/main/js/models/calc_program.js',
+        'web/building_saas/main/js/models/calc_base.js',
+        'web/building_saas/main/js/views/calc_program_manage.js',
+        'public/web/common_ajax.js',
+        'public/web/url_util.js',
+        'public/web/number_util.js',
+        'public/web/sheet/sheet_common.js',
+        'public/web/slideResize.js',
+       // 'lib/ztree/*.js',
+        'lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2',
+       // 'lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js',
+       // "lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js",
+      //  'lib/spreadjs/views/plugins/gc.spread.views.gridlayout.10.0.0.min.js',
+        'web/building_saas/main/js/models/project.js',
+        'web/building_saas/main/js/models/bills.js',
+        'web/building_saas/main/js/models/ration.js',
+        'web/building_saas/main/js/models/glj.js',
+        'web/building_saas/main/js/models/project_glj.js',
+        'web/building_saas/main/js/models/composition.js',
+        'web/building_saas/main/js/models/fee_rate.js',
+        'web/building_saas/main/js/models/ration_glj.js',
+        'web/building_saas/main/js/models/ration_coe.js',
+        'web/building_saas/main/js/models/ration_ass.js',
+        'web/building_saas/main/js/models/ration_installation.js',
+        'web/building_saas/main/js/models/ration_template.js',
+        // 'web/building_saas/main/js/models/volume_price.js',
+        'web/building_saas/main/js/models/labour_coe.js',
+        'web/building_saas/main/js/models/installation_fee.js',
+        'public/web/id_tree.js',
+        'web/building_saas/main/js/models/cache_tree.js',
+        'web/building_saas/main/js/calc/calc_fees.js',
+        // 'web/building_saas/main/js/calc/ration_calc.js',
+        // 'web/building_saas/main/js/calc/bills_calc.js',
+        // 'public/calc_util.js',
+        'public/web/tree_sheet/tree_sheet_controller.js',
+        'public/web/tree_sheet/tree_sheet_helper.js',
+        'public/web/sheet/sheet_data_helper.js',
+        'web/building_saas/main/js/views/glj_col.js',
+        'web/building_saas/main/js/views/main_tree_col.js',
+        'web/building_saas/main/js/views/project_info.js',
+        'web/building_saas/main/js/views/project_view.js',
+        'web/building_saas/main/js/views/options_view.js',
+        'web/building_saas/main/js/views/project_property_bills_quantity_decimal.js',
+        'web/building_saas/main/js/views/project_property_decimal_view.js',
+        'web/building_saas/main/js/views/project_property_basicInfo.js',
+        'web/building_saas/main/js/views/project_property_projFeature.js',
+        'web/building_saas/main/js/views/project_property_indicativeInfo.js',
+        'web/building_saas/main/js/views/project_property_display_view.js',
+        'web/building_saas/main/js/main_ajax.js',
+        'web/building_saas/main/js/main.js',
+        'web/building_saas/main/js/controllers/project_controller.js',
+        'web/building_saas/main/js/controllers/block_controller.js',
+        'web/building_saas/main/js/controllers/material_controller.js',
+        'web/building_saas/main/js/views/side_tools.js',
+        'web/building_saas/main/js/views/std_billsGuidance_lib.js',
+        'web/building_saas/main/js/views/std_bills_lib.js',
+        'web/building_saas/main/js/views/std_ration_lib.js',
+        'web/building_saas/main/js/views/block_lib.js',
+        'web/building_saas/main/js/models/quantity_detail.js',
+        'web/building_saas/main/js/views/glj_view_contextMenu.js',
+        'web/building_saas/main/js/views/calc_program_view.js',
+        'web/building_saas/main/js/views/confirm_modal.js',
+        'web/building_saas/main/js/views/zlfb_view.js',
+        'web/building_saas/main/js/views/installation_fee_view.js',
+        'web/building_saas/main/js/views/project_glj_view.js',
+        'web/building_saas/main/js/views/importBills.js',
+        'public/web/rpt_tpl_def.js',
+        'public/web/treeDataHelper.js',
+        'public/web/string_util_light.js',
+        'public/web/ztree_common.js',
+        'web/building_saas/report/js/rpt_main.js',
+        'web/building_saas/report/js/rpt_cfg_const.js',
+        'web/building_saas/report/js/jpc_output_value_define.js',
+        'web/building_saas/report/js/jpc_output.js',
+        'web/building_saas/report/js/rpt_print.js',
+        'web/building_saas/main/js/views/character_content_view.js',
+        'web/building_saas/main/js/views/glj_view.js',
+        'web/building_saas/main/js/views/zmhs_view.js',
+        'web/building_saas/main/js/views/mbzm_view.js',
+        'web/building_saas/main/js/views/tender_price_view.js',
+        'web/building_saas/main/js/views/billsElf.js',
+        'web/building_saas/main/js/views/sub_view.js',
+        'web/building_saas/main/js/views/fee_rate_view.js',
+        'web/building_saas/main/js/views/quantity_edit_view.js',
+        'web/building_saas/main/js/views/sub_fee_rate_views.js',
+        'web/building_saas/main/js/views/calc_base_view.js',
+        'web/building_saas/main/js/views/project_property_labour_coe_view.js',
+        'web/building_saas/main/js/views/locate_view.js',
+        'web/building_saas/complementary_ration_lib/js/main.js',
+        'public/web/storageUtil.js'
+    ],
+    compleGlj_css: [
+        'lib/jquery-contextmenu/jquery.contextMenu.css',
+        'lib/ztree/css/zTreeStyle.css',
+    ],
+    compleGlj_jspaths: [
+        'public/web/common_ajax.js',
+        'public/web/treeDataHelper.js',
+        'public/web/QueryParam.js',
+        'lib/lodash/lodash.js',
+        'public/web/id_tree.js',
+        'public/web/tree_sheet/tree_sheet_controller.js',
+        'public/web/tree_sheet/tree_sheet_helper.js',
+        'public/web/tools_const.js',
+        'public/web/ration_glj_units.js',
+        'web/building_saas/complementary_glj_lib/js/glj.js',
+        'web/building_saas/complementary_glj_lib/js/gljClassTree.js',
+        'web/building_saas/complementary_glj_lib/js/gljComponent.js',
+        'web/building_saas/complementary_glj_lib/js/components.js',
+        'public/web/ztree_common.js',
+        'public/web/sheet/sheet_common.js',
+        'web/building_saas/complementary_glj_lib/js/sheetOpr.js',
+        'public/web/storageUtil.js',
+        'public/web/slideResize.js'
+    ],
+    compleRation_ration_css: [
+        'lib/ztree/css/zTreeStyle.css',
+        'lib/jquery-contextmenu/jquery.contextMenu.css',
+    ],
+    compleRation_ration_jspaths:[
+        '/public/web/uuid.js',
+        'lib/jquery-contextmenu/jquery.contextMenu.min.js',
+        'lib/jquery-contextmenu/jquery.ui.position.js',
+        'lib/ztree/jquery.ztree.core.js',
+        'web/building_saas/complementary_ration_lib/js/global.js',
+        'public/web/id_tree.js',
+        'public/web/tree_sheet/tree_sheet_controller.js',
+        'public/web/tree_sheet/tree_sheet_helper.js',
+        'public/web/treeDataHelper.js',
+        'public/web/sheet/sheet_common.js',
+        'public/web/sheet/sheet_data_helper.js',
+        'web/building_saas/complementary_ration_lib/js/sheetsOpr.js',
+        'public/web/QueryParam.js',
+        'public/web/storageUtil.js',
+        'web/building_saas/complementary_ration_lib/js/section_tree.js',
+        'web/building_saas/complementary_ration_lib/js/explanatory.js',
+        'web/building_saas/complementary_ration_lib/js/jobContent.js',
+        'web/building_saas/complementary_ration_lib/js/annotation.js',
+        'public/web/scMathUtil.js',
+        'public/web/common_ajax.js',
+        'public/web/ztree_common.js',
+        'public/web/ration_glj_units.js',
+        'web/building_saas/complementary_ration_lib/js/ration.js',
+        'web/building_saas/complementary_ration_lib/js/gljSelect.js',
+        'web/building_saas/complementary_ration_lib/js/ration_glj.js',
+        'web/building_saas/complementary_ration_lib/js/ration_coe.js',
+        'web/building_saas/complementary_ration_lib/js/ration_assist.js',
+        'web/building_saas/complementary_ration_lib/js/ration_installation.js.js',
+        'public/web/slideResize.js',
+        'web/building_saas/complementary_ration_lib/js/coe.js'
+    ],
+    compleRation_glj_css: [
+    ],
+    compleRation_glj_jspaths: [
+        'web/building_saas/complementary_ration_lib/js/global.js',
+        'public/web/common_ajax.js',
+        'public/web/treeDataHelper.js',
+        'public/web/QueryParam.js',
+        'web/building_saas/complementary_ration_lib/js/repository_glj.js',
+        'public/web/ztree_common.js',
+        'public/web/sheet/sheet_common.js',
+        'web/building_saas/complementary_ration_lib/js/sheetsOpr.js',
+        'public/web/storageUtil.js'
+    ],
+    compleRation_coe_css: [
+    ],
+    compleRation_coe_jspaths: [
+        'web/building_saas/complementary_ration_lib/js/global.js',
+        'public/web/common_ajax.js',
+        'public/web/treeDataHelper.js',
+        'public/web/QueryParam.js',
+        'public/web/common_util.js',
+        'public/web/sheet/sheet_common.js',
+        'web/building_saas/complementary_ration_lib/js/sheetsOpr.js',
+        'public/web/storageUtil.js',
+        'web/building_saas/complementary_ration_lib/js/coe.js'
+    ],
+    compleRation_inst_css: [
+        'lib/jquery-contextmenu/jquery.contextMenu.css',
+    ],
+    compleRation_inst_jspaths: [
+        'public/web/QueryParam.js',
+        'public/web/uuid.js',
+        'public/web/common_util.js',
+        'public/web/storageUtil.js',
+        'public/web/id_tree.js',
+        'public/web/tree_sheet/tree_sheet_controller.js',
+        'public/web/tree_sheet/tree_sheet_helper.js',
+        'public/web/sheet/sheet_common.js',
+        'public/web/common_ajax.js',
+        'web/building_saas/complementary_ration_lib/js/global.js',
+        'web/building_saas/complementary_ration_lib/js/installation.js'
+    ]
+}
+

+ 220 - 0
config/redis.js

@@ -0,0 +1,220 @@
+/**
+ * Created by chen on 2017/8/21.
+ */
+
+let Redis = require('ioredis'),
+    config=require('./config'),
+    redisConfig = config.current.redis;
+    redis = new Redis({
+        port: redisConfig.port,          // Redis port
+        host: redisConfig.server,   // Redis host
+        family: 4,           // 4 (IPv4) or 6 (IPv6)
+        password:redisConfig.pwd,
+        db: 0
+    });
+let client={};
+
+redis.on('ready',function(res){
+    console.log('ready');
+});
+
+redis.on("error", function (err) {
+    console.log("Error " + err);
+});
+client.redis = redis;
+//redis.hmset('测试',{12525:55,'a':'aaaa',b:"bbbbb"});
+
+//var stream = redis.scanStream({  match: '测*'});
+
+/*redis.hmset('RATION',{12525:55,'a':'aaaa',b:"bbbbb"});
+
+redis.hgetall("RATION",function (err,result) {
+    console.log(result);
+})*/
+
+
+client.scan = function(options,callback){
+    var stream = null;
+    if(options){
+        stream = redis.scanStream(options);
+    }else {
+        stream = redis.scanStream();
+    }
+    var keys = [];
+    stream.on('data', function (resultKeys) {
+        // `resultKeys` is an array of strings representing key names
+        for (var i = 0; i < resultKeys.length; i++) {
+            keys.push(resultKeys[i]);
+        }
+    });
+    stream.on('end', function () {
+        console.log('done with the keys: ', keys);
+        callback(keys);
+    });
+}
+
+client.set = function(key, value, expire, callback){
+    return redis.set(key, value, function(err, result){
+        if (err) {
+            console.log(err);
+            callback(err,null);
+            return;
+        }
+        if (!isNaN(expire) && expire > 0) {
+            redis.expire(key, parseInt(expire));
+        }
+        if(callback){
+            callback(null,result);
+        }
+    })
+}
+
+
+client.get = function(key, callback){
+    return redis.get(key, function(err,result){
+        if (err) {
+            console.log(err);
+            callback(err,null);
+            return;
+        }
+        if(callback){
+            callback(null,result);
+        }
+    });
+}
+
+client.hmset = function(key, value, expire, callback){
+    return redis.hmset(key, value, function(err, result){
+        if (err) {
+            console.log(err);
+            callback(err,null);
+            return;
+        }
+        if (!isNaN(expire) && expire > 0) {
+            redis.expire(key, parseInt(expire));
+        }
+        if(callback){
+            callback(null,result);
+        }
+    })
+}
+
+client.hmget = function (key,fields,callback) {
+    return redis.hmget(key,fields,function(err,result){
+        if (err) {
+            console.log(err);
+            callback(err,null)
+            return;
+        }
+        if(callback){
+            callback(null,result);
+        }
+    })
+}
+
+client.hgetall = function (key,callback) {
+    return redis.hgetall(key,function (err,result) {
+        if (err) {
+            console.log(err);
+            callback(err,null)
+            return;
+        }
+        callback(null,result);
+    })
+}
+
+
+client.hscan = function (key,options) {
+    var stream = null;
+    if(options){
+        stream = redis.hscanStream(key,options);
+    }else {
+        stream = redis.hscanStream(key);
+    }
+    var fields = [];
+    stream.on('data', function (resultFields) {
+        // `resultKeys` is an array of strings representing key names
+        for (var i = 0; i < resultFields.length; i++) {
+            fields.push(resultFields[i]);
+        }
+    });
+    stream.on('end', function () {
+        console.log('done with the keys: ', fields);
+        callback(fields);
+    });
+}
+
+client.rpush = function(key,value,expire, callback){
+    return redis.rpush(key, value, function(err, result){
+        if (err) {
+            console.log(err);
+            callback(err,null);
+            return;
+        }
+        if (!isNaN(expire) && expire > 0) {
+            redis.expire(key, parseInt(expire));
+        }
+        if(callback){
+            callback(null,result);
+        }
+    })
+}
+
+client.lrange= function (key,start,end,callback) {
+   return redis.lrange(key,start,end,callback);//获取列表在给定范围上的所有值 array lrange('key', 0, -1) (返回所有值)
+}
+
+client.lindex =function (key,index,callback) {
+    return redis.lindex(key,index,callback);//获取列表在给定位置上的单个元素 lindex('key', 1)
+}
+
+client.lpop = function (key,callback) {
+    return redis.lpop(key,callback);//从列表左端弹出一个值,并返回被弹出的值lpop('key')
+}
+
+client.rpop = function (key,callback) {
+    return redis.rpop(key,callback);//从列表右端弹出一个值,并返回被弹出的值rpop('key')
+}
+
+client.ltrim = function (key,start,end,callback) {
+    return redis.ltrim(key,start,end,callback);//将列表按指定的index范围裁减 ltrim('key', 'start', 'end')
+}
+
+
+client.del = function (keys,callback) {
+    return redis.del(keys,callback);// 删除一个(或多个)keys return 被删除的keys的数量  del('key1'[, 'key2', ...])
+}
+
+client.exists = function (key,callback) {
+    return redis.exists(key,callback);// 查询一个key是否存在  1/0 exists('key')
+}
+
+client.multi = function () {
+    return redis.multi();//用于开启一个事务,它总是返回 OK 。
+}
+
+client.exec =function () {
+   return redis.exec();//执行所有事务块内的命令
+}
+
+client.application_init = function () {
+    redis.flushdb();//清空所有keys
+    // load datas -- to do
+    /*data=[{
+     method:'hmset',
+     key:'ration:25555',
+     value:{
+     name:'aaa',
+     quantily:255
+     },
+     expire:2000,//options
+     callback:function, //option
+     }]
+     for(let data of datas){
+     client[data.method](data.key,data.value,data.expire,data.callback);
+     }
+     */
+}
+
+
+module.exports = client

+ 369 - 0
gulpfile.js

@@ -0,0 +1,369 @@
+/**
+ * Created by chen on 2017/9/26.
+ */
+
+let gulp =require( 'gulp');
+let gulpLoadPlugins = require('gulp-load-plugins');
+let del = require('del');
+let uglify = require('gulp-uglify-es').default;
+let config = require("./config/gulpConfig.js");
+
+const $ = gulpLoadPlugins();
+let common_jspaths=config.common_jspaths;
+let common_css=config.common_css;
+let pm_jspaths=config.pm_jspaths;
+let pm_csspaths=config.pm_css;
+let login_jspaths=config.login_jspaths;
+let main_jspaths=config.main_jspaths;
+let main_csspaths=config.main_css;
+let compleGlj_jspaths = config.compleGlj_jspaths;
+let compleGlj_csspaths = config.compleGlj_css;
+let compleRation_ration_jspaths = config.compleRation_ration_jspaths;
+let compleRation_ration_csspaths = config.compleRation_ration_css;
+let compleRation_glj_jspaths = config.compleRation_glj_jspaths;
+let compleRation_glj_csspaths = config.compleRation_glj_css;
+let compleRation_coe_jspaths = config.compleRation_coe_jspaths;
+let compleRation_coe_csspaths = config.compleRation_coe_css;
+let compleRation_inst_csspaths = config.compleRation_inst_css;
+let compleRation_inst_jspaths = config.compleRation_inst_jspaths;
+let version=config.version;
+let cssDest='web/dest/css';
+let scriptsDest='web/dest/scripts';
+
+let commonOptions={
+    jspaths:common_jspaths,
+    csspaths:common_css,
+    concatName:'common.all.min'
+};
+
+let headerOptions={
+    version:version,
+    scriptsDest:'web/dest/scripts',
+    concatName:'header.all.min',
+    srcHtml:'web/src/html/common/header.html',
+    htmlDest:'web/common/html',
+    htmlName:'header.html',
+    injectList:['web/dest/scripts/common.all.min.'+version+'.js']
+};
+
+let loginOptions={
+    version:version,
+    scriptsDest:'web/dest/scripts',
+    jspaths:login_jspaths,
+    concatName:'login.all.min',
+    srcHtml:'web/src/html/login/login.html',
+    htmlDest:'web/users/html',
+    htmlName:'login.html',
+    injectList:[  'web/dest/scripts/common.all.min.'+version+'.js',
+        'web/dest/scripts/login.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.'+version+'.css']
+}
+
+let pmOptions={
+    version:version,
+    scriptsDest:'web/dest/scripts',
+    jspaths:pm_jspaths,
+    csspaths:pm_csspaths,
+    concatName:'pm.all.min',
+    srcHtml:'web/src/html/pm/!*.html',
+    htmlDest:'web/building_saas/pm/html',
+    htmlName:'project-management.html',
+    injectList:['web/dest/scripts/pm.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.'+version+'.css',
+        'web/dest/css/pm.all.min.'+version+'.css']
+};
+
+let mainOptions={
+    version:version,
+    scriptsDest:'web/dest/scripts',
+    jspaths:main_jspaths,
+    csspaths:main_csspaths,
+    concatName:'main.all.min',
+    srcHtml:'web/src/html/main/main.html',
+    htmlDest:'web/building_saas/main/html',
+    htmlName:'main.html',
+    injectList:['web/dest/scripts/main.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.'+version+'.css',
+        'web/dest/css/main.all.min.'+version+'.css']
+}
+
+let compleGljOptions = {
+    version: version,
+    scriptsDest: 'web/dest/scripts',
+    jspaths: compleGlj_jspaths,
+    csspaths: compleGlj_csspaths,
+    concatName: 'compleGlj.all.min',
+    srcHtml: 'web/src/html/complementary_glj_lib/tools-gongliaoji.html',
+    htmlDest: 'web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html',
+    htmlName: 'tools-gongliaoji.html',
+    injectList: [
+        'web/dest/scripts/compleGlj.all.min' + version + '.js',
+        'web/dest/css/compleGlj.all.min' + version + '.css',
+        'web/dest/css/common.all.min.' + version + '.css'
+    ]
+};
+
+let compleRation_rationOptions = {
+    version: version,
+    scriptsDest: 'web/dest/scripts',
+    jspaths: compleRation_ration_jspaths,
+    csspaths: compleRation_ration_csspaths,
+    concatName: 'compleRation_ration.all.min',
+    srcHtml: 'web/src/html/complementary_ration_lib/dinge.html',
+    htmlDest: 'web/building_saas/complementary_ration_lib/html/dinge.html',
+    htmlName: 'dinge.html',
+    injectList: [
+        'web/dest/scripts/compleRation_ration.all.min' + version + '.js',
+        'web/dest/css/compleRation_ration.all.min' + version + '.css',
+        'web/dest/scripts/common.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.' + version + '.css'
+    ]
+};
+
+let compleRation_gljOptions = {
+    version: version,
+    scriptsDest: 'web/dest/scripts',
+    jspaths: compleRation_glj_jspaths,
+    csspaths: compleRation_glj_csspaths,
+    concatName: 'compleRation_glj.all.min',
+    srcHtml: 'web/src/html/complementary_ration_lib/gongliao.html',
+    htmlDest: 'web/building_saas/complementary_ration_lib/html/gongliao.html',
+    htmlName: 'gongliao.html',
+    injectList: [
+        'web/dest/scripts/compleRation_glj.all.min' + version + '.js',
+        'web/dest/scripts/compleRation_glj.all.min' + version + '.css',
+        'web/dest/scripts/common.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.' + version + '.css'
+    ]
+};
+
+let compleRation_coeOptions = {
+    version: version,
+    scriptsDest: 'web/dest/scripts',
+    jspaths: compleRation_coe_jspaths,
+    csspaths: compleRation_coe_csspaths,
+    concatName: 'compleRation_coe.all.min',
+    srcHtml: 'web/src/html/complementary_ration_lib/fuzhu.html',
+    htmlDest: 'web/building_saas/complementary_ration_lib/html/fuzhu.html',
+    htmlName: 'fuzhu.html',
+    injectList: [
+        'web/dest/scripts/compleRation_coe.all.min' + version + '.js',
+        'web/dest/scripts/compleRation_coe.all.min' + version + '.css',
+        'web/dest/scripts/common.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.' + version + '.css'
+    ]
+};
+
+let compleRation_instOptions = {
+    version: version,
+    scriptsDest: 'web/dest/scripts',
+    jspaths: compleRation_inst_jspaths,
+    csspaths: compleRation_inst_csspaths,
+    concatName: 'compleRation_inst.all.min',
+    srcHtml: 'web/src/html/complementary_ration_lib/anzhuang.html',
+    htmlDest: 'web/building_saas/complementary_ration_lib/html/anzhuang.html',
+    htmlName: 'anzhuang.html',
+    injectList: [
+        'web/dest/scripts/compleRation_inst.all.min' + version + '.js',
+        'web/dest/scripts/compleRation_inst.all.min' + version + '.css',
+        'web/dest/scripts/common.all.min.'+version+'.js',
+        'web/dest/css/common.all.min.' + version + '.css'
+    ]
+}
+
+function minify(options) {
+    if(options.jspaths){
+        return gulp.src(options.jspaths)
+            .pipe($.plumber())
+            .pipe(uglify())
+            .pipe($.concat(options.concatName+"."+version+".js"))
+            .pipe(gulp.dest(scriptsDest));
+    }
+    return;
+}
+
+function css(options) {
+    if(options.csspaths){
+        return gulp.src(options.csspaths)
+            .pipe($.plumber())
+            .pipe($.cssnano())
+            .pipe($.concat(options.concatName+"."+version+".css"))
+            .pipe(gulp.dest(cssDest));
+    }
+    return;
+}
+
+function inject(options) {
+    var target = gulp.src(options.htmlDest+'/'+options.htmlName);
+    var sources = gulp.src(options.injectList, {read: false});
+
+    return target.pipe($.plumber())
+        .pipe($.inject(sources))
+        .pipe(gulp.dest(options.htmlDest));
+}
+
+function htmlmin(options) {
+    return gulp.src(options.htmlDest+'/*.html')
+       // .pipe($.htmlmin({collapseWhitespace: true}))
+        .pipe(gulp.dest(options.htmlDest));
+}
+
+
+gulp.task('minify', function (){
+    return minify(commonOptions);
+});
+
+gulp.task('css',function () {
+    return css(commonOptions);
+})
+
+gulp.task('common', ['minify','css']);
+
+gulp.task('login_minify',['common'], function (){
+    return minify(loginOptions);
+});
+
+gulp.task('login_css',function () {
+    return css(loginOptions);
+})
+
+gulp.task('login_inject',['login_minify','login_css'],function () {
+    return inject(loginOptions);
+})
+
+gulp.task('login',['login_inject'], function (){
+    return htmlmin(loginOptions);
+});
+
+
+gulp.task('header_minify',['common'], function (){
+    return minify(headerOptions);
+});
+
+gulp.task('header_css',function () {
+    return css(headerOptions);
+})
+
+gulp.task('header_inject',['header_minify','header_css'],function () {
+    return inject(headerOptions);
+})
+
+gulp.task('header',['header_inject'], function (){
+    return htmlmin(headerOptions);
+});
+
+gulp.task('pm_minify',['common'], function (){
+    return minify(pmOptions);
+});
+
+gulp.task('pm_css',function () {
+    return css(pmOptions);
+})
+
+gulp.task('pm_inject',['pm_minify','pm_css'],function () {
+    return inject(pmOptions);
+})
+
+gulp.task('pm',['pm_inject'], function (){
+    return htmlmin(pmOptions);
+});
+
+gulp.task('main_minify',['common'], function (){
+    return minify(mainOptions);
+});
+
+gulp.task('main_css',function () {
+    return css(mainOptions);
+})
+
+gulp.task('main_inject',['main_minify'],function () {//, ['main_minify','main_css'  ] main css 打包到一起会出现样式冲突问题, 现改成不打包
+    return inject(mainOptions);
+})
+
+gulp.task('main',['main_inject'], function (){
+    return htmlmin(mainOptions);
+});
+
+gulp.task('compleGlj_minify', ['common'], function () {
+    return minify(compleGljOptions);
+});
+
+gulp.task('compleGlj_css', function () {
+    return css(compleGljOptions);
+});
+
+gulp.task('compleGlj_inject', ['compleGlj_minify', 'compleGlj_css'], function () {
+    return inject(compleGljOptions);
+});
+
+gulp.task('compleGlj', ['compleGlj_inject'], function () {
+    return htmlmin(compleGljOptions);
+});
+
+gulp.task('compleRation_ration_minify', ['common'], function () {
+    return minify(compleRation_rationOptions);
+});
+
+gulp.task('compleRation_ration_css', function () {
+    return css(compleRation_rationOptions);
+});
+
+gulp.task('compleRation_ration_inject', ['compleRation_ration_minify', 'compleRation_ration_css'], function () {
+    return inject(compleRation_rationOptions);
+});
+
+gulp.task('compleRation_ration', ['compleRation_ration_inject'], function () {
+    return htmlmin(compleRation_rationOptions);
+});
+
+gulp.task('compleRation_glj_minify', ['common'], function () {
+    return minify(compleRation_gljOptions);
+});
+
+gulp.task('compleRation_glj_css', function () {
+    return css(compleRation_gljOptions);
+});
+
+gulp.task('compleRation_glj_inject', ['compleRation_glj_minify', 'compleRation_glj_css'], function () {
+    return inject(compleRation_gljOptions);
+});
+
+gulp.task('compleRation_glj', ['compleRation_glj_inject'], function () {
+    return htmlmin(compleRation_gljOptions);
+});
+
+gulp.task('compleRation_coe_minify', ['common'], function () {
+    return minify(compleRation_coeOptions);
+});
+
+gulp.task('compleRation_coe_css', function () {
+    return css(compleRation_coeOptions);
+});
+
+gulp.task('compleRation_coe_inject', ['compleRation_coe_minify', 'compleRation_coe_css'], function () {
+    return inject(compleRation_coeOptions);
+});
+
+gulp.task('compleRation_coe', ['compleRation_coe_inject'], function () {
+    return htmlmin(compleRation_coeOptions);
+});
+
+gulp.task('compleRation_inst_minify', ['common'], function () {
+    return minify(compleRation_instOptions);
+});
+
+gulp.task('compleRation_inst_css', function () {
+    return css(compleRation_instOptions);
+});
+
+gulp.task('compleRation_inst_inject', ['compleRation_inst_minify', 'compleRation_inst_css'], function () {
+    return inject(compleRation_instOptions);
+});
+
+gulp.task('compleRation_inst', ['compleRation_inst_inject'], function () {
+    return htmlmin(compleRation_instOptions);
+});
+
+
+
+gulp.task('build',['header','login','pm','main', 'compleGlj', 'compleRation_ration', 'compleRation_glj', 'compleRation_coe', 'compleRation_inst']);

+ 149 - 0
gulpfile.js.copy

@@ -0,0 +1,149 @@
+
+/**
+ * Created by chen on 2017/9/26.
+ */
+
+let gulp =require( 'gulp');
+let gulpLoadPlugins = require('gulp-load-plugins');
+let del = require('del');
+let uglify = require('gulp-uglify-es').default;
+let config = require("./config/gulpConfig.js");
+let  runSequence = require('run-sequence');
+
+const $ = gulpLoadPlugins();
+let common_jspaths=config.common_jspaths;
+let common_css=config.common_css;
+let pm_jspaths=config.pm_jspaths;
+let pm_csspaths=config.pm_css;
+let login_jspaths=config.login_jspaths;
+let main_jspaths=config.main_jspaths;
+let main_csspaths=config.main_css;
+let version=config.version;
+
+let taskObject={};
+function task_init(options) {
+    taskObject=options;
+    taskObject.version=version;
+    taskObject.scriptsDest='web/dest/scripts';
+}
+
+gulp.task('minify', function (){
+    if(taskObject.jspaths){
+        return gulp.src(taskObject.jspaths)
+            .pipe($.plumber())
+           // .pipe(uglify())
+            .pipe($.concat(taskObject.concatName+"."+version+".js"))
+            .pipe(gulp.dest(taskObject.scriptsDest));
+    }
+   return;
+});
+
+
+gulp.task('copy',function () {
+    return gulp.src(taskObject.srcHtml)
+            .pipe($.plumber())
+            .pipe(gulp.dest(taskObject.htmlDest));
+})
+
+gulp.task('inject',['minify','css'], function () {
+    var target = gulp.src(taskObject.htmlDest+'/'+taskObject.htmlName);
+    var sources = gulp.src(taskObject.injectList, {read: false});
+
+    return target.pipe($.plumber())
+         .pipe($.inject(sources))
+         .pipe(gulp.dest(taskObject.htmlDest));
+});
+
+gulp.task('htmlmin',function () {
+    return gulp.src(taskObject.htmlDest+'/*.html')
+      //  .pipe($.htmlmin({collapseWhitespace: true}))
+        .pipe(gulp.dest(taskObject.htmlDest));
+})
+
+gulp.task('css',function () {
+    if(taskObject.pm_csspaths){
+        return gulp.src(taskObject.pm_csspaths)
+            .pipe($.plumber())
+            .pipe($.cssnano())
+            .pipe($.concat(taskObject.concatName+"."+version+".css"))
+            .pipe(gulp.dest(taskObject.cssDest));
+    }
+    return;
+})
+
+gulp.task('common', function (){
+    let options = {
+        jspaths:common_jspaths,
+        pm_csspaths:common_css,
+        concatName:'common.all.min',
+        cssDest:'web/dest/css'
+    }
+    task_init(options);
+    runSequence('minify','css');
+});
+
+gulp.task('header', function (){
+    let options = {
+        concatName:'header.all.min',
+        srcHtml:'web/src/html/common/header.html',
+        htmlDest:'web/common/html',
+        htmlName:'header.html',
+        injectList:['web/dest/scripts/common.all.min.'+version+'.js']
+    };
+    task_init(options);
+    runSequence('inject','htmlmin');
+});
+
+
+gulp.task('login', function (){
+    let options = {
+        jspaths:login_jspaths,
+        concatName:'login.all.min',
+        srcHtml:'web/src/html/login/login.html',
+        htmlDest:'web/users/html',
+        htmlName:'login.html',
+        injectList:[  'web/dest/scripts/common.all.min.'+version+'.js',
+                        'web/dest/scripts/login.all.min.'+version+'.js',
+                        'web/dest/css/common.all.min.'+version+'.css']
+    }
+    task_init(options);
+    runSequence('inject','htmlmin');
+});
+
+gulp.task('pm', function (){
+    let options = {
+        jspaths:pm_jspaths,
+        pm_csspaths:pm_csspaths,
+        concatName:'pm.all.min',
+        cssDest:'web/dest/css',
+        srcHtml:'web/src/html/pm/*.html',
+        htmlDest:'web/building_saas/pm/html',
+        htmlName:'project-management.html',
+        injectList:['web/dest/scripts/pm.all.min.'+version+'.js',
+                      'web/dest/css/common.all.min.'+version+'.css',
+                      'web/dest/css/pm.all.min.'+version+'.css']
+    }
+    task_init(options);
+    runSequence('inject','htmlmin');
+});
+
+gulp.task('main',function () {
+    let options ={
+        jspaths:main_jspaths,
+        pm_csspaths:main_csspaths,
+        concatName:'main.all.min',
+        cssDest:'web/dest/css',
+        srcHtml:'web/src/html/main/main.html',
+        htmlDest:'web/building_saas/main/html',
+        htmlName:'main.html',
+        injectList:['web/dest/scripts/main.all.min.'+version+'.js',
+            'web/dest/css/common.all.min.'+version+'.css',
+            'web/dest/css/main.all.min.'+version+'.css']
+    }
+    task_init(options);
+    runSequence('inject','htmlmin');
+})
+
+gulp.task('build',['common'],function () {
+    runSequence('header',['login','pm','main']);
+});

+ 337 - 0
lib/JSExpressionEval_src/Date.js

@@ -0,0 +1,337 @@
+// ===================================================================
+// Author: Matt Kruse <matt@mattkruse.com>
+// WWW: http://www.mattkruse.com/
+//
+// NOTICE: You may use this code for any purpose, commercial or
+// private, without any further permission from the author. You may
+// remove this notice from your final code if you wish, however it is
+// appreciated by the author if at least my web site address is kept.
+//
+// You may *NOT* re-distribute this code in any way except through its
+// use. That means, you can include it in your product, or your web
+// site, or any other form where the code is actually being used. You
+// may not put the plain javascript up on your site for download or
+// include it in your javascript libraries for download. 
+// If you wish to share this code with others, please just point them
+// to the URL instead.
+// Please DO NOT link directly to my .js files from your site. Copy
+// the files to your server and use them there. Thank you.
+// ===================================================================
+
+// HISTORY
+// ------------------------------------------------------------------
+// May 17, 2003: Fixed bug in parseDate() for dates <1970
+// March 11, 2003: Added parseDate() function
+// March 11, 2003: Added "NNN" formatting option. Doesn't match up
+//                 perfectly with SimpleDateFormat formats, but 
+//                 backwards-compatability was required.
+
+// ------------------------------------------------------------------
+// These functions use the same 'format' strings as the 
+// java.text.SimpleDateFormat class, with minor exceptions.
+// The format string consists of the following abbreviations:
+// 
+// Field        | Full Form          | Short Form
+// -------------+--------------------+-----------------------
+// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
+// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
+//              | NNN (abbr.)        |
+// Day of Month | dd (2 digits)      | d (1 or 2 digits)
+// Day of Week  | EE (name)          | E (abbr)
+// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
+// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
+// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
+// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
+// Minute       | mm (2 digits)      | m (1 or 2 digits)
+// Second       | ss (2 digits)      | s (1 or 2 digits)
+// AM/PM        | a                  |
+//
+// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
+// Examples:
+//  "MMM d, y" matches: January 01, 2000
+//                      Dec 1, 1900
+//                      Nov 20, 00
+//  "M/d/yy"   matches: 01/20/00
+//                      9/2/00
+//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
+// ------------------------------------------------------------------
+
+var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
+var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
+function LZ(x) {return(x<0||x>9?"":"0")+x}
+
+// ------------------------------------------------------------------
+// isDate ( date_string, format_string )
+// Returns true if date string matches format of format string and
+// is a valid date. Else returns false.
+// It is recommended that you trim whitespace around the value before
+// passing it to this function, as whitespace is NOT ignored!
+// ------------------------------------------------------------------
+function isDate(val,format) {
+	var date=getDateFromFormat(val,format);
+	if (date==0) { return false; }
+	return true;
+	}
+
+// -------------------------------------------------------------------
+// compareDates(date1,date1format,date2,date2format)
+//   Compare two date strings to see which is greater.
+//   Returns:
+//   1 if date1 is greater than date2
+//   0 if date2 is greater than date1 of if they are the same
+//  -1 if either of the dates is in an invalid format
+// -------------------------------------------------------------------
+function compareDates(date1,dateformat1,date2,dateformat2) {
+	var d1=getDateFromFormat(date1,dateformat1);
+	var d2=getDateFromFormat(date2,dateformat2);
+	if (d1==0 || d2==0) {
+		return -1;
+		}
+	else if (d1 > d2) {
+		return 1;
+		}
+	return 0;
+	}
+
+// ------------------------------------------------------------------
+// formatDate (date_object, format)
+// Returns a date in the output format specified.
+// The format string uses the same abbreviations as in getDateFromFormat()
+// ------------------------------------------------------------------
+function formatDate(date,format) {
+	format=format+"";
+	var result="";
+	var i_format=0;
+	var c="";
+	var token="";
+	var y=date.getYear()+"";
+	var M=date.getMonth()+1;
+	var d=date.getDate();
+	var E=date.getDay();
+	var H=date.getHours();
+	var m=date.getMinutes();
+	var s=date.getSeconds();
+	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
+	// Convert real date parts into formatted versions
+	var value=new Object();
+	if (y.length < 4) {y=""+(y-0+1900);}
+	value["y"]=""+y;
+	value["yyyy"]=y;
+	value["yy"]=y.substring(2,4);
+	value["M"]=M;
+	value["MM"]=LZ(M);
+	value["MMM"]=MONTH_NAMES[M-1];
+	value["NNN"]=MONTH_NAMES[M+11];
+	value["d"]=d;
+	value["dd"]=LZ(d);
+	value["E"]=DAY_NAMES[E+7];
+	value["EE"]=DAY_NAMES[E];
+	value["H"]=H;
+	value["HH"]=LZ(H);
+	if (H==0){value["h"]=12;}
+	else if (H>12){value["h"]=H-12;}
+	else {value["h"]=H;}
+	value["hh"]=LZ(value["h"]);
+	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
+	value["k"]=H+1;
+	value["KK"]=LZ(value["K"]);
+	value["kk"]=LZ(value["k"]);
+	if (H > 11) { value["a"]="PM"; }
+	else { value["a"]="AM"; }
+	value["m"]=m;
+	value["mm"]=LZ(m);
+	value["s"]=s;
+	value["ss"]=LZ(s);
+	while (i_format < format.length) {
+		c=format.charAt(i_format);
+		token="";
+		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
+			token += format.charAt(i_format++);
+			}
+		if (value[token] != null) { result=result + value[token]; }
+		else { result=result + token; }
+		}
+	return result;
+	}
+	
+// ------------------------------------------------------------------
+// Utility functions for parsing in getDateFromFormat()
+// ------------------------------------------------------------------
+function _isInteger(val) {
+	var digits="1234567890";
+	for (var i=0; i < val.length; i++) {
+		if (digits.indexOf(val.charAt(i))==-1) { return false; }
+		}
+	return true;
+	}
+function _getInt(str,i,minlength,maxlength) {
+	for (var x=maxlength; x>=minlength; x--) {
+		var token=str.substring(i,i+x);
+		if (token.length < minlength) { return null; }
+		if (_isInteger(token)) { return token; }
+		}
+	return null;
+	}
+	
+// ------------------------------------------------------------------
+// getDateFromFormat( date_string , format_string )
+//
+// This function takes a date string and a format string. It matches
+// If the date string matches the format string, it returns the 
+// getTime() of the date. If it does not match, it returns 0.
+// ------------------------------------------------------------------
+function getDateFromFormat(val,format) {
+	val=val+"";
+	format=format+"";
+	var i_val=0;
+	var i_format=0;
+	var c="";
+	var token="";
+	var token2="";
+	var x,y;
+	var now=new Date();
+	var year=now.getYear();
+	var month=now.getMonth()+1;
+	var date=1;
+	var hh=now.getHours();
+	var mm=now.getMinutes();
+	var ss=now.getSeconds();
+	var ampm="";
+	
+	while (i_format < format.length) {
+		// Get next token from format string
+		c=format.charAt(i_format);
+		token="";
+		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
+			token += format.charAt(i_format++);
+			}
+
+		// Extract contents of value based on format token
+		if (token=="yyyy" || token=="yy" || token=="y") {
+			if (token=="yyyy") { x=4;y=4; }
+			if (token=="yy")   { x=2;y=2; }
+			if (token=="y")    { x=2;y=4; }
+			year=_getInt(val,i_val,x,y);
+
+			if (year==null) { return 0; }
+			i_val += year.length;
+			if (year.length==2) {
+				if (year > 70) { year=1900+(year-0); }
+				else { year=2000+(year-0); }
+				}
+			}
+		else if (token=="MMM"||token=="NNN"){
+			month=0;
+			for (var i=0; i<MONTH_NAMES.length; i++) {
+				var month_name=MONTH_NAMES[i];
+				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
+					if (token=="MMM"||(token=="NNN"&&i>11)) {
+						month=i+1;
+						if (month>12) { month -= 12; }
+						i_val += month_name.length;
+						break;
+						}
+					}
+				}
+			if ((month < 1)||(month>12)){return 0;}
+			}
+		else if (token=="EE"||token=="E"){
+			for (var i=0; i<DAY_NAMES.length; i++) {
+				var day_name=DAY_NAMES[i];
+				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
+					i_val += day_name.length;
+					break;
+					}
+				}
+			}
+		else if (token=="MM"||token=="M") {
+			month=_getInt(val,i_val,token.length,2);
+			if(month==null||(month<1)||(month>12)){return 0;}
+			i_val+=month.length;}
+		else if (token=="dd"||token=="d") {
+			date=_getInt(val,i_val,token.length,2);
+			if(date==null||(date<1)||(date>31)){return 0;}
+			i_val+=date.length;}
+		else if (token=="hh"||token=="h") {
+			hh=_getInt(val,i_val,token.length,2);
+			if(hh==null||(hh<1)||(hh>12)){return 0;}
+			i_val+=hh.length;}
+		else if (token=="HH"||token=="H") {
+			hh=_getInt(val,i_val,token.length,2);
+			if(hh==null||(hh<0)||(hh>23)){return 0;}
+			i_val+=hh.length;}
+		else if (token=="KK"||token=="K") {
+			hh=_getInt(val,i_val,token.length,2);
+			if(hh==null||(hh<0)||(hh>11)){return 0;}
+			i_val+=hh.length;}
+		else if (token=="kk"||token=="k") {
+			hh=_getInt(val,i_val,token.length,2);
+			if(hh==null||(hh<1)||(hh>24)){return 0;}
+			i_val+=hh.length;hh--;}
+		else if (token=="mm"||token=="m") {
+			mm=_getInt(val,i_val,token.length,2);
+			if(mm==null||(mm<0)||(mm>59)){return 0;}
+			i_val+=mm.length;}
+		else if (token=="ss"||token=="s") {
+			ss=_getInt(val,i_val,token.length,2);
+			if(ss==null||(ss<0)||(ss>59)){return 0;}
+			i_val+=ss.length;}
+		else if (token=="a") {
+			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
+			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
+			else {return 0;}
+			i_val+=2;}
+		else {
+			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
+			else {i_val+=token.length;}
+			}
+		}
+	// If there are any trailing characters left in the value, it doesn't match
+	if (i_val != val.length) { return 0; }
+	// Is date valid for month?
+	if (month==2) {
+		// Check for leap year
+		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
+			if (date > 29){ return 0; }
+			}
+		else { if (date > 28) { return 0; } }
+		}
+	if ((month==4)||(month==6)||(month==9)||(month==11)) {
+		if (date > 30) { return 0; }
+		}
+	// Correct hours value
+	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
+	else if (hh>11 && ampm=="AM") { hh-=12; }
+	var newdate=new Date(year,month-1,date,hh,mm,ss);
+	return newdate.getTime();
+	}
+
+// ------------------------------------------------------------------
+// parseDate( date_string [, prefer_euro_format] )
+//
+// This function takes a date string and tries to match it to a
+// number of possible date formats to get the value. It will try to
+// match against the following international formats, in this order:
+// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
+// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
+// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
+// A second argument may be passed to instruct the method to search
+// for formats like d/M/y (european format) before M/d/y (American).
+// Returns a Date object or null if no patterns match.
+// ------------------------------------------------------------------
+function parseDate(val) {
+	var preferEuro=(arguments.length==2)?arguments[1]:false;
+	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
+	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
+	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
+	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
+	var d=null;
+	for (var i=0; i<checkList.length; i++) {
+		var l=window[checkList[i]];
+		for (var j=0; j<l.length; j++) {
+			d=getDateFromFormat(val,l[j]);
+			if (d!=0) { return new Date(d); }
+			}
+		}
+	return null;
+	}

文件差異過大導致無法顯示
+ 1050 - 0
lib/JSExpressionEval_src/Evaluator.js


+ 129 - 0
lib/JSExpressionEval_src/ExpressionTester.htm

@@ -0,0 +1,129 @@
+   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1250">
+<meta name="generator" content="PSPad editor, www.pspad.com">
+<title>Expression Converter</title>
+<style>
+body     {font-family: Verdana,Tahoma; font-size: 8px; font-weight: normal;}
+input    {font-family: Verdana,Tahoma; font-size: 8px; font-weight: normal;}
+textarea {font-family: Verdana,Tahoma; font-size: 8px; font-weight: normal;}
+button   {font-family: Verdana,Tahoma; font-size: 9px; font-weight: normal; height: 24px;}
+table, td {font-family: Verdana,Tahoma; font-size: 8px; font-weight: normal;}
+
+</style>
+<script src="Date.js" type="text/javascript"></script>
+<script src="Stack.js" type="text/javascript"></script>
+<script src="Tokanizer.js" type="text/javascript"></script>
+<script src="Evaluator.js" type="text/javascript"></script>
+<script language="vbscript">
+'5*log(1000)*-2/3+MAX(4,6 MOD 7) 
+'5*log(1000)*-2/3+6 
+'5*6.90775527898214*-2/3+6 
+'34.5387763949107*-2/3+6 
+'-69.0775527898214/3+6 
+'-23.0258509299405+6 
+'-17.0258509299405
+'-17.025850929940457
+'InputBox "6 Mod 7", "Result", (6 Mod 7)
+</script>
+<script language="javascript">
+//alert (6 % 7);
+
+var exp = new Expression("");
+
+function Convert()
+{
+    var frm = document.frmMain;
+    var arrToks;
+    var arrPFix;
+    var strExp;
+    var intCntr;
+
+    strExp = frm.txtExp.value;
+    if (strExp == null || strExp == undefined)
+    {
+        alert ("No expression is specified!");
+        return false;
+    }
+
+    exp.Expression(strExp);
+    frm.txtResult.value = exp.Parse();
+    return false;
+}
+
+function Compute()
+{
+    var frm;
+    var strExp;
+
+    frm = document.frmMain;
+    strExp = frm.txtExp.value;
+    exp.Expression(strExp);
+    frm.txtResult.value = exp.Evaluate();
+}
+
+function AddVar()
+{
+    var frm;
+
+    frm = document.frmMain;
+    exp.AddVariable(frm.txtVarName.value, frm.txtVarValue.value);
+    return true;
+}
+
+function Reset()
+{
+	exp.Reset();
+}
+</script>
+</head>
+<body>
+<form id="frmMain" name="frmMain">
+	<table>
+    	<tr>
+        	<td>
+        		<table>
+            		<tr>
+                		<td>Expression : </td>
+                		<td><input type="text" size="50" name="txtExp" id="txtExp" /></td>
+            		</tr>
+            		<tr>
+                		<td>&nbsp;</td>
+                		<td><textarea cols="58" rows="5" name="txtResult" id="txtResult"></textarea></td>
+            		</tr>
+            		<tr>
+                		<td colspan="2" align="right">
+                    		<a href="#" name="btnConvert" id="btnConvert" onClick="javascript:Convert();">PostFix</a>
+                    		&nbsp;
+                    		<a href="#" name="btnCompute" id="btnCompute" onClick="javascript:Compute();">Evaluate</a>
+                    		&nbsp;
+                    		<a href="#" name="btnReset" id="btnReset" onClick="javascript:Reset();">Reset</a>
+                		</td>
+            		</tr>
+        		</table>
+			</td>
+		</tr>
+		<tr>
+			<td>
+        		<table>
+            		<tr>
+                		<td>Variable Name : </td>
+                		<td><input type="text" size="50" name="txtVarName" id="txtVarName" /></td>
+            		</tr>
+            		<tr>
+                		<td>Variable Value : </td>
+                		<td><input type="text" size="50" name="txtVarValue" id="txtVarVal" /></td>
+            		</tr>
+            		<tr>
+                		<td colspan="2" align="right">
+                    		<a href="#" name="btnAdd" id="btnAdd" onClick="AddVar();">Add Variable</a>
+                		</td>
+            		</tr>
+        		</table>
+			</td>
+		</tr>
+	</table>
+</form>
+</body>
+</html>

+ 141 - 0
lib/JSExpressionEval_src/JsHashMap.js

@@ -0,0 +1,141 @@
+/////////////////////////////////////////////
+/////       Js Object                 //////
+///////////////////////////////////////////
+// Author: NHM TAnveer Hossain Khan (Hasan)
+// http://hasan.we4tech.com
+// mail:admin at we4tech.com
+
+// hashmap internal data object
+JsObject=function(key, value) {
+  this._key=key;
+  this._value=value;
+}
+
+// set some methods for JsObject
+JsObject.prototype.getKey=function() {
+  return this._key;
+}
+
+// get value
+JsObject.prototype.getValue=function() {
+  return this._value;
+}
+
+
+/////////////////////////////////////////////
+////        Iterator                 ///////
+///////////////////////////////////////////
+JsIterator=function(array) {
+  // set internal array
+  this._array=array;
+
+  // create inernal index counter
+  this._counter=0;
+  
+  // set _hasNext value
+  if(array.length>0)
+    this._hasNext=true;
+  else
+    this._hasNext=false;
+}
+
+// return boolean value
+JsIterator.prototype.hasNext=function() {
+  return this._hasNext;
+}
+
+// return object in next method
+JsIterator.prototype.next=function() {
+    if(this._array.length>this._counter)
+    {
+        // get object
+        var rtnObj=this._array[this._counter];
+        // increment counter value;
+        this._counter++;
+        // check is has next true of flase
+        if(this._array.length>this._counter)
+            this._hasNext=true;
+        else
+            this._hasNext=false;
+
+        // return data
+        return rtnObj;
+    }
+    else
+    {
+        this._hasNext=false;
+    }
+}
+
+// remove object
+JsIterator.prototype.remove=function() {
+    this._array.splice(this._counter,1);
+    if(this._array.length > this._counter)
+        this._hasNext=false;
+}
+
+
+/////////////////////////////////////////////
+////        HashMap Object           ///////
+///////////////////////////////////////////
+
+// create JsHashMap class object
+JsHashMap=function() {
+    // init. internal array
+    this._array=new Array();
+    // set internal counter value as 0
+    // this counter will keep track the current index
+    // of array
+    this._counter=0;
+}
+
+// create add method
+// put key and value
+JsHashMap.prototype.put=function(key, value) {
+    // add new value
+    var newJsObj=new JsObject(key, value);
+    // add in internal array
+    this._array[this._counter]=newJsObj;
+    // increment the internal index counter
+    this._counter++;
+}
+
+// retrive data based on iterator
+JsHashMap.prototype.iterator=function() {
+    // create iterator
+    var it=new JsIterator(this._array);
+    // return iterator
+    return it;
+}
+
+// retrive data based on keyword
+JsHashMap.prototype.get=function(key) {
+    // create iterator object
+    var it=this.iterator();
+  
+    // iterate untile get success
+    while(it.hasNext())
+    {
+        // fetch object
+        var getObj=it.next();
+        // check is found or not
+        if(getObj.getKey()==key)
+            return getObj.getValue();
+    }
+}
+
+// remove key and object
+JsHashMap.prototype.remove=function(key) {
+    // create iterator object
+    var it=this.iterator();
+  
+    // iterate untile get success
+    while(it.hasNext())
+    {
+        // fetch object
+        var getObj=it.next();
+        // check is found or not
+        if(getObj.getKey()==key)
+            it.remove();
+    }
+}

+ 133 - 0
lib/JSExpressionEval_src/License.txt

@@ -0,0 +1,133 @@
+KIS Public License 1.0
+Terms & Conditions Of Use
+February, 2005
+Copyright (c) 2005. Khan Information Systems. All Rights Reserved
+
+
+PLEASE READ THIS DOCUMENT CAREFULLY. BY DOWNLOADING OR USING THE CODE BASE AND
+DOCUMENTATION ACCOMPANYING THIS LICENSE (THE "License"), YOU AGREE TO THE
+FOLLOWING TERMS AND CONDITIONS OF THIS LICENSE.
+
+Section One: Your Rights
+Subject to these terms and conditions of this License, Khan Information
+Systems (KIS) (the "Original Contributor") and each subsequent contributor
+(collectively with the Original Contributor, the "Contributors") hereby grants
+you a non-exclusive, worldwide, no-charge, transferable, copyright license to
+execute, prepare derivative works of, and distribute (internally and externally),
+for commercial and noncommercial purposes, the original code contributed by
+Original Contributor and all Modifications (collectively called the "Program").
+
+This non-exclusive license (with respect to the grant from a particular
+Contributor) automatically terminates for any entity that initiates legal action
+for intellectual property infringement against such Contributor as of the
+initiation of such action.
+
+Section Two: Your License Grant
+If you make a Modification and distribute it externally you are a Contributor,
+and you must provide such Modification in source code form to the Original
+Contributor within thirty (30) days of such distribution under the terms of the
+license in Section 1 above in accordance with the instructions below.
+A "Modification" to the Program is any addition to or deletion from the contents
+of any file of the Program or of any Modifications and any new file that contains
+any part of the Program or of any Modifications.
+
+As a Contributor you represent that your contributions are your original
+creation(s) and, to the best of your knowledge, no third party has any claim
+(including but not limited to intellectual property claims) relating to your
+Modification. You represent that your contribution submission includes complete
+details of any license or other restriction associated with any part of your
+Modification (including a copy of any applicable license agreement).
+
+If, after submitting your contribution, you learn of a third party claim or other
+restriction relating to your contribution, you shall promptly modify your
+contribution submission and take all reasonable steps to inform those who may
+have received the Program containing such Modification.
+
+Section Three: Redistribution
+If you distribute the Program or any derivative work of the Program in a form to
+which the recipient can make Modifications, you must ensure that the recipient
+of the Program or derivative work of the Program accepts the terms of this
+License with respect to the Program and any Modifications included your
+distribution. In addition, in each source and data file of the Program and any
+Modification you distribute must contain the following:
+
+	"The contents of this file, as updated from time to time by Khan Information
+	Systems (KIS), are subject to the KIS Public License Version 1.0
+	(the "License"); you may not use this file except in compliance with the
+	License.
+
+	Software distributed under the License is distributed on an "AS IS" basis,
+	WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
+	the specific language governing rights and limitations under the License.
+
+	This software consists of voluntary contributions made by many individuals
+	on behalf of the Khan Information Systems.
+
+	The Original Code is ______________________________________________________.
+	The Initial Developer of the Original Code is _____________________________.
+	Portions created by _______________________________________________________
+	are Copyright (C) ______ _______________________. All Rights Reserved.
+	Contributor(s): __________________________________________________________."
+
+If you redistribute the Program or any derivative work of the Program in a form
+to which the recipient can not make Modifications, you must include the
+following in appropriate and conspicuous locations:
+
+	"Includes software, which is Copyright (c) 2005 - (insert then current year)
+	Khan Information Systems (KIS) and others. All rights reserved."
+
+Any redistribution must be made without any further restriction on the
+recipient's exercise of the rights granted herein.
+
+Section Four: Termination
+If you fail to comply with this License, your rights (but not your obligations)
+under this License shall terminate automatically unless you cure such breach
+within thirty days of becoming aware of the noncompliance. All sublicenses
+granted by you which preexist such termination and are properly granted shall
+survive such termination.
+
+Section Five: Other Terms
+Except for the copyright notices required above or as otherwise agreed in writing,
+you may not use any trademark of any of the Contributors.
+
+All transfers of the Program or any part thereof shall be made in compliance
+with U.S. Trade regulations or other restrictions of the U.S. Department of
+Commerce, as well as other similar trade or commerce restrictions which might
+apply.
+
+Any patent obtained by any party covering the Program or any part thereof must
+include a provision providing for the free, perpetual and unrestricted commercial
+and noncommercial use by any third party.
+
+If, as a consequence of a court judgment or allegation of patent infringement or
+for any other reason (not limited to patent issues), conditions are imposed on
+you (whether by court order, agreement or otherwise) that contradict the
+conditions of this License, they do not excuse you from the conditions of this
+License. If you cannot distribute so as to satisfy simultaneously your obligations
+under this License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent license would not
+permit royalty-free redistribution of the Program by all those who receive copies
+directly or indirectly through you, then the only way you could satisfy both it
+and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and the
+section as a whole is intended to apply in other circumstances.
+
+YOU AGREE THAT THE PROGRAM IS PROVIDED AS-IS, WITHOUT WARRANTY OF ANY KIND
+(EITHER EXPRESS OR IMPLIED) INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY 
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND ANY WARRANTY OF NON
+INFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE PROGRAM, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The Original Contributor from time to time may change this License, and the
+amended license will apply to all copies of the Program downloaded after the new
+license is posted. This License provides you no implied rights or licenses to the
+intellectual property of any Contributor.
+
+								Created 01/01/2005

+ 105 - 0
lib/JSExpressionEval_src/Stack.js

@@ -0,0 +1,105 @@
+/*------------------------------------------------------------------------------
+ * NAME    : Stack.js
+ * PURPOSE : Stack dta structure using java script
+ * AUTHOR  : Prasad P. Khandekar
+ * CREATED : August 21, 2005 
+ *------------------------------------------------------------------------------
+ * Copyright (c) 2005. Khan Information Systems. All Rights Reserved
+ * The contents of this file are subject to the KIS Public License 1.0
+ * (the "License"); you may not use this file except in compliance with the 
+ * License. You should have received a copy of the KIS Public License along with 
+ * this library; if not, please ask your software vendor to provide one.
+ * 
+ * YOU AGREE THAT THE PROGRAM IS PROVIDED AS-IS, WITHOUT WARRANTY OF ANY KIND
+ * (EITHER EXPRESS OR IMPLIED) INCLUDING, WITHOUT LIMITATION, ANY IMPLIED 
+ * WARRANTY OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND ANY 
+ * WARRANTY OF NON INFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE 
+ * PROGRAM, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * See the License for the specific language governing rights and limitations 
+ * under the License.
+ *-----------------------------------------------------------------------------*/
+// Stack object constructor
+function Stack()
+{
+    this.arrStack = new Array();
+    this.intIndex = 0;
+
+    this.Size     = getSize;
+    this.IsEmpty  = isStackEmpty;
+    this.Push     = pushElement;
+    this.Pop      = popElement;
+    this.Get      = getElement;
+    this.toString = dumpStack;
+}
+
+// Converts stack contents into a comma seperated string
+function dumpStack()
+{
+    var intCntr = 0;
+    var strRet  =  "";
+    if (this.intIndex == 0) return null;
+    for (intCntr = 0; intCntr < this.intIndex; intCntr++)
+    {
+        if (strRet.length == 0)
+            strRet += this.arrStack[intCntr];
+        else
+            strRet += "," + this.arrStack[intCntr];
+    }
+    return strRet;
+}
+
+// Returns size of stack
+function getSize()
+{
+    return this.intIndex;
+}
+
+// This method tells us if this Stack object is empty
+function isStackEmpty()
+{
+	if (this.intIndex == 0)
+		return true;
+	else
+		return false;
+}
+
+// This method pushes a new element onto the top of the stack
+function pushElement(newData)
+{
+	// Assign our new element to the top
+	debugAssert ("Pushing " + newData);
+	this.arrStack[this.intIndex] = newData;
+	this.intIndex++;
+}
+
+// This method pops the top element off of the stack
+function popElement()
+{
+    var retVal;
+
+    retVal = null;
+    if (this.intIndex > 0)
+    {
+	   // Assign our new element to the top
+	   this.intIndex--;
+	   retVal = this.arrStack[this.intIndex];
+	}
+	return retVal;
+}
+
+// Gets an element at a particular offset from top of the stack
+function getElement(intPos)
+{
+    var retVal;
+
+    //alert ("Size : " + this.intIndex + ", Index " + intPos);
+    if (intPos >= 0 && intPos < this.intIndex)
+        retVal = this.arrStack[this.intIndex - intPos - 1];
+    return retVal;
+}

+ 108 - 0
lib/JSExpressionEval_src/StackImpl.htm

@@ -0,0 +1,108 @@
+<HTML>
+<HEAD>
+<TITLE>Simple Stack Object Example</TITLE>
+<SCRIPT LANGUAGE="JavaScript">
+<!-
+// This is the constructor for our stack object
+// If the "length" instance variable is 0, the stack is empty
+function oStack() {
+	this.top = null;
+	this.length = 0;
+	this.isEmpty = oStackIsEmpty;
+	this.push = oStackPush;
+	this.pop = oStackPop;
+	}
+
+// This method tells us if this oStack object is empty
+function oStackIsEmpty() {
+	if (this.length == 0)
+		return true;
+	else
+		return false;
+	}
+
+// This method pushes a new element onto the top of the stack
+function oStackPush( newData) {
+	// Create the new element
+	var newElement = new oStackElement();
+	// Add the data to it
+	newElement.setData( newData);
+	// Put the current top in our next field
+	newElement.setNext( this.top);
+	// Assign our new element to the top
+	this.top = newElement;
+	this.length++;
+	}
+	
+// This method pops the top element off of the stack
+function oStackPop() {
+	// Put old top away for safe keeping
+	var oldTop = this.top;
+	// Get the new top
+	this.top = this.top.getNext();
+	this.length-;
+	return oldTop;
+	}
+
+// This is the constructor for an element in our stack object
+// The "data" variable holds our actual data (whatever it may be)
+// and the "next" variable holds the oStackElement object that is
+// 'underneath' this oStackElement object.
+function oStackElement() {
+	this.data = 0;
+	this.next = null;
+	this.setData = oStackElementSetData;
+	this.getData = oStackElementGetData;
+	this.setNext = oStackElementSetNext;
+	this.getNext = oStackElementGetNext;
+	}
+
+// This method sets the data field of this oStackElement
+function oStackElementSetData( newData) {
+	this.data = newData;
+	}
+
+// This method returns the data field of this oStackElement
+function oStackElementGetData() {
+	return this.data;
+	}
+
+// This method sets the next field of this oStackElement
+function oStackElementSetNext( newNext) {
+	this.next = newNext;
+	}
+
+// This method returns the next field of this oStackElement
+function oStackElementGetNext() {
+	return this.next;
+	}
+
+// create a new oStack object
+var stack1 = new oStack();
+
+// Fill it with something interesting
+// In this case, the names of my cats
+stack1.push( "Puddin' Head")
+stack1.push( "Sunshine")
+stack1.push( "Shadow")
+stack1.push( "Sassy")
+stack1.push( "Toby")
+stack1.push( "Sandy")
+stack1.push( "Pixie")
+stack1.push( "Edi")
+stack1.push( "Gizmo")
+
+// Get the number of items in the stack
+var numElements = stack1.length;
+
+// Print out the contents of the stack
+for (var i = 0; i < numElements; i++)
+	document.write( stack1.length + " - " + stack1.pop().getData() 
++ "<br>");
+//->
+</SCRIPT>
+</HEAD>
+<BODY>
+</BODY>
+</HTML>
+

+ 119 - 0
lib/JSExpressionEval_src/StackTester.htm

@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1250">
+<meta name="generator" content="PSPad editor, www.pspad.com">
+<title>Stack Tester</title>
+<script language="javascript" type="text/javascript" src="Stack.js"></script>
+<style>
+body {font-family: Verdana, Tahoma; font-size: 8pt; font-weight: normal}
+button {font-family: Verdana, Tahoma; font-size: 8pt; font-weight: bold; width: 100px; height: 24px;}
+textarea {font-family: Verdana, Tahoma; font-size: 8pt; font-weight: normal; border: 1px solid;}
+input {font-family: Verdana, Tahoma; font-size: 8pt; font-weight: normal; border: 1px solid;}
+</style>
+<script language="javascript">
+var myStack = new Stack();
+
+function pushValue()
+{
+    var objFrm;
+    var strVal;
+
+    objFrm = document.frmMain;
+    if (objFrm) strVal = objFrm.txtValue.value;
+    if (strVal) myStack.Push(strVal);
+    objFrm.txtValue.value = "";
+}
+
+function popValue()
+{
+    var objFrm;
+    var strVal;
+
+    objFrm = document.frmMain;
+    if (!myStack.IsEmpty())
+    {
+        strVal = myStack.Pop();
+        objFrm.txtValue.value = strVal;
+    }
+}
+
+function getValue()
+{
+    var objFrm;
+    var strVal;
+    var intIndex = NaN;
+
+    objFrm = document.frmMain;
+    if (objFrm) intIndex = parseInt(objFrm.txtIndex.value);
+    if (!isNaN(intIndex))
+    {
+        strVal = myStack.Get(intIndex);
+        objFrm.txtValue.value = strVal;
+    }
+}
+
+function showStack()
+{
+    var objFrm;
+    var strVal, strTemp;
+    var intCntr = 0;
+
+    if (myStack.IsEmpty())
+    {
+        alert ("No values stored on stack!");
+        return;
+    }
+
+    strTemp = "";
+    objFrm = document.frmMain;
+    for (intCntr = 0; intCntr < myStack.Size(); intCntr++)
+    {
+        strVal = myStack.Get(intCntr);
+        if (intCntr == 0)
+            strTemp += "Stack[Top] = " + strVal + "\r\n";
+        else
+            strTemp += "Stack[Top + " + intCntr + "] = " + strVal + "\r\n";
+        strVal = "";
+    }
+    objFrm.txtStack.value = strTemp;
+}
+</script>
+</head>
+<body>
+    <form name="frmMain" id="frmMain" method="POST">
+        <table>
+            <tr>
+                <td valign="top">
+                    <table>
+                        <tr>
+                            <td>Value : </td>
+                            <td><input type="text" name="txtValue" id="txtValue" size="20" /></td>
+                        </tr>
+                        <tr>
+                            <td colspan="2">
+                                <button id="btnPush" name="btnPush" onClick="javascript:pushValue()">Push</button>
+                                <button id="btnPop" name="btnPop" onClick="javascript:popValue()">Pop</button>
+                            </td>
+                        </tr>
+                        <tr>
+                            <td colspan="2">
+                                <button id="btnGet" name="btnGet" onClick="getValue()">Get</button>
+                                @&nbsp;<input type="text" size="2" maxlength="2" id="txtIndex" name="txtIndex" />
+                            </td>
+                        </tr>
+                        <tr>
+                            <td colspan="2">
+                                <button name="btnWalk" id="btnWalk" onClick="javascript:showStack()">Walk</button>
+                            </td>
+                        </tr>
+                    </table>
+                </td>
+                <td>
+                    <textarea id="txtStack" name="txtStack" cols="30" rows="10"></textarea>
+                </td>
+            </tr>
+        </table>
+    </form>
+</body>
+</html>

+ 54 - 0
lib/JSExpressionEval_src/TokanTester.htm

@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1250">
+<meta name="generator" content="PSPad editor, www.pspad.com">
+<title>Tokanizer Tester</title>
+<script language="javascript" type="text/javascript" src="Tokanizer.js"></script>
+<script language="javascript">
+<!--//
+function getTokens()
+{
+    var intCntr;
+    var form = document.frmMain;
+    var arrTokens = Tokanize(form.txtExp.value);
+    var strTemp = "";
+    var strTmp = "";
+    if (arrTokens.length > 0)
+    {
+        for (intCntr = 0; intCntr < arrTokens.length; intCntr++)
+        {
+            strTemp += arrTokens[intCntr];
+            strTmp += "Token " + intCntr + " : " + arrTokens[intCntr] + "\r\n";
+        }
+        form.txtResult.value = strTemp + "\r\n" + strTmp     ;
+    }
+    else
+        alert ("No Tokens");
+}
+//-->
+</script>
+</head>
+<body>
+    <form name="frmMain" id="frmMain" method="POST">
+        <table>
+        <tbody>
+            <tr>
+                <td>Enter an Expression : </td>
+                <td><input type="text" size="60" name="txtExp" id="txtExp"></input></td>
+            </tr>
+            <tr>
+                <td colspan="2">
+                    <textarea name="txtResult" id="txtResult" cols="60" rows="10"></textarea>
+                </td>
+            </tr>
+            <tr>
+                <td colspan="2">
+                    <button name="btnTokanize" id="btnTokanize" onClick="javascript:getTokens();">Tokanize</button>
+                </td>
+            </tr>
+        </tbody>
+        </table>
+    </form>
+</body>
+</html>

+ 493 - 0
lib/JSExpressionEval_src/Tokanizer.js

@@ -0,0 +1,493 @@
+/*------------------------------------------------------------------------------
+ * NAME    : Tokanizer.js
+ * PURPOSE : Parse a string a make an array of tokens. The following tokens are
+ *           reconized.
+ *           () 
+ *           ^ * / % + -  
+ *           ! & | TRUE FALSE
+ *           < <= > >= <> =
+ *           AVG ABS ACOS ASC ASIN ATAN CDATE CHR COS DATE FIX HEX IIF 
+ *           LCASE LEFT LOG MAX MID MIN RIGHT ROUND SIN SQRT TAN UCASE 
+ *           , ' "
+ * AUTHOR  : Prasad P. Khandekar
+ * CREATED : August 19, 2005
+ *------------------------------------------------------------------------------
+ * -3              // Negative 3 - is the first token
+ * 3+-2            // Negative 2 - previous token is an operator and next is a digit
+ * 3*-(2)          // Negative 2 - previous token is an operator and next is an opening brace
+ * 3*ABS(-2)       // Negative 2 - previous token is an opening brace and next is a digit
+ * 3+-SQR(4)       // Negative SQR - previous token is an operator and next is a alpha
+ *
+ * 3-2             // Positive 2 - previous token is a digit and next is a digit
+ * 3 - 2           // Positive 2 - previous token is a digit or space and next is a space
+ * ABS(3.4)-2      // Positive 2 - previous token is a closing brace and next is a digit
+ * ABS(3.4)- 2     // Positive 2 - previous token is a digit and next is a space
+ * ABS(3.4) - 2    // Positive 2 - previous token is a closing brace or space and next is a space
+ *------------------------------------------------------------------------------
+ * Copyright (c) 2005. Khan Information Systems. All Rights Reserved
+ * The contents of this file are subject to the KIS Public License 1.0
+ * (the "License"); you may not use this file except in compliance with the 
+ * License. You should have received a copy of the KIS Public License along with 
+ * this library; if not, please ask your software vendor to provide one.
+ * 
+ * YOU AGREE THAT THE PROGRAM IS PROVIDED AS-IS, WITHOUT WARRANTY OF ANY KIND
+ * (EITHER EXPRESS OR IMPLIED) INCLUDING, WITHOUT LIMITATION, ANY IMPLIED 
+ * WARRANTY OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND ANY 
+ * WARRANTY OF NON INFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE 
+ * PROGRAM, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * See the License for the specific language governing rights and limitations 
+ * under the License.
+ *-----------------------------------------------------------------------------*/
+ var lstAlpha    = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,uv,w,x,y,z";
+ var lstDigits   = "0,1,2,3,4,5,6,7,8,9";
+ var lstArithOps = "^,*,/,%,+,-";
+ var lstLogicOps = "!,&,|";
+ var lstCompaOps = "<,<=,>,>=,<>,=";
+ var lstFuncOps  = ["AVG","ABS","ACOS","ASC","ASIN","ATAN","CDATE","CHR","COS","DATE","FIX","HEX","IIF","LCASE","LEFT","LOG","MAX","MID","MIN","RIGHT","ROUND","SIN","SQRT","TAN","UCASE"];
+
+/*------------------------------------------------------------------------------
+ * NAME       : Tokanize
+ * PURPOSE    : Breaks the string into a token array. It also checks whether the
+ *              parenthesis, single quotes and double quotes are balanced or not.
+ * PARAMETERS : pstrExpression - The string from which token array is to be 
+ *              constructed.
+ * RETURNS    : An array of tokens.
+ * THROWS     : Unterminated string constant - Single/Double quotes are not 
+ *                                             properly terminated
+ *              Unbalanced parenthesis - Opening/closing braces are not balanced
+ *----------------------------------------------------------------------------*/
+ function Tokanize(pstrExpression)
+ {
+    var intCntr, intBraces;
+    var arrTokens;
+    var intIndex, intPos;
+    var chrChar, chrNext;
+    var strToken, prevToken;
+
+    intCntr   = 0;
+    intBraces = 0;
+    intIndex  = 0;
+    strToken  = "";
+    arrTokens = new Array();
+    pstrExpression = Trim(pstrExpression);
+    while (intCntr < pstrExpression.length)
+    {
+        prevToken = "";
+        chrChar = pstrExpression.substr(intCntr, 1);
+        if (window)
+            if (window.status)
+                window.status = "Processing " + chrChar;
+        switch (chrChar)
+        {
+            case " " :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                break;
+            case "(":
+                intBraces++;
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case ")" :
+                intBraces--;
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "^" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "*" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "/" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "%" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "&" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "|" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "," :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "-" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                chrNext = pstrExpression.substr(intCntr + 1, 1);
+                if (arrTokens.length > 0)
+                    prevToken = arrTokens[intIndex - 1];
+                if (intCntr == 0 || ((IsOperator(prevToken) ||
+                    prevToken == "(" || prevToken == ",") && 
+                    (IsDigit(chrNext) || chrNext == "(")))
+                {
+                    // Negative Number
+                    strToken += chrChar;
+                }
+                else
+                {
+                    arrTokens[intIndex] = chrChar;
+                    intIndex++;
+                    strToken = "";
+                }
+                break;
+            case "+" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                chrNext = pstrExpression.substr(intCntr + 1, 1);
+                if (arrTokens.length > 0)
+                    prevToken = arrTokens[intIndex - 1];
+                if (intCntr == 0 || ((IsOperator(prevToken) ||
+                    prevToken == "(" || prevToken == ",") && 
+                    (IsDigit(chrNext) || chrNext == "(")))
+                {
+                    // positive Number
+                    strToken += chrChar;
+                }
+                else
+                {
+                    arrTokens[intIndex] = chrChar;
+                    intIndex++;
+                    strToken = "";
+                }
+                break;
+            case "<" :
+                chrNext = pstrExpression.substr(intCntr + 1, 1);
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                if (chrNext == "=")
+                {
+                    arrTokens[intIndex] = chrChar + "=";
+                    intIndex++;
+                    intCntr++;
+                }
+                else if (chrNext == ">")
+                {
+                    arrTokens[intIndex] = chrChar + ">";
+                    intIndex++;
+                    intCntr++;
+                }
+                else
+                {
+                    arrTokens[intIndex] = chrChar;
+                    intIndex++;
+                }
+                break;
+            case ">" :
+                chrNext = pstrExpression.substr(intCntr + 1, 1);
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                if (chrNext == "=")
+                {
+                    arrTokens[intIndex] = chrChar + "=";
+                    intIndex++;
+                    intCntr++;
+                }
+                else
+                {
+                    arrTokens[intIndex] = chrChar;
+                    intIndex++;
+                }
+                break;
+            case "=" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+                arrTokens[intIndex] = chrChar;
+                intIndex++;
+                break;
+            case "'" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+
+                intPos = pstrExpression.indexOf(chrChar, intCntr + 1);
+                if (intPos < 0) 
+                    throw "Unterminated string constant";
+                else
+                {
+                    strToken += pstrExpression.substring(intCntr + 1, intPos);
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                    intCntr = intPos;
+                }
+                break;
+            case "\"" :
+                if (strToken.length > 0)
+                {
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                }
+
+                intPos = pstrExpression.indexOf(chrChar, intCntr + 1);
+                if (intPos < 0)
+                {
+                    throw "Unterminated string constant";
+                }
+                else
+                {
+                    strToken += pstrExpression.substring(intCntr + 1, intPos);
+                    arrTokens[intIndex] = strToken;
+                    intIndex++;
+                    strToken = "";
+                    intCntr = intPos;
+                }
+                break;
+            default :
+                strToken += chrChar;
+                break;
+        }
+        intCntr++;
+    }
+    if (intBraces > 0)
+        throw "Unbalanced parenthesis!";
+
+    if (strToken.length > 0)
+        arrTokens[intIndex] = strToken;
+    return arrTokens;
+}
+
+/*------------------------------------------------------------------------------
+ * NAME       : IsDigit
+ * PURPOSE    : Checks whether the character specified by chrArg is a numeric 
+ *              character.
+ * PARAMETERS : chrArg - The character to be checked
+ * RETURNS    : False - If chrArg is not a numeric character
+ *              True - Otherwise 
+ *----------------------------------------------------------------------------*/
+function IsDigit(chrArg)
+{
+    if (lstDigits.indexOf(chrArg) >= 0)
+        return true;
+    return false;
+}
+
+/*------------------------------------------------------------------------------
+ * NAME       : IsAlpha
+ * PURPOSE    : Checks whether the character specified by chrArg is a alphabet 
+ * PARAMETERS : chrArg - The character to be checked
+ * RETURNS    : False - If chrArg is not a alphabet
+ *              True - Otherwise 
+ *----------------------------------------------------------------------------*/
+function IsAlpha(chrArg)
+{
+    if (lstAlpha.indexOf(chrArg) >= 0 || 
+        lstAlpha.toUpperCase().indexOf(chrArg) >= 0)
+        return true;
+    return false;
+}
+
+/*------------------------------------------------------------------------------
+ * NAME       : IsOperator
+ * PURPOSE    : Checks whether the string specified by strArg is an operator
+ * PARAMETERS : strArg - The string to be checked
+ * RETURNS    : False - If strArg is not an operator symbol
+ *              True - Otherwise 
+ *----------------------------------------------------------------------------*/
+function IsOperator(strArg)
+{
+    if (lstArithOps.indexOf(strArg) >= 0 || lstCompaOps.indexOf(strArg) >= 0)
+        return true;
+    return false;
+}
+
+/*------------------------------------------------------------------------------
+ * NAME       : IsFunction
+ * PURPOSE    : Checks whether the string specified by strArg is a function name
+ * PARAMETERS : strArg - The string to be checked
+ * RETURNS    : False - If strArg is not a valid built-in function name.
+ *              True - Otherwise 
+ *----------------------------------------------------------------------------*/
+function IsFunction(strArg)
+{
+	var idx = 0;
+
+	strArg = strArg.toUpperCase();
+	for (idx = 0; idx < lstFuncOps.length; idx++)
+	{
+	    if (strArg == lstFuncOps[idx])
+	        return true;
+	}
+	return false;
+}
+
+/*------------------------------------------------------------------------------
+ * NAME       : Trim
+ * PURPOSE    : Removes trailing and leading spaces from a string.
+ * PARAMETERS : pstrVal - The string from which leading and trailing spaces are 
+ *              to be removed.
+ * RETURNS    : A string with leading and trailing spaces removed.
+ *----------------------------------------------------------------------------*/
+function Trim(pstrVal)
+{
+    if (pstrVal.length < 1) return "";
+
+    pstrVal = RTrim(pstrVal);
+    pstrVal = LTrim(pstrVal);
+    if (pstrVal == "")
+		return "";
+    else
+        return pstrVal;
+}
+
+/*------------------------------------------------------------------------------
+ * NAME       : RTrim
+ * PURPOSE    : Removes trailing spaces from a string.
+ * PARAMETERS : pstrValue - The string from which trailing spaces are to be removed.
+ * RETURNS    : A string with trailing spaces removed.
+ *----------------------------------------------------------------------------*/
+function RTrim(pstrValue)
+{
+    var w_space = String.fromCharCode(32);
+    var v_length = pstrValue.length;
+    var strTemp = "";
+    if(v_length < 0)
+    {
+        return"";
+    }
+    var iTemp = v_length - 1;
+
+    while(iTemp > -1)
+    {
+        if(pstrValue.charAt(iTemp) == w_space)
+        {
+        }
+        else
+        {
+            strTemp = pstrValue.substring(0, iTemp + 1);
+            break;
+        }
+        iTemp = iTemp - 1;
+    }
+    return strTemp;
+}
+
+/*------------------------------------------------------------------------------
+ * NAME       : LTrim
+ * PURPOSE    : Removes leading spaces from a string.
+ * PARAMETERS : pstrValue - The string from which leading spaces are to be removed.
+ * RETURNS    : A string with leading spaces removed.
+ *----------------------------------------------------------------------------*/
+function LTrim(pstrValue)
+{
+    var w_space = String.fromCharCode(32);
+    if(v_length < 1)
+    {
+        return "";
+    }
+    var v_length = pstrValue.length;
+    var strTemp = "";
+    var iTemp = 0;
+
+    while(iTemp < v_length)
+    {
+        if(pstrValue.charAt(iTemp) == w_space)
+        {
+        }
+        else
+        {
+            strTemp = pstrValue.substring(iTemp, v_length);
+            break;
+        }
+        iTemp = iTemp + 1;
+    }
+    return strTemp;
+}

+ 47 - 0
lib/JSExpressionEval_src/VBEval.htm

@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=windows-1250">
+<meta name="generator" content="PSPad editor, www.pspad.com">
+<style>
+body {font-family: Verdana,Tahoma; font-size: 9pt; font-weight: normal;}
+table {font-family: Verdana,Tahoma; font-size: 9pt; font-weight: normal;}
+input {font-family: Verdana,Tahoma; font-size: 10pt; font-weight: normal; border: 1px solid;}
+textarea {font-family: Verdana,Tahoma; font-size: 10pt; font-weight: normal; border: 1px solid;}
+button {font-family: Verdana,Tahoma; font-size: 8pt; font-weight: bold; width: 125px; height: 24px;}
+</style>
+<title>VB Eval</title>
+<script language="vbscript">
+Sub Calculate()
+    Dim frm
+    Dim strExp
+    Dim strResult
+
+    Set frm = document.frmMain
+    strExp = frm.txtExp.Value
+    strResult = Eval(strExp)
+    frm.txtResult.Value = strResult
+End Sub
+</script>
+</head>
+<body>
+    <form name="frmMain" id="frmMain" method="POST">
+        <table>
+            <tr>
+                <td>Expression : </td>
+                <td><input type="text" size="50" name="txtExp" id="txtExp" /></td>
+            </tr>
+            <tr>
+                <td colspan="2">
+                    <textarea name="txtResult" id="txtResult" cols="61" rows="5"></textarea>
+                </td>
+            </tr>
+            <tr>
+                <td colspan="2" align ="center">
+                    <button name="btnCalc" id="btnCalc" onClick="vbscript:Calculate()">Calculate</button>
+                </td>
+            </tr>
+        </table>
+    </form>
+</body>
+</html>

+ 123 - 0
lib/JSExpressionEval_src/postfix.txt

@@ -0,0 +1,123 @@
+(           99
+-!          10
+Functions   9
+^           7
+*/%         6
++-          5
+&|          3
+><=<><=>=   4
+
+
+10/Abs(3) + 2 > 2 & 3 >= 2
+--------------------------------------
+10      (       10
+/       (/      10
+Abs     (/Abs   10
+(       (/Abs(  10
+3       (/Abs(  10 3
+)       (/Abs   10 3
++       (+      10 3 Abs /
+2       (+      10 3 Abs / 2
+>       (>      10 3 Abs / 2 +
+2       (>      10 3 Abs / 2 + 2
+&       (&      10 3 Abs / 2 + 2 >
+3       (&      10 3 Abs / 2 + 2 > 3
+>=      (&>=    10 3 Abs / 2 + 2 > 3
+2       (&>=    10 3 Abs / 2 + 2 > 3 2
+--------------------------------------
+10 3 Abs / 2 + 2 > 3 2 >= & 
+10 3 Abs / 2 + 2 > 3 2 >= &
+
+10/Abs(3) + 2
+----------------------------------
+10      (       10
+/       (/      10
+Abs     (/Abs   10
+(       (/Abs(  10
+3       (/Abs(  10 3
+)       (/Abs   10 3
++       (+      10 3 Abs /
+2       (+      10 3 Abs / 2
+-----------------------------------
+10 3 Abs / 2 +
+10 3 Abs / 2 +
+
+
+2+3.4*56/MAX(3,4,5)
+---------------------------------
+2	(	2
++	(+	2
+3.4	(+	2 3.4
+*	(+*	2 3.4
+56	(+*	2 3.4 56
+/	(+/	2 3.4 56 *
+MAX	(+/MAX	2 3.4 56 *
+(	(+/MAX(	2 3.4 56 *
+3	(+/MAX(	2 3.4 56 * 3
+,	(+/MAX(	2 3.4 56 * 3
+4	(+/MAX(	2 3.4 56 * 3 4
+,	(+/MAX(	2 3.4 56 * 3 4
+5	(+/MAX(	2 3.4 56 * 3 4 5
+)	(+/MAX	2 3.4 56 * 3 4 5
+--------------------------------
+2 3.4 56 * 3 4 5 MAX / +
+2 3.4 56 * 3 4 5 MAX / +
+
+
+2+3.4*56^AVG(3,4,5)
+--------------------------------------
+2	(		2
++	(+		2
+3.4	(+		2 3.4
+*	(+*		2 3.4
+56	(+*		2 3.4 56
+^	(+*^		2 3.4 56
+AVG	(+*^AVG		2 3.4 56
+(	(+*^AVG(	2 3.4 56
+3	(+*^AVG(	2 3.4 56 3
+,	(+*^AVG(	2 3.4 56 3
+4	(+*^AVG(	2 3.4 56 3 4
+,	(+*^AVG(	2 3.4 56 3 4
+5	(+*^AVG(	2 3.4 56 3 4 5
+)	(+*^AVG		2 3.4 56 3 4 5
+---------------------------------------
+2 3.4 56 3 4 5 AVG ^ * +
+
+
+3+MAX(3*4,6,7)
+--------------------------------------------
+3	(		3
++	(+		3
+MAX	(+MAX		3
+(	(+MAX(		3
+3	(+MAX(		3 3
+*	(+MAX(*		3 3
+4	(+MAX(*		3 3 4
+,	(+MAX(		3 3 4 *
+6	(+MAX(		3 3 4 * 6
+,	(+MAX(		3 3 4 * 6
+7	(+MAX(		3 3 4 * 6 7
+)	(+MAX		3 3 4 * 6 7
+--------------------------------------------
+3 3 4 * 6 7 MAX
+
+
+3+MAX(3+2*4,6,7)
+------------------------------------------
+3	(		3
++	(+		3
+MAX	(+MAX		3
+(	(+MAX(		3
+3	(+MAX(		3 3
++	(+MAX(+		3 3
+2	(+MAX(+		3 3 2
+*	(+MAX(+*	3 3 2
+4	(+MAX(+*	3 3 2 4
+,	(+MAX(		3 3 2 4 * +
+6	(+MAX(		3 3 2 4 * + 6
+,	(+MAX(		3 3 2 4 * + 6
+7	(+MAX(		3 3 2 4 * + 6 7
+)	(+MAX		3 3 2 4 * + 6 7
+--------------------------------------------
+3 3 2 4 * + 6 7 MAX +
+3 3 2 4 * + 6 7 MAX +

+ 657 - 0
lib/bootstrap/bootstrap-paginator.js

@@ -0,0 +1,657 @@
+/**
+ * bootstrap-paginator.js v0.5
+ * --
+ * Copyright 2013 Yun Lai <lyonlai1984@gmail.com>
+ * --
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function ($) {
+
+    "use strict"; // jshint ;_;
+
+
+    /* Paginator PUBLIC CLASS DEFINITION
+     * ================================= */
+
+    /**
+     * Boostrap Paginator Constructor
+     *
+     * @param element element of the paginator
+     * @param options the options to config the paginator
+     *
+     * */
+    var BootstrapPaginator = function (element, options) {
+        this.init(element, options);
+    },
+        old = null;
+
+    BootstrapPaginator.prototype = {
+
+        /**
+         * Initialization function of the paginator, accepting an element and the options as parameters
+         *
+         * @param element element of the paginator
+         * @param options the options to config the paginator
+         *
+         * */
+        init: function (element, options) {
+
+            this.$element = $(element);
+
+            var version = (options && options.bootstrapMajorVersion) ? options.bootstrapMajorVersion : $.fn.bootstrapPaginator.defaults.bootstrapMajorVersion,
+                id = this.$element.attr("id");
+
+            if (version === 2 && !this.$element.is("div")) {
+
+                throw "in Bootstrap version 2 the pagination must be a div element. Or if you are using Bootstrap pagination 3. Please specify it in bootstrapMajorVersion in the option";
+            } else if (version > 2 && !this.$element.is("ul")) {
+                throw "in Bootstrap version 3 the pagination root item must be an ul element."
+            }
+
+
+
+            this.currentPage = 1;
+
+            this.lastPage = 1;
+
+            this.setOptions(options);
+
+            this.initialized = true;
+        },
+
+        /**
+         * Update the properties of the paginator element
+         *
+         * @param options options to config the paginator
+         * */
+        setOptions: function (options) {
+
+            this.options = $.extend({}, (this.options || $.fn.bootstrapPaginator.defaults), options);
+
+            this.totalPages = parseInt(this.options.totalPages, 10);  //setup the total pages property.
+            this.numberOfPages = parseInt(this.options.numberOfPages, 10); //setup the numberOfPages to be shown
+
+            //move the set current page after the setting of total pages. otherwise it will cause out of page exception.
+            if (options && typeof (options.currentPage)  !== 'undefined') {
+
+                this.setCurrentPage(options.currentPage);
+            }
+
+            this.listen();
+
+            //render the paginator
+            this.render();
+
+            if (!this.initialized && this.lastPage !== this.currentPage) {
+                this.$element.trigger("page-changed", [this.lastPage, this.currentPage]);
+            }
+
+        },
+
+        /**
+         * Sets up the events listeners. Currently the pageclicked and pagechanged events are linked if available.
+         *
+         * */
+        listen: function () {
+
+            this.$element.off("page-clicked");
+
+            this.$element.off("page-changed");// unload the events for the element
+
+            if (typeof (this.options.onPageClicked) === "function") {
+                this.$element.bind("page-clicked", this.options.onPageClicked);
+            }
+
+            if (typeof (this.options.onPageChanged) === "function") {
+                this.$element.on("page-changed", this.options.onPageChanged);
+            }
+
+            this.$element.bind("page-clicked", this.onPageClicked);
+        },
+
+
+        /**
+         *
+         *  Destroys the paginator element, it unload the event first, then empty the content inside.
+         *
+         * */
+        destroy: function () {
+
+            this.$element.off("page-clicked");
+
+            this.$element.off("page-changed");
+
+            this.$element.removeData('bootstrapPaginator');
+
+            this.$element.empty();
+
+        },
+
+        /**
+         * Shows the page
+         *
+         * */
+        show: function (page) {
+
+            this.setCurrentPage(page);
+
+            this.render();
+
+            if (this.lastPage !== this.currentPage) {
+                this.$element.trigger("page-changed", [this.lastPage, this.currentPage]);
+            }
+        },
+
+        /**
+         * Shows the next page
+         *
+         * */
+        showNext: function () {
+            var pages = this.getPages();
+
+            if (pages.next) {
+                this.show(pages.next);
+            }
+
+        },
+
+        /**
+         * Shows the previous page
+         *
+         * */
+        showPrevious: function () {
+            var pages = this.getPages();
+
+            if (pages.prev) {
+                this.show(pages.prev);
+            }
+
+        },
+
+        /**
+         * Shows the first page
+         *
+         * */
+        showFirst: function () {
+            var pages = this.getPages();
+
+            if (pages.first) {
+                this.show(pages.first);
+            }
+
+        },
+
+        /**
+         * Shows the last page
+         *
+         * */
+        showLast: function () {
+            var pages = this.getPages();
+
+            if (pages.last) {
+                this.show(pages.last);
+            }
+
+        },
+
+        /**
+         * Internal on page item click handler, when the page item is clicked, change the current page to the corresponding page and
+         * trigger the pageclick event for the listeners.
+         *
+         *
+         * */
+        onPageItemClicked: function (event) {
+
+            var type = event.data.type,
+                page = event.data.page;
+
+            this.$element.trigger("page-clicked", [event, type, page]);
+
+        },
+
+        onPageClicked: function (event, originalEvent, type, page) {
+
+            //show the corresponding page and retrieve the newly built item related to the page clicked before for the event return
+
+            var currentTarget = $(event.currentTarget);
+
+            switch (type) {
+            case "first":
+                currentTarget.bootstrapPaginator("showFirst");
+                break;
+            case "prev":
+                currentTarget.bootstrapPaginator("showPrevious");
+                break;
+            case "next":
+                currentTarget.bootstrapPaginator("showNext");
+                break;
+            case "last":
+                currentTarget.bootstrapPaginator("showLast");
+                break;
+            case "page":
+                currentTarget.bootstrapPaginator("show", page);
+                break;
+            }
+
+        },
+
+        /**
+         * Renders the paginator according to the internal properties and the settings.
+         *
+         *
+         * */
+        render: function () {
+
+            //fetch the container class and add them to the container
+            var containerClass = this.getValueFromOption(this.options.containerClass, this.$element),
+                size = this.options.size || "normal",
+                alignment = this.options.alignment || "left",
+                pages = this.getPages(),
+                listContainer = this.options.bootstrapMajorVersion === 2 ? $("<ul></ul>") : this.$element,
+                listContainerClass = this.options.bootstrapMajorVersion === 2 ? this.getValueFromOption(this.options.listContainerClass, listContainer) : null,
+                first = null,
+                prev = null,
+                next = null,
+                last = null,
+                p = null,
+                i = 0;
+
+
+            this.$element.prop("class", "");
+
+            this.$element.addClass("pagination");
+
+            switch (size.toLowerCase()) {
+            case "large":
+            case "small":
+            case "mini":
+                this.$element.addClass($.fn.bootstrapPaginator.sizeArray[this.options.bootstrapMajorVersion][size.toLowerCase()]);
+                break;
+            default:
+                break;
+            }
+
+            if (this.options.bootstrapMajorVersion === 2) {
+                switch (alignment.toLowerCase()) {
+                case "center":
+                    this.$element.addClass("pagination-centered");
+                    break;
+                case "right":
+                    this.$element.addClass("pagination-right");
+                    break;
+                default:
+                    break;
+                }
+            }
+
+
+            this.$element.addClass(containerClass);
+
+            //empty the outter most container then add the listContainer inside.
+            this.$element.empty();
+
+            if (this.options.bootstrapMajorVersion === 2) {
+                this.$element.append(listContainer);
+
+                listContainer.addClass(listContainerClass);
+            }
+
+            //update the page element reference
+            this.pageRef = [];
+
+            if (pages.first) {//if the there is first page element
+                first = this.buildPageItem("first", pages.first);
+
+                if (first) {
+                    listContainer.append(first);
+                }
+
+            }
+
+            if (pages.prev) {//if the there is previous page element
+
+                prev = this.buildPageItem("prev", pages.prev);
+
+                if (prev) {
+                    listContainer.append(prev);
+                }
+
+            }
+
+
+            for (i = 0; i < pages.length; i = i + 1) {//fill the numeric pages.
+
+                p = this.buildPageItem("page", pages[i]);
+
+                if (p) {
+                    listContainer.append(p);
+                }
+            }
+
+            if (pages.next) {//if there is next page
+
+                next = this.buildPageItem("next", pages.next);
+
+                if (next) {
+                    listContainer.append(next);
+                }
+            }
+
+            if (pages.last) {//if there is last page
+
+                last = this.buildPageItem("last", pages.last);
+
+                if (last) {
+                    listContainer.append(last);
+                }
+            }
+        },
+
+        /**
+         *
+         * Creates a page item base on the type and page number given.
+         *
+         * @param page page number
+         * @param type type of the page, whether it is the first, prev, page, next, last
+         *
+         * @return Object the constructed page element
+         * */
+        buildPageItem: function (type, page) {
+
+            var itemContainer = $("<li></li>"),//creates the item container
+                itemContent = $("<a></a>"),//creates the item content
+                text = "",
+                title = "",
+                itemContainerClass = this.options.itemContainerClass(type, page, this.currentPage),
+                itemContentClass = this.getValueFromOption(this.options.itemContentClass, type, page, this.currentPage),
+                tooltipOpts = null;
+
+
+            switch (type) {
+
+            case "first":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            case "last":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            case "prev":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            case "next":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            case "page":
+                if (!this.getValueFromOption(this.options.shouldShowPage, type, page, this.currentPage)) { return; }
+                text = this.options.itemTexts(type, page, this.currentPage);
+                title = this.options.tooltipTitles(type, page, this.currentPage);
+                break;
+            }
+
+            itemContainer.addClass(itemContainerClass).append(itemContent);
+
+            itemContent.addClass(itemContentClass).html(text).on("click", null, {type: type, page: page}, $.proxy(this.onPageItemClicked, this));
+
+            if (this.options.pageUrl) {
+                itemContent.attr("href", this.getValueFromOption(this.options.pageUrl, type, page, this.currentPage));
+            }
+
+            if (this.options.useBootstrapTooltip) {
+                tooltipOpts = $.extend({}, this.options.bootstrapTooltipOptions, {title: title});
+
+                itemContent.tooltip(tooltipOpts);
+            } else {
+                itemContent.attr("title", title);
+            }
+
+            return itemContainer;
+
+        },
+
+        setCurrentPage: function (page) {
+            if (page > this.totalPages || page < 1) {// if the current page is out of range, throw exception.
+
+                throw "Page out of range";
+
+            }
+
+            this.lastPage = this.currentPage;
+
+            this.currentPage = parseInt(page, 10);
+
+        },
+
+        /**
+         * Gets an array that represents the current status of the page object. Numeric pages can be access via array mode. length attributes describes how many numeric pages are there. First, previous, next and last page can be accessed via attributes first, prev, next and last. Current attribute marks the current page within the pages.
+         *
+         * @return object output objects that has first, prev, next, last and also the number of pages in between.
+         * */
+        getPages: function () {
+
+            var totalPages = this.totalPages,// get or calculate the total pages via the total records
+                pageStart = (this.currentPage % this.numberOfPages === 0) ? (parseInt(this.currentPage / this.numberOfPages, 10) - 1) * this.numberOfPages + 1 : parseInt(this.currentPage / this.numberOfPages, 10) * this.numberOfPages + 1,//calculates the start page.
+                output = [],
+                i = 0,
+                counter = 0;
+
+            pageStart = pageStart < 1 ? 1 : pageStart;//check the range of the page start to see if its less than 1.
+
+            for (i = pageStart, counter = 0; counter < this.numberOfPages && i <= totalPages; i = i + 1, counter = counter + 1) {//fill the pages
+                output.push(i);
+            }
+
+            output.first = 1;//add the first when the current page leaves the 1st page.
+
+            if (this.currentPage > 1) {// add the previous when the current page leaves the 1st page
+                output.prev = this.currentPage - 1;
+            } else {
+                output.prev = 1;
+            }
+
+            if (this.currentPage < totalPages) {// add the next page when the current page doesn't reach the last page
+                output.next = this.currentPage + 1;
+            } else {
+                output.next = totalPages;
+            }
+
+            output.last = totalPages;// add the last page when the current page doesn't reach the last page
+
+            output.current = this.currentPage;//mark the current page.
+
+            output.total = totalPages;
+
+            output.numberOfPages = this.options.numberOfPages;
+
+            return output;
+
+        },
+
+        /**
+         * Gets the value from the options, this is made to handle the situation where value is the return value of a function.
+         *
+         * @return mixed value that depends on the type of parameters, if the given parameter is a function, then the evaluated result is returned. Otherwise the parameter itself will get returned.
+         * */
+        getValueFromOption: function (value) {
+
+            var output = null,
+                args = Array.prototype.slice.call(arguments, 1);
+
+            if (typeof value === 'function') {
+                output = value.apply(this, args);
+            } else {
+                output = value;
+            }
+
+            return output;
+
+        }
+
+    };
+
+
+    /* TYPEAHEAD PLUGIN DEFINITION
+     * =========================== */
+
+    old = $.fn.bootstrapPaginator;
+
+    $.fn.bootstrapPaginator = function (option) {
+
+        var args = arguments,
+            result = null;
+
+        $(this).each(function (index, item) {
+            var $this = $(item),
+                data = $this.data('bootstrapPaginator'),
+                options = (typeof option !== 'object') ? null : option;
+
+            if (!data) {
+                data = new BootstrapPaginator(this, options);
+
+                $this = $(data.$element);
+
+                $this.data('bootstrapPaginator', data);
+
+                return;
+            }
+
+            if (typeof option === 'string') {
+
+                if (data[option]) {
+                    result = data[option].apply(data, Array.prototype.slice.call(args, 1));
+                } else {
+                    throw "Method " + option + " does not exist";
+                }
+
+            } else {
+                result = data.setOptions(option);
+            }
+        });
+
+        return result;
+
+    };
+
+    $.fn.bootstrapPaginator.sizeArray = {
+
+        "2": {
+            "large": "pagination-large",
+            "small": "pagination-small",
+            "mini": "pagination-mini"
+        },
+        "3": {
+            "large": "pagination-lg",
+            "small": "pagination-sm",
+            "mini": ""
+        }
+
+    };
+
+    $.fn.bootstrapPaginator.defaults = {
+        containerClass: "",
+        size: "normal",
+        alignment: "left",
+        bootstrapMajorVersion: 2,
+        listContainerClass: "",
+        itemContainerClass: function (type, page, current) {
+            return (page === current) ? "active" : "";
+        },
+        itemContentClass: function (type, page, current) {
+            return "";
+        },
+        currentPage: 1,
+        numberOfPages: 5,
+        totalPages: 1,
+        pageUrl: function (type, page, current) {
+            return null;
+        },
+        onPageClicked: null,
+        onPageChanged: null,
+        useBootstrapTooltip: false,
+        shouldShowPage: function (type, page, current) {
+
+            var result = true;
+
+            switch (type) {
+            case "first":
+                result = (current !== 1);
+                break;
+            case "prev":
+                result = (current !== 1);
+                break;
+            case "next":
+                result = (current !== this.totalPages);
+                break;
+            case "last":
+                result = (current !== this.totalPages);
+                break;
+            case "page":
+                result = true;
+                break;
+            }
+
+            return result;
+
+        },
+        itemTexts: function (type, page, current) {
+            switch (type) {
+            case "first":
+                return "&lt;&lt;";
+            case "prev":
+                return "&lt;";
+            case "next":
+                return "&gt;";
+            case "last":
+                return "&gt;&gt;";
+            case "page":
+                return page;
+            }
+        },
+        tooltipTitles: function (type, page, current) {
+
+            switch (type) {
+            case "first":
+                return "Go to first page";
+            case "prev":
+                return "Go to previous page";
+            case "next":
+                return "Go to next page";
+            case "last":
+                return "Go to last page";
+            case "page":
+                return (page === current) ? "Current page is " + page : "Go to page " + page;
+            }
+        },
+        bootstrapTooltipOptions: {
+            animation: true,
+            html: true,
+            placement: 'top',
+            selector: false,
+            title: "",
+            container: false
+        }
+    };
+
+    $.fn.bootstrapPaginator.Constructor = BootstrapPaginator;
+
+
+
+}(window.jQuery));

文件差異過大導致無法顯示
+ 7 - 0
lib/bootstrap/bootstrap.min.js


文件差異過大導致無法顯示
+ 7 - 0
lib/bootstrap/css/bootstrap.min.css


文件差異過大導致無法顯示
+ 4 - 0
lib/font-awesome/font-awesome.min.css


二進制
lib/font-awesome/fonts/FontAwesome.otf


二進制
lib/font-awesome/fonts/fontawesome-webfont.eot


文件差異過大導致無法顯示
+ 2671 - 0
lib/font-awesome/fonts/fontawesome-webfont.svg


二進制
lib/font-awesome/fonts/fontawesome-webfont.ttf


二進制
lib/font-awesome/fonts/fontawesome-webfont.woff


二進制
lib/font-awesome/fonts/fontawesome-webfont.woff2


二進制
lib/jquery-contextmenu/font/context-menu-icons.eot


二進制
lib/jquery-contextmenu/font/context-menu-icons.ttf


二進制
lib/jquery-contextmenu/font/context-menu-icons.woff


二進制
lib/jquery-contextmenu/font/context-menu-icons.woff2


+ 287 - 0
lib/jquery-contextmenu/jquery.contextMenu.css

@@ -0,0 +1,287 @@
+@charset "UTF-8";
+/*!
+ * jQuery contextMenu - Plugin for simple contextMenu handling
+ *
+ * Version: v2.4.5
+ *
+ * Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF)
+ * Web: http://swisnl.github.io/jQuery-contextMenu/
+ *
+ * Copyright (c) 2011-2017 SWIS BV and contributors
+ *
+ * Licensed under
+ *   MIT License http://www.opensource.org/licenses/mit-license
+ *
+ * Date: 2017-05-05T14:40:37.763Z
+ */
+@-webkit-keyframes cm-spin {
+  0% {
+    -webkit-transform: translateY(-50%) rotate(0deg);
+            transform: translateY(-50%) rotate(0deg);
+  }
+  100% {
+    -webkit-transform: translateY(-50%) rotate(359deg);
+            transform: translateY(-50%) rotate(359deg);
+  }
+}
+@-o-keyframes cm-spin {
+  0% {
+    -webkit-transform: translateY(-50%) rotate(0deg);
+         -o-transform: translateY(-50%) rotate(0deg);
+            transform: translateY(-50%) rotate(0deg);
+  }
+  100% {
+    -webkit-transform: translateY(-50%) rotate(359deg);
+         -o-transform: translateY(-50%) rotate(359deg);
+            transform: translateY(-50%) rotate(359deg);
+  }
+}
+@keyframes cm-spin {
+  0% {
+    -webkit-transform: translateY(-50%) rotate(0deg);
+         -o-transform: translateY(-50%) rotate(0deg);
+            transform: translateY(-50%) rotate(0deg);
+  }
+  100% {
+    -webkit-transform: translateY(-50%) rotate(359deg);
+         -o-transform: translateY(-50%) rotate(359deg);
+            transform: translateY(-50%) rotate(359deg);
+  }
+}
+
+@font-face {
+  font-family: "context-menu-icons";
+  font-style: normal; 
+  font-weight: normal;
+
+  src: url("font/context-menu-icons.eot?lnvb");
+  src: url("font/context-menu-icons.eot?lnvb#iefix") format("embedded-opentype"), url("font/context-menu-icons.woff2?lnvb") format("woff2"), url("font/context-menu-icons.woff?lnvb") format("woff"), url("font/context-menu-icons.ttf?lnvb") format("truetype");
+}
+
+.context-menu-icon-add:before {
+  content: "\EA01";
+}
+
+.context-menu-icon-copy:before {
+  content: "\EA02";
+}
+
+.context-menu-icon-cut:before {
+  content: "\EA03";
+}
+
+.context-menu-icon-delete:before {
+  content: "\EA04";
+}
+
+.context-menu-icon-edit:before {
+  content: "\EA05";
+}
+
+.context-menu-icon-loading:before {
+  content: "\EA06";
+}
+
+.context-menu-icon-paste:before {
+  content: "\EA07";
+}
+
+.context-menu-icon-quit:before {
+  content: "\EA08";
+}
+
+.context-menu-icon::before {
+  position: absolute;
+  top: 50%;
+  left: 0;
+  width: 2em; 
+  font-family: "context-menu-icons";
+  font-size: 1em;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+  color: #2980b9;
+  text-align: center;
+  -webkit-transform: translateY(-50%);
+      -ms-transform: translateY(-50%);
+       -o-transform: translateY(-50%);
+          transform: translateY(-50%);
+
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.context-menu-icon.context-menu-hover:before {
+  color: #fff;
+}
+
+.context-menu-icon.context-menu-disabled::before {
+  color: #bbb;
+}
+
+.context-menu-icon.context-menu-icon-loading:before {
+  -webkit-animation: cm-spin 2s infinite;
+       -o-animation: cm-spin 2s infinite;
+          animation: cm-spin 2s infinite;
+}
+
+.context-menu-icon.context-menu-icon--fa {
+  display: list-item;
+  font-family: inherit;
+}
+.context-menu-icon.context-menu-icon--fa::before {
+  position: absolute;
+  top: 50%;
+  left: 0;
+  width: 2em; 
+  font-family: FontAwesome;
+  font-size: 1em;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+  color: #2980b9;
+  text-align: center;
+  -webkit-transform: translateY(-50%);
+      -ms-transform: translateY(-50%);
+       -o-transform: translateY(-50%);
+          transform: translateY(-50%);
+
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.context-menu-icon.context-menu-icon--fa.context-menu-hover:before {
+  color: #fff;
+}
+.context-menu-icon.context-menu-icon--fa.context-menu-disabled::before {
+  color: #bbb;
+}
+
+.context-menu-list {
+  position: absolute; 
+  display: inline-block;
+  min-width: 13em;
+  max-width: 26em;
+  padding: .25em 0;
+  margin: .3em;
+  font-family: inherit;
+  font-size: inherit;
+  list-style-type: none;
+  background: #fff;
+  border: 1px solid #bebebe;
+  border-radius: .2em;
+  -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
+          box-shadow: 0 2px 5px rgba(0, 0, 0, .5);
+}
+
+.context-menu-item {
+  position: relative;
+  padding: .2em 2em;
+  color: #2f2f2f;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none; 
+  background-color: #fff;
+}
+
+.context-menu-separator {
+  padding: 0; 
+  margin: .35em 0;
+  border-bottom: 1px solid #e6e6e6;
+}
+
+.context-menu-item > label > input,
+.context-menu-item > label > textarea {
+  -webkit-user-select: text;
+     -moz-user-select: text;
+      -ms-user-select: text;
+          user-select: text;
+}
+
+.context-menu-item.context-menu-hover {
+  color: #fff;
+  cursor: pointer; 
+  background-color: #2980b9;
+}
+
+.context-menu-item.context-menu-disabled {
+  color: #bbb;
+  cursor: default; 
+  background-color: #fff;
+}
+
+.context-menu-input.context-menu-hover {
+  color: #2f2f2f; 
+  cursor: default;
+}
+
+.context-menu-submenu:after {
+  position: absolute;
+  top: 50%;
+  right: .5em;
+  z-index: 1; 
+  width: 0;
+  height: 0;
+  content: '';
+  border-color: transparent transparent transparent #2f2f2f;
+  border-style: solid;
+  border-width: .25em 0 .25em .25em;
+  -webkit-transform: translateY(-50%);
+      -ms-transform: translateY(-50%);
+       -o-transform: translateY(-50%);
+          transform: translateY(-50%);
+}
+
+/**
+ * Inputs
+ */
+.context-menu-item.context-menu-input {
+  padding: .3em .6em;
+}
+
+/* vertically align inside labels */
+.context-menu-input > label > * {
+  vertical-align: top;
+}
+
+/* position checkboxes and radios as icons */
+.context-menu-input > label > input[type="checkbox"],
+.context-menu-input > label > input[type="radio"] {
+  position: relative;
+  top: .12em; 
+  margin-right: .4em;
+}
+
+.context-menu-input > label {
+  margin: 0;
+}
+
+.context-menu-input > label,
+.context-menu-input > label > input[type="text"],
+.context-menu-input > label > textarea,
+.context-menu-input > label > select {
+  display: block;
+  width: 100%; 
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.context-menu-input > label > textarea {
+  height: 7em;
+}
+
+.context-menu-item > .context-menu-list {
+  top: .3em; 
+  /* re-positioned by js */
+  right: -.3em;
+  display: none;
+}
+
+.context-menu-item.context-menu-visible > .context-menu-list {
+  display: block;
+}
+
+.context-menu-accesskey {
+  text-decoration: underline;
+}

文件差異過大導致無法顯示
+ 2051 - 0
lib/jquery-contextmenu/jquery.contextMenu.js


文件差異過大導致無法顯示
+ 16 - 0
lib/jquery-contextmenu/jquery.contextMenu.min.css


文件差異過大導致無法顯示
+ 1 - 0
lib/jquery-contextmenu/jquery.contextMenu.min.css.map


文件差異過大導致無法顯示
+ 2 - 0
lib/jquery-contextmenu/jquery.contextMenu.min.js


文件差異過大導致無法顯示
+ 1 - 0
lib/jquery-contextmenu/jquery.contextMenu.min.js.map


+ 513 - 0
lib/jquery-contextmenu/jquery.ui.position.js

@@ -0,0 +1,513 @@
+/*! jQuery UI - v1.12.1 - 2016-09-16
+ * http://jqueryui.com
+ * Includes: position.js
+ * Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function( factory ) {
+    if ( typeof define === "function" && define.amd ) {
+
+        // AMD. Register as an anonymous module.
+        define([ "jquery" ], factory );
+    } else {
+
+        // Browser globals
+        factory( jQuery );
+    }
+}(function( $ ) {
+
+    $.ui = $.ui || {};
+
+    var version = $.ui.version = "1.12.1";
+
+
+    /*!
+     * jQuery UI Position 1.12.1
+     * http://jqueryui.com
+     *
+     * Copyright jQuery Foundation and other contributors
+     * Released under the MIT license.
+     * http://jquery.org/license
+     *
+     * http://api.jqueryui.com/position/
+     */
+
+//>>label: Position
+//>>group: Core
+//>>description: Positions elements relative to other elements.
+//>>docs: http://api.jqueryui.com/position/
+//>>demos: http://jqueryui.com/position/
+
+
+    ( function() {
+        var cachedScrollbarWidth,
+            max = Math.max,
+            abs = Math.abs,
+            rhorizontal = /left|center|right/,
+            rvertical = /top|center|bottom/,
+            roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+            rposition = /^\w+/,
+            rpercent = /%$/,
+            _position = $.fn.position;
+
+        function getOffsets( offsets, width, height ) {
+            return [
+                parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+                parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+            ];
+        }
+
+        function parseCss( element, property ) {
+            return parseInt( $.css( element, property ), 10 ) || 0;
+        }
+
+        function getDimensions( elem ) {
+            var raw = elem[ 0 ];
+            if ( raw.nodeType === 9 ) {
+                return {
+                    width: elem.width(),
+                    height: elem.height(),
+                    offset: { top: 0, left: 0 }
+                };
+            }
+            if ( $.isWindow( raw ) ) {
+                return {
+                    width: elem.width(),
+                    height: elem.height(),
+                    offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
+                };
+            }
+            if ( raw.preventDefault ) {
+                return {
+                    width: 0,
+                    height: 0,
+                    offset: { top: raw.pageY, left: raw.pageX }
+                };
+            }
+            return {
+                width: elem.outerWidth(),
+                height: elem.outerHeight(),
+                offset: elem.offset()
+            };
+        }
+
+        $.position = {
+            scrollbarWidth: function() {
+                if ( cachedScrollbarWidth !== undefined ) {
+                    return cachedScrollbarWidth;
+                }
+                var w1, w2,
+                    div = $( "<div " +
+                        "style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +
+                        "<div style='height:100px;width:auto;'></div></div>" ),
+                    innerDiv = div.children()[ 0 ];
+
+                $( "body" ).append( div );
+                w1 = innerDiv.offsetWidth;
+                div.css( "overflow", "scroll" );
+
+                w2 = innerDiv.offsetWidth;
+
+                if ( w1 === w2 ) {
+                    w2 = div[ 0 ].clientWidth;
+                }
+
+                div.remove();
+
+                return ( cachedScrollbarWidth = w1 - w2 );
+            },
+            getScrollInfo: function( within ) {
+                var overflowX = within.isWindow || within.isDocument ? "" :
+                        within.element.css( "overflow-x" ),
+                    overflowY = within.isWindow || within.isDocument ? "" :
+                        within.element.css( "overflow-y" ),
+                    hasOverflowX = overflowX === "scroll" ||
+                        ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
+                    hasOverflowY = overflowY === "scroll" ||
+                        ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
+                return {
+                    width: hasOverflowY ? $.position.scrollbarWidth() : 0,
+                    height: hasOverflowX ? $.position.scrollbarWidth() : 0
+                };
+            },
+            getWithinInfo: function( element ) {
+                var withinElement = $( element || window ),
+                    isWindow = $.isWindow( withinElement[ 0 ] ),
+                    isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
+                    hasOffset = !isWindow && !isDocument;
+                return {
+                    element: withinElement,
+                    isWindow: isWindow,
+                    isDocument: isDocument,
+                    offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
+                    scrollLeft: withinElement.scrollLeft(),
+                    scrollTop: withinElement.scrollTop(),
+                    width: withinElement.outerWidth(),
+                    height: withinElement.outerHeight()
+                };
+            }
+        };
+
+        $.fn.position = function( options ) {
+            if ( !options || !options.of ) {
+                return _position.apply( this, arguments );
+            }
+
+            // Make a copy, we don't want to modify arguments
+            options = $.extend( {}, options );
+
+            var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
+                target = $( options.of ),
+                within = $.position.getWithinInfo( options.within ),
+                scrollInfo = $.position.getScrollInfo( within ),
+                collision = ( options.collision || "flip" ).split( " " ),
+                offsets = {};
+
+            dimensions = getDimensions( target );
+            if ( target[ 0 ].preventDefault ) {
+
+                // Force left top to allow flipping
+                options.at = "left top";
+            }
+            targetWidth = dimensions.width;
+            targetHeight = dimensions.height;
+            targetOffset = dimensions.offset;
+
+            // Clone to reuse original targetOffset later
+            basePosition = $.extend( {}, targetOffset );
+
+            // Force my and at to have valid horizontal and vertical positions
+            // if a value is missing or invalid, it will be converted to center
+            $.each( [ "my", "at" ], function() {
+                var pos = ( options[ this ] || "" ).split( " " ),
+                    horizontalOffset,
+                    verticalOffset;
+
+                if ( pos.length === 1 ) {
+                    pos = rhorizontal.test( pos[ 0 ] ) ?
+                        pos.concat( [ "center" ] ) :
+                        rvertical.test( pos[ 0 ] ) ?
+                            [ "center" ].concat( pos ) :
+                            [ "center", "center" ];
+                }
+                pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+                pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+                // Calculate offsets
+                horizontalOffset = roffset.exec( pos[ 0 ] );
+                verticalOffset = roffset.exec( pos[ 1 ] );
+                offsets[ this ] = [
+                    horizontalOffset ? horizontalOffset[ 0 ] : 0,
+                    verticalOffset ? verticalOffset[ 0 ] : 0
+                ];
+
+                // Reduce to just the positions without the offsets
+                options[ this ] = [
+                    rposition.exec( pos[ 0 ] )[ 0 ],
+                    rposition.exec( pos[ 1 ] )[ 0 ]
+                ];
+            } );
+
+            // Normalize collision option
+            if ( collision.length === 1 ) {
+                collision[ 1 ] = collision[ 0 ];
+            }
+
+            if ( options.at[ 0 ] === "right" ) {
+                basePosition.left += targetWidth;
+            } else if ( options.at[ 0 ] === "center" ) {
+                basePosition.left += targetWidth / 2;
+            }
+
+            if ( options.at[ 1 ] === "bottom" ) {
+                basePosition.top += targetHeight;
+            } else if ( options.at[ 1 ] === "center" ) {
+                basePosition.top += targetHeight / 2;
+            }
+
+            atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+            basePosition.left += atOffset[ 0 ];
+            basePosition.top += atOffset[ 1 ];
+
+            return this.each( function() {
+                var collisionPosition, using,
+                    elem = $( this ),
+                    elemWidth = elem.outerWidth(),
+                    elemHeight = elem.outerHeight(),
+                    marginLeft = parseCss( this, "marginLeft" ),
+                    marginTop = parseCss( this, "marginTop" ),
+                    collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
+                        scrollInfo.width,
+                    collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
+                        scrollInfo.height,
+                    position = $.extend( {}, basePosition ),
+                    myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
+
+                if ( options.my[ 0 ] === "right" ) {
+                    position.left -= elemWidth;
+                } else if ( options.my[ 0 ] === "center" ) {
+                    position.left -= elemWidth / 2;
+                }
+
+                if ( options.my[ 1 ] === "bottom" ) {
+                    position.top -= elemHeight;
+                } else if ( options.my[ 1 ] === "center" ) {
+                    position.top -= elemHeight / 2;
+                }
+
+                position.left += myOffset[ 0 ];
+                position.top += myOffset[ 1 ];
+
+                collisionPosition = {
+                    marginLeft: marginLeft,
+                    marginTop: marginTop
+                };
+
+                $.each( [ "left", "top" ], function( i, dir ) {
+                    if ( $.ui.position[ collision[ i ] ] ) {
+                        $.ui.position[ collision[ i ] ][ dir ]( position, {
+                            targetWidth: targetWidth,
+                            targetHeight: targetHeight,
+                            elemWidth: elemWidth,
+                            elemHeight: elemHeight,
+                            collisionPosition: collisionPosition,
+                            collisionWidth: collisionWidth,
+                            collisionHeight: collisionHeight,
+                            offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
+                            my: options.my,
+                            at: options.at,
+                            within: within,
+                            elem: elem
+                        } );
+                    }
+                } );
+
+                if ( options.using ) {
+
+                    // Adds feedback as second argument to using callback, if present
+                    using = function( props ) {
+                        var left = targetOffset.left - position.left,
+                            right = left + targetWidth - elemWidth,
+                            top = targetOffset.top - position.top,
+                            bottom = top + targetHeight - elemHeight,
+                            feedback = {
+                                target: {
+                                    element: target,
+                                    left: targetOffset.left,
+                                    top: targetOffset.top,
+                                    width: targetWidth,
+                                    height: targetHeight
+                                },
+                                element: {
+                                    element: elem,
+                                    left: position.left,
+                                    top: position.top,
+                                    width: elemWidth,
+                                    height: elemHeight
+                                },
+                                horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
+                                vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
+                            };
+                        if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+                            feedback.horizontal = "center";
+                        }
+                        if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
+                            feedback.vertical = "middle";
+                        }
+                        if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+                            feedback.important = "horizontal";
+                        } else {
+                            feedback.important = "vertical";
+                        }
+                        options.using.call( this, props, feedback );
+                    };
+                }
+
+                elem.offset( $.extend( position, { using: using } ) );
+            } );
+        };
+
+        $.ui.position = {
+            fit: {
+                left: function( position, data ) {
+                    var within = data.within,
+                        withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+                        outerWidth = within.width,
+                        collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+                        overLeft = withinOffset - collisionPosLeft,
+                        overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+                        newOverRight;
+
+                    // Element is wider than within
+                    if ( data.collisionWidth > outerWidth ) {
+
+                        // Element is initially over the left side of within
+                        if ( overLeft > 0 && overRight <= 0 ) {
+                            newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
+                                withinOffset;
+                            position.left += overLeft - newOverRight;
+
+                            // Element is initially over right side of within
+                        } else if ( overRight > 0 && overLeft <= 0 ) {
+                            position.left = withinOffset;
+
+                            // Element is initially over both left and right sides of within
+                        } else {
+                            if ( overLeft > overRight ) {
+                                position.left = withinOffset + outerWidth - data.collisionWidth;
+                            } else {
+                                position.left = withinOffset;
+                            }
+                        }
+
+                        // Too far left -> align with left edge
+                    } else if ( overLeft > 0 ) {
+                        position.left += overLeft;
+
+                        // Too far right -> align with right edge
+                    } else if ( overRight > 0 ) {
+                        position.left -= overRight;
+
+                        // Adjust based on position and margin
+                    } else {
+                        position.left = max( position.left - collisionPosLeft, position.left );
+                    }
+                },
+                top: function( position, data ) {
+                    var within = data.within,
+                        withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+                        outerHeight = data.within.height,
+                        collisionPosTop = position.top - data.collisionPosition.marginTop,
+                        overTop = withinOffset - collisionPosTop,
+                        overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+                        newOverBottom;
+
+                    // Element is taller than within
+                    if ( data.collisionHeight > outerHeight ) {
+
+                        // Element is initially over the top of within
+                        if ( overTop > 0 && overBottom <= 0 ) {
+                            newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
+                                withinOffset;
+                            position.top += overTop - newOverBottom;
+
+                            // Element is initially over bottom of within
+                        } else if ( overBottom > 0 && overTop <= 0 ) {
+                            position.top = withinOffset;
+
+                            // Element is initially over both top and bottom of within
+                        } else {
+                            if ( overTop > overBottom ) {
+                                position.top = withinOffset + outerHeight - data.collisionHeight;
+                            } else {
+                                position.top = withinOffset;
+                            }
+                        }
+
+                        // Too far up -> align with top
+                    } else if ( overTop > 0 ) {
+                        position.top += overTop;
+
+                        // Too far down -> align with bottom edge
+                    } else if ( overBottom > 0 ) {
+                        position.top -= overBottom;
+
+                        // Adjust based on position and margin
+                    } else {
+                        position.top = max( position.top - collisionPosTop, position.top );
+                    }
+                }
+            },
+            flip: {
+                left: function( position, data ) {
+                    var within = data.within,
+                        withinOffset = within.offset.left + within.scrollLeft,
+                        outerWidth = within.width,
+                        offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+                        collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+                        overLeft = collisionPosLeft - offsetLeft,
+                        overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
+                        myOffset = data.my[ 0 ] === "left" ?
+                            -data.elemWidth :
+                            data.my[ 0 ] === "right" ?
+                                data.elemWidth :
+                                0,
+                        atOffset = data.at[ 0 ] === "left" ?
+                            data.targetWidth :
+                            data.at[ 0 ] === "right" ?
+                                -data.targetWidth :
+                                0,
+                        offset = -2 * data.offset[ 0 ],
+                        newOverRight,
+                        newOverLeft;
+
+                    if ( overLeft < 0 ) {
+                        newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
+                            outerWidth - withinOffset;
+                        if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+                            position.left += myOffset + atOffset + offset;
+                        }
+                    } else if ( overRight > 0 ) {
+                        newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
+                            atOffset + offset - offsetLeft;
+                        if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+                            position.left += myOffset + atOffset + offset;
+                        }
+                    }
+                },
+                top: function( position, data ) {
+                    var within = data.within,
+                        withinOffset = within.offset.top + within.scrollTop,
+                        outerHeight = within.height,
+                        offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+                        collisionPosTop = position.top - data.collisionPosition.marginTop,
+                        overTop = collisionPosTop - offsetTop,
+                        overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+                        top = data.my[ 1 ] === "top",
+                        myOffset = top ?
+                            -data.elemHeight :
+                            data.my[ 1 ] === "bottom" ?
+                                data.elemHeight :
+                                0,
+                        atOffset = data.at[ 1 ] === "top" ?
+                            data.targetHeight :
+                            data.at[ 1 ] === "bottom" ?
+                                -data.targetHeight :
+                                0,
+                        offset = -2 * data.offset[ 1 ],
+                        newOverTop,
+                        newOverBottom;
+                    if ( overTop < 0 ) {
+                        newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
+                            outerHeight - withinOffset;
+                        if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
+                            position.top += myOffset + atOffset + offset;
+                        }
+                    } else if ( overBottom > 0 ) {
+                        newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
+                            offset - offsetTop;
+                        if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
+                            position.top += myOffset + atOffset + offset;
+                        }
+                    }
+                }
+            },
+            flipfit: {
+                left: function() {
+                    $.ui.position.flip.left.apply( this, arguments );
+                    $.ui.position.fit.left.apply( this, arguments );
+                },
+                top: function() {
+                    $.ui.position.flip.top.apply( this, arguments );
+                    $.ui.position.fit.top.apply( this, arguments );
+                }
+            }
+        };
+
+    } )();
+
+    var position = $.ui.position;
+
+
+
+
+}));

文件差異過大導致無法顯示
+ 6 - 0
lib/jquery-contextmenu/jquery.ui.position.min.js


文件差異過大導致無法顯示
+ 11 - 0
lib/jquery-editable-select/jquery.editable-select.min.css


文件差異過大導致無法顯示
+ 7 - 0
lib/jquery-editable-select/jquery.editable-select.min.js


二進制
lib/jquery-ui/images/ui-icons_444444_256x240.png


二進制
lib/jquery-ui/images/ui-icons_555555_256x240.png


二進制
lib/jquery-ui/images/ui-icons_777620_256x240.png


二進制
lib/jquery-ui/images/ui-icons_777777_256x240.png


二進制
lib/jquery-ui/images/ui-icons_cc0000_256x240.png


二進制
lib/jquery-ui/images/ui-icons_ffffff_256x240.png


+ 36 - 0
lib/jquery-ui/jquery-ui-datepickerCN.js

@@ -0,0 +1,36 @@
+/**
+ * Created by Zhong on 2017/11/27.
+ */
+jQuery(function($){
+    $.datepicker.regional['zh-CN'] = {
+        clearText: '清除',
+        clearStatus: '清除已选日期',
+        closeText: '关闭',
+        closeStatus: '不改变当前选择',
+        prevText: '< 上月',
+        prevStatus: '显示上月',
+        prevBigText: '<<',
+        prevBigStatus: '显示上一年',
+        nextText: '下月>',
+        nextStatus: '显示下月',
+        nextBigText: '>>',
+        nextBigStatus: '显示下一年',
+        currentText: '今天',
+        currentStatus: '显示本月',
+        monthNames: ['一月','二月','三月','四月','五月','六月', '七月','八月','九月','十月','十一月','十二月'],
+        monthNamesShort: ['一月','二月','三月','四月','五月','六月', '七月','八月','九月','十月','十一月','十二月'],
+        monthStatus: '选择月份',
+        yearStatus: '选择年份',
+        weekHeader: '周',
+        weekStatus: '年内周次',
+        dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+        dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+        dayNamesMin: ['日','一','二','三','四','五','六'],
+        dayStatus: '设置 DD 为一周起始',
+        dateStatus: '选择 m月 d日, DD',
+        dateFormat: 'yy-mm-dd',
+        firstDay: 1,
+        initStatus: '请选择日期',
+        isRTL: false};
+    $.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});

文件差異過大導致無法顯示
+ 1312 - 0
lib/jquery-ui/jquery-ui.css


文件差異過大導致無法顯示
+ 13 - 0
lib/jquery-ui/jquery-ui.min.js


文件差異過大導致無法顯示
+ 4 - 0
lib/jquery/jquery-3.2.1.min.js


文件差異過大導致無法顯示
+ 16 - 0
lib/js-xlsx/xlsx.core.min.js


文件差異過大導致無法顯示
+ 12557 - 0
lib/lodash/lodash.js


文件差異過大導致無法顯示
+ 1 - 0
lib/lz-string/lz-string.min.js


文件差異過大導致無法顯示
+ 5 - 0
lib/popper/popper.min.js


文件差異過大導致無法顯示
+ 785 - 0
lib/spreadjs/sheets/css/gc.spread.sheets.10.0.1.css


+ 855 - 0
lib/spreadjs/sheets/css/gc.spread.sheets.excel2013darkGray.10.0.1.css

@@ -0,0 +1,855 @@
+/*-----common css start-----*/
+.gc-theme-version {
+    position: absolute;
+    z-index: 2013;
+}
+.gc-grayArea {
+    background-color: #dedede;
+}
+.gc-corner-hover {
+    background-color: #dedede;
+}
+.gc-corner-selected {
+    background-color: #dedede;
+}
+.gc-corner-normal {
+    background-color: #dedede;
+}
+.gc-corner-triangle-normal {
+    background-color: #b3b3b3;
+    background-image: -webkit-linear-gradient(top, #b3b3b3, #b3b3b3); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #b3b3b3, #b3b3b3); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #b3b3b3, #b3b3b3); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #b3b3b3, #b3b3b3); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #b3b3b3, #b3b3b3); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+}
+.gc-corner-triangle-hover {
+    background-color: #9e9e9e;
+    background-image: -webkit-linear-gradient(top, #9e9e9e, #9e9e9e); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #9e9e9e, #9e9e9e); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #9e9e9e, #9e9e9e); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+}
+.gc-corner-triangle-selected {
+    background-color: #217346;
+    background-image: -webkit-linear-gradient(top, #217346, #217346); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #217346, #217346); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #217346, #217346); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #217346, #217346); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #217346, #217346); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+}
+.gc-columnHeader-normal {
+    color: black;
+    background-image: none;
+    background-color: #dedede;
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-hover {
+    color: black;
+    background-image: none;
+    background-color: #9fd5b7;
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-selected {
+    color: #217346;
+    background-image: none;
+    background-color: #d3f0e0;
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-highlight {
+    color: #217346;
+    background-image: none;
+    background-color: #bdbdbd;
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-rowHeader-normal {
+    color: black;
+    background-color: #dedede;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-hover {
+    color: black;
+    background-color: #9fd5b7;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-selected {
+    color: #217346;
+    background-color: #d3f0e0;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-highlight {
+    color: #217346;
+    background-color: #bdbdbd;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+    border-right-color: #999999 !important;
+}
+.gc-horizontal-scrollbar {
+    box-sizing:content-box;
+    background: #dedede;
+    border-top: 1px solid #999999;
+    height: 18px;
+    padding: 4px 0px 5px 0px;
+    margin: 0;
+}
+.gc-vertical-scrollbar {
+    box-sizing:content-box;
+    background: #dedede;
+    border-left: 1px solid #999999;
+    width: 18px;
+    padding: 0px 5px 0px 4px;
+    margin: 0;
+}
+.gc-footer-corner {
+    background-color: #dedede;
+}
+.gc-selection {
+    background-color: rgba(20, 20, 20, 0.2);
+    border-color: #217346;
+    color: rgba(240,240,240,0.7);
+}
+.gc-drag-indicator {
+    border-color: #217346;
+}
+.gc-gridlineColor {
+    border-color: #d4d4d4;
+}
+.gc-group {
+    background-color: #dedede;
+    color: #999999;
+}
+.gc-group-box {
+    background-color: #dedede;
+    color: #464646;
+    border-color: #828790;
+}
+
+.gc-tabStripNewTab-highlight {
+    border-color: #525252;
+}
+.gc-tabStripNewTab-hover {
+    border-color: #439467;
+}
+.gc-tabStripBackground {
+    background-image: -webkit-linear-gradient(top, #dedede, #dedede); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #dedede, #dedede); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #dedede, #dedede); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #dedede, #dedede); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #dedede, #dedede); /* Standard syntax; must be last */
+    background-color: #dedede;
+    border-color: #999999;
+}
+.gc-tabStripResizeBarInner {
+    color: #5e5e5e;
+}
+.gc-navMoreButton-highlight {
+    border-color: #5e5e5e;
+}
+.gc-navMoreButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-highlight {
+    border-color: #525252;
+}
+.gc-navButton-normal {
+    border-color: #9e9e9e;
+}
+.gc-tab-normal {
+    color: #262626;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #999999;
+    border-bottom-color: #217346;
+}
+.gc-tab-hover {
+    color: #252627;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #999999;
+    border-bottom-color: #217346;
+}
+.gc-tab-active {
+    color: #217346;
+    background-image: none;
+    background-color: white;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+
+.gc-rowHeaderFill {
+    background-color: #e4ecf7;
+}
+.gc-colHeaderFill {
+    background-image: -webkit-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB 12.5%, #D2DBEB); /* Standard syntax; must be last */
+    background-color: #D2DBEB;
+}
+
+.gc-gradientButton {
+    background-color: #DDDDDD; /* fallback color if gradients are not supported */
+    background-image: -webkit-linear-gradient(top, #F6FAFB, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB, #D2DBEB); /* Standard syntax; must be last */
+}
+
+.gc-sheetTabEditor::-ms-clear {
+    display: none;
+}
+
+
+.gc-layout-table {
+    font-size:12px;
+    width:100%;
+    height:100%;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+}
+
+.gc-layout-table-first-column {
+    width:21px;
+    border-right:1px solid #CCC;
+    text-align:right;
+    padding-top:7px;
+}
+
+.gc-layout-table-last-column {
+    width:18px;
+}
+
+.gc-filter-sort-desc-container {
+    border-bottom:1px solid #CCC;
+}
+
+.gc-filter-item-wrapper {
+}
+
+
+.gc-filter-dialog-style {
+    background:#fcfdfd;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+    font-size:12px;
+    border:1px solid #a7abb0;
+}
+
+.gc-search-outer-div {
+    border: none;
+    margin:4px 0px 0px 4px;
+    background-color: white;
+    background-image: none;
+    color:#1e395b;
+    font-weight:normal;
+}
+
+div.gc-search-outer-div input::-ms-clear{
+   display:none;
+}
+
+#gc-filterSearch {
+    width:165px;
+    height:21px;
+    border:1px solid #ababab;
+    margin-left:7px;
+    margin-top:4px;
+    margin-bottom: 0px;
+    padding: 0;
+    font-size: 1em;
+    background-color:white;
+    color:black;
+    float:none;
+}
+#gc-filterSearch:hover,
+#gc-filterSearch:active{
+    background-color:white;
+}
+
+.gc-check-uncheck-all {
+    float:left;
+    width:16px;
+    height:16px;
+    display:inline-block;
+}
+.gc-filter-check-outerDiv .gc-check-image,
+.gc-fill-type-item .gc-check-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);
+}
+.gc-filter-check-outerDiv .gc-uncheck-image,
+.gc-fill-type-item .gc-uncheck-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);
+}
+.gc-check-image,
+.gc-uncheck-image {
+    background-position:center;
+}
+
+.gc-filter-check-outerDiv {
+    height:18px;
+    margin-top:4px;
+}
+
+a.gc-filter-check-style {
+    color:#1e395b;
+    text-shadow:none;
+}
+
+a.gc-filter-check {
+    text-decoration: none;
+}
+
+a.gc-filter-check:hover {
+    text-decoration:underline;
+}
+#gc-sortASC:hover,
+#gc-sortASC:active {
+    border-color: #e3e3e3;
+    outline: none;
+    -webkit-box-shadow: none;
+            box-shadow: none;  
+}
+.gc-filter-sort {
+    border:1px solid transparent;
+    font-weight:normal;
+    color:#222222;
+}
+
+.gc-filter-hover {
+    border-radius: 3px;
+    outline:none;
+}
+
+.gc-filter-item {
+    position: relative;
+    cursor: default;
+    font-weight:normal;
+    border-style: solid;
+    border-color: transparent;
+}
+
+.gc-filter-item-container {
+    border:1px solid #a7abb0;
+    border-radius:3px;
+    margin:4px 0px 4px 4px;
+    overflow:hidden;
+}
+
+.gc-filter-item-input {
+    float: left;
+    clear: left;
+}
+
+.gc-filter-item-text {
+    font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
+    font-size: 12px;
+    margin: 2px;
+    white-space:nowrap;
+    word-wrap:normal;
+    float: left;
+    clear: right;
+}
+
+.gc-filter-button {
+    width:90px;
+    height:27px;
+    border-radius:3px;
+    margin:2px 1px 5px;
+}
+
+.gc-filter-button-disable {
+    opacity:.35;
+    background-image:none;
+}
+
+#gc-filterOK {
+    margin-left: 13px;
+    margin-bottom: 5px;
+    float: left;
+}
+#gc-filterCancel {
+    margin-bottom: 5px;
+    float: left;
+}
+
+.gc-filter-button-default {
+    border:1px solid #acacac;
+    border-radius: 0;
+    background-image: -webkit-linear-gradient(top, #f0f0f0, #e5e5e5); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f0f0f0, #e5e5e5); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f0f0f0, #e5e5e5); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+}
+
+.gc-filter-button-hover {
+    border:1px solid #7eb4ea;
+    border-radius: 0;
+    background-color: #d3f0e0;
+    background-image: -webkit-linear-gradient(top, #ecf4fc, #dcecfc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #ecf4fc, #dcecfc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #ecf4fc, #dcecfc); /* Standard syntax; must be last */
+    color: black;
+    font-weight:normal;
+    text-shadow:none;
+    cursor:pointer;
+}
+
+.gc-filter-button-active {
+    border:1px solid #569de5;
+    border-radius: 0;
+    background-color: #ffe475;    background-image: -webkit-linear-gradient(top, #daecfc, #c4e0fc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #daecfc, #c4e0fc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #daecfc, #c4e0fc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #daecfc, #c4e0fc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #daecfc, #c4e0fc); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-filter-item-hover {
+    border:1px solid transparent;
+    background-color: #d3f0e0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smartMenu-item-default {
+    border:1px solid transparent;
+    background-color: white;
+    background-image: none;
+    font-weight:normal;
+    color:#1e395b;
+    border-radius:0;
+}
+
+.gc-smartMenu-item-hover {
+    border:1px solid #86bfa0;
+    background-color: #d3f0e0;    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-default {
+    border:1px solid #ababab;
+    background: white;
+    color:#1e395b;
+    font-weight:normal;
+    border-radius:0;
+}
+
+.gc-smart-tag-hover {
+    border:1px solid #9fd5b7;
+    background-color: white;    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-active {
+    border:1px solid #9fd5b7;
+    background-color:#9fd5b7;    background-image: none;
+    font-weight:normal;
+    color:#262626;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+
+.gc-menu-item-input {
+    width:16px;
+    height:16px;
+    margin:1px;
+    float:left;
+    display:inline-block;
+}
+.gc-menu-item-text {
+    font-size:12px;
+    font-weight:normal;
+    display:inline-block;
+    float:left;
+    padding-top:2px;
+    font-family:Arial;
+}
+.gc-fill-menu-container {
+    box-shadow:rgba(0,0,0,0.4) 1px 2px 5px;
+    cursor:default;
+}
+
+.gc-toolstrip-default {
+    background: white;
+    border:1px solid #c6c6c6;
+}
+.gc-toolstrip-button-style:active,
+.gc-toolstrip-button-style {
+    color: black;
+    background:white;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-tab-tip-span{
+     background:#D6E6F9;
+     color:black;
+     border:1px solid #D6E6F9;
+     font-weight:normal;
+}
+
+.gc-spread-toolTip {
+    border: 1px solid #bebebe;
+    border-radius: 0px;
+    background-color: white;    background-image: none;
+    font-weight: normal;
+    color: #217346;
+}
+
+.gc-no-user-select {
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+/*-----common css end-----*/
+
+/*-----formula textbox start-----*/
+/* function autocomplete */
+/* function autocomplete */
+.gcsj-func-ac-popup {
+	margin: 0;
+	padding: 0;
+    background: #fff;
+	border: 1px solid rgba(0,0,0,0.2);
+	font-family: arial,sans-serif;
+	font-size: 12px;
+	line-height: 22px;
+	position: absolute;
+	width: 300px;
+	z-index: 2001;
+
+	-webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-ac-row {
+    margin: 0;
+    cursor: default;
+    padding: 2px 10px;
+    color: #666666;
+}
+
+.gcsj-func-ac-row-name {
+     color: #222;
+     font-size: 13px;
+     font-family: inconsolata,monospace,arial,sans,sans-serif;
+     margin: -2px 0;
+}
+
+.gcsj-func-ac-row-description {
+    color: #666;
+    display: none;
+    font-size: 11px;
+    margin: -2px 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.gcsj-ac-row-active {
+	background-color: #f5f5f5;
+	color: #000;
+	border-top: 1px solid #ebebeb;
+	border-bottom: 1px solid #ebebeb;
+	padding: 1px 10px
+}
+
+.gcsj-ac-row-active .gcsj-func-ac-row-description {
+    display:block;
+}
+
+/*  function help */
+.gcsj-func-help-popup {
+    background-color:#fff;
+    border: 1px solid rgba(0,0,0,0.2);
+    color: #222;
+    font-size: 11px;
+    word-wrap: break-word;
+    position: absolute;
+    width: 320px;
+    z-index: 2001;
+
+    -webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	box-shadow:0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-help-title {
+    background-color: #f5f5f5;
+    color: #222;
+    font-size: 13px;
+    padding: 1px 0 1px 10px;
+}
+
+.gcsj-func-help-body {
+    border-top: 1px solid #ebebeb;
+    font-family: arial, sans-serif;
+    overflow: hidden;
+}
+
+.gcsj-func-help-content {
+    padding-bottom: 2px;
+}
+
+.gcsj-func-help-section {
+    padding: 5px 10px;
+}
+
+.gcsj-func-help-section-title {
+    font-size: 11px;
+    color: #666;
+}
+
+.gcsj-func-help-section-content {
+    font-size: 11px;
+}
+
+.gcsj-func-help-formula {
+    font-family: inconsolata,monospace,arial,sans,sans-serif;
+    padding: 1px 0;
+}
+
+.gcsj-func-help-formula-name {
+}
+
+.gcsj-func-help-paramter {
+    padding-left:1px;
+}
+
+.gcsj-func-help-paramter-paren {
+}
+
+.gcsj-func-help-paramter-active {
+    background-color: #feb;
+}
+
+/* color text */
+.gcsj-func-color-content {
+    white-space: pre-wrap;
+}
+/*-----formula textbox end-----*/
+
+/*-----floatingobject start-----*/
+.gc-floatingobject-selected{
+    border:1px solid #939393;
+}
+
+.gc-floatingobject-unselected{
+    background-color: transparent;
+    border:1px solid transparent;
+}
+
+.gc-floatingobject-container{
+    position: absolute;
+    overflow: hidden;
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-background-cover{
+    -webkit-background-size: cover; /* For WebKit*/
+    -moz-background-size: cover;    /* Mozilla*/
+    -o-background-size: cover;      /* Opera*/
+    background-size: cover;         /* Generic*/
+}
+
+.gc-floatingobject-moving-container{
+    position: absolute;
+    overflow: hidden;
+}
+
+.gc-floatingobject-moving-div{
+    position: absolute;
+    border:1px solid black;
+}
+.gc-floatingobject-resize-indicator {
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-resize-indicator-select{
+    background-color:white;
+    border-radius:2px;
+    -moz-border-radius:1px;
+    border:1px solid #939393;
+    z-index:100;
+}
+
+.gc-floatingobject-resize-indicator-unSelect{
+    display: none;
+}
+
+.gc-floatingobject-absolute{
+    position: absolute;
+}
+
+.gc-floatingobject-content-container {
+    box-sizing:content-box;
+}
+/*-----floatingobject end-----*/
+
+/*-----scrollbar start-----*/
+/*scrollbar*/
+.gc-scroll-container{
+    background-color: #bababa;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+.gc-scroll-corner-all {
+    border-radius: 2px;
+}
+.gc-scroll-arrow{
+    background-color: white;
+    border-style:solid;
+    border-color: #ababab;
+    background-image: none;
+    border-radius: 0;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowUp{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAClJREFUKFNjGEmgvLz8P5RJHABpgGGoEH6ArIEojdg0wDBUyShAAAYGAHSXJkH1wN/VAAAAAElFTkSuQmCC);
+    
+}
+.gc-scroll-arrowUp {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowDown {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAACRJREFUKFNjGAVYQHl5+X9cGKoEOyBZAwyQrAEGSNYwpAEDAwBvhSZBmzrLGgAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowDown {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowLeft{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAADBJREFUKFNjGMKgvLz8P5RJHABpIEkTTAPRmpA1EK0JBMjSBAJkaQIBsjQNNGBgAABe7iZBxoz5vwAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowLeft {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowRight{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAC5JREFUKFNjGIKgvLz8P5RJPABpIlkjTBNJGpE1Ea2RZA0gQLIGECBZw2ACDAwAhS4mQZAuqGcAAAAASUVORK5CYII=);
+}
+.gc-scroll-arrowRight {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-vertical {
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-vertical {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-horizontal {
+    text-indent: 0;
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-horizontal {
+    background-position: center;
+}
+
+.gc-scrollbar-wrapper {
+    background-color: transparent;
+}
+
+.gc-scroll-bar {
+    border-style:solid;
+    border-color:#ababab;
+    background:  white;
+    -moz-border-radius: 0px;
+    -webkit-border-radius: 0px;
+    border-radius: 0px;
+}
+.gc-scroll-arrow-hover {
+    border-style:solid;
+    border-color:#777777;
+    background: white;
+}
+.gc-scrollbar-stateHover {
+    border-style:solid;
+    border-color:#777777;
+    background: white;
+}
+
+.gc-scroll-arrow:active,
+.gc-scroll-bar:active,
+.gc-scrollbar-stateActive {
+    border-style:solid;
+    border-color:#777777;
+    background: #e1e1e1;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+/*-----scrollbar end-----*/
+

+ 857 - 0
lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css

@@ -0,0 +1,857 @@
+/*-----common css start-----*/
+.gc-theme-version {
+    position: absolute;
+    z-index: 2013;
+}
+.gc-grayArea {
+    background-color: #f1f1f1;
+}
+.gc-corner-hover {
+    background-color: #f1f1f1;
+}
+.gc-corner-selected {
+    background-color: #f1f1f1;
+}
+.gc-corner-normal {
+    background-color: #f1f1f1;
+}
+.gc-corner-triangle-normal {
+    background-color: #c6c6c6;
+    background-image: -webkit-linear-gradient(top, #c6c6c6, #c6c6c6); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #c6c6c6, #c6c6c6); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #c6c6c6, #c6c6c6); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #c6c6c6, #c6c6c6); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #c6c6c6, #c6c6c6); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+}
+.gc-corner-triangle-hover {
+    background-color: #9e9e9e;
+    background-image: -webkit-linear-gradient(top, #9e9e9e, #9e9e9e); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #9e9e9e, #9e9e9e); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #9e9e9e, #9e9e9e); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+}
+.gc-corner-triangle-selected {
+    background-color: #217346;
+    background-image: -webkit-linear-gradient(top, #217346, #217346); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #217346, #217346); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #217346, #217346); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #217346, #217346); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #217346, #217346); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+}
+.gc-columnHeader-normal {
+    color: #262626;
+    background-image: none;
+    background-color: #f1f1f1;
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-columnHeader-hover {
+    color: #262626;
+    background-image: none;
+    background-color: #9fd5b7;
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-columnHeader-selected {
+    color: #217346;
+    background-image: none;
+    background-color: #d3f0e0;
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-columnHeader-highlight {
+    color: #217346;
+    background-image: none;
+    background-color: #d4d4d4;
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-rowHeader-normal {
+    color: #262626;
+    background-color: #f1f1f1;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+    border-right-color: #ababab !important;
+}
+.gc-rowHeader-hover {
+    color: #262626;
+    background-color: #9fd5b7;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+    border-right-color: #ababab !important;
+}
+.gc-rowHeader-selected {
+    color: #217346;
+    background-color: #d3f0e0;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+    border-right-color: #ababab !important;
+}
+.gc-rowHeader-highlight {
+    color: #217346;
+    background-color: #d4d4d4;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+    border-right-color: #ababab !important;
+}
+.gc-horizontal-scrollbar {
+    box-sizing:content-box;
+    background: #f1f1f1;
+    border-top: 1px solid #ababab;
+    height: 18px;
+    padding: 4px 0px 5px 0px;
+    margin: 0;
+}
+.gc-vertical-scrollbar {
+    box-sizing:content-box;
+    background: #f1f1f1;
+    border-left: 1px solid #ababab;
+    width: 18px;
+    padding: 0px 5px 0px 4px;
+    margin: 0;
+}
+.gc-footer-corner {
+    background-color: #f1f1f1;
+}
+.gc-selection {
+    background-color: rgba(20, 20, 20, 0.2);
+    border-color: #217346;
+    color: rgba(240,240,240,0.7);
+}
+.gc-drag-indicator {
+    border-color: #217346;
+}
+.gc-gridlineColor {
+    border-color: #d4d4d4;
+}
+.gc-group {
+    background-color:#f1f1f1;
+    color: #ababab;
+}
+.gc-group-box {
+    background-color:#f1f1f1;
+    color: #606060;
+    border-color: #828790;
+}
+
+.gc-tabStripNewTab-highlight {
+    border-color: #5e5e5e;
+}
+.gc-tabStripNewTab-hover {
+    border-color: #439467;
+}
+.gc-tabStripBackground {
+    background-image: -webkit-linear-gradient(top, #f1f1f1, #f1f1f1); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f1f1f1, #f1f1f1); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f1f1f1, #f1f1f1); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f1f1f1, #f1f1f1); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f1f1f1, #f1f1f1); /* Standard syntax; must be last */
+    background-color: #f1f1f1;
+    border-color: #ababab;
+}
+.gc-tabStripResizeBarInner {
+    color: #5e5e5e;
+}
+.gc-navMoreButton-highlight {
+    border-color: #5e5e5e;
+}
+.gc-navMoreButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-highlight {
+    border-color: #005a2b;
+}
+.gc-navButton-normal {
+    border-color: #ababab;
+}
+.gc-tab-normal {
+    color: #444444;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+.gc-tab-hover {
+    color: #252627;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+.gc-tab-active {
+    color: #217346;
+    background-image: none;
+    background-color: white;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+
+.gc-rowHeaderFill {
+    background-color: #e4ecf7;
+}
+.gc-colHeaderFill {
+    background-image: -webkit-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB 12.5%, #D2DBEB); /* Standard syntax; must be last */
+    background-color: #D2DBEB;
+}
+
+.gc-gradientButton {
+    background-color: #DDDDDD; /* fallback color if gradients are not supported */
+    background-image: -webkit-linear-gradient(top, #F6FAFB, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB, #D2DBEB); /* Standard syntax; must be last */
+}
+
+.gc-sheetTabEditor::-ms-clear {
+    display: none;
+}
+
+
+.gc-layout-table {
+    font-size:12px;
+    width:100%;
+    height:100%;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+}
+
+.gc-layout-table-first-column {
+    width:21px;
+    border-right:1px solid #CCC;
+    text-align:right;
+    padding-top:7px;
+}
+
+.gc-layout-table-last-column {
+    width:18px;
+}
+
+.gc-filter-sort-desc-container {
+    border-bottom:1px solid #CCC;
+}
+
+.gc-filter-item-wrapper {
+}
+
+
+.gc-filter-dialog-style {
+    background:#fcfdfd;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+    font-size:12px;
+    border:1px solid #a7abb0;
+}
+
+.gc-search-outer-div {
+    border: none;
+    margin:4px 0px 0px 4px;
+    background-color: white;
+    background-image: none;
+    color:#1e395b;
+    font-weight:normal;
+}
+
+div.gc-search-outer-div input::-ms-clear{
+   display:none;
+}
+
+#gc-filterSearch {
+    width:165px;
+    height:21px;
+    border:1px solid #ababab;
+    margin-left:7px;
+    margin-top:4px;
+    margin-bottom: 0px;
+    padding: 0;
+    font-size: 1em;
+    background-color:white;
+    color:black;
+    float:none;
+}
+#gc-filterSearch:hover,
+#gc-filterSearch:active{
+    background-color:white;
+}
+
+.gc-check-uncheck-all {
+    float:left;
+    width:16px;
+    height:16px;
+    display:inline-block;
+}
+.gc-filter-check-outerDiv .gc-check-image,
+.gc-fill-type-item .gc-check-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);
+}
+.gc-filter-check-outerDiv .gc-uncheck-image,
+.gc-fill-type-item .gc-uncheck-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);
+}
+.gc-check-image,
+.gc-uncheck-image {
+    background-position:center;
+}
+
+.gc-filter-check-outerDiv {
+    height:18px;
+    margin-top:4px;
+}
+
+a.gc-filter-check-style {
+    color:#1e395b;
+    text-shadow:none;
+}
+
+a.gc-filter-check {
+    text-decoration: none;
+}
+
+a.gc-filter-check:hover {
+    text-decoration:underline;
+}
+#gc-sortASC:hover,
+#gc-sortASC:active {
+    border-color: #e3e3e3;
+    outline: none;
+    -webkit-box-shadow: none;
+            box-shadow: none;  
+}
+.gc-filter-sort {
+    border:1px solid transparent;
+    font-weight:normal;
+    color:#222222;
+}
+
+.gc-filter-hover {
+    border-radius: 0px;
+    outline:none;
+}
+
+.gc-filter-item {
+    position: relative;
+    cursor: default;
+    font-weight:normal;
+    border-style: solid;
+    border-color: transparent;
+}
+
+.gc-filter-item-container {
+    border:1px solid #a7abb0;
+    border-radius:3px;
+    margin:4px 0px 4px 4px;
+    overflow:hidden;
+}
+
+.gc-filter-item-input {
+    float: left;
+    clear: left;
+}
+
+.gc-filter-item-text {
+    font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
+    font-size: 12px;
+    margin: 2px;
+    white-space:nowrap;
+    word-wrap:normal;
+    float: left;
+    clear: right;
+}
+
+.gc-filter-button {
+    width:90px;
+    height:27px;
+    margin:2px 1px 5px;
+}
+
+.gc-filter-button-disable {
+    opacity:.35;
+    background-image:none;
+}
+
+#gc-filterOK {
+    margin-left:13px;
+    margin-bottom:5px;
+    float:left;
+}
+#gc-filterCancel {
+    margin-bottom:5px;
+    float:left;
+}
+
+.gc-filter-button-default {
+    border:1px solid #acacac;
+    border-radius: 0;
+    background-image: -webkit-linear-gradient(top, #f0f0f0, #e5e5e5); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f0f0f0, #e5e5e5); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f0f0f0, #e5e5e5); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+}
+
+.gc-filter-button-hover {
+    border:1px solid #7eb4ea;
+    border-radius: 0;
+    background-color: #d3f0e0;
+    background-image: -webkit-linear-gradient(top, #ecf4fc, #dcecfc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #ecf4fc, #dcecfc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #ecf4fc, #dcecfc); /* Standard syntax; must be last */
+    color: black;
+    font-weight:normal;
+    text-shadow:none;
+    cursor:pointer;
+}
+
+.gc-filter-button-active {
+    border:1px solid #569de5;
+    border-radius: 0;
+    background-color: #ffe475;
+    background-image: -webkit-linear-gradient(top, #daecfc, #c4e0fc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #daecfc, #c4e0fc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #daecfc, #c4e0fc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #daecfc, #c4e0fc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #daecfc, #c4e0fc); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-filter-item-hover {
+    border:1px solid transparent;
+    background-color: #d3f0e0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smartMenu-item-default {
+    border:1px solid transparent;
+    background-color: white;
+    background-image: none;
+    font-weight:normal;
+    color:#1e395b;
+    border-radius:0;
+}
+
+.gc-smartMenu-item-hover {
+    border:1px solid #86bfa0;
+    background-color: #d3f0e0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-default {
+    border:1px solid #ababab;
+    background: white;
+    color:#1e395b;
+    font-weight:normal;
+    border-radius:0;
+}
+
+.gc-smart-tag-hover {
+    border:1px solid #9fd5b7;
+    background-color: white;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-active {
+    border:1px solid #9fd5b7;
+    background-color:#9fd5b7;
+    background-image: none;
+    font-weight:normal;
+    color:#262626;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+
+.gc-menu-item-input {
+    width:16px;
+    height:16px;
+    margin:1px;
+    float:left;
+    display:inline-block;
+}
+.gc-menu-item-text {
+    font-size:12px;
+    font-weight:normal;
+    display:inline-block;
+    float:left;
+    padding-top:2px;
+    font-family:Arial;
+}
+.gc-fill-menu-container {
+    box-shadow:rgba(0,0,0,0.4) 1px 2px 5px;
+    cursor:default;
+}
+
+.gc-toolstrip-default {
+    background: white;
+    border:1px solid #c6c6c6;
+}
+.gc-toolstrip-button-style:active,
+.gc-toolstrip-button-style {
+    color: black;
+    background:white;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-tab-tip-span{
+     background:#D6E6F9;
+     color:black;
+     border:1px solid #D6E6F9;
+     font-weight:normal;
+}
+
+.gc-spread-toolTip {
+    border: 1px solid #bebebe;
+    border-radius: 0px;
+    background-color: white;    background-image: none;
+    font-weight: normal;
+    color: #217346;
+}
+
+.gc-no-user-select {
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+/*-----common css end-----*/
+
+/*-----formula textbox start-----*/
+/* function autocomplete */
+.gcsj-func-ac-popup {
+	margin: 0;
+	padding: 0;
+    background: #fff;
+	border: 1px solid rgba(0,0,0,0.2);
+	font-family: arial,sans-serif;
+	font-size: 12px;
+	line-height: 22px;
+	position: absolute;
+	width: 300px;
+	z-index: 2001;
+
+	-webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-ac-row {
+    margin: 0;
+    cursor: default;
+    padding: 2px 10px;
+    color: #666666;
+}
+
+.gcsj-func-ac-row-name {
+     color: #222;
+     font-size: 13px;
+     font-family: inconsolata,monospace,arial,sans,sans-serif;
+     margin: -2px 0;
+}
+
+.gcsj-func-ac-row-description {
+    color: #666;
+    display: none;
+    font-size: 11px;
+    margin: -2px 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.gcsj-ac-row-active {
+	background-color: #f5f5f5;
+	color: #000;
+	border-top: 1px solid #ebebeb;
+	border-bottom: 1px solid #ebebeb;
+	padding: 1px 10px
+}
+
+.gcsj-ac-row-active .gcsj-func-ac-row-description {
+    display:block;
+}
+
+/*  function help */
+.gcsj-func-help-popup {
+    background-color:#fff;
+    border: 1px solid rgba(0,0,0,0.2);
+    color: #222;
+    font-size: 11px;
+    word-wrap: break-word;
+    position: absolute;
+    width: 320px;
+    z-index: 2001;
+
+    -webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	box-shadow:0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-help-title {
+    background-color: #f5f5f5;
+    color: #222;
+    font-size: 13px;
+    padding: 1px 0 1px 10px;
+}
+
+.gcsj-func-help-body {
+    border-top: 1px solid #ebebeb;
+    font-family: arial, sans-serif;
+    overflow: hidden;
+}
+
+.gcsj-func-help-content {
+    padding-bottom: 2px;
+}
+
+.gcsj-func-help-section {
+    padding: 5px 10px;
+}
+
+.gcsj-func-help-section-title {
+    font-size: 11px;
+    color: #666;
+}
+
+.gcsj-func-help-section-content {
+    font-size: 11px;
+}
+
+.gcsj-func-help-formula {
+    font-family: inconsolata,monospace,arial,sans,sans-serif;
+    padding: 1px 0;
+}
+
+.gcsj-func-help-formula-name {
+}
+
+.gcsj-func-help-paramter {
+    padding-left:1px;
+}
+
+.gcsj-func-help-paramter-paren {
+}
+
+.gcsj-func-help-paramter-active {
+    background-color: #feb;
+}
+
+/* color text */
+.gcsj-func-color-content {
+    white-space: pre-wrap;
+}
+/*-----formula textbox end-----*/
+
+/*-----floatingobject start-----*/
+.gc-floatingobject-selected{
+    border:1px solid #939393;
+}
+
+.gc-floatingobject-unselected{
+    background-color: transparent;
+    border:1px solid transparent;
+}
+
+.gc-floatingobject-container{
+    position: absolute;
+    overflow: hidden;
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-background-cover{
+    -webkit-background-size: cover; /* For WebKit*/
+    -moz-background-size: cover;    /* Mozilla*/
+    -o-background-size: cover;      /* Opera*/
+    background-size: cover;         /* Generic*/
+}
+
+.gc-floatingobject-moving-container{
+    position: absolute;
+    overflow: hidden;
+}
+
+.gc-floatingobject-moving-div{
+    position: absolute;
+    border:1px solid black;
+}
+.gc-floatingobject-resize-indicator {
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-resize-indicator-select{
+    background-color:white;
+    border-radius:2px;
+    -moz-border-radius:1px;
+    border:1px solid #939393;
+    z-index:100;
+}
+
+.gc-floatingobject-resize-indicator-unSelect{
+    display: none;
+}
+
+.gc-floatingobject-absolute{
+    position: absolute;
+}
+
+.gc-floatingobject-content-container {
+    box-sizing:content-box;
+}
+/*-----floatingobject end-----*/
+
+/*-----scrollbar start-----*/
+/*scrollbar*/
+.gc-scroll-container{
+    background-color: #d9d9d9;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+.gc-scroll-corner-all {
+    border-radius: 2px;
+}
+.gc-scroll-arrow{
+    background-color: white;
+    border-style:solid;
+    border-color: #ababab;
+    background-image: none;
+    border-radius: 0;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowUp{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAClJREFUKFNjGEmgvLz8P5RJHABpgGGoEH6ArIEojdg0wDBUyShAAAYGAHSXJkH1wN/VAAAAAElFTkSuQmCC);
+    
+}
+.gc-scroll-arrowUp {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowDown {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAACRJREFUKFNjGAVYQHl5+X9cGKoEOyBZAwyQrAEGSNYwpAEDAwBvhSZBmzrLGgAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowDown {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowLeft{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAADBJREFUKFNjGMKgvLz8P5RJHABpIEkTTAPRmpA1EK0JBMjSBAJkaQIBsjQNNGBgAABe7iZBxoz5vwAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowLeft {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowRight{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAC5JREFUKFNjGIKgvLz8P5RJPABpIlkjTBNJGpE1Ea2RZA0gQLIGECBZw2ACDAwAhS4mQZAuqGcAAAAASUVORK5CYII=);
+}
+.gc-scroll-arrowRight {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-vertical {
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-vertical {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-horizontal {
+    text-indent: 0;
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-horizontal {
+    background-position: center;
+}
+
+.gc-scrollbar-wrapper {
+    background-color: transparent;
+}
+
+.gc-scroll-bar {
+    border-style:solid;
+    border-color:#ababab;
+    background:  white;
+    -moz-border-radius: 0px;
+    -webkit-border-radius: 0px;
+    border-radius: 0px;
+}
+.gc-scroll-arrow-hover {
+    border-style:solid;
+    border-color:#777777;
+    background: white;
+}
+.gc-scrollbar-stateHover {
+    border-style:solid;
+    border-color:#777777;
+    background: white;
+}
+
+.gc-scroll-arrow:active,
+.gc-scroll-bar:active,
+.gc-scrollbar-stateActive {
+    border-style:solid;
+    border-color:#777777;
+    background: #e1e1e1;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+/*-----scrollbar end-----*/
+

+ 850 - 0
lib/spreadjs/sheets/css/gc.spread.sheets.excel2013white.10.0.1.css

@@ -0,0 +1,850 @@
+/*-----common css start-----*/
+.gc-theme-version {
+    position: absolute;
+    z-index: 2013;
+}
+.gc-grayArea {
+    background-color: white;
+}
+.gc-corner-hover {
+    background-color: white;
+}
+.gc-corner-selected {
+    background-color: white;
+}
+.gc-corner-normal {
+    background-color: white;
+}
+.gc-corner-triangle-normal {
+    background-color: #dfdfdf;
+    background-image: -webkit-linear-gradient(top, #dfdfdf, #dfdfdf); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #dfdfdf, #dfdfdf); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #dfdfdf, #dfdfdf); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #dfdfdf, #dfdfdf); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #dfdfdf, #dfdfdf); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #efefef !important;
+    border-right-color: #d5ded5 !important;
+    border-top-color: #efefef !important;
+    border-bottom-color: #d5ded5 !important;
+}
+.gc-corner-triangle-hover {
+    background-color: #9e9e9e;
+    background-image: -webkit-linear-gradient(top, #9e9e9e, #9e9e9e); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #9e9e9e, #9e9e9e); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #9e9e9e, #9e9e9e); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #efefef !important;
+    border-right-color: #d5ded5 !important;
+    border-top-color: #efefef !important;
+    border-bottom-color: #d5ded5 !important;
+}
+.gc-corner-triangle-selected {
+    background-color: #217346;
+    background-image: -webkit-linear-gradient(top, #217346, #217346); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #217346, #217346); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #217346, #217346); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #217346, #217346); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #217346, #217346); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #efefef !important;
+    border-right-color: #d5ded5 !important;
+    border-top-color: #efefef !important;
+    border-bottom-color: #d5ded5 !important;
+}
+.gc-columnHeader-normal {
+    color: #444444;
+    background-image: none;
+    background-color: white;
+    border-style:solid;
+    border-left-color: #efefef !important;
+    border-right-color: #d5ded5 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-columnHeader-hover {
+    color: #444444;
+    background-image: none;
+    background-color: #9fd5b7;
+    border-style:solid;
+    border-left-color: #efefef !important;
+    border-right-color: #d5ded5 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-columnHeader-selected {
+    color: #217346;
+    background-image: none;
+    background-color: #d3f0e0;
+    border-style:solid;
+    border-left-color: #efefef !important;
+    border-right-color: #d5ded5 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-columnHeader-highlight {
+    color: #217346;
+    background-image: none;
+    background-color: #e1e1e1;
+    border-style:solid;
+    border-left-color: #efefef !important;
+    border-right-color: #d5ded5 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-rowHeader-normal {
+    color: #444444;
+    background-color: white;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #efefef !important;
+    border-bottom-color: #d5ded5 !important;
+    border-right-color: #ababab !important;
+}
+.gc-rowHeader-hover {
+    color: #444444;
+    background-color: #9fd5b7;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #efefef !important;
+    border-bottom-color: #d5ded5 !important;
+    border-right-color: #ababab !important;
+}
+.gc-rowHeader-selected {
+    color: #217346;
+    background-color: #d3f0e0;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #efefef !important;
+    border-bottom-color: #d5ded5 !important;
+    border-right-color: #ababab !important;
+}
+.gc-rowHeader-highlight {
+    color: #217346;
+    background-color: #e1e1e1;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #efefef !important;
+    border-bottom-color: #d5ded5 !important;
+    border-right-color: #ababab !important;
+}
+.gc-horizontal-scrollbar {
+    background-color: #f6f6f6;
+    border-top-color: #ababab;
+}
+.gc-vertical-scrollbar {
+    background-color: #f6f6f6;
+    border-left-color: #ababab;
+}
+.gc-footer-corner {
+    background-color: #f6f6f6;
+}
+.gc-selection {
+    background-color: rgba(20, 20, 20, 0.2);
+    border-color: #217346;
+    color: rgba(240,240,240,0.7);
+}
+.gc-drag-indicator {
+    border-color: #217346;
+}
+.gc-gridlineColor {
+    border-color: #d4d4d4;
+}
+.gc-group {
+    background-color: white;
+    color: #ababab;
+}
+.gc-group-box {
+    background-color: white;
+    color: #666666;
+    border-color: #828790;
+}
+
+.gc-tabStripNewTab-highlight {
+    border-color: #777777;
+}
+.gc-tabStripNewTab-hover {
+    border-color: #439467;
+}
+.gc-tabStripBackground {
+    background-image: -webkit-linear-gradient(top, #f6f6f6, #f6f6f6); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f6f6f6, #f6f6f6); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f6f6f6, #f6f6f6); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f6f6f6, #f6f6f6); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f6f6f6, #f6f6f6); /* Standard syntax; must be last */
+    background-color: #f6f6f6;
+    border-color: #ababab;
+}
+.gc-tabStripResizeBarInner {
+    color: #b3b3b3;
+}
+.gc-navMoreButton-highlight {
+    border-color: #0a6332;
+}
+.gc-navMoreButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-highlight {
+    border-color: #0a6332;
+}
+.gc-navButton-normal {
+    border-color: #c6c6c6;
+}
+.gc-tab-normal {
+    color: #444444;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+.gc-tab-hover {
+    color: #252627;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+.gc-tab-active {
+    color: #217346;
+    background-image: none;
+    background-color: white;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+
+.gc-rowHeaderFill {
+    background-color: #e4ecf7;
+}
+.gc-colHeaderFill {
+    background-image: -webkit-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB 12.5%, #D2DBEB); /* Standard syntax; must be last */
+    background-color: #D2DBEB;
+}
+
+.gc-gradientButton {
+    background-color: #DDDDDD; /* fallback color if gradients are not supported */
+    background-image: -webkit-linear-gradient(top, #F6FAFB, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB, #D2DBEB); /* Standard syntax; must be last */
+}
+
+.gc-sheetTabEditor::-ms-clear {
+    display: none;
+}
+
+
+.gc-layout-table {
+    font-size:12px;
+    width:100%;
+    height:100%;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+}
+
+.gc-layout-table-first-column {
+    width:21px;
+    border-right:1px solid #CCC;
+    text-align:right;
+    padding-top:7px;
+}
+
+.gc-layout-table-last-column {
+    width:18px;
+}
+
+.gc-filter-sort-desc-container {
+    border-bottom:1px solid #CCC;
+}
+
+.gc-filter-item-wrapper {
+}
+
+
+.gc-filter-dialog-style {
+    background:#fcfdfd;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+    font-size:12px;
+    border:1px solid #a7abb0;
+}
+
+.gc-search-outer-div {
+    border: none;
+    margin:4px 0px 0px 4px;
+    background-color: white;
+    background-image: none;
+    color:#1e395b;
+    font-weight:normal;
+}
+
+div.gc-search-outer-div input::-ms-clear{
+   display:none;
+}
+
+#gc-filterSearch {
+    width:165px;
+    height:21px;
+    border:1px solid #ababab;
+    margin-left:7px;
+    margin-top:4px;
+    margin-bottom: 0px;
+    padding: 0;
+    font-size: 1em;
+    background-color:white;
+    color:black;
+    float:none;
+}
+#gc-filterSearch:hover,
+#gc-filterSearch:active{
+    background-color:white;
+}
+
+.gc-check-uncheck-all {
+    float:left;
+    width:16px;
+    height:16px;
+    display:inline-block;
+}
+.gc-filter-check-outerDiv .gc-check-image,
+.gc-fill-type-item .gc-check-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);
+}
+.gc-filter-check-outerDiv .gc-uncheck-image,
+.gc-fill-type-item .gc-uncheck-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);
+}
+.gc-check-image,
+.gc-uncheck-image {
+    background-position:center;
+}
+
+.gc-filter-check-outerDiv {
+    height:18px;
+    margin-top:4px;
+}
+
+a.gc-filter-check-style {
+    color:#1e395b;
+    text-shadow:none;
+}
+
+a.gc-filter-check {
+    text-decoration: none;
+}
+
+a.gc-filter-check:hover {
+    text-decoration:underline;
+}
+#gc-sortASC:hover,
+#gc-sortASC:active {
+    border-color: #e3e3e3;
+    outline: none;
+    -webkit-box-shadow: none;
+            box-shadow: none;  
+}
+.gc-filter-sort {
+    border:1px solid transparent;
+    font-weight:normal;
+    color:#222222;
+}
+
+.gc-filter-hover {
+    border-radius: 0px;
+    outline:none;
+}
+
+.gc-filter-item {
+    position: relative;
+    cursor: default;
+    font-weight:normal;
+    border-style: solid;
+    border-color: transparent;
+}
+
+.gc-filter-item-container {
+    border:1px solid #a7abb0;
+    border-radius:3px;
+    margin:4px 0px 4px 4px;
+    overflow:hidden;
+}
+
+.gc-filter-item-input {
+    float: left;
+    clear: left;
+}
+
+.gc-filter-item-text {
+    font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
+    font-size: 12px;
+    margin: 2px;
+    white-space:nowrap;
+    word-wrap:normal;
+    float: left;
+    clear: right;
+}
+
+.gc-filter-button {
+    width:90px;
+    height:27px;
+    margin:2px 1px 5px;
+}
+
+.gc-filter-button-disable {
+    opacity:.35;
+    background-image:none;
+}
+
+#gc-filterOK {
+    margin-left:13px;
+    margin-bottom:5px;
+    float:left;
+}
+#gc-filterCancel {
+    margin-bottom:5px;
+    float:left;
+}
+
+.gc-filter-button-default {
+    border:1px solid #acacac;
+    border-radius: 0;
+    background-image: -webkit-linear-gradient(top, #f0f0f0, #e5e5e5); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f0f0f0, #e5e5e5); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f0f0f0, #e5e5e5); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+}
+
+.gc-filter-button-hover {
+    border:1px solid #7eb4ea;
+    border-radius: 0;
+    background-color: #d3f0e0;
+    background-image: -webkit-linear-gradient(top, #ecf4fc, #dcecfc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #ecf4fc, #dcecfc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #ecf4fc, #dcecfc); /* Standard syntax; must be last */
+    color: black;
+    font-weight:normal;
+    text-shadow:none;
+    cursor:pointer;
+}
+
+.gc-filter-button-active {
+    border:1px solid #569de5;
+    border-radius: 0;
+    background-color: #ffe475;
+    background-image: -webkit-linear-gradient(top, #daecfc, #c4e0fc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #daecfc, #c4e0fc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #daecfc, #c4e0fc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #daecfc, #c4e0fc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #daecfc, #c4e0fc); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-filter-item-hover {
+    border:1px solid transparent;
+    background-color: #d3f0e0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smartMenu-item-default {
+    border:1px solid transparent;
+    background-color: white;
+    background-image: none;
+    font-weight:normal;
+    color:#1e395b;
+    border-radius:0;
+}
+
+.gc-smartMenu-item-hover {
+    border:1px solid #86bfa0;
+    background-color: #d3f0e0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-default {
+    border:1px solid #ababab;
+    background: white;
+    color:#1e395b;
+    font-weight:normal;
+    border-radius:0;
+}
+
+.gc-smart-tag-hover {
+    border:1px solid #9fd5b7;
+    background-color: white;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-active {
+    border:1px solid #9fd5b7;
+    background-color:#9fd5b7;
+    background-image: none;
+    font-weight:normal;
+    color:#262626;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+
+.gc-menu-item-input {
+    width:16px;
+    height:16px;
+    margin:1px;
+    float:left;
+    display:inline-block;
+}
+.gc-menu-item-text {
+    font-size:12px;
+    font-weight:normal;
+    display:inline-block;
+    float:left;
+    padding-top:2px;
+    font-family:Arial;
+}
+.gc-fill-menu-container {
+    box-shadow:rgba(0,0,0,0.4) 1px 2px 5px;
+    cursor:default;
+}
+
+.gc-toolstrip-default {
+    background: white;
+    border:1px solid #c6c6c6;
+}
+.gc-toolstrip-button-style:active,
+.gc-toolstrip-button-style {
+    color: black;
+    background:white;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-tab-tip-span{
+     background:#D6E6F9;
+     color:black;
+     border:1px solid #D6E6F9;
+     font-weight:normal;
+}
+
+.gc-spread-toolTip {
+    border: 1px solid #bebebe;
+    border-radius: 0px;
+    background-color: white;
+    background-image: none;
+    font-weight: normal;
+    color: #217346;
+}
+
+.gc-no-user-select {
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+/*-----common css end-----*/
+
+/*-----formula textbox start-----*/
+/* function autocomplete */
+.gcsj-func-ac-popup {
+	margin: 0;
+	padding: 0;
+    background: #fff;
+	border: 1px solid rgba(0,0,0,0.2);
+	font-family: arial,sans-serif;
+	font-size: 12px;
+	line-height: 22px;
+	position: absolute;
+	width: 300px;
+	z-index: 2001;
+
+	-webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-ac-row {
+    margin: 0;
+    cursor: default;
+    padding: 2px 10px;
+    color: #666666;
+}
+
+.gcsj-func-ac-row-name {
+     color: #222;
+     font-size: 13px;
+     font-family: inconsolata,monospace,arial,sans,sans-serif;
+     margin: -2px 0;
+}
+
+.gcsj-func-ac-row-description {
+    color: #666;
+    display: none;
+    font-size: 11px;
+    margin: -2px 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.gcsj-ac-row-active {
+	background-color: #f5f5f5;
+	color: #000;
+	border-top: 1px solid #ebebeb;
+	border-bottom: 1px solid #ebebeb;
+	padding: 1px 10px
+}
+
+.gcsj-ac-row-active .gcsj-func-ac-row-description {
+    display:block;
+}
+
+/*  function help */
+.gcsj-func-help-popup {
+    background-color:#fff;
+    border: 1px solid rgba(0,0,0,0.2);
+    color: #222;
+    font-size: 11px;
+    word-wrap: break-word;
+    position: absolute;
+    width: 320px;
+    z-index: 2001;
+
+    -webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	box-shadow:0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-help-title {
+    background-color: #f5f5f5;
+    color: #222;
+    font-size: 13px;
+    padding: 1px 0 1px 10px;
+}
+
+.gcsj-func-help-body {
+    border-top: 1px solid #ebebeb;
+    font-family: arial, sans-serif;
+    overflow: hidden;
+}
+
+.gcsj-func-help-content {
+    padding-bottom: 2px;
+}
+
+.gcsj-func-help-section {
+    padding: 5px 10px;
+}
+
+.gcsj-func-help-section-title {
+    font-size: 11px;
+    color: #666;
+}
+
+.gcsj-func-help-section-content {
+    font-size: 11px;
+}
+
+.gcsj-func-help-formula {
+    font-family: inconsolata,monospace,arial,sans,sans-serif;
+    padding: 1px 0;
+}
+
+.gcsj-func-help-formula-name {
+}
+
+.gcsj-func-help-paramter {
+    padding-left:1px;
+}
+
+.gcsj-func-help-paramter-paren {
+}
+
+.gcsj-func-help-paramter-active {
+    background-color: #feb;
+}
+
+/* color text */
+.gcsj-func-color-content {
+    white-space: pre-wrap;
+}
+/*-----formula textbox end-----*/
+
+/*-----floatingobject start-----*/
+.gc-floatingobject-selected{
+    border:1px solid #939393;
+}
+
+.gc-floatingobject-unselected{
+    background-color: transparent;
+    border:1px solid transparent;
+}
+
+.gc-floatingobject-container{
+    position: absolute;
+    overflow: hidden;
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-background-cover{
+    -webkit-background-size: cover; /* For WebKit*/
+    -moz-background-size: cover;    /* Mozilla*/
+    -o-background-size: cover;      /* Opera*/
+    background-size: cover;         /* Generic*/
+}
+
+.gc-floatingobject-moving-container{
+    position: absolute;
+    overflow: hidden;
+}
+
+.gc-floatingobject-moving-div{
+    position: absolute;
+    border:1px solid black;
+}
+.gc-floatingobject-resize-indicator {
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-resize-indicator-select{
+    background-color:white;
+    border-radius:2px;
+    -moz-border-radius:1px;
+    border:1px solid #939393;
+    z-index:100;
+}
+
+.gc-floatingobject-resize-indicator-unSelect{
+    display: none;
+}
+
+.gc-floatingobject-absolute{
+    position: absolute;
+}
+
+.gc-floatingobject-content-container {
+    box-sizing:content-box;
+}
+/*-----floatingobject end-----*/
+
+/*-----scrollbar start-----*/
+/*scrollbar*/
+.gc-scroll-container{
+    background-color: #eaeaea;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+.gc-scroll-corner-all {
+    border-radius: 2px;
+}
+.gc-scroll-arrow{
+    background-color: white;
+    border-style:solid;
+    border-color: #ababab;
+    background-image: none;
+    border-radius: 0;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowUp{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAClJREFUKFNjGEmgvLz8P5RJHABpgGGoEH6ArIEojdg0wDBUyShAAAYGAHSXJkH1wN/VAAAAAElFTkSuQmCC);
+    
+}
+.gc-scroll-arrowUp {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowDown {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAACRJREFUKFNjGAVYQHl5+X9cGKoEOyBZAwyQrAEGSNYwpAEDAwBvhSZBmzrLGgAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowDown {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowLeft{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAADBJREFUKFNjGMKgvLz8P5RJHABpIEkTTAPRmpA1EK0JBMjSBAJkaQIBsjQNNGBgAABe7iZBxoz5vwAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowLeft {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowRight{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAC5JREFUKFNjGIKgvLz8P5RJPABpIlkjTBNJGpE1Ea2RZA0gQLIGECBZw2ACDAwAhS4mQZAuqGcAAAAASUVORK5CYII=);
+}
+.gc-scroll-arrowRight {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-vertical {
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-vertical {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-horizontal {
+    text-indent: 0;
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-horizontal {
+    background-position: center;
+}
+
+.gc-scrollbar-wrapper {
+    background-color: transparent;
+}
+
+.gc-scroll-bar {
+    border-style:solid;
+    border-color:#ababab;
+    background:  white;
+    -moz-border-radius: 0px;
+    -webkit-border-radius: 0px;
+    border-radius: 0px;
+}
+.gc-scroll-arrow-hover {
+    border-style:solid;
+    border-color:#777777;
+    background: white;
+}
+.gc-scrollbar-stateHover {
+    border-style:solid;
+    border-color:#ababab;
+    background: #f0f0f0;
+}
+
+.gc-scroll-arrow:active,
+.gc-scroll-bar:active,
+.gc-scrollbar-stateActive {
+    border-style:solid;
+    border-color:#777777;
+    background: #f0f0f0;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+/*-----scrollbar end-----*/
+

+ 857 - 0
lib/spreadjs/sheets/css/gc.spread.sheets.excel2016colorful.10.0.1.css

@@ -0,0 +1,857 @@
+/*-----common css start-----*/
+.gc-theme-version {
+    position: absolute;
+    z-index: 2016;
+}
+.gc-grayArea {
+    background-color: #e6e6e6;
+}
+.gc-corner-hover {
+    background-color: #e6e6e6;
+}
+.gc-corner-selected {
+    background-color: #e6e6e6;
+}
+.gc-corner-normal {
+    background-color: #e6e6e6;
+}
+.gc-corner-triangle-normal {
+    background-color: #b4b4b4;
+    background-image: -webkit-linear-gradient(top, #b4b4b4, #b4b4b4); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #b4b4b4, #b4b4b4); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #b4b4b4, #b4b4b4); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #b4b4b4, #b4b4b4); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #b4b4b4, #b4b4b4); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #d6d6d6 !important;
+    border-right-color: #9b9b9b !important;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+}
+.gc-corner-triangle-hover {
+    background-color: #9e9e9e;
+    background-image: -webkit-linear-gradient(top, #9e9e9e, #9e9e9e); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #9e9e9e, #9e9e9e); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #9e9e9e, #9e9e9e); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #d6d6d6 !important;
+    border-right-color: #9b9b9b !important;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+}
+.gc-corner-triangle-selected {
+    background-color: #217346;
+    background-image: -webkit-linear-gradient(top, #217346, #217346); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #217346, #217346); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #217346, #217346); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #217346, #217346); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #217346, #217346); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #d6d6d6 !important;
+    border-right-color: #9b9b9b !important;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+}
+.gc-columnHeader-normal {
+    color: black;
+    background-image: none;
+    background-color: #e6e6e6;
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-hover {
+    color: black;
+    background-image: none;
+    background-color: #9fd5b7;
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-selected {
+    color: #217346;
+    background-image: none;
+    background-color: #d3f0e0;
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-highlight {
+    color: #217346;
+    background-image: none;
+    background-color: #d2d2d2;
+    border-style:solid;
+    border-left-color: #d2d2d2 !important;
+    border-right-color: #9c9c9c !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-rowHeader-normal {
+    color: black;
+    background-color: #e6e6e6;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-hover {
+    color: black;
+    background-color: #9fd5b7;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-selected {
+    color: #217346;
+    background-color: #d3f0e0;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-highlight {
+    color: #217346;
+    background-color: #d2d2d2;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #d2d2d2 !important;
+    border-bottom-color: #9c9c9c !important;
+    border-right-color: #999999 !important;
+}
+.gc-horizontal-scrollbar {
+    box-sizing:content-box;
+    background: #e6e6e6;
+    border-top: 1px solid #999999;
+    height: 18px;
+    padding: 4px 0px 5px 0px;
+    margin: 0;
+}
+.gc-vertical-scrollbar {
+    box-sizing:content-box;
+    background: #e6e6e6;
+    border-left: 1px solid #999999;
+    width: 18px;
+    padding: 0px 5px 0px 4px;
+    margin: 0;
+}
+.gc-footer-corner {
+    background-color: #e6e6e6;
+}
+.gc-selection {
+    background-color: rgba(20, 20, 20, 0.2);
+    border-color: #217346;
+    color: rgba(240,240,240,0.7);
+}
+.gc-drag-indicator {
+    border-color: #217346;
+}
+.gc-gridlineColor {
+    border-color: #d4d4d4;
+}
+.gc-group {
+    background-color: #e6e6e6;
+    color: #999999;
+}
+.gc-group-box {
+    background-color: #e4e4e4;
+    color: #646464;
+    border-color: #828790;
+}
+
+.gc-tabStripNewTab-highlight {
+    border-color: #777777;
+}
+.gc-tabStripNewTab-hover {
+    border-color: #439467;
+}
+.gc-tabStripBackground {
+    background-image: -webkit-linear-gradient(top, #e6e6e6, #e6e6e6); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #e6e6e6, #e6e6e6); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #e6e6e6, #e6e6e6); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #e6e6e6, #e6e6e6); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #e6e6e6, #e6e6e6); /* Standard syntax; must be last */
+    background-color: #e6e6e6;
+    border-color: #999999;
+}
+.gc-tabStripResizeBarInner {
+    color: #b3b3b3;
+}
+.gc-navMoreButton-highlight {
+    border-color: #0a6332;
+}
+.gc-navMoreButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-highlight {
+    border-color: #0a6332;
+}
+.gc-navButton-normal {
+    border-color: #c6c6c6;
+}
+.gc-tab-normal {
+    color: #444444;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #999999;
+    border-bottom-color: #217346;
+}
+.gc-tab-hover {
+    color: #252627;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #999999;
+    border-bottom-color: #217346;
+}
+.gc-tab-active {
+    color: #217346;
+    background-image: none;
+    background-color: white;
+    border-style: solid;
+    border-left-color: #999999;
+    border-bottom-color: #217346;
+}
+
+.gc-rowHeaderFill {
+    background-color: #e4ecf7;
+}
+.gc-colHeaderFill {
+    background-image: -webkit-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB 12.5%, #D2DBEB); /* Standard syntax; must be last */
+    background-color: #D2DBEB;
+}
+
+.gc-gradientButton {
+    background-color: #DDDDDD; /* fallback color if gradients are not supported */
+    background-image: -webkit-linear-gradient(top, #F6FAFB, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB, #D2DBEB); /* Standard syntax; must be last */
+}
+
+.gc-sheetTabEditor::-ms-clear {
+    display: none;
+}
+
+
+.gc-layout-table {
+    font-size:12px;
+    width:100%;
+    height:100%;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+}
+
+.gc-layout-table-first-column {
+    width:21px;
+    border-right:1px solid #CCC;
+    text-align:right;
+    padding-top:7px;
+}
+
+.gc-layout-table-last-column {
+    width:18px;
+}
+
+.gc-filter-sort-desc-container {
+    border-bottom:1px solid #CCC;
+}
+
+.gc-filter-item-wrapper {
+}
+
+
+.gc-filter-dialog-style {
+    background:#ffffff;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+    font-size:12px;
+    border:1px solid #c6c6c6;
+}
+
+.gc-search-outer-div {
+    border: none;
+    margin:4px 0px 0px 4px;
+    background-color: white;
+    background-image: none;
+    color:#1e395b;
+    font-weight:normal;
+}
+
+div.gc-search-outer-div input::-ms-clear{
+   display:none;
+}
+
+#gc-filterSearch {
+    width:165px;
+    height:21px;
+    border:1px solid #ababab;
+    margin-left:7px;
+    margin-top:4px;
+    margin-bottom: 0px;
+    padding: 0;
+    font-size: 1em;
+    background-color:white;
+    color:black;
+    float:none;
+}
+#gc-filterSearch:hover,
+#gc-filterSearch:active{
+    background-color:white;
+}
+
+.gc-check-uncheck-all {
+    float:left;
+    width:16px;
+    height:16px;
+    display:inline-block;
+}
+.gc-filter-check-outerDiv .gc-check-image,
+.gc-fill-type-item .gc-check-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);
+}
+.gc-filter-check-outerDiv .gc-uncheck-image,
+.gc-fill-type-item .gc-uncheck-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);
+}
+.gc-check-image,
+.gc-uncheck-image {
+    background-position:center;
+}
+
+.gc-filter-check-outerDiv {
+    height:18px;
+    margin-top:4px;
+}
+
+a.gc-filter-check-style {
+    color:#1e395b;
+    text-shadow:none;
+}
+
+a.gc-filter-check {
+    text-decoration: none;
+}
+
+a.gc-filter-check:hover {
+    text-decoration:underline;
+}
+#gc-sortASC:hover,
+#gc-sortASC:active {
+    border-color: #e3e3e3;
+    outline: none;
+    -webkit-box-shadow: none;
+            box-shadow: none;  
+}
+.gc-filter-sort {
+    border:1px solid transparent;
+    font-weight:normal;
+    color:#222222;
+}
+
+.gc-filter-hover {
+    border-radius: 0px;
+    outline:none;
+}
+
+.gc-filter-item {
+    position: relative;
+    cursor: default;
+    font-weight:normal;
+    border-style: solid;
+    border-color: transparent;
+}
+
+.gc-filter-item-container {
+    border:1px solid #a7abb0;
+    border-radius:3px;
+    margin:4px 0px 4px 4px;
+    overflow:hidden;
+}
+
+.gc-filter-item-input {
+    float: left;
+    clear: left;
+}
+
+.gc-filter-item-text {
+    font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
+    font-size: 12px;
+    margin: 2px;
+    white-space:nowrap;
+    word-wrap:normal;
+    float: left;
+    clear: right;
+}
+
+.gc-filter-button {
+    width:90px;
+    height:27px;
+    border-radius:3px;
+    margin:2px 1px 5px;
+}
+
+.gc-filter-button-disable {
+    opacity:.35;
+    background-image:none;
+}
+
+#gc-filterOK {
+    margin-left:13px;
+    margin-bottom:5px;
+    float:left;
+}
+#gc-filterCancel {
+    margin-bottom:5px;
+    float:left;
+}
+
+.gc-filter-button-default {
+    border:1px solid #acacac;
+    border-radius: 0;
+    background-image: -webkit-linear-gradient(top, #f0f0f0, #e5e5e5); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f0f0f0, #e5e5e5); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f0f0f0, #e5e5e5); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+}
+
+.gc-filter-button-hover {
+    border:1px solid #7eb4ea;
+    border-radius: 0;
+    background-color: #d3f0e0;
+    background-image: -webkit-linear-gradient(top, #ecf4fc, #dcecfc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #ecf4fc, #dcecfc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #ecf4fc, #dcecfc); /* Standard syntax; must be last */
+    color: black;
+    font-weight:normal;
+    text-shadow:none;
+    cursor:pointer;
+}
+
+.gc-filter-button-active {
+    border:1px solid #569de5;
+    border-radius: 0;
+    background-color: #ffe475;    background-image: -webkit-linear-gradient(top, #daecfc, #c4e0fc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #daecfc, #c4e0fc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #daecfc, #c4e0fc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #daecfc, #c4e0fc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #daecfc, #c4e0fc); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-filter-item-hover {
+    border:1px solid transparent;
+    background-color: #c5c5c5;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smartMenu-item-default {
+    border:1px solid transparent;
+    background-color: white;
+    background-image: none;
+    font-weight:normal;
+    color:#1e395b;
+    border-radius:0;
+}
+
+.gc-smartMenu-item-hover {
+    border:1px solid #86bfa0;
+    background-color: #d3f0e0;    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-default {
+    border:1px solid #ababab;
+    background: white;
+    color:#1e395b;
+    font-weight:normal;
+    border-radius:0;
+}
+
+.gc-smart-tag-hover {
+    border:1px solid #9fd5b7;
+    background-color: white;    
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-active {
+    border:1px solid #9fd5b7;
+    background-color:#9fd5b7;    
+    background-image: none;
+    font-weight:normal;
+    color:#262626;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+
+.gc-menu-item-input {
+    width:16px;
+    height:16px;
+    margin:1px;
+    float:left;
+    display:inline-block;
+}
+.gc-menu-item-text {
+    font-size:12px;
+    font-weight:normal;
+    display:inline-block;
+    float:left;
+    padding-top:2px;
+    font-family:Arial;
+}
+.gc-fill-menu-container {
+    box-shadow:rgba(0,0,0,0.4) 1px 2px 5px;
+    cursor:default;
+}
+
+.gc-toolstrip-default {
+    background: white;
+    border:1px solid #c6c6c6;
+}
+.gc-toolstrip-button-style:active,
+.gc-toolstrip-button-style {
+    color: black;
+    background:white;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-tab-tip-span{
+     background:#D6E6F9;
+     color:black;
+     border:1px solid #D6E6F9;
+     font-weight:normal;
+}
+
+.gc-spread-toolTip {
+    border: 1px solid #bebebe;
+    border-radius: 0px;
+    background-color: white;    background-image: none;
+    font-weight: normal;
+    color: #217346;
+}
+
+.gc-no-user-select {
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+/*-----common css end-----*/
+
+/*-----formula textbox start-----*/
+/* function autocomplete */
+/* function autocomplete */
+.gcsj-func-ac-popup {
+	margin: 0;
+	padding: 0;
+    background: #fff;
+	border: 1px solid rgba(0,0,0,0.2);
+	font-family: arial,sans-serif;
+	font-size: 12px;
+	line-height: 22px;
+	position: absolute;
+	width: 300px;
+	z-index: 2001;
+
+	-webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-ac-row {
+    margin: 0;
+    cursor: default;
+    padding: 2px 10px;
+    color: #666666;
+}
+
+.gcsj-func-ac-row-name {
+     color: #222;
+     font-size: 13px;
+     font-family: inconsolata,monospace,arial,sans,sans-serif;
+     margin: -2px 0;
+}
+
+.gcsj-func-ac-row-description {
+    color: #666;
+    display: none;
+    font-size: 11px;
+    margin: -2px 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.gcsj-ac-row-active {
+	background-color: #f5f5f5;
+	color: #000;
+	border-top: 1px solid #ebebeb;
+	border-bottom: 1px solid #ebebeb;
+	padding: 1px 10px
+}
+
+.gcsj-ac-row-active .gcsj-func-ac-row-description {
+    display:block;
+}
+
+/*  function help */
+.gcsj-func-help-popup {
+    background-color:#fff;
+    border: 1px solid rgba(0,0,0,0.2);
+    color: #222;
+    font-size: 11px;
+    word-wrap: break-word;
+    position: absolute;
+    width: 320px;
+    z-index: 2001;
+
+    -webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	box-shadow:0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-help-title {
+    background-color: #f5f5f5;
+    color: #222;
+    font-size: 13px;
+    padding: 1px 0 1px 10px;
+}
+
+.gcsj-func-help-body {
+    border-top: 1px solid #ebebeb;
+    font-family: arial, sans-serif;
+    overflow: hidden;
+}
+
+.gcsj-func-help-content {
+    padding-bottom: 2px;
+}
+
+.gcsj-func-help-section {
+    padding: 5px 10px;
+}
+
+.gcsj-func-help-section-title {
+    font-size: 11px;
+    color: #666;
+}
+
+.gcsj-func-help-section-content {
+    font-size: 11px;
+}
+
+.gcsj-func-help-formula {
+    font-family: inconsolata,monospace,arial,sans,sans-serif;
+    padding: 1px 0;
+}
+
+.gcsj-func-help-formula-name {
+}
+
+.gcsj-func-help-paramter {
+    padding-left:1px;
+}
+
+.gcsj-func-help-paramter-paren {
+}
+
+.gcsj-func-help-paramter-active {
+    background-color: #feb;
+}
+
+/* color text */
+.gcsj-func-color-content {
+    white-space: pre-wrap;
+}
+/*-----formula textbox end-----*/
+
+/*-----floatingobject start-----*/
+.gc-floatingobject-selected{
+    border:1px solid #939393;
+}
+
+.gc-floatingobject-unselected{
+    background-color: transparent;
+    border:1px solid transparent;
+}
+
+.gc-floatingobject-container{
+    position: absolute;
+    overflow: hidden;
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-background-cover{
+    -webkit-background-size: cover; /* For WebKit*/
+    -moz-background-size: cover;    /* Mozilla*/
+    -o-background-size: cover;      /* Opera*/
+    background-size: cover;         /* Generic*/
+}
+
+.gc-floatingobject-moving-container{
+    position: absolute;
+    overflow: hidden;
+}
+
+.gc-floatingobject-moving-div{
+    position: absolute;
+    border:1px solid black;
+}
+.gc-floatingobject-resize-indicator {
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-resize-indicator-select{
+    background-color:white;
+    border-radius:2px;
+    -moz-border-radius:1px;
+    border:1px solid #939393;
+    z-index:100;
+}
+
+.gc-floatingobject-resize-indicator-unSelect{
+    display: none;
+}
+
+.gc-floatingobject-absolute{
+    position: absolute;
+}
+
+.gc-floatingobject-content-container {
+    box-sizing:content-box;
+}
+/*-----floatingobject end-----*/
+
+/*-----scrollbar start-----*/
+/*scrollbar*/
+.gc-scroll-container{
+    background-color: #dbdbdb;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+.gc-scroll-corner-all {
+    border-radius: 2px;
+}
+.gc-scroll-arrow{
+    background-color: white;
+    border-style:solid;
+    border-color: #ababab;
+    background-image: none;
+    border-radius: 0;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowUp{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAClJREFUKFNjGEmgvLz8P5RJHABpgGGoEH6ArIEojdg0wDBUyShAAAYGAHSXJkH1wN/VAAAAAElFTkSuQmCC);
+    
+}
+.gc-scroll-arrowUp {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowDown {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAACRJREFUKFNjGAVYQHl5+X9cGKoEOyBZAwyQrAEGSNYwpAEDAwBvhSZBmzrLGgAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowDown {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowLeft{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAADBJREFUKFNjGMKgvLz8P5RJHABpIEkTTAPRmpA1EK0JBMjSBAJkaQIBsjQNNGBgAABe7iZBxoz5vwAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowLeft {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowRight{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAC5JREFUKFNjGIKgvLz8P5RJPABpIlkjTBNJGpE1Ea2RZA0gQLIGECBZw2ACDAwAhS4mQZAuqGcAAAAASUVORK5CYII=);
+}
+.gc-scroll-arrowRight {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-vertical {
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-vertical {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-horizontal {
+    text-indent: 0;
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-horizontal {
+    background-position: center;
+}
+
+.gc-scrollbar-wrapper {
+    background-color: transparent;
+}
+
+.gc-scroll-bar {
+    border-style:solid;
+    border-color:#ababab;
+    background:  white;
+    -moz-border-radius: 0px;
+    -webkit-border-radius: 0px;
+    border-radius: 0px;
+}
+.gc-scroll-arrow-hover {
+    border-style:solid;
+    border-color:#777777;
+    background: white;
+}
+.gc-scrollbar-stateHover {
+    border-style:solid;
+    border-color:#ababab;
+    background: #f0f0f0;
+}
+
+.gc-scroll-arrow:active,
+.gc-scroll-bar:active,
+.gc-scrollbar-stateActive {
+    border-style:solid;
+    border-color:#777777;
+    background: #f0f0f0;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+/*-----scrollbar end-----*/
+

+ 850 - 0
lib/spreadjs/sheets/css/gc.spread.sheets.excel2016darkGray.10.0.1.css

@@ -0,0 +1,850 @@
+/*-----common css start-----*/
+.gc-theme-version {
+    position: absolute;
+    z-index: 2016;
+}
+.gc-grayArea {
+    background-color: #6a6a6a;
+}
+.gc-corner-hover {
+    background-color: #6a6a6a;
+}
+.gc-corner-selected {
+    background-color: #6a6a6a;
+}
+.gc-corner-normal {
+    background-color: #6a6a6a;
+}
+.gc-corner-triangle-normal {
+    background-color: #f0f0f0;
+    background-image: -webkit-linear-gradient(top, #f0f0f0, #f0f0f0); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f0f0f0, #f0f0f0); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f0f0f0, #f0f0f0); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f0f0f0, #f0f0f0); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f0f0f0, #f0f0f0); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #999999 !important;
+    border-right-color: #d3d3d3 !important;
+    border-top-color: #9c9c9c !important;
+    border-bottom-color: #d2d2d2 !important;
+}
+.gc-corner-triangle-hover {
+    background-color: #ffffff;
+    background-image: -webkit-linear-gradient(top, #ffffff, #ffffff); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #ffffff, #ffffff); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #ffffff, #ffffff); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #ffffff, #ffffff); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #ffffff, #ffffff); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #999999 !important;
+    border-right-color: #d3d3d3 !important;
+    border-top-color: #9c9c9c !important;
+    border-bottom-color: #d2d2d2 !important;
+}
+.gc-corner-triangle-selected {
+    background-color: #217346;
+    background-image: -webkit-linear-gradient(top, #217346, #217346); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #217346, #217346); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #217346, #217346); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #217346, #217346); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #217346, #217346); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #999999 !important;
+    border-right-color: #d3d3d3 !important;
+    border-top-color: #9c9c9c !important;
+    border-bottom-color: #d2d2d2 !important;
+}
+.gc-columnHeader-normal {
+    color: #ffffff;
+    background-image: none;
+    background-color: #6a6a6a;
+    border-style:solid;
+    border-left-color: #9c9c9c !important;
+    border-right-color: #d2d2d2 !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-hover {
+    color: #ffffff;
+    background-image: none;
+    background-color: #0a6332;
+    border-style:solid;
+    border-left-color: #9c9c9c !important;
+    border-right-color: #d2d2d2 !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-selected {
+    color: #ffffff;
+    background-image: none;
+    background-color: #217346;
+    border-style:solid;
+    border-left-color: #9c9c9c !important;
+    border-right-color: #d2d2d2 !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-columnHeader-highlight {
+    color: #ffffff;
+    background-image: none;
+    background-color: #262626;
+    border-style:solid;
+    border-left-color: #9c9c9c !important;
+    border-right-color: #d2d2d2 !important;
+    border-bottom-color: #999999 !important;
+}
+.gc-rowHeader-normal {
+    color: #ffffff;
+    background-color: #6a6a6a;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #9c9c9c !important;
+    border-bottom-color: #d2d2d2 !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-hover {
+    color: #ffffff;
+    background-color: #0a6332;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #9c9c9c !important;
+    border-bottom-color: #d2d2d2 !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-selected {
+    color: #ffffff;
+    background-color: #217346;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #9c9c9c !important;
+    border-bottom-color: #d2d2d2 !important;
+    border-right-color: #999999 !important;
+}
+.gc-rowHeader-highlight {
+    color: #ffffff;
+    background-color: #262626;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #9c9c9c !important;
+    border-bottom-color: #d2d2d2 !important;
+    border-right-color: #999999 !important;
+}
+.gc-horizontal-scrollbar {
+    background-color: #6a6a6a;
+    border-top-color: #999999;
+}
+.gc-vertical-scrollbar {
+    background-color: #6a6a6a;
+    border-left-color: #999999;
+}
+.gc-footer-corner {
+    background-color: #6a6a6a;
+}
+.gc-selection {
+    background-color: rgba(20, 20, 20, 0.2);
+    border-color: #217346;
+    color: rgba(240,240,240,0.7);
+}
+.gc-drag-indicator {
+    border-color: #217346;
+}
+.gc-gridlineColor {
+    border-color: #d4d4d4;
+}
+.gc-group {
+    background-color: #6a6a6a;
+    color: #999999;
+}
+.gc-group-box {
+    background-color: #e4e4e4;
+    color: #646464;
+    border-color: #828790;
+}
+
+.gc-tabStripNewTab-highlight {
+    border-color: #f0f0f0;
+}
+.gc-tabStripNewTab-hover {
+    border-color: #86bfa0;
+}
+.gc-tabStripBackground {
+    background-image: -webkit-linear-gradient(top, #6a6a6a, #6a6a6a); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #6a6a6a, #6a6a6a); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #6a6a6a, #6a6a6a); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #6a6a6a, #6a6a6a); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #6a6a6a, #6a6a6a); /* Standard syntax; must be last */
+    background-color: #6a6a6a;
+    border-color: #999999;
+}
+.gc-tabStripResizeBarInner {
+    color: #f0f0f0;
+}
+.gc-navMoreButton-highlight {
+    border-color: #f0f0f0;
+}
+.gc-navMoreButton-hover {
+    border-color: #86bfa0;
+}
+.gc-navButton-hover {
+    border-color: #86bfa0;
+}
+.gc-navButton-highlight {
+    border-color: #f0f0f0;
+}
+.gc-navButton-normal {
+    border-color: #a3a3a3;
+}
+.gc-tab-normal {
+    color: #ffffff;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #999999;
+    border-bottom-color: #217346;
+}
+.gc-tab-hover {
+    color: #ffffff;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #999999;
+    border-bottom-color: #217346;
+}
+.gc-tab-active {
+    color: #217346;
+    background-image: none;
+    background-color: white;
+    border-style: solid;
+    border-left-color: #999999;
+    border-bottom-color: #217346;
+}
+
+.gc-rowHeaderFill {
+    background-color: #e4ecf7;
+}
+.gc-colHeaderFill {
+    background-image: -webkit-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB 12.5%, #D2DBEB); /* Standard syntax; must be last */
+    background-color: #D2DBEB;
+}
+
+.gc-gradientButton {
+    background-color: #DDDDDD; /* fallback color if gradients are not supported */
+    background-image: -webkit-linear-gradient(top, #F6FAFB, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB, #D2DBEB); /* Standard syntax; must be last */
+}
+
+.gc-sheetTabEditor::-ms-clear {
+    display: none;
+}
+
+
+.gc-layout-table {
+    font-size:12px;
+    width:100%;
+    height:100%;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+}
+
+.gc-layout-table-first-column {
+    width:21px;
+    border-right:1px solid #CCC;
+    text-align:right;
+    padding-top:7px;
+}
+
+.gc-layout-table-last-column {
+    width:18px;
+}
+
+.gc-filter-sort-desc-container {
+    border-bottom:1px solid #CCC;
+}
+
+.gc-filter-item-wrapper {
+}
+
+
+.gc-filter-dialog-style {
+    background:#f0f0f0;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+    font-size:12px;
+    border:1px solid #acacac;
+}
+
+.gc-search-outer-div {
+    border: none;
+    margin:4px 0px 0px 4px;
+    background-color: white;
+    background-image: none;
+    color:#1e395b;
+    font-weight:normal;
+}
+
+div.gc-search-outer-div input::-ms-clear{
+   display:none;
+}
+
+#gc-filterSearch {
+    width:165px;
+    height:21px;
+    border:1px solid #ababab;
+    margin-left:7px;
+    margin-top:4px;
+    margin-bottom: 0px;
+    padding: 0;
+    font-size: 1em;
+    background-color:white;
+    color:black;
+    float:none;
+}
+#gc-filterSearch:hover,
+#gc-filterSearch:active{
+    background-color:white;
+}
+
+.gc-check-uncheck-all {
+    float:left;
+    width:16px;
+    height:16px;
+    display:inline-block;
+}
+.gc-filter-check-outerDiv .gc-check-image,
+.gc-fill-type-item .gc-check-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);
+}
+.gc-filter-check-outerDiv .gc-uncheck-image,
+.gc-fill-type-item .gc-uncheck-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);
+}
+.gc-check-image,
+.gc-uncheck-image {
+    background-position:center;
+}
+
+.gc-filter-check-outerDiv {
+    height:18px;
+    margin-top:4px;
+}
+
+a.gc-filter-check-style {
+    color:#1e395b;
+    text-shadow:none;
+}
+
+a.gc-filter-check {
+    text-decoration: none;
+}
+
+a.gc-filter-check:hover {
+    text-decoration:underline;
+}
+#gc-sortASC:hover,
+#gc-sortASC:active {
+    border-color: #e3e3e3;
+    outline: none;
+    -webkit-box-shadow: none;
+            box-shadow: none;  
+}
+.gc-filter-sort {
+    border:1px solid transparent;
+    font-weight:normal;
+    color:#222222;
+}
+
+.gc-filter-hover {
+    border-radius: 0px;
+    outline:none;
+}
+
+.gc-filter-item {
+    position: relative;
+    cursor: default;
+    font-weight:normal;
+    border-style: solid;
+    border-color: transparent;
+}
+
+.gc-filter-item-container {
+    border:1px solid #a7abb0;
+    border-radius:3px;
+    margin:4px 0px 4px 4px;
+    overflow:hidden;
+}
+
+.gc-filter-item-input {
+    float: left;
+    clear: left;
+}
+
+.gc-filter-item-text {
+    font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
+    font-size: 12px;
+    margin: 2px;
+    white-space:nowrap;
+    word-wrap:normal;
+    float: left;
+    clear: right;
+}
+
+.gc-filter-button {
+    width:90px;
+    height:27px;
+    margin:2px 1px 5px;
+}
+
+.gc-filter-button-disable {
+    opacity:.35;
+    background-image:none;
+}
+
+#gc-filterOK {
+    margin-left:13px;
+    margin-bottom:5px;
+    float:left;
+}
+#gc-filterCancel {
+    margin-bottom:5px;
+    float:left;
+}
+
+.gc-filter-button-default {
+    border:1px solid #acacac;
+    border-radius: 0;
+    background-image: -webkit-linear-gradient(top, #f0f0f0, #e5e5e5); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f0f0f0, #e5e5e5); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f0f0f0, #e5e5e5); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+}
+
+.gc-filter-button-hover {
+    border:1px solid #7eb4ea;
+    border-radius: 0;
+    background-color: #d3f0e0;
+    background-image: -webkit-linear-gradient(top, #ecf4fc, #dcecfc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #ecf4fc, #dcecfc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #ecf4fc, #dcecfc); /* Standard syntax; must be last */
+    color: black;
+    font-weight:normal;
+    text-shadow:none;
+    cursor:pointer;
+}
+
+.gc-filter-button-active {
+    border:1px solid #569de5;
+    border-radius: 0;
+    background-color: #ffe475;
+    background-image: -webkit-linear-gradient(top, #daecfc, #c4e0fc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #daecfc, #c4e0fc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #daecfc, #c4e0fc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #daecfc, #c4e0fc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #daecfc, #c4e0fc); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-filter-item-hover {
+    border:1px solid transparent;
+    background-color: #969696;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smartMenu-item-default {
+    border:1px solid transparent;
+    background-color: white;
+    background-image: none;
+    font-weight:normal;
+    color:#1e395b;
+    border-radius:0;
+}
+
+.gc-smartMenu-item-hover {
+    border:1px solid #86bfa0;
+    background-color: #d3f0e0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-default {
+    border:1px solid #ababab;
+    background: #f0f0f0;
+    color:#1e395b;
+    font-weight:normal;
+    border-radius:0;
+}
+
+.gc-smart-tag-hover {
+    border:1px solid #9fd5b7;
+    background-color: #f0f0f0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-active {
+    border:1px solid #9fd5b7;
+    background-color:#9fd5b7;
+    background-image: none;
+    font-weight:normal;
+    color:#262626;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+
+.gc-menu-item-input {
+    width:16px;
+    height:16px;
+    margin:1px;
+    float:left;
+    display:inline-block;
+}
+.gc-menu-item-text {
+    font-size:12px;
+    font-weight:normal;
+    display:inline-block;
+    float:left;
+    padding-top:2px;
+    font-family:Arial;
+}
+.gc-fill-menu-container {
+    box-shadow:rgba(0,0,0,0.4) 1px 2px 5px;
+    cursor:default;
+}
+
+.gc-toolstrip-default {
+    background: white;
+    border:1px solid #c6c6c6;
+}
+.gc-toolstrip-button-style:active,
+.gc-toolstrip-button-style {
+    color: black;
+    background:white;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+
+.gc-tab-tip-span{
+     background:#D6E6F9;
+     color:black;
+     border:1px solid #D6E6F9;
+     font-weight:normal;
+}
+
+.gc-spread-toolTip {
+    border: 1px solid #bebebe;
+    border-radius: 0px;
+    background-color: #f0f0f0;
+    background-image: none;
+    font-weight: normal;
+    color: #217346;
+}
+
+.gc-no-user-select {
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+/*-----common css end-----*/
+
+/*-----formula textbox start-----*/
+/* function autocomplete */
+.gcsj-func-ac-popup {
+	margin: 0;
+	padding: 0;
+    background: #fff;
+	border: 1px solid rgba(0,0,0,0.2);
+	font-family: arial,sans-serif;
+	font-size: 12px;
+	line-height: 22px;
+	position: absolute;
+	width: 300px;
+	z-index: 2001;
+
+	-webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+	box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-ac-row {
+    margin: 0;
+    cursor: default;
+    padding: 2px 10px;
+    color: #666666;
+}
+
+.gcsj-func-ac-row-name {
+     color: #222;
+     font-size: 13px;
+     font-family: inconsolata,monospace,arial,sans,sans-serif;
+     margin: -2px 0;
+}
+
+.gcsj-func-ac-row-description {
+    color: #666;
+    display: none;
+    font-size: 11px;
+    margin: -2px 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.gcsj-ac-row-active {
+	background-color: #f5f5f5;
+	color: #000;
+	border-top: 1px solid #ebebeb;
+	border-bottom: 1px solid #ebebeb;
+	padding: 1px 10px
+}
+
+.gcsj-ac-row-active .gcsj-func-ac-row-description {
+    display:block;
+}
+
+/*  function help */
+.gcsj-func-help-popup {
+    background-color:#fff;
+    border: 1px solid rgba(0,0,0,0.2);
+    color: #222;
+    font-size: 11px;
+    word-wrap: break-word;
+    position: absolute;
+    width: 320px;
+    z-index: 2001;
+
+    -webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+	box-shadow:0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-help-title {
+    background-color: #f5f5f5;
+    color: #222;
+    font-size: 13px;
+    padding: 1px 0 1px 10px;
+}
+
+.gcsj-func-help-body {
+    border-top: 1px solid #ebebeb;
+    font-family: arial, sans-serif;
+    overflow: hidden;
+}
+
+.gcsj-func-help-content {
+    padding-bottom: 2px;
+}
+
+.gcsj-func-help-section {
+    padding: 5px 10px;
+}
+
+.gcsj-func-help-section-title {
+    font-size: 11px;
+    color: #666;
+}
+
+.gcsj-func-help-section-content {
+    font-size: 11px;
+}
+
+.gcsj-func-help-formula {
+    font-family: inconsolata,monospace,arial,sans,sans-serif;
+    padding: 1px 0;
+}
+
+.gcsj-func-help-formula-name {
+}
+
+.gcsj-func-help-paramter {
+    padding-left:1px;
+}
+
+.gcsj-func-help-paramter-paren {
+}
+
+.gcsj-func-help-paramter-active {
+    background-color: #feb;
+}
+
+/* color text */
+.gcsj-func-color-content {
+    white-space: pre-wrap;
+}
+/*-----formula textbox end-----*/
+
+/*-----floatingobject start-----*/
+.gc-floatingobject-selected{
+    border:1px solid #939393;
+}
+
+.gc-floatingobject-unselected{
+    background-color: transparent;
+    border:1px solid transparent;
+}
+
+.gc-floatingobject-container{
+    position: absolute;
+    overflow: hidden;
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-background-cover{
+    -webkit-background-size: cover; /* For WebKit*/
+    -moz-background-size: cover;    /* Mozilla*/
+    -o-background-size: cover;      /* Opera*/
+    background-size: cover;         /* Generic*/
+}
+
+.gc-floatingobject-moving-container{
+    position: absolute;
+    overflow: hidden;
+}
+
+.gc-floatingobject-moving-div{
+    position: absolute;
+    border:1px solid black;
+}
+.gc-floatingobject-resize-indicator {
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-resize-indicator-select{
+    background-color:white;
+    border-radius:2px;
+    -moz-border-radius:1px;
+    border:1px solid #939393;
+    z-index:100;
+}
+
+.gc-floatingobject-resize-indicator-unSelect{
+    display: none;
+}
+
+.gc-floatingobject-absolute{
+    position: absolute;
+}
+
+.gc-floatingobject-content-container {
+    box-sizing:content-box;
+}
+/*-----floatingobject end-----*/
+
+/*-----scrollbar start-----*/
+/*scrollbar*/
+.gc-scroll-container{
+    background-color: #575757;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+.gc-scroll-corner-all {
+    border-radius: 2px;
+}
+.gc-scroll-arrow{
+    background-color: #999999;
+    border-style:solid;
+    border-color: #3b3b3b;
+    background-image: none;
+    border-radius: 0;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowUp{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAClJREFUKFNjGEmgvLz8P5RJHABpgGGoEH6ArIEojdg0wDBUyShAAAYGAHSXJkH1wN/VAAAAAElFTkSuQmCC);
+    
+}
+.gc-scroll-arrowUp {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowDown {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAACRJREFUKFNjGAVYQHl5+X9cGKoEOyBZAwyQrAEGSNYwpAEDAwBvhSZBmzrLGgAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowDown {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowLeft{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAADBJREFUKFNjGMKgvLz8P5RJHABpIEkTTAPRmpA1EK0JBMjSBAJkaQIBsjQNNGBgAABe7iZBxoz5vwAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowLeft {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowRight{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAC5JREFUKFNjGIKgvLz8P5RJPABpIlkjTBNJGpE1Ea2RZA0gQLIGECBZw2ACDAwAhS4mQZAuqGcAAAAASUVORK5CYII=);
+}
+.gc-scroll-arrowRight {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-vertical {
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-vertical {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-horizontal {
+    text-indent: 0;
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-horizontal {
+    background-position: center;
+}
+
+.gc-scrollbar-wrapper {
+    background-color: transparent;
+}
+
+.gc-scroll-bar {
+    border-style:solid;
+    border-color:#3b3b3b;
+    background: #999999;
+    -moz-border-radius: 0px;
+    -webkit-border-radius: 0px;
+    border-radius: 0px;
+}
+.gc-scroll-arrow-hover {
+    border-style:solid;
+    border-color:#101010;
+    background: #b3b3b3;
+}
+.gc-scrollbar-stateHover {
+    border-style:solid;
+    border-color:#101010;
+    background: #b3b3b3;
+}
+
+.gc-scroll-arrow:active,
+.gc-scroll-bar:active,
+.gc-scrollbar-stateActive {
+    border-style:solid;
+    border-color:#101010;
+    background: #c4c4c4;
+    -webkit-box-shadow: none;
+          box-shadow: none;
+}
+/*-----scrollbar end-----*/
+

+ 864 - 0
lib/spreadjs/sheets/css/gc.spread.sheets.sc.css

@@ -0,0 +1,864 @@
+/*-----common css start-----*/
+.gc-theme-version {
+    position: absolute;
+    z-index: 2013;
+}
+.gc-grayArea {
+    background-color: #f1f1f1;
+}
+.gc-corner-hover {
+    background-color: #f1f1f1;
+}
+.gc-corner-selected {
+    background-color: #f1f1f1;
+}
+.gc-corner-normal {
+    background-color: #f1f1f1;
+}
+.gc-corner-triangle-normal {
+    background-color: #c6c6c6;
+    background-image: -webkit-linear-gradient(top, #c6c6c6, #c6c6c6); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #c6c6c6, #c6c6c6); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #c6c6c6, #c6c6c6); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #c6c6c6, #c6c6c6); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #c6c6c6, #c6c6c6); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+}
+.gc-corner-triangle-hover {
+    background-color: #9e9e9e;
+    background-image: -webkit-linear-gradient(top, #9e9e9e, #9e9e9e); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #9e9e9e, #9e9e9e); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #9e9e9e, #9e9e9e); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #9e9e9e, #9e9e9e); /* Standard syntax; must be last */
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+}
+.gc-corner-triangle-selected {
+    background-color: #217346;
+    background-image: -webkit-linear-gradient(top, #217346, #217346); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #217346, #217346); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #217346, #217346); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #217346, #217346); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #2577c2, #2577c2); /* Standard syntax; must be last */ /*左上三角色*/
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+}
+.gc-columnHeader-normal {
+    color: #262626;
+    background-image: none;
+    background-color: #f1f1f1;
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-bottom-color: #ababab !important;
+}
+/*列头悬停*/
+.gc-columnHeader-hover {
+    color: #262626;
+    background-image: none;
+    background-color: #ababab;
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-bottom-color: #ababab !important;
+}
+/*选中列*/
+.gc-columnHeader-selected {
+    color: #2577c2;
+    background-image: none;
+    background-color: #ababab;
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-bottom-color: #ababab !important;
+}
+/*焦点列头字体*/
+.gc-columnHeader-highlight {
+    color: #2577c2;
+    background-image: none;
+    background-color: #d4d4d4;
+    border-style:solid;
+    border-left-color: #dbdbdb !important;
+    border-right-color: #b7b7b7 !important;
+    border-bottom-color: #ababab !important;
+}
+.gc-rowHeader-normal {
+    color: #262626;
+    background-color: #f1f1f1;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+    border-right-color: #ababab !important;
+}
+/*行头悬停色*/
+.gc-rowHeader-hover {
+    color: #262626;
+    background-color: #ababab;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+    border-right-color: #ababab !important;
+}
+/*选中行*/
+.gc-rowHeader-selected {
+    color: #2577c2;
+    background-color: #ababab;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+    border-right-color: #ababab !important;
+}
+.gc-rowHeader-highlight {
+    color: #2577c2;
+    background-color: #d4d4d4;
+    background-image: none;
+    border-style:solid;
+    border-top-color: #dbdbdb !important;
+    border-bottom-color: #b7b7b7 !important;
+    border-right-color: #ababab !important;
+}
+.gc-horizontal-scrollbar {
+    box-sizing:content-box;
+    background: #f1f1f1;
+    border-top: 1px solid #ababab;
+    height: 18px;
+    padding: 4px 0px 5px 0px;
+    margin: 0;
+}
+.gc-vertical-scrollbar {
+    box-sizing:content-box;
+    background: #f1f1f1;
+    border-left: 1px solid #ababab;
+    width: 18px;
+    padding: 0px 5px 0px 4px;
+    margin: 0;
+}
+.gc-footer-corner {
+    background-color: #f1f1f1;
+}
+/*选择框*/
+.gc-selection {
+    background-color: rgba(20, 20, 20, 0.2);
+    /*border-color: #ababab;*/
+    border-color: #675f5e;
+    color: rgba(240,240,240,0.7);
+}
+.gc-drag-indicator {
+    border-color: #217346;
+}
+.gc-gridlineColor {
+    border-color: #d4d4d4;
+}
+.gc-group {
+    background-color:#f1f1f1;
+    color: #ababab;
+}
+.gc-group-box {
+    background-color:#f1f1f1;
+    color: #606060;
+    border-color: #828790;
+}
+
+.gc-tabStripNewTab-highlight {
+    border-color: #5e5e5e;
+}
+.gc-tabStripNewTab-hover {
+    border-color: #439467;
+}
+.gc-tabStripBackground {
+    background-image: -webkit-linear-gradient(top, #f1f1f1, #f1f1f1); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f1f1f1, #f1f1f1); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f1f1f1, #f1f1f1); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f1f1f1, #f1f1f1); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f1f1f1, #f1f1f1); /* Standard syntax; must be last */
+    background-color: #f1f1f1;
+    border-color: #ababab;
+}
+.gc-tabStripResizeBarInner {
+    color: #5e5e5e;
+}
+.gc-navMoreButton-highlight {
+    border-color: #5e5e5e;
+}
+.gc-navMoreButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-hover {
+    border-color: #439467;
+}
+.gc-navButton-highlight {
+    border-color: #005a2b;
+}
+.gc-navButton-normal {
+    border-color: #ababab;
+}
+.gc-tab-normal {
+    color: #444444;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+.gc-tab-hover {
+    color: #252627;
+    background-image: none;
+    background-color: transparent;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+.gc-tab-active {
+    color: #217346;
+    background-image: none;
+    background-color: white;
+    border-style: solid;
+    border-left-color: #ababab;
+    border-bottom-color: #217346;
+}
+
+.gc-rowHeaderFill {
+    background-color: #e4ecf7;
+}
+.gc-colHeaderFill {
+    background-image: -webkit-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB 12.5%, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB 12.5%, #D2DBEB); /* Standard syntax; must be last */
+    background-color: #D2DBEB;
+}
+
+.gc-gradientButton {
+    background-color: #DDDDDD; /* fallback color if gradients are not supported */
+    background-image: -webkit-linear-gradient(top, #F6FAFB, #D2DBEB); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #F6FAFB, #D2DBEB); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #F6FAFB, #D2DBEB); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #F6FAFB, #D2DBEB); /* Standard syntax; must be last */
+}
+
+.gc-sheetTabEditor::-ms-clear {
+    display: none;
+}
+
+
+.gc-layout-table {
+    font-size:12px;
+    width:100%;
+    height:100%;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+}
+
+.gc-layout-table-first-column {
+    width:21px;
+    border-right:1px solid #CCC;
+    text-align:right;
+    padding-top:7px;
+}
+
+.gc-layout-table-last-column {
+    width:18px;
+}
+
+.gc-filter-sort-desc-container {
+    border-bottom:1px solid #CCC;
+}
+
+.gc-filter-item-wrapper {
+}
+
+
+.gc-filter-dialog-style {
+    background:#fcfdfd;
+    font-family:Lucida Grande, Lucida Sans, Arial, sans-serif;
+    font-size:12px;
+    border:1px solid #a7abb0;
+}
+
+.gc-search-outer-div {
+    border: none;
+    margin:4px 0px 0px 4px;
+    background-color: white;
+    background-image: none;
+    color:#1e395b;
+    font-weight:normal;
+}
+
+div.gc-search-outer-div input::-ms-clear{
+    display:none;
+}
+
+#gc-filterSearch {
+    width:165px;
+    height:21px;
+    border:1px solid #ababab;
+    margin-left:7px;
+    margin-top:4px;
+    margin-bottom: 0px;
+    padding: 0;
+    font-size: 1em;
+    background-color:white;
+    color:black;
+    float:none;
+}
+#gc-filterSearch:hover,
+#gc-filterSearch:active{
+    background-color:white;
+}
+
+.gc-check-uncheck-all {
+    float:left;
+    width:16px;
+    height:16px;
+    display:inline-block;
+}
+.gc-filter-check-outerDiv .gc-check-image,
+.gc-fill-type-item .gc-check-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);
+}
+.gc-filter-check-outerDiv .gc-uncheck-image,
+.gc-fill-type-item .gc-uncheck-image {
+    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);
+}
+.gc-check-image,
+.gc-uncheck-image {
+    background-position:center;
+}
+
+.gc-filter-check-outerDiv {
+    height:18px;
+    margin-top:4px;
+}
+
+a.gc-filter-check-style {
+    color:#1e395b;
+    text-shadow:none;
+}
+
+a.gc-filter-check {
+    text-decoration: none;
+}
+
+a.gc-filter-check:hover {
+    text-decoration:underline;
+}
+#gc-sortASC:hover,
+#gc-sortASC:active {
+    border-color: #e3e3e3;
+    outline: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+.gc-filter-sort {
+    border:1px solid transparent;
+    font-weight:normal;
+    color:#222222;
+}
+
+.gc-filter-hover {
+    border-radius: 0px;
+    outline:none;
+}
+
+.gc-filter-item {
+    position: relative;
+    cursor: default;
+    font-weight:normal;
+    border-style: solid;
+    border-color: transparent;
+}
+
+.gc-filter-item-container {
+    border:1px solid #a7abb0;
+    border-radius:3px;
+    margin:4px 0px 4px 4px;
+    overflow:hidden;
+}
+
+.gc-filter-item-input {
+    float: left;
+    clear: left;
+}
+
+.gc-filter-item-text {
+    font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
+    font-size: 12px;
+    margin: 2px;
+    white-space:nowrap;
+    word-wrap:normal;
+    float: left;
+    clear: right;
+}
+
+.gc-filter-button {
+    width:90px;
+    height:27px;
+    margin:2px 1px 5px;
+}
+
+.gc-filter-button-disable {
+    opacity:.35;
+    background-image:none;
+}
+
+#gc-filterOK {
+    margin-left:13px;
+    margin-bottom:5px;
+    float:left;
+}
+#gc-filterCancel {
+    margin-bottom:5px;
+    float:left;
+}
+
+.gc-filter-button-default {
+    border:1px solid #acacac;
+    border-radius: 0;
+    background-image: -webkit-linear-gradient(top, #f0f0f0, #e5e5e5); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #f0f0f0, #e5e5e5); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #f0f0f0, #e5e5e5); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #f0f0f0, #e5e5e5); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+}
+
+.gc-filter-button-hover {
+    border:1px solid #7eb4ea;
+    border-radius: 0;
+    background-color: #d3f0e0;
+    background-image: -webkit-linear-gradient(top, #ecf4fc, #dcecfc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #ecf4fc, #dcecfc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #ecf4fc, #dcecfc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #ecf4fc, #dcecfc); /* Standard syntax; must be last */
+    color: black;
+    font-weight:normal;
+    text-shadow:none;
+    cursor:pointer;
+}
+
+.gc-filter-button-active {
+    border:1px solid #569de5;
+    border-radius: 0;
+    background-color: #ffe475;
+    background-image: -webkit-linear-gradient(top, #daecfc, #c4e0fc); /* For Chrome and Safari */
+    background-image:    -moz-linear-gradient(top, #daecfc, #c4e0fc); /* For old Fx (3.6 to 15) */
+    background-image:     -ms-linear-gradient(top, #daecfc, #c4e0fc); /* For pre-releases of IE 10*/
+    background-image:      -o-linear-gradient(top, #daecfc, #c4e0fc); /* For old Opera (11.1 to 12.0) */
+    background-image:         linear-gradient(to bottom, #daecfc, #c4e0fc); /* Standard syntax; must be last */
+    font-weight:normal;
+    color: black;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+
+.gc-filter-item-hover {
+    border:1px solid transparent;
+    background-color: #d3f0e0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smartMenu-item-default {
+    border:1px solid transparent;
+    background-color: white;
+    background-image: none;
+    font-weight:normal;
+    color:#1e395b;
+    border-radius:0;
+}
+
+.gc-smartMenu-item-hover {
+    border:1px solid #86bfa0;
+    background-color: #d3f0e0;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-default {
+    border:1px solid #ababab;
+    background: white;
+    color:#1e395b;
+    font-weight:normal;
+    border-radius:0;
+}
+
+.gc-smart-tag-hover {
+    border:1px solid #9fd5b7;
+    background-color: white;
+    background-image: none;
+    color:#1d5987;
+    font-weight:normal;
+    text-shadow:none;
+}
+
+.gc-smart-tag-active {
+    border:1px solid #9fd5b7;
+    background-color:#9fd5b7;
+    background-image: none;
+    font-weight:normal;
+    color:#262626;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+
+
+.gc-menu-item-input {
+    width:16px;
+    height:16px;
+    margin:1px;
+    float:left;
+    display:inline-block;
+}
+.gc-menu-item-text {
+    font-size:12px;
+    font-weight:normal;
+    display:inline-block;
+    float:left;
+    padding-top:2px;
+    font-family:Arial;
+}
+.gc-fill-menu-container {
+    box-shadow:rgba(0,0,0,0.4) 1px 2px 5px;
+    cursor:default;
+}
+
+.gc-toolstrip-default {
+    background: white;
+    border:1px solid #c6c6c6;
+}
+.gc-toolstrip-button-style:active,
+.gc-toolstrip-button-style {
+    color: black;
+    background:white;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+
+.gc-tab-tip-span{
+    background:#D6E6F9;
+    color:black;
+    border:1px solid #D6E6F9;
+    font-weight:normal;
+}
+
+.gc-spread-toolTip {
+    border: 1px solid #bebebe;
+    border-radius: 0px;
+    background-color: white;    background-image: none;
+    font-weight: normal;
+    color: #217346;
+}
+
+.gc-no-user-select {
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+/*-----common css end-----*/
+
+/*-----formula textbox start-----*/
+/* function autocomplete */
+.gcsj-func-ac-popup {
+    margin: 0;
+    padding: 0;
+    background: #fff;
+    border: 1px solid rgba(0,0,0,0.2);
+    font-family: arial,sans-serif;
+    font-size: 12px;
+    line-height: 22px;
+    position: absolute;
+    width: 300px;
+    z-index: 2001;
+
+    -webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+    -moz-box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+    box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-ac-row {
+    margin: 0;
+    cursor: default;
+    padding: 2px 10px;
+    color: #666666;
+}
+
+.gcsj-func-ac-row-name {
+    color: #222;
+    font-size: 13px;
+    font-family: inconsolata,monospace,arial,sans,sans-serif;
+    margin: -2px 0;
+}
+
+.gcsj-func-ac-row-description {
+    color: #666;
+    display: none;
+    font-size: 11px;
+    margin: -2px 0;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.gcsj-ac-row-active {
+    background-color: #f5f5f5;
+    color: #000;
+    border-top: 1px solid #ebebeb;
+    border-bottom: 1px solid #ebebeb;
+    padding: 1px 10px
+}
+
+.gcsj-ac-row-active .gcsj-func-ac-row-description {
+    display:block;
+}
+
+/*  function help */
+.gcsj-func-help-popup {
+    background-color:#fff;
+    border: 1px solid rgba(0,0,0,0.2);
+    color: #222;
+    font-size: 11px;
+    word-wrap: break-word;
+    position: absolute;
+    width: 320px;
+    z-index: 2001;
+
+    -webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+    -moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);
+    box-shadow:0 2px 4px rgba(0,0,0,0.2);
+}
+
+.gcsj-func-help-title {
+    background-color: #f5f5f5;
+    color: #222;
+    font-size: 13px;
+    padding: 1px 0 1px 10px;
+}
+
+.gcsj-func-help-body {
+    border-top: 1px solid #ebebeb;
+    font-family: arial, sans-serif;
+    overflow: hidden;
+}
+
+.gcsj-func-help-content {
+    padding-bottom: 2px;
+}
+
+.gcsj-func-help-section {
+    padding: 5px 10px;
+}
+
+.gcsj-func-help-section-title {
+    font-size: 11px;
+    color: #666;
+}
+
+.gcsj-func-help-section-content {
+    font-size: 11px;
+}
+
+.gcsj-func-help-formula {
+    font-family: inconsolata,monospace,arial,sans,sans-serif;
+    padding: 1px 0;
+}
+
+.gcsj-func-help-formula-name {
+}
+
+.gcsj-func-help-paramter {
+    padding-left:1px;
+}
+
+.gcsj-func-help-paramter-paren {
+}
+
+.gcsj-func-help-paramter-active {
+    background-color: #feb;
+}
+
+/* color text */
+.gcsj-func-color-content {
+    white-space: pre-wrap;
+}
+/*-----formula textbox end-----*/
+
+/*-----floatingobject start-----*/
+.gc-floatingobject-selected{
+    border:1px solid #939393;
+}
+
+.gc-floatingobject-unselected{
+    background-color: transparent;
+    border:1px solid transparent;
+}
+
+.gc-floatingobject-container{
+    position: absolute;
+    overflow: hidden;
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-background-cover{
+    -webkit-background-size: cover; /* For WebKit*/
+    -moz-background-size: cover;    /* Mozilla*/
+    -o-background-size: cover;      /* Opera*/
+    background-size: cover;         /* Generic*/
+}
+
+.gc-floatingobject-moving-container{
+    position: absolute;
+    overflow: hidden;
+}
+
+.gc-floatingobject-moving-div{
+    position: absolute;
+    border:1px solid black;
+}
+.gc-floatingobject-resize-indicator {
+    box-sizing:content-box;
+}
+
+.gc-floatingobject-resize-indicator-select{
+    background-color:white;
+    border-radius:2px;
+    -moz-border-radius:1px;
+    border:1px solid #939393;
+    z-index:100;
+}
+
+.gc-floatingobject-resize-indicator-unSelect{
+    display: none;
+}
+
+.gc-floatingobject-absolute{
+    position: absolute;
+}
+
+.gc-floatingobject-content-container {
+    box-sizing:content-box;
+}
+/*-----floatingobject end-----*/
+
+/*-----scrollbar start-----*/
+/*scrollbar*/
+.gc-scroll-container{
+    background-color: #d9d9d9;
+    -moz-box-shadow: none;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+.gc-scroll-corner-all {
+    border-radius: 2px;
+}
+.gc-scroll-arrow{
+    background-color: white;
+    border-style:solid;
+    border-color: #ababab;
+    background-image: none;
+    border-radius: 0;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowUp{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAClJREFUKFNjGEmgvLz8P5RJHABpgGGoEH6ArIEojdg0wDBUyShAAAYGAHSXJkH1wN/VAAAAAElFTkSuQmCC);
+
+}
+.gc-scroll-arrowUp {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowDown {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAACRJREFUKFNjGAVYQHl5+X9cGKoEOyBZAwyQrAEGSNYwpAEDAwBvhSZBmzrLGgAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowDown {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowLeft{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAADBJREFUKFNjGMKgvLz8P5RJHABpIEkTTAPRmpA1EK0JBMjSBAJkaQIBsjQNNGBgAABe7iZBxoz5vwAAAABJRU5ErkJggg==);
+}
+.gc-scroll-arrowLeft {
+    background-position: center;
+}
+
+.gc-scroll-arrow .gc-scroll-arrowRight{
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAC5JREFUKFNjGIKgvLz8P5RJPABpIlkjTBNJGpE1Ea2RZA0gQLIGECBZw2ACDAwAhS4mQZAuqGcAAAAASUVORK5CYII=);
+}
+.gc-scroll-arrowRight {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-vertical {
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-vertical {
+    background-position: center;
+}
+
+.gc-scroll-bar .gc-scrollbar-horizontal {
+    text-indent: 0;
+    background-image: none;
+    background-repeat: no-repeat;
+}
+.gc-scrollbar-horizontal {
+    background-position: center;
+}
+
+.gc-scrollbar-wrapper {
+    background-color: transparent;
+}
+
+.gc-scroll-bar {
+    border-style:solid;
+    border-color:#ababab;
+    background:  white;
+    -moz-border-radius: 0px;
+    -webkit-border-radius: 0px;
+    border-radius: 0px;
+}
+.gc-scroll-arrow-hover {
+    border-style:solid;
+    border-color:#777777;
+    background: white;
+}
+.gc-scrollbar-stateHover {
+    border-style:solid;
+    border-color:#777777;
+    background: white;
+}
+
+.gc-scroll-arrow:active,
+.gc-scroll-bar:active,
+.gc-scrollbar-stateActive {
+    border-style:solid;
+    border-color:#777777;
+    background: #e1e1e1;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+/*-----scrollbar end-----*/
+

文件差異過大導致無法顯示
+ 62 - 0
lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js


文件差異過大導致無法顯示
+ 36 - 0
lib/spreadjs/sheets/interop/gc.spread.excelio.11.1.2.min.js


文件差異過大導致無法顯示
+ 17 - 0
lib/spreadjs/sheets/pluggable/gc.spread.calcengine.10.0.1.min.js


文件差異過大導致無法顯示
+ 15 - 0
lib/spreadjs/sheets/pluggable/gc.spread.calcengine.advancedfunctions.10.0.1.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/sheets/pluggable/gc.spread.calcengine.basicfunctions.10.0.1.min.js


文件差異過大導致無法顯示
+ 16 - 0
lib/spreadjs/sheets/pluggable/gc.spread.common.10.0.1.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.bindings.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.celltypes.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.comments.10.0.1.min.js


文件差異過大導致無法顯示
+ 15 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.conditionalformatting.10.0.1.min.js


文件差異過大導致無法顯示
+ 27 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.core.10.0.1.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.datavalidation.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.fill.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.filter.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.floatingobjects.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.formulatextbox.10.0.1.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.outlines.10.0.1.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.print.10.0.1.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.search.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.slicers.10.0.1.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.sparklines.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.tables.10.0.1.min.js


文件差異過大導致無法顯示
+ 14 - 0
lib/spreadjs/sheets/pluggable/gc.spread.sheets.touch.10.0.1.min.js


文件差異過大導致無法顯示
+ 16 - 0
lib/spreadjs/sheets/resources/ja/gc.spread.sheets.resources.ja.10.0.1.min.js


文件差異過大導致無法顯示
+ 15 - 0
lib/spreadjs/sheets/resources/zh/gc.spread.sheets.resources.zh.10.0.1.min.js


文件差異過大導致無法顯示
+ 4 - 0
lib/spreadjs/views/common/gc.spread.common.10.0.0.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/views/gc.spread.views.dataview.10.0.0.css


文件差異過大導致無法顯示
+ 24 - 0
lib/spreadjs/views/gc.spread.views.dataview.10.0.0.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/views/locale/gc.spread.views.dataView.locale.en-US.10.0.0.min.js


文件差異過大導致無法顯示
+ 13 - 0
lib/spreadjs/views/locale/gc.spread.views.dataView.locale.ja-JP.10.0.0.min.js


+ 0 - 0
lib/spreadjs/views/locale/gc.spread.views.dataView.locale.zh-CN.10.0.0.min.js


部分文件因文件數量過多而無法顯示