{"version":3,"sources":["AX6UIUploader.js"],"names":["_jqmin","require","_AX6UICore2","_AX6Util","_AX6Info","_AX6Mustache","tmpl","uploadProgress","columnKeys","inputFile","inputFileForm","progressBox","upoadedBox","thumbnail","apiServerUrl","name","size","onSelectFile","files","this","config","onStateChanged","call","that","_evt","openProgressBox","_AX6Info2","default","supportFileApi","selectedFiles","target","path","value","length","alignLayout","_AX6Util2","toArray","bindEvent","$fileSelector","trigger","manualUpload","send","_this","off","e","$inputFile","on","$uploadedBox","addClass","uploadedFiles","fileIndex","uploadedBox","onclick","get","currentTarget","cellType","$this","stopEvent","uploadedItemIndex","Number","parents","attr","self","$target","$dropZone","addEventListener","_jqmin2","$","contains","getAttribute","isFunction","dropZone","ondragout","ondragover","removeClass","_TF","box","offset","ondrop","_alignProgressBox","window","event","pos","parent","pickerDim","outerWidth","winWidth","Math","outerHeight","winHeight","max","$window","css","left","top","pickerDirection","append","_this2","$body","document","body","$progressBox","position","dim","width","height","progressBoxDirection","positionCSS","positionMargin","$progressBoxArrow","act","processor","viewport","selector","$progressAbort","state","upload","closeProgressBox","abort","animateTime","setTimeout","uploadComplete","$progressUpload","removeAttr","alignProgressBox","formData","form","xhr","_this3","remove","res","startUpload","html5","uploadFile","debug","shift","error","FormData","find","each","fileName","updateProgressBar","open","onprogress","loaded","total","parseJson","console","log","__uploading","onuploaderror","$iframe","uploaded","root","doc","documentElement","result","parse","instanceId","$inputFileForm","contentWindow","contentDocument","selectedFilesTotal","textContent","innerText","JSON","filesTotal","__loaded","_this4","action","lengthComputable","percent","forEach","n","onuploadComplete","number","round","$progressBar","$progressBarVal","html","attachFileTag","cancelUpload","push","repaintUploadedBox","icon","accept","@fn_get_byte","text","render","byte","lang","_this5","_AX6Mustache2","multiple","AX6UIUploader","_classCallCheck","_this6","_possibleConstructorReturn","__proto__","Object","getPrototypeOf","onchange","validateSelectedFiles","onuploaded","extend","download","delete","type","uploadedName","uploadedPath","downloadPath","previewPath","supportedHTML5_emptyListMsg","emptyListMsg","defaultBtns","label","theme","init","data","getError","initialized","btns","initOnce","alert","_files","isArray","isString","setUploadedFiles","_index","isNaN","splice"],"mappings":"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","file":"AX6UIUploader.js","sourcesContent":["import jQuery from \"jqmin\";\nimport AX6UICore from \"./AX6UICore.js\";\nimport U from \"./AX6Util\";\nimport info from \"./AX6Info\";\nimport mustache from \"./AX6Mustache\";\n/* ~~~~~~~~~~~~~~~~~~ end of import  ~~~~~~~~~~~~~~~~~~~~ */\n\n\nlet tmpl = {\n  uploadProgress(columnKeys) {\n    return ``;\n  },\n  inputFile(columnKeys) {\n    return `<input type=\"file\" data-ax6ui-uploader-input=\"{{instanceId}}\" name=\"{{name}}\" {{#multiple}}multiple{{/multiple}} accept=\"{{accept}}\" />`;\n  },\n  inputFileForm(columnKeys) {\n    return `<form data-ax6ui-uploader-form=\"{{instanceId}}\" name=\"ax5uploader-{{instanceId}}-form\" method=\"post\" enctype=\"multipart/form-data\"></form>`;\n  },\n  progressBox(columnKeys) {\n    return `\n<div data-ax6ui-uploader-progressbox=\"{{instanceId}}\" class=\"{{theme}}\">\n    <div class=\"ax-progressbox-body\">\n        <div class=\"ax-pregressbox-content\">\n            <div class=\"progress\">\n              <div class=\"progress-bar progress-bar-striped active\" role=\"progressbar\" style=\"width: 0\">\n                <span class=\"sr-only\" role=\"progressbarval\">0% Complete</span>\n              </div>\n            </div>\n        </div>\n        {{#btns}}\n            <div class=\"ax-progressbox-buttons\">\n            {{#btns}}\n                {{#@each}}\n                <button data-pregressbox-btn=\"{{@key}}\" class=\"btn btn-default {{@value.theme}}\">{{@value.label}}</button>\n                {{/@each}}\n            {{/btns}}\n            </div>\n        {{/btns}}\n    </div>\n    <div class=\"ax-progressbox-arrow\"></div>\n</div>\n`;\n  },\n  upoadedBox(columnKeys) {\n    return `\n{{#uploadedFiles}}<div data-ax6ui-uploader-uploaded-item=\"{{@i}}\">\n    <div class=\"uploaded-item-preview\">\n        {{#${columnKeys.thumbnail}}}<img src=\"${columnKeys.apiServerUrl}{{${columnKeys.thumbnail}}}\">{{/${columnKeys.thumbnail}}}\n    </div>\n    <div class=\"uploaded-item-holder\">\n        <div class=\"uploaded-item-cell\" data-uploaded-item-cell=\"download\">{{{icon.download}}}</div>\n        <div class=\"uploaded-item-cell\" data-uploaded-item-cell=\"filename\">{{${columnKeys.name}}}</div>\n        <div class=\"uploaded-item-cell\" data-uploaded-item-cell=\"filesize\">({{#@fn_get_byte}}{{${columnKeys.size}}}{{/@fn_get_byte}})</div>\n        <div class=\"uploaded-item-cell\" data-uploaded-item-cell=\"delete\">{{{icon.delete}}}</div>\n    </div>\n</div>{{/uploadedFiles}}\n{{^uploadedFiles}}\n<div data-ax6ui-uploader-emptyList-msg=\"true\">\n  {{#supportFileApi}}{{{lang.supportedHTML5_emptyListMsg}}}{{/supportFileApi}}\n  {{^supportFileApi}}{{{lang.emptyListMsg}}}{{/supportFileApi}}\n</div>\n{{/uploadedFiles}}\n`;\n  }\n};\n\nconst onStateChanged = function (that) {\n  if (this.config.onStateChanged) {\n    this.config.onStateChanged.call(that, that);\n  }\n  else if (this.onStateChanged) {\n    this.onStateChanged.call(that, that);\n  }\n\n  that = null;\n  return true;\n};\nconst onSelectFile = function (_evt) {\n  let files;\n\n  if (!info.supportFileApi) {\n    // file API 지원 안되는 브라우저.\n    // input file에 multiple 지원 안됨 그러므로 단일 파일 처리만 하면 됨.\n    files = {path: _evt.target.value};\n  }\n  else if ('dataTransfer' in _evt) {\n    files = _evt.dataTransfer.files;\n  }\n  else if ('target' in _evt) {\n    files = _evt.target.files;\n  }\n  else if (_evt) {\n    files = _evt;\n  }\n\n  if (!files) return false;\n\n  /// selectedFiles에 현재 파일 정보 담아두기\n  if (length in files) {\n    if (files.length == 1) {\n      this.selectedFiles = [files[0]];\n    } else {\n      this.selectedFiles = U.toArray(files);\n    }\n  } else {\n    this.selectedFiles = [files];\n  }\n\n  if (this.config.progressBox) {\n    openProgressBox.call(this);\n  }\n  if (!this.config.manualUpload) {\n    this.send();\n  }\n\n  if (!info.supportFileApi) {\n    alignLayout.call(this, false);\n  }\n};\nconst bindEvent = function () {\n\n  this.$fileSelector\n    .off(\"click.ax5uploader\")\n    .on(\"click.ax5uploader\", e => {\n      this.$inputFile.trigger(\"click\");\n    });\n\n  if (!info.supportFileApi) {\n    this.$fileSelector\n      .off(\"mouseover.ax5uploader\")\n      .on(\"mouseover.ax5uploader\", e => {\n        alignLayout.call(this, true);\n      });\n\n    this.$inputFile\n      .off(\"mouseover.ax5uploader\")\n      .on(\"mouseover.ax5uploader\", e => {\n        this.$fileSelector.addClass(\"active\");\n      });\n\n    this.$inputFile\n      .off(\"mouseout.ax5uploader\")\n      .on(\"mouseout.ax5uploader\", e => {\n        this.$fileSelector.removeClass(\"active\");\n        alignLayout.call(this, false);\n      });\n  }\n\n  {\n    if (!this.$uploadedBox || !this.$uploadedBox.get(0)) return false;\n\n    this.$uploadedBox.on(\"click\", \"[data-uploaded-item-cell]\", e => {\n      let $this = jQuery(e.currentTarget),\n        cellType = $this.attr(\"data-uploaded-item-cell\"),\n        uploadedItemIndex = Number($this.parents('[data-ax6ui-uploader-uploaded-item]').attr('data-ax6ui-uploader-uploaded-item')),\n        that = {};\n\n      if (this.config.uploadedBox && this.config.uploadedBox.onclick) {\n        that = {\n          self: this,\n          cellType: cellType,\n          uploadedFiles: this.uploadedFiles,\n          fileIndex: uploadedItemIndex\n        };\n        this.config.uploadedBox.onclick.call(that, that);\n      }\n\n      $this = null;\n      cellType = null;\n      uploadedItemIndex = null;\n      that = null;\n    });\n\n    this.$uploadedBox\n      .on(\"dragstart\", function (e) {\n        U.stopEvent(e);\n        return false;\n      });\n  }\n\n  {\n    // dropZone 설정 방식 변경\n    if (!info.supportFileApi) return false;\n    if (!this.$dropZone || !this.$dropZone.get(0)) return false;\n\n    let timer;\n\n    this.$dropZone.parent()\n      .on(\"click\", \"[data-ax6ui-uploader-dropzone]\", e => {\n        let $target = jQuery(e.currentTarget);\n        if ($target.parents('[data-ax6ui-uploader-uploaded-item]').length == 0 && !$target.attr('data-ax6ui-uploader-uploaded-item')) {\n          //console.log(e.currentTarget == e.target, $.contains(e.target, e.currentTarget), e.target.getAttribute('data-ax6ui-uploader-emptylist-msg'));\n          if (e.currentTarget == e.target || $.contains(e.target, e.currentTarget) || e.target.getAttribute('data-ax6ui-uploader-emptylist-msg')) {\n            if (U.isFunction(this.config.dropZone.onclick)) {\n              this.config.dropZone.onclick.call({\n                self: this\n              });\n            } else {\n              this.$inputFile.trigger(\"click\");\n            }\n          }\n        }\n        $target = null;\n      });\n\n    this.$dropZone.get(0).addEventListener('dragover', e => {\n      U.stopEvent(e);\n\n      if (U.isFunction(this.config.dropZone.ondragover)) {\n        this.config.dropZone.ondragover.call({\n          self: this\n        });\n      }\n      else {\n        this.$dropZone.addClass(\"dragover\");\n      }\n\n    }, false);\n\n    this.$dropZone.get(0).addEventListener('dragleave', e => {\n      U.stopEvent(e);\n\n      if (U.isFunction(this.config.dropZone.ondragover)) {\n        this.config.dropZone.ondragout.call({\n          self: this\n        });\n      }\n      else {\n        this.$dropZone.removeClass(\"dragover\");\n      }\n\n    }, false);\n\n    this.$dropZone.get(0).addEventListener('drop', e => {\n      U.stopEvent(e);\n\n      if (U.isFunction(this.config.dropZone.ondrop)) {\n        this.config.dropZone.ondrop.call({\n          self: this\n        });\n      }\n      else {\n        this.$dropZone.removeClass(\"dragover\");\n      }\n\n      onSelectFile.call(this, e || window.event);\n    }, false);\n\n  }\n};\nconst alignLayout = function (_TF) {\n  // 상황이 좋지 않은경우 (만약 버튼 클릭으로 input file click이 되지 않는 다면 z-index값을 높여서 버튼위를 덮는다.)\n  if (_TF) {\n    if (!info.supportFileApi) {\n      // ie9에서 inputFile을 직접 클릭하지 않으면 submit 오류발생함. submit access denied\n      // 그래서 버튼위에 inputFile을 올려두어야 함. (position값을 이용하면 편하지만..)\n      // 그런데 form을 안에두면 또 다른 이중폼 문제 발생소지 ㅜㅜ 불가피하게 버튼의 offset 값을 이용.\n      let box = this.$fileSelector.offset();\n      box.width = this.$fileSelector.outerWidth();\n      box.height = this.$fileSelector.outerHeight();\n      this.$inputFile.css(box);\n    }\n  } else {\n    this.$inputFile.css({\n      left: -1000, top: -1000\n    });\n  }\n}\nconst alignProgressBox = function (append) {\n  const _alignProgressBox = function () {\n    let $window = jQuery(window), $body = jQuery(document.body);\n    let pos = {}, positionMargin = 6,\n      dim = {}, pickerDim = {},\n      pickerDirection;\n\n    // this.config.viewport.selector\n\n    pos = (this.$progressBox.parent().get(0) == this.$target.get(0)) ? this.$fileSelector.position() : this.$fileSelector.offset();\n    dim = {\n      width: this.$fileSelector.outerWidth(),\n      height: this.$fileSelector.outerHeight()\n    };\n    pickerDim = {\n      winWidth: Math.max($window.width(), $body.width()),\n      winHeight: Math.max($window.height(), $body.height()),\n      width: this.$progressBox.outerWidth(),\n      height: this.$progressBox.outerHeight()\n    };\n\n    // picker css(width, left, top) & direction 결정\n    if (!this.config.progressBoxDirection || this.config.progressBoxDirection === \"\" || this.config.progressBoxDirection === \"auto\") {\n      // set direction\n      pickerDirection = \"top\";\n      if (pos.top - pickerDim.height - positionMargin < 0) {\n        pickerDirection = \"top\";\n      } else if (pos.top + dim.height + pickerDim.height + positionMargin > pickerDim.winHeight) {\n        pickerDirection = \"bottom\";\n      }\n    } else {\n      pickerDirection = this.config.progressBoxDirection;\n    }\n\n    if (append) {\n      this.$progressBox\n        .addClass(\"direction-\" + pickerDirection);\n    }\n\n    let positionCSS = (function () {\n      let css = {left: 0, top: 0};\n      switch (pickerDirection) {\n        case \"top\":\n          css.left = pos.left + dim.width / 2 - pickerDim.width / 2;\n          css.top = pos.top + dim.height + positionMargin;\n          break;\n        case \"bottom\":\n          css.left = pos.left + dim.width / 2 - pickerDim.width / 2;\n          css.top = pos.top - pickerDim.height - positionMargin;\n          break;\n        case \"left\":\n          css.left = pos.left + dim.width + positionMargin;\n          css.top = pos.top - pickerDim.height / 2 + dim.height / 2;\n          break;\n        case \"right\":\n          css.left = pos.left - pickerDim.width - positionMargin;\n          css.top = pos.top - pickerDim.height / 2 + dim.height / 2;\n          break;\n      }\n      return css;\n    })();\n\n    {\n      if (pickerDirection == \"top\" || pickerDirection == \"bottom\") {\n        if (positionCSS.left < 0) {\n          positionCSS.left = positionMargin;\n          this.$progressBoxArrow.css({left: (pos.left + dim.width / 2) - positionCSS.left});\n        } else if (positionCSS.left + pickerDim.width > pickerDim.winWidth) {\n          positionCSS.left = pickerDim.winWidth - pickerDim.width - positionMargin;\n          this.$progressBoxArrow.css({left: (pos.left + dim.width / 2) - positionCSS.left});\n        }\n      }\n    }\n\n    this.$progressBox\n      .css(positionCSS);\n  };\n\n  this.$progressBox.css({top: -999});\n\n  if (append) {\n    // progressBox를 append 할 타겟 엘리먼트 펀단 후 결정.\n    (function () {\n      if (this.config.viewport) {\n        return jQuery(this.config.viewport.selector);\n      } else {\n        return this.$target;\n      }\n    }).call(this).append(this.$progressBox);\n\n    // progressBox 버튼에 이벤트 연결.\n    this.$progressBox\n      .off(\"click.ax5uploader\")\n      .on(\"click.ax5uploader\", \"button\", e => {\n        let act = e.currentTarget.getAttribute(\"data-pregressbox-btn\");\n        let processor = {\n          \"upload\": function () {\n            this.send();\n          },\n          \"abort\": function () {\n            this.abort();\n          }\n        };\n        if (processor[act]) processor[act].call(this);\n      });\n  }\n\n  setTimeout(() => {\n    _alignProgressBox.call(this);\n  });\n};\nconst openProgressBox = function () {\n  this.$progressBox.removeClass(\"destroy\");\n  this.$progressUpload.removeAttr(\"disabled\");\n  this.$progressAbort.removeAttr(\"disabled\");\n\n  // apend & align progress box\n  alignProgressBox.call(this, \"append\");\n\n  // state change\n  onStateChanged.call(this, {\n    self: this,\n    state: \"open\"\n  });\n};\nconst closeProgressBox = function () {\n  this.$progressBox.addClass(\"destroy\");\n  setTimeout(() => {\n    this.$progressBox\n      .remove();\n  }, this.config.animateTime);\n};\nconst startUpload = function () {\n  const processor = {\n    \"html5\"() {\n      const self = this;\n      let uploadFile = this.selectedFiles.shift();\n      if (!uploadFile) {\n        // 업로드 종료\n        uploadComplete.call(this);\n        return this;\n      }\n\n      if (uploadFile[0]) uploadFile = uploadFile[0];\n\n      let formData = new FormData();\n      //서버로 전송해야 할 추가 파라미터 정보 설정\n\n      this.$target.find(\"input\").each(function () {\n        formData.append(this.name, this.value);\n      });\n      // 파일 아이템 추가\n      formData.append(this.config.form.fileName, uploadFile);\n\n      this.xhr = new XMLHttpRequest();\n      this.xhr.open(\"post\", this.config.form.action, true);\n      this.xhr.onload = function (e) {\n        let res = e.target.response;\n        try {\n          if (typeof res == \"string\") res = U.parseJson(res);\n        }\n        catch (e) {\n          return false;\n        }\n        if (self.config.debug) console.log(res);\n\n        if (res.error) {\n          if (self.config.debug) console.log(res.error);\n          if (U.isFunction(self.config.onuploaderror)) {\n            self.config.onuploaderror.call({\n              self: self,\n              error: res.error\n            }, res);\n          }\n          self.send();\n          return false;\n        }\n\n        uploaded.call(self, res);\n        self.send();\n      };\n      this.xhr.upload.onprogress = function (e) {\n        updateProgressBar.call(self, e);\n        if (U.isFunction(self.config.onprogress)) {\n          self.config.onprogress.call({\n            loaded: e.loaded,\n            total: e.total\n          }, e);\n        }\n      };\n      this.xhr.send(formData);  // multipart/form-data\n\n    },\n    \"form\"() {\n\n      /// i'm busy\n      this.__uploading = true;\n\n      // 폼과 iframe을 만들어 페이지 아래에 삽입 후 업로드\n      let $iframe = jQuery('<iframe src=\"javascript:false;\" name=\"ax5uploader-' + this.instanceId + '-iframe\" style=\"display:none;\"></iframe>');\n      jQuery(document.body).append($iframe);\n\n      // onload 이벤트 핸들러\n      // action에서 파일을 받아 처리한 결과값을 텍스트로 출력한다고 가정하고 iframe의 내부 데이터를 결과값으로 callback 호출\n      $iframe.on('load', e => {\n        let doc = e.currentTarget.contentWindow ? e.currentTarget.contentWindow.document : (e.currentTarget.contentDocument ? e.currentTarget.contentDocument : e.currentTarget.document),\n          root = doc.documentElement ? doc.documentElement : doc.body,\n          result = root.textContent ? root.textContent : root.innerText,\n          res;\n\n        try {\n          res = JSON.parse(result);\n        }\n        catch (e) {\n          res = {\n            error: \"Syntax error\",\n            body: result\n          };\n        }\n\n        if (this.config.debug) console.log(res);\n        if (res.error) {\n          console.log(res);\n        }\n        else {\n          uploaded.call(this, res);\n          $iframe.remove();\n\n          setTimeout(() => {\n            uploadComplete.call(this);\n          }, 300);\n        }\n      });\n\n      this.$inputFileForm\n        .attr(\"target\", 'ax5uploader-' + this.instanceId + '-iframe')\n        .attr(\"action\", this.config.form.action)\n        .submit();\n\n      this.selectedFilesTotal = 1;\n      updateProgressBar.call(this, {\n        loaded: 1,\n        total: 1\n      });\n    }\n  };\n\n  if (this.__uploading === false) {\n    // 전체 파일 사이즈 구하기\n    let filesTotal = 0;\n    this.selectedFiles.forEach(function (n) {\n      filesTotal += n.size;\n    });\n    this.selectedFilesTotal = filesTotal;\n    this.__loaded = 0;\n\n    this.__uploading = true; // 업로드 시작 상태 처리\n    this.$progressUpload.attr(\"disabled\", \"disabled\");\n    this.$progressAbort.removeAttr(\"disabled\");\n  }\n\n  processor[info.supportFileApi ? \"html5\" : \"form\"].call(this);\n\n};\nconst updateProgressBar = function (e) {\n  let percent = U.number((this.__loaded + e.loaded) / this.selectedFilesTotal * 100, {round: 2});\n  this.$progressBar.css({width: percent + '%'});\n  this.$progressBarVal.html(percent + '% Complete');\n  if(e.loaded >= e.total){\n    this.__loaded += e.total;\n  }\n  if (e.lengthComputable) {\n    if (e.loaded >= e.total) {\n\n    }\n  }\n  percent = null;\n};\nconst uploaded = function (res) {\n  if (this.config.debug) console.log(res);\n  this.uploadedFiles.push(res);\n  repaintUploadedBox.call(this); // 업로드된 파일 출력\n\n  if (U.isFunction(this.config.onuploaded)) {\n    this.config.onuploaded.call({\n      self: this\n    }, res);\n  }\n};\nconst uploadComplete = function () {\n  this.__uploading = false; // 업로드 완료 상태처리\n  this.$progressUpload.removeAttr(\"disabled\");\n  this.$progressAbort.attr(\"disabled\", \"disabled\");\n\n  if (this.config.progressBox) {\n    closeProgressBox.call(this);\n  }\n  if (U.isFunction(this.config.onuploadComplete)) {\n    this.config.onuploadComplete.call({\n      self: this\n    });\n  }\n  // update uploadedFiles display\n\n  /// reset inputFile\n  attachFileTag.call(this);\n};\nconst cancelUpload = function () {\n\n  const processor = {\n    \"html5\": function () {\n      if (this.xhr) {\n        this.xhr.abort();\n      }\n    },\n    \"form\": function () {\n\n    }\n  };\n\n  this.__uploading = false; // 업로드 완료 상태처리\n  this.$progressUpload.removeAttr(\"disabled\");\n  this.$progressAbort.attr(\"disabled\", \"disabled\");\n\n  processor[info.supportFileApi ? \"html5\" : \"form\"].call(this);\n\n  if (this.config.progressBox) {\n    closeProgressBox.call(this);\n  }\n\n  //this.$inputFile.val(\"\");\n  /// reset inputFile\n  attachFileTag.call(this);\n\n  if (this.config.debug) console.log(\"cancelUpload\");\n  // update uploadedFiles display\n};\nconst repaintUploadedBox = function () {\n  // uploadedBox 가 없다면 아무일도 하지 않음.\n  // onuploaded 함수 이벤트를 이용하여 개발자가 직접 업로드디 박스를 구현 한다고 이해 하자.\n  if (this.$uploadedBox === null) return this;\n\n  this.$uploadedBox.html(\n    mustache.render(tmpl.upoadedBox.call(this, this.config.uploadedBox.columnKeys), {\n      \"@fn_get_byte\"() {\n        return function (text, render) {\n          return U.number(render(text), {round: 2, byte: true});\n        }\n      },\n      uploadedFiles: this.uploadedFiles,\n      icon: this.config.uploadedBox.icon,\n      lang: this.config.uploadedBox.lang,\n      supportFileApi: !!info.supportFileApi\n    })\n  );\n  this.$uploadedBox.find(\"img\").on(\"error\", function () {\n    //this.src = \"\";\n    $(this).parent().addClass(\"no-image\");\n  });\n\n};\nconst attachFileTag = function () {\n  if (this.$inputFile && this.$inputFile.get(0)) {\n    this.$inputFile.remove();\n  }\n  if (this.$inputFileForm && this.$inputFileForm.get(0)) {\n    this.$inputFileForm.remove();\n  }\n\n  this.$inputFile = jQuery(\n    mustache.render(tmpl.inputFile.call(this), {\n      instanceId: this.instanceId,\n      multiple: this.config.multiple,\n      accept: this.config.accept,\n      name: this.config.form.fileName\n    })\n  );\n\n  if (info.supportFileApi) {\n    jQuery(document.body).append(this.$inputFile);\n  } else {\n    this.$fileSelector.attr(\"tabindex\", -1);\n    this.$inputFileForm = jQuery(\n      mustache.render(tmpl.inputFileForm.call(this), {\n        instanceId: this.instanceId\n      })\n    );\n\n    this.$inputFileForm.append(this.$inputFile);\n    jQuery(document.body).append(this.$inputFileForm);\n  }\n\n  this.$inputFile\n    .off(\"change.ax5uploader\")\n    .on(\"change.ax5uploader\", e => {\n      onSelectFile.call(this, e);\n    });\n};\n/* ~~~~~~~~~~~~~~~~~~ end of private  ~~~~~~~~~~~~~~~~~~~~ */\n\n/**\n * @class\n */\nclass AX6UIUploader extends AX6UICore {\n  /**\n   * @constructor\n   * @param config\n   */\n  constructor(config) {\n    super();\n\n    /**\n     * @member {JSON}\n     * @param config\n     * @param {Element} config.target\n     * @param [config.theme='default']\n     * @param [config.lang]\n     * @param [config.lang.upload='Upload']\n     * @param [config.lang.abort='Abort']\n     * @param [config.animateTime=100]\n     * @param [config.accept=\"*\\/*\"]\n     * @param [config.multiple=false]\n     * @param [config.manualUpload=false]\n     * @param [config.progressBox=true]\n     * @param [config.progressBoxDirection='left'] - top, bottom, left, right, auto\n     * @param [config.form]\n     * @param [config.form.action='']\n     * @param [config.form.fileName='file']\n     * @param [config.dropZone]\n     * @param {Element} [config.dropZone.target]\n     * @param [config.uploadedBox]\n     * @param {Element} [config.uploadedBox.target]\n     * @param [config.uploadedBox.icon]\n     * @param [config.uploadedBox.icon.download='U+2913']\n     * @param [config.uploadedBox.icon.delete='U+232b']\n     * @param [config.uploadedBox.columnKeys.name='name']\n     * @param [config.uploadedBox.columnKeys.type='type']\n     * @param [config.uploadedBox.columnKeys.size='size']\n     * @param [config.uploadedBox.columnKeys.uploadedName='uploadedName']\n     * @param [config.uploadedBox.columnKeys.uploadedPath='uploadedPath']\n     * @param [config.uploadedBox.columnKeys.downloadPath='downloadPath']\n     * @param [config.uploadedBox.columnKeys.previewPath='previewPath']\n     * @param [config.uploadedBox.columnKeys.thumbnail='thumbnail']\n     * @param [config.uploadedBox.lang]\n     * @param [config.uploadedBox.lang.supportedHTML5_emptyListMsg='Drop files here or click to upload.']\n     * @param [config.uploadedBox.lang.emptyListMsg='Empty of List.']\n     * @param {Function} [config.uploadedBox.onchange]\n     * @param {Function} [config.uploadedBox.onclick]\n     * @param {Function} [config.onprogress]\n     * @param {Function} [config.onuploaderror]\n     * @param {Function} [config.onuploaded]\n     * @param {Function} [config.onuploadComplete]\n     */\n    this.config = {\n      theme: 'default', // theme of uploader\n      lang: { // 업로더 버튼 랭귀지 설정\n        \"upload\": \"Upload\",\n        \"abort\": \"Abort\"\n      },\n      animateTime: 100,\n      accept: \"*/*\", // 업로드 선택 파일 타입 설정\n      multiple: false, // 다중 파일 업로드\n      manualUpload: false, // 업로딩 시작 수동처리 여부\n      progressBox: true, // 업로드 프로그래스 박스 사용여부 false 이면 업로드 진행바를 표시 하지 않습니다. 개발자가 onprogress 함수를 이용하여 직접 구현 해야 합니다.\n      progressBoxDirection: \"left\",\n      form: {\n        action: \"\",\n        fileName: \"file\"\n      },\n      dropZone: {\n        target: null\n      },\n      uploadedBox: {\n        target: null,\n        icon: {\n          download: \"U+2913\",\n          delete: \"U+232b\"\n        },\n        columnKeys: {\n          name: \"name\",\n          type: \"type\",\n          size: \"size\",\n          uploadedName: \"uploadedName\",\n          uploadedPath: \"uploadedPath\",\n          downloadPath: \"downloadPath\",\n          previewPath: \"previewPath\",\n          thumbnail: \"thumbnail\"\n        },\n        lang: {\n          supportedHTML5_emptyListMsg: 'Drop files here or click to upload.',\n          emptyListMsg: 'Empty of List.'\n        },\n        onchange: null,\n        onclick: null\n      },\n      validateSelectedFiles: null,\n      onprogress: null,\n      onuploaderror: null,\n      onuploaded: null,\n      onuploadComplete: null\n    };\n    jQuery.extend(true, this.config, config);\n\n    // 멤버 변수 초기화\n    /**\n     * 버튼속성\n     * @member {JSON}\n     */\n    this.defaultBtns = {\n      \"upload\": {label: this.config.lang[\"upload\"], theme: \"upload\"},\n      \"abort\": {label: this.config.lang[\"abort\"], theme: \"abort\"}\n    };\n\n    /**\n     * 업로드된 파일\n     * @member {Array}\n     */\n    this.uploadedFiles = [];\n\n    /**\n     * 업로더 타겟\n     * @member {jQuery}\n     */\n    this.$target = null;\n     \n    /**\n     * input file 태그\n     * @member {jQuery}\n     */\n    this.$inputFile = null;\n    /**\n     * input form\n     * @member {jQuery}\n     */\n    this.$inputFileForm = null;\n\n    /**\n     * 파일 선택 버튼\n     * @member {jQuery}\n     */\n    this.$fileSelector = null;\n    \n    /**\n     * 파일 드랍존\n     * @member {jQuery}\n     */\n    this.$dropZone = null;\n \n    /**\n     * 파일 목록 표시박스\n     * @member {jQuery}\n     */\n    this.$uploadedBox = null;\n\n    /**\n     * 업로드 진행 상태바\n     * @member {Boolean}\n     */\n    this.__uploading = false;\n    \n    /**\n     * 선택된 파일들\n     * @member {Array}\n     */\n    this.selectedFiles = [];\n\n    /**\n     * 선택된 파일의 전체 크기\n     * @member {Number}\n     */\n    this.selectedFilesTotal = 0;\n\n    /**\n     * 전송된 파일 크기\n     * @member {Number}\n     */\n    this.__loaded = 0;\n\n    if (typeof config !== \"undefined\") this.init();\n  }\n\n  /**\n   * @method\n   */\n  init() {\n    this.onStateChanged = this.config.onStateChanged;\n    delete this.config.onStateChanged;\n\n    if (this.config.target) {\n      this.$target = jQuery(this.config.target);\n\n      // 파일 드랍존은 옵션 사항.\n      if (this.config.dropZone && this.config.dropZone.target && info.supportFileApi) {\n        this.$dropZone = jQuery(this.config.dropZone.target);\n        this.$dropZone\n          .attr(\"data-ax6ui-uploader-dropzone\", this.instanceId);\n      }\n\n      // uploadedBox 옵션 사항\n      if (this.config.uploadedBox && this.config.uploadedBox.target) {\n        this.$uploadedBox = jQuery(this.config.uploadedBox.target);\n      }\n\n      // target attribute data\n      (function (data) {\n        if (U.isObject(data) && !data.error) {\n          this.config = jQuery.extend(true, {}, this.config, data);\n        }\n      }).call(this, U.parseJson(this.$target.attr(\"data-ax6ui-uploader-config\"), true));\n\n\n      // detect element\n      /// fileSelector 수집\n      this.$fileSelector = this.$target.find('[data-ax6ui-uploader-button=\"selector\"]');\n      if (this.$fileSelector.length === 0) {\n        console.log(info.getError(\"ax6ui-uploader\", \"402\", \"can not find file selector\"));\n        return this;\n      }\n\n      // input file 추가\n      attachFileTag.call(this);\n\n      // btns 확인\n      this.config.btns = jQuery.extend({}, this.defaultBtns, this.config.btns);\n\n      this.$progressBox = jQuery(\n        mustache.render(tmpl.progressBox.call(this), {\n          instanceId: this.instanceId,\n          btns: this.config.btns\n        })\n      );\n      this.$progressBar = this.$progressBox.find('[role=\"progressbar\"]');\n      this.$progressBarVal = this.$progressBox.find('[role=\"progressbarval\"]');\n      this.$progressBoxArrow = this.$progressBox.find(\".ax-progressbox-arrow\");\n      this.$progressUpload = this.$progressBox.find('[data-pregressbox-btn=\"upload\"]');\n      this.$progressAbort = this.$progressBox.find('[data-pregressbox-btn=\"abort\"]');\n\n      // file API가 지원되지 않는 브라우저는 중지 기능 제공 못함.\n      if (!info.supportFileApi) {\n        this.$progressAbort.css({display:\"none\"});\n      }\n\n      // 파일버튼 등에 이벤트 연결.\n      bindEvent.call(this);\n      repaintUploadedBox.call(this);\n    }\n\n    // init 호출 여부\n    this.initOnce();\n  }\n\n  /**\n   * @method\n   */\n  initOnce() {\n    if (this.initialized) return this;\n    this.initialized = true;\n  }\n\n\n  /**\n   * @method\n   * @returns {AX6UIUploader}\n   */\n  send() {\n    // 업로드 시작\n    if (this.selectedFiles.length && U.isFunction(this.config.validateSelectedFiles)) {\n      let that = {\n        self: this,\n        uploadedFiles: this.uploadedFiles,\n        selectedFiles: this.selectedFiles\n      };\n      if (!this.config.validateSelectedFiles.call(that, that)) {\n        cancelUpload.call(this);\n        return false;\n        // 전송처리 안함.\n      }\n    }\n\n    startUpload.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @returns {AX6UIUploader}\n   */\n  abort() {\n    if (!info.supportFileApi) {\n      alert(\"This browser not supported abort method\");\n      return this;\n    }\n    cancelUpload.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @param {Array} _files - JSON formatting can all be overridden in columnKeys.\n   * @returns {AX6UIUploader}\n   * @example\n   * ```js\n   * $.ajax({\n   *     url: \"api/fileListLoad.php\",\n   *     success: function (res) {\n   *         // res JSON format\n   *         // [{\n   *         // \"name\": \"barcode-scan-ani.gif\",\n   *         // \"saveName\": \"barcode-scan-ani.gif\",\n   *         // \"type\": \"file\",\n   *         // \"fileSize\": \"3891664\",\n   *         // \"uploadedPath\": \"/ax5ui-uploader/test/api/files\",\n   *         // \"thumbUrl\": \"\"\n   *         // }]\n   *         upload.setUploadedFiles(res);\n   *     }\n   * });\n   * ```\n   */\n  setUploadedFiles(_files) {\n    if (U.isArray(_files)) {\n      this.uploadedFiles = _files;\n    }\n    if (U.isString(_files)) {\n      try {\n        this.uploadedFiles = JSON.parse(_files);\n      }\n      catch (e) {\n\n      }\n    }\n\n    repaintUploadedBox.call(this);\n    return this;\n  }\n\n  /**\n   * clear uploadedFiles\n   * @method\n   * @returns {AX6UIUploader}\n   */\n  clear() {\n    this.setUploadedFiles([]);\n    return this;\n  }\n\n  /**\n   * Removes the object corresponding to the index passed to the argument from uploadedFiles.\n   * @method\n   * @param {Number} _index\n   * @returns {AX6UIUploader}\n   * @example\n   * ```js\n   * // The actual file is not deleted\n   * upload.removeFile(fileIndex);\n   * ```\n   */\n  removeFile(_index) {\n    if (!isNaN(Number(_index))) {\n      this.uploadedFiles.splice(_index, 1);\n    }\n    repaintUploadedBox.call(this);\n    return this;\n  }\n\n  /**\n   * Empty uploadedFiles\n   * @method\n   * @returns {AX6UIUploader}\n   * @example\n   * ```js\n   *\n   * ```\n   */\n  removeFileAll() {\n    this.uploadedFiles = [];\n    repaintUploadedBox.call(this);\n    return this;\n  }\n\n  /**\n   * @method\n   * @returns {Boolean}\n   */\n  selectFile() {\n    if (info.supportFileApi) {\n      this.$inputFile.trigger(\"click\");\n      return true;\n    }\n    return false;\n  }\n}\n\nexport default AX6UIUploader;"]}