var MdEditor = {
    editorId: null,
    format: {
        undo: function undo(editor) {
            editor.undo();
        },

        redo: function redo(editor) {
            editor.redo();
        },

        setBold: function setBold(editor) {
            editor.replaceSelection(`**${editor.getSelection()}**`);
            var cursor = editor.getCursor();
            editor.setCursor({
                line: cursor.line,
                ch: cursor.ch - 2
            });
            editor.focus();
        },

        setItalic: function setItalic(editor) {
            editor.replaceSelection(`*${editor.getSelection()}*`);
            var cursor = editor.getCursor();
            editor.setCursor({
                line: cursor.line,
                ch: cursor.ch - 1
            });
            editor.focus();
        },

        setBlockQuote: function setBlockQuote(editor) {
            var cursorLine = editor.getCursor().line;
            editor.replaceRange('> ', {
                line: cursorLine,
                ch: 0
            }, {
                line: cursorLine,
                ch: 0
            });
            editor.focus();
        },

        setHeader: function setHeader(editor, level) {
            var cursorLine = editor.getCursor().line;
            switch (level) {
                case 1:
                    editor.replaceRange('# ', {
                        line: cursorLine,
                        ch: 0
                    }, {
                        line: cursorLine,
                        ch: 0
                    });
                    break;
                case 2:
                    editor.replaceRange('## ', {
                        line: cursorLine,
                        ch: 0
                    }, {
                        line: cursorLine,
                        ch: 0
                    });
                    break;
                case 3:
                    editor.replaceRange('### ', {
                        line: cursorLine,
                        ch: 0
                    }, {
                        line: cursorLine,
                        ch: 0
                    });
                    break;
                case 4:
                    editor.replaceRange('#### ', {
                        line: cursorLine,
                        ch: 0
                    }, {
                        line: cursorLine,
                        ch: 0
                    });
                    break;
                case 5:
                    editor.replaceRange('##### ', {
                        line: cursorLine,
                        ch: 0
                    }, {
                        line: cursorLine,
                        ch: 0
                    });
                    break;
                default:
                    break;
            }
            editor.focus();
        },
        setLink: function setLink(editor) {
            editor.replaceSelection(`[](https://)`);
            var cursor = editor.getCursor();
            editor.setCursor({
                line: cursor.line,
                ch: cursor.ch - 11
            });
            editor.focus();
        },

        setImage: function setImage(editor) {
            editor.replaceSelection(`![]()`);
            var cursor = editor.getCursor();
            editor.setCursor({
                line: cursor.line,
                ch: cursor.ch - 3
            });
            editor.focus();
        },

        setInlineCode: function setInlineCode(editor) {
            editor.replaceSelection(`\`${editor.getSelection()}\``);
            var cursor = editor.getCursor();
            editor.setCursor({
                line: cursor.line,
                ch: cursor.ch - 1
            });
            editor.focus();
        },

        uploadImage: function(editor) {
            var input_f = $('<input type="file" name="file" accept="image/jpg,image/jpeg,image/png,image/gif">');
            input_f.on('change', function () {
                var file = input_f[0].files[0];
                if (!file) {
                    return false;
                }
                var form = new FormData();
                form.append("file", file);
                $.ajax({
                    url: _MTONS.BASE_PATH + "/bg/sys/file/upload/image",
                    data: form,
                    type: "POST",
                    cache: false, //上传文件无需缓存
                    processData: false, //用于对data参数进行序列化处理 这里必须false
                    contentType: false, //必须
                    success: function (result) {
                        var jsonResult = result.data
                        var image = `![` + jsonResult.name + `](` + jsonResult.url + `)`;
                        editor.replaceSelection(image);
                        var cursor = editor.getCursor();
                        editor.setCursor({
                            line: cursor.line,
                            ch: cursor.ch - 3
                        });
                        editor.focus();
                    }
                });
            });

            input_f.click();
        },

        setPreMode: function setPreMode(element, mode, editor) {
			$('button[event=premode].active').removeClass('active');
			element.addClass('active');
			$('.editor-container').removeClass('liveMode editMode previewMode').addClass(mode);
        },
        
        fullscreen: function (editor) {
            var $btn = $('button[event=fullscreen]');
            $btn.toggleClass('active');
            $('.md-editor').toggleClass('fullscreen');
            var height = $(window).height() - 37;
            if ($btn.hasClass('active')) {
                editor.setSize('auto', height + 'px');
            } else {
                editor.setSize('auto', '450px');
            }
        }
    },

    initEditor: function () {
        var editor = CodeMirror.fromTextArea(document.getElementById("content"), {
            mode: 'markdown',     // Markdown
            lineNumbers: true,     // 显示行数
            indentUnit: 4,         // 缩进4格
            tabSize: 4,
            autoCloseBrackets: true,
            matchBrackets: true,   // 括号匹配
            lineWrapping: true,    // 自动换行
            highlightFormatting: true,
            theme: 'idea',
            keyMap: 'sublime',
            extraKeys: {"Enter": "newlineAndIndentContinueMarkdownList"}
        });
        editor.setSize('auto', '450px');

        editor.on('change', function (editor) {
            var $content = $('#content');
            $content.text(editor.getValue());
            $('.editor-preview').html(marked(editor.getValue()));
        });
		
		$('.editor-preview').html(marked($('#content').text()));

        // Toolbar click
        $('div.editor-toolbar').on('click', 'button[event]', function () {
            var that = $(this);
            var event = that.attr('event');
            switch (event) {
                case 'undo':
                    MdEditor.format.undo(editor);
                    break;
                case 'redo':
                    MdEditor.format.redo(editor);
                    break;
                case 'bold':
                    MdEditor.format.setBold(editor);
                    break;
                case 'italic':
                    MdEditor.format.setItalic(editor);
                    break;
                case 'blockquote':
                    MdEditor.format.setBlockQuote(editor);
                    break;
                case 'h1':
                    MdEditor.format.setHeader(editor, 1);
                    break;
                case 'h2':
                    MdEditor.format.setHeader(editor, 2);
                    break;
                case 'h3':
                    MdEditor.format.setHeader(editor, 3);
                    break;
                case 'h4':
                    MdEditor.format.setHeader(editor, 4);
                    break;
                case 'h5':
                    MdEditor.format.setHeader(editor, 5);
                    break;
                case 'link':
                    MdEditor.format.setLink(editor);
                    break;
                case 'image':
                    MdEditor.format.setImage(editor);
                    break;
                case 'inlinecode':
                    MdEditor.format.setInlineCode(editor);
                    break;
                case 'uploadimage':
                    MdEditor.format.uploadImage(editor);
                    break;
                case 'premode':
					var mode = that.data('value');
                    MdEditor.format.setPreMode(that, mode, editor);
                    break;
                case 'fullscreen':
                    MdEditor.format.fullscreen(editor);
                    break;
                default:
                    break;
            }
        });
    }
};
