/*\
title: $:/core/modules/widgets/edit-text-codemirror.js
type: application/javascript
module-type: widget

Extend the edit-text widget to use CodeMirror

\*/
(function(){

/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";

var CODEMIRROR_OPTIONS = "$:/config/CodeMirror", configOptions;
/*
e.g. to allow vim key bindings
 {
	"require": [
		"$:/plugins/tiddlywiki/codemirror/addon/dialog.js",
		"$:/plugins/tiddlywiki/codemirror/addon/searchcursor.js",
		"$:/plugins/tiddlywiki/codemirror/keymap/vim.js"
	],
	"configuration": {
			"keyMap": "vim",
			"showCursorWhenSelecting": true
	}
}
*/

var EditTextWidget = require("$:/core/modules/widgets/edit-text.js")["edit-text"];

if($tw.browser) {
	require("$:/plugins/tiddlywiki/codemirror/codemirror.js");

	configOptions = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{});

	if(configOptions) {
		if(configOptions["require"]) {
				if($tw.utils.isArray(configOptions["require"])) {
					for (var index=0; index < configOptions["require"].length; index++) {
						require(configOptions["require"][index]);
					}
				}
				else {
					require(configOptions["require"]);
				}
		}
		EditTextWidget.configuration = configOptions["configuration"];
	}
}

/*
The edit-text widget calls this method just after inserting its dom nodes
*/
EditTextWidget.prototype.postRender = function() {
	var self = this,
		cm, config, cv, cm_opts = {
			lineWrapping: true,
			lineNumbers: true
		};

	if($tw.browser && window.CodeMirror && this.editTag === "textarea") {
		if(EditTextWidget.configuration) {
			for (cv in EditTextWidget.configuration) { cm_opts[cv] = EditTextWidget.configuration[cv]; }
		}
		cm = CodeMirror.fromTextArea(this.domNodes[0], cm_opts);
		cm.on("change",function() {
			self.saveChanges(cm.getValue());
		});
	} else {
		cm = undefined;
	}
	this.codemirrorInstance = cm;
};

EditTextWidget.prototype.updateEditor = function(text) {
	// Replace the edit value if the tiddler we're editing has changed
	if(this.codemirrorInstance) {
		if(!this.codemirrorInstance.hasFocus()) {
			this.codemirrorInstance.setValue(text);
		}
	} else {
		this.updateEditorDomNode(this.getEditInfo().value);
	}
};

})();
