// CodeMirror, copyright © by Marijn Haverbeke and others // Distributed under an MIT license: codemirror.net/LICENSE

(function(mod) {

if (typeof exports == "object" && typeof module == "object") // CommonJS
  mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
  define(["../../lib/codemirror"], mod);
else // Plain browser env
  mod(CodeMirror);

})(function(CodeMirror) {

"use strict";

function errorIfNotEmpty(stream) {
  var nonWS = stream.match(/^\s*\S/);
  stream.skipToEnd();
  return nonWS ? "error" : null;
}

CodeMirror.defineMode("asciiarmor", function() {
  return {
    token: function(stream, state) {
      var m;
      if (state.state == "top") {
        if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\s*$/))) {
          state.state = "headers";
          state.type = m[1];
          return "tag";
        }
        return errorIfNotEmpty(stream);
      } else if (state.state == "headers") {
        if (stream.sol() && stream.match(/^\w+:/)) {
          state.state = "header";
          return "atom";
        } else {
          var result = errorIfNotEmpty(stream);
          if (result) state.state = "body";
          return result;
        }
      } else if (state.state == "header") {
        stream.skipToEnd();
        state.state = "headers";
        return "string";
      } else if (state.state == "body") {
        if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\s*$/))) {
          if (m[1] != state.type) return "error";
          state.state = "end";
          return "tag";
        } else {
          if (stream.eatWhile(/[A-Za-z0-9+\/=]/)) {
            return null;
          } else {
            stream.next();
            return "error";
          }
        }
      } else if (state.state == "end") {
        return errorIfNotEmpty(stream);
      }
    },
    blankLine: function(state) {
      if (state.state == "headers") state.state = "body";
    },
    startState: function() {
      return {state: "top", type: null};
    }
  };
});

CodeMirror.defineMIME("application/pgp", "asciiarmor");
CodeMirror.defineMIME("application/pgp-encrypted", "asciiarmor");
CodeMirror.defineMIME("application/pgp-keys", "asciiarmor");
CodeMirror.defineMIME("application/pgp-signature", "asciiarmor");

});