(function() {
  // Copyright 2017-2018 Xuan Sang LE <xsang.le AT gmail DOT com>

  // AnTOS Web desktop is is licensed under the GNU General Public
  // License v3.0, see the LICENCE file for more information

  // This program is free software: you can redistribute it and/or
  // modify it under the terms of the GNU General Public License as
  // published by the Free Software Foundation, either version 3 of 
  // the License, or (at your option) any later version.

  // This program is distributed in the hope that it will be useful,
  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  // General Public License for more details.

  // You should have received a copy of the GNU General Public License
  //along with this program. If not, see https://www.gnu.org/licenses/.
  var MarkOn;

  MarkOn = class MarkOn extends this.OS.application.BaseApplication {
    constructor(args) {
      super("MarkOn", args);
    }

    main() {
      var markarea;
      markarea = this.find("markarea");
      this.container = this.find("mycontainer");
      this.previewOn = false;
      if (this.args && this.args.length > 0) {
        this.currfile = this.args[0].path.asFileHandle();
      } else {
        this.currfile = "Untitled".asFileHandle();
      }
      this.editormux = false;
      this.editor = new SimpleMDE({
        element: markarea,
        autoDownloadFontAwesome: false,
        autofocus: true,
        tabSize: 4,
        indentWithTabs: true,
        toolbar: [
          "bold",
          "italic",
          "heading",
          "|",
          "quote",
          "code",
          "unordered-list",
          "ordered-list",
          "|",
          "link",
          "image",
          "table",
          "horizontal-rule",
          "|",
          {
            name: "preview",
            className: "fa fa-eye no-disable",
            action: (e) => {
              this.previewOn = !this.previewOn;
              return SimpleMDE.togglePreview(e);
            }
          }
        ]
      });
      //if(self.previewOn) toggle the highlight
      //{
      //    var container = self._scheme.find(self,"Text")
      //                        .$element.getElementsByClassName("editor-preview");
      //    if(container.length == 0) return;
      //    var codes = container[0].getElementsByTagName('pre');
      //    codes.forEach(function(el){
      //        hljs.highlightBlock(el);
      //    });
      //    //console.log(code);
      //}
      this.editor.codemirror.on("change", () => {
        if (this.editormux) {
          return;
        }
        if (this.currfile.dirty === false) {
          this.currfile.dirty = true;
          return this.scheme.apptitle = `${this.currfile.basename}*`;
        }
      });
      this.on("hboxchange", (e) => {
        return this.resizeContent();
      });
      this.bindKey("ALT-N", () => {
        return this.actionFile(`${this.name}-New`);
      });
      this.bindKey("ALT-O", () => {
        return this.actionFile(`${this.name}-Open`);
      });
      this.bindKey("CTRL-S", () => {
        return this.actionFile(`${this.name}-Save`);
      });
      this.bindKey("ALT-W", () => {
        return this.actionFile(`${this.name}-Saveas`);
      });
      this.resizeContent();
      return this.open(this.currfile);
    }

    resizeContent() {
      var cheight, children, statusbar, titlebar, toolbar;
      children = ($(this.container)).children();
      titlebar = (($(this.scheme)).find(".afx-window-top"))[0];
      toolbar = children[1];
      statusbar = children[4];
      cheight = ($(this.scheme)).height() - ($(titlebar)).height() - ($(toolbar)).height() - ($(statusbar)).height() - 40;
      return ($(children[2])).css("height", cheight + "px");
    }

    open(file) {
      //find table
      if (file.path === "Untitled") {
        return;
      }
      file.dirty = false;
      return file.read().then((d) => {
        this.currfile = file;
        this.editormux = true;
        this.editor.value(d);
        this.scheme.apptitle = `${this.currfile.basename}`;
        return this.editormux = false;
      }).catch((e) => {
        return this.error(__("Unable to open: {0}", file.path), e);
      });
    }

    save(file) {
      return file.write("text/plain").then((d) => {
        if (d.error) {
          return this.error(__("Error saving file {0}: {1}", file.basename, d.error));
        }
        file.dirty = false;
        file.text = file.basename;
        return this.scheme.apptitle = `${this.currfile.basename}`;
      }).catch((e) => {
        return this.error(__("Unable to save file: {0}", file.path), e);
      });
    }

    menu() {
      var menu;
      menu = [
        {
          text: "__(File)",
          nodes: [
            {
              text: "__(New)",
              dataid: `${this.name}-New`,
              shortcut: "A-N"
            },
            {
              text: "__(Open)",
              dataid: `${this.name}-Open`,
              shortcut: "A-O"
            },
            {
              text: "__(Save)",
              dataid: `${this.name}-Save`,
              shortcut: "C-S"
            },
            {
              text: "__(Save as)",
              dataid: `${this.name}-Saveas`,
              shortcut: "A-W"
            }
          ],
          onchildselect: (e) => {
            return this.actionFile(e.data.item.data.dataid);
          }
        }
      ];
      return menu;
    }

    actionFile(e) {
      var saveas;
      saveas = () => {
        return this.openDialog("FileDialog", {
          title: __("Save as"),
          file: this.currfile
        }).then((f) => {
          var d;
          d = f.file.path.asFileHandle();
          if (f.file.type === "file") {
            d = d.parent();
          }
          this.currfile.setPath(`${d.path}/${f.name}`);
          return this.save(this.currfile);
        });
      };
      switch (e) {
        case `${this.name}-Open`:
          return this.openDialog("FileDialog", {
            title: __("Open file")
          }).then((f) => {
            return this.open(f.file.path.asFileHandle());
          });
        case `${this.name}-Save`:
          this.currfile.cache = this.editor.value();
          if (this.currfile.basename) {
            return this.save(this.currfile);
          }
          return saveas();
        case `${this.name}-Saveas`:
          this.currfile.cache = this.editor.value();
          return saveas();
        case `${this.name}-New`:
          this.currfile = "Untitled".asFileHandle();
          this.currfile.cache = "";
          return this.editor.value("");
      }
    }

    cleanup(evt) {
      if (!this.currfile.dirty) {
        return;
      }
      evt.preventDefault();
      return this.openDialog("YesNoDialog", {
        title: __("Quit"),
        text: __("Quit without saving ?")
      }).then((d) => {
        if (d) {
          this.currfile.dirty = false;
          return this.quit();
        }
      });
    }

  };

  MarkOn.dependencies = ["os://scripts/mde/simplemde.min.js", "os://scripts/mde/simplemde.min.css"];

  this.OS.register("MarkOn", MarkOn);

}).call(this);
