text: import server from '../controllers/server';
  import { luckysheetlodingHTML, luckyColor } from '../controllers/constant';
  import sheetmanage from '../controllers/sheetmanage';
  import luckysheetformula from './formula';
  import imageCtrl from '../controllers/imageCtrl';
  import dataVerificationCtrl from '../controllers/dataVerificationCtrl';
  import pivotTable from '../controllers/pivotTable';
  import luckysheetFreezen from '../controllers/freezen';
  import { getSheetIndex } from '../methods/get';
  import { luckysheetextendData } from './extend';
  import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';
  import editor from './editor';
  import luckysheetcreatesheet from './createsheet';
  import Store from '../store';
  
  const defaultConfig = {
      defaultStore:{
          container: null, 
          luckysheetfile: null, 
          defaultcolumnNum: 60, 
          defaultrowNum: 84, 
          fullscreenmode: true,
          devicePixelRatio: 1,
      
          currentSheetIndex: 0,
          calculateSheetIndex: 0,
          flowdata: [],
          config: {},
      
          visibledatarow: [],
          visibledatacolumn: [],
          ch_width: 0,
          rh_height: 0,
      
          cellmainWidth: 0,
          cellmainHeight: 0,
          toolbarHeight: 0,
          infobarHeight: 0,
          calculatebarHeight: 0,
          rowHeaderWidth: 46,
          columnHeaderHeight: 20,
          cellMainSrollBarSize: 12,
          sheetBarHeight: 31,
          statisticBarHeight: 23,
          luckysheetTableContentHW: [0, 0], 
      
          defaultcollen: 73,
          defaultrowlen: 19,
      
          jfcountfuncTimeout: null, 
          jfautoscrollTimeout: null,
      
          luckysheet_select_status: false,
          luckysheet_select_save: [{ "row": [0, 0], "column": [0, 0] }],
          luckysheet_selection_range: [],
      
          luckysheet_copy_save: {}, //复制粘贴
          luckysheet_paste_iscut: false,
      
          filterchage: true, //筛选
          luckysheet_filter_save: { "row": [], "column": [] },
      
          luckysheet_sheet_move_status: false,
          luckysheet_sheet_move_data: [],
          luckysheet_scroll_status: false,
      
          luckysheetisrefreshdetail: true,
          luckysheetisrefreshtheme: true,
          luckysheetcurrentisPivotTable: false,
      
          luckysheet_rows_selected_status: false,  //行列标题相关参
          luckysheet_cols_selected_status: false,  
          luckysheet_rows_change_size: false,
          luckysheet_rows_change_size_start: [],
          luckysheet_cols_change_size: false,
          luckysheet_cols_change_size_start: [],
          luckysheet_cols_dbclick_timeout: null,
          luckysheet_cols_dbclick_times: 0,
      
          luckysheetCellUpdate: [],
          
          luckysheet_shiftpositon: null,
      
          iscopyself: true,
      
          orderbyindex: 0, //排序下标
      
          luckysheet_model_move_state: false, //模态框拖动
          luckysheet_model_xy: [0, 0],
          luckysheet_model_move_obj: null,
      
          luckysheet_cell_selected_move: false,  //选区拖动替换
          luckysheet_cell_selected_move_index: [],
      
          luckysheet_cell_selected_extend: false,  //选区下拉
          luckysheet_cell_selected_extend_index: [],
          luckysheet_cell_selected_extend_time: null,
      
          clearjfundo: true,
          jfredo: [],
          jfundo: [],
          lang: 'en', //language
          createChart: '',
          highlightChart: '',
          zIndex: 15,
          chartparam: {
              luckysheetCurrentChart: null, //current chart_id
              luckysheetCurrentChartActive: false,
              luckysheetCurrentChartMove: null, // Debounce state
              luckysheetCurrentChartMoveTimeout: null,//拖动图表框的节流定时器
              luckysheetCurrentChartMoveObj: null, //chart DOM object
              luckysheetCurrentChartMoveXy: null, //上一次操作结束的图表信息，x,y: chart框位置，scrollLeft1,scrollTop1: 滚动条位置
              luckysheetCurrentChartMoveWinH: null, //左右滚动条滑动距离
              luckysheetCurrentChartMoveWinW: null, //上下滚动条滑动距离
              luckysheetCurrentChartResize: null,
              luckysheetCurrentChartResizeObj: null,
              luckysheetCurrentChartResizeXy: null,
              luckysheetCurrentChartResizeWinH: null,
              luckysheetCurrentChartResizeWinW: null,
              luckysheetInsertChartTosheetChange: true, // 正在执行撤销
              luckysheetCurrentChartZIndexRank : 100,
              luckysheet_chart_redo_click:false, //撤销重做时标识
              luckysheetCurrentChartMaxState: false, //图表全屏状态
              jfrefreshchartall: '',
              changeChartCellData: '',
              renderChart: '',
              getChartJson: ''
          },
          functionList:null, //function list explanation
          luckysheet_function:null,
          chart_selection: {},
          currentChart: '',
          scrollRefreshSwitch:true,
      
          measureTextCache:{},
          measureTextCellInfoCache:{},
          measureTextCacheTimeOut:null,
          cellOverflowMapCache:{},
      
          zoomRatio:1,
      
          visibledatacolumn_unique:null,
          visibledatarow_unique:null,
      
          showGridLines:true,
      
          toobarObject: {}, //toolbar constant
          inlineStringEditCache:null,
          inlineStringEditRange:null,
      
          fontList:[],
  
          currentSheetView:"viewNormal",
      
      },    
      defaultFormula:{
          searchFunctionCell: null,
          functionlistPosition: {},
          rangechangeindex: null,
          rangestart: false,
          rangetosheet: null,
          rangeSetValueTo: null,
          func_selectedrange: {}, //函数选区范围
          rangedrag_column_start: false,
          rangedrag_row_start: false,
          rangeResizeObj: null,
          rangeResize: null,
          rangeResizeIndex: null,
          rangeResizexy: null,
          rangeResizeWinH: null,
          rangeResizeWinW: null,
          rangeResizeTo: null,
          rangeMovexy: null,
          rangeMove: false,
          rangeMoveObj: null,
          rangeMoveIndex: null,
          rangeMoveRangedata: null,
          functionHTMLIndex: 0,
          functionRangeIndex: null,
          execvertex: {},
          execFunctionGroupData: null,
          execFunctionExist: null,
          formulaContainSheetList:{},
          cellTextToIndexList:{},
          isFunctionRangeSave: false,
          execvertex: {},
          execFunctionGroupData: null,
          execFunctionExist: null,
          formulaContainSheetList:{},
          formulaContainCellList:{},
          cellTextToIndexList:{},
          execFunctionGlobalData:{},
          groupValuesRefreshData: [],
          functionResizeData: {},
          functionResizeStatus: false,
          functionResizeTimeout: null,
          data_parm_index: 0  //选择公式后参数索引标记
      },
      defaultSheet:{
          sheetMaxIndex: 0,
          nulldata: null,
          mergeCalculationSheet:{},
          checkLoadSheetIndexToDataIndex:{},
          CacheNotLoadControll:[],
      },
      defaultPivotTable:{
          pivotDatas: null,
          pivotSheetIndex: 0,
          pivotDataSheetIndex: 0,
          celldata: null,
          origindata: null,
          pivot_data_type: {},
          pivot_select_save: null,
          column: null,
          row: null,
          values: null,
          filter: null,
          showType: null,
          rowhidden: null,
          selected: null,
          caljs: null,
          initial: true,
          filterparm: null,
          luckysheet_pivotTable_select_state: false,
          jgridCurrentPivotInput: null,
          movestate: false,
          moveitemposition: [],
          movesave: {},
          drawPivotTable: true,
          pivotTableBoundary: [12, 6],
      },
      defaultImage:{
          imgItem: {
              type: '3',  //1移动并调整单元格大小 2移动并且不调整单元格的大小 3不要移动单元格并调整其大小
              src: '',  //图片url
              originWidth: null,  //图片原始宽度
              originHeight: null,  //图片原始高度
              default: {
                  width: null,  //图片 宽度
                  height: null,  //图片 高度
                  left: null,  //图片离表格左边的 位置
                  top: null,  //图片离表格顶部的 位置
              },
              crop: {
                  width: null,  //图片裁剪后 宽度
                  height: null,  //图片裁剪后 高度
                  offsetLeft: 0,  //图片裁剪后离未裁剪时 左边的位移
                  offsetTop: 0,  //图片裁剪后离未裁剪时 顶部的位移
              },
              isFixedPos: false,  //固定位置
              fixedLeft: null,  //固定位置 左位移
              fixedTop: null,  //固定位置 右位移
              border: {
                  width: 0,  //边框宽度
                  radius: 0,  //边框半径
                  style: 'solid',  //边框类型
                  color: '#000',  //边框颜色
              }
          },
          images: null,
          currentImgId: null,
          currentWinW: null,
          currentWinH: null,
          resize: null,  
          resizeXY: null,
          move: false,
          moveXY: null,
          cropChange: null,  
          cropChangeXY: null,
          cropChangeObj: null,
          copyImgItemObj: null,
      },
      defaultDataVerification:{
          defaultItem: {
              type: 'dropdown',  //类型
              type2: null,  //
              value1: '',  //
              value2: '',  //
              checked: false,
              remote: false,  //自动远程获取选项
              prohibitInput: false,  //输入数据无效时禁止输入
              hintShow: false,  //选中单元格时显示提示语
              hintText: '',  //
          },
          curItem: null,
          dataVerification: null,
          selectRange: [],
          selectStatus: false,
      }
  }
  
  const method = {
      //翻页
      addDataAjax: function(param, index, url, func){
          let _this = this;
  
          if(index == null){
              index = Store.currentSheetIndex;
          }
  
          if(url == null){
              url = server.loadSheetUrl;
          }
  
          $("#luckysheet-grid-window-1").append(luckysheetlodingHTML());
          param.currentPage++;
          
          let dataType = 'application/json;charset=UTF-8';
          let token = sessionStorage.getItem('x-auth-token');
  
          $.ajax({
              method: 'POST',
              url: url,
              headers: { "x-auth-token": token },
              data: JSON.stringify(param),
              contentType: dataType,
              success: function(d) {
                  //d可能为json字符串
                  if(typeof d == "string"){
                      d = JSON.parse(d);
                  }
  
                  let dataset = d.data;
                  
                  let newData = dataset.celldata;
                  luckysheetextendData(dataset["row"], newData);
  
                  setTimeout(function(){
                      Store.loadingObj.close()
                  }, 500);
  
                  if(func && typeof(func)=="function"){ 
                      func(dataset);
                  }
              }
          })
      },
      //重载
      reload: function(param, index, url, func){
          let _this = this;
  
          if(index == null){
              index = Store.currentSheetIndex;
          }
  
          if(url == null){
              url = server.loadSheetUrl;
          }
  
          $("#luckysheet-grid-window-1").append(luckysheetlodingHTML());
  
          let arg = {"gridKey" : server.gridKey, "index": index};
          param = $.extend(true, param, arg);
          let file = Store.luckysheetfile[getSheetIndex(index)];
  
          $.post(url, param, function (d) {
              let dataset = new Function("return " + d)();
              file.celldata = dataset[index.toString()];
              let data = sheetmanage.buildGridData(file);
  
              setTimeout(function(){
                  Store.loadingObj.close()
              }, 500);
  
              file["data"] = data;
              Store.flowdata = data;
              editor.webWorkerFlowDataCache(data);//worker存数据
  
              luckysheetcreatesheet(data[0].length, data.length, data, null, false);
              file["load"] = "1";
  
              Store.luckysheet_select_save.length = 0;
              Store.luckysheet_selection_range = [];
  
              server.saveParam("shs", null, Store.currentSheetIndex);
  
              sheetmanage.changeSheet(index);
  
              if(func && typeof(func)=="function"){ 
                  func();
              }
          });
      },
      clearSheetByIndex: function(i){
          let index = getSheetIndex(i);
          let sheetfile = Store.luckysheetfile[index];
  
          if(!sheetfile.isPivotTable){
              sheetfile.data = [];
              sheetfile.row = Store.defaultrowNum;
              sheetfile.column = Store.defaultcolumnNum;
  
              sheetfile.chart = [];
              sheetfile.config = null;
              sheetfile.filter = null;
              sheetfile.filter_select = null;
              sheetfile.celldata = [];
              sheetfile.pivotTable = {};
              sheetfile.calcChain = [];
              sheetfile.status = 0;
              sheetfile.load = 0;
  
              Store.flowdata = [];
              editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据
  
              $("#"+ Store.container +" .luckysheet-data-visualization-chart").remove();
              $("#"+ Store.container +" .luckysheet-datavisual-selection-set").remove();
  
              $("#luckysheet-row-count-show, #luckysheet-formula-functionrange-select, #luckysheet-row-count-show, #luckysheet-column-count-show, #luckysheet-change-size-line, #luckysheet-cell-selected-focus, #luckysheet-selection-copy, #luckysheet-cell-selected-extend, #luckysheet-cell-selected-move, #luckysheet-cell-selected").hide();
  
              delete sheetfile.load;
          }
          else {
              delete Store.luckysheetfile[index];
          }
      },
      clear: function(index){
          let _this = this;
  
          if(index == "all"){
              for(let i = 0; i < Store.luckysheetfile.length; i++){
                  let sheetfile = Store.luckysheetfile[i];
                  _this.clearSheetByIndex(sheetfile.index);
              }
              
          }
          else{
              if(index == null){
                  index = Store.currentSheetIndex;
              }
              _this.clearSheetByIndex(index);
          }
  
          sheetmanage.changeSheet(Store.luckysheetfile[0].index);
      },
      destroy:function(){
          $("#" + Store.container).empty();
          $("body > .luckysheet-cols-menu").remove();
  
          $("#luckysheet-modal-dialog-mask, #luckysheetTextSizeTest, #luckysheet-icon-morebtn-div").remove();
          $("#luckysheet-input-box").parent().remove();
          $("#luckysheet-formula-help-c").remove();
          $(".chartSetting, .luckysheet-modal-dialog-slider").remove();
  
          //document event release
          $(document).off(".luckysheetEvent");
          $(document).off(".luckysheetProtection");
          
          //参数重置
          luckysheetFreezen.initialHorizontal = true;
          luckysheetFreezen.initialVertical = true;
  
          let defaultStore = $.extend(true, {}, defaultConfig.defaultStore);
          for(let key in defaultStore){
              if(key in Store){
                  Store[key] = defaultStore[key];
              }
          }
  
          let defaultFormula = $.extend(true, {}, defaultConfig.defaultFormula);
          for(let key in defaultFormula){
              if(key in luckysheetformula){
                  luckysheetformula[key] = defaultFormula[key];
              }
          }
  
          let defaultSheet = $.extend(true, {}, defaultConfig.defaultSheet);
          for(let key in defaultSheet){
              if(key in sheetmanage){
                  sheetmanage[key] = defaultSheet[key];
              }
          }
  
          let defaultPivotTable = $.extend(true, {}, defaultConfig.defaultPivotTable);
          for(let key in defaultPivotTable){
              if(key in pivotTable){
                  pivotTable[key] = defaultPivotTable[key];
              }
          }
  
          let defaultImage = $.extend(true, {}, defaultConfig.defaultImage);
          for(let key in defaultImage){
              if(key in imageCtrl){
                  imageCtrl[key] = defaultImage[key];
              }
          }
  
          let defaultDataVerification = $.extend(true, {}, defaultConfig.defaultDataVerification);
          for(let key in defaultDataVerification){
              if(key in dataVerificationCtrl){
                  dataVerificationCtrl[key] = defaultDataVerification[key];
              }
          }
  
          // remove proxy
          Store.asyncLoad = ['core'];
      },
      editorChart:function(c){
          let chart_selection_color = luckyColor[0];
          let chart_id = "luckysheetEditMode-datav-chart";
          let chart_selection_id = chart_id + "_selection";
          c.chart_id = chart_id;
          let chartTheme = c.chartTheme;
          chartTheme = chartTheme == null ? "default0000" : chartTheme;
  
          luckysheet.insertChartTosheet(c.sheetIndex, c.dataSheetIndex, c.option, c.chartType, c.selfOption, c.defaultOption, c.row, c.column, chart_selection_color, chart_id, chart_selection_id, c.chartStyle, c.rangeConfigCheck, c.rangeRowCheck, c.rangeColCheck, c.chartMarkConfig, c.chartTitleConfig, c.winWidth, c.winHeight, c.scrollLeft, c.scrollTop, chartTheme, c.myWidth, c.myHeight, c.myLeft!=null?parseFloat(c.myLeft):null, c.myTop!=null?parseFloat(c.myTop):null, c.myindexrank, true);
  
          $("#"+chart_id).find(".luckysheet-modal-controll-update").click();
      },
      /**
       * 获取单元格的值
       * @param {name} 函数名称
       * @param {arguments} 函数参数
       */
      createHookFunction:function(){
          let hookName = arguments[0];
          if(luckysheetConfigsetting.hook && luckysheetConfigsetting.hook[hookName]!=null && (typeof luckysheetConfigsetting.hook[hookName] == "function")){
              var args = Array.prototype.slice.apply(arguments);
              args.shift();
              let ret = luckysheetConfigsetting.hook[hookName].apply(this, args);
              if(ret===false){
                  return false;
              }
              else{
                  return true;
              }
          }
  
          return true;
      }
  
  }
  
  export default method;