diff --git a/fhem/www/codemirror/fhem_codemirror.js b/fhem/www/codemirror/fhem_codemirror.js
index ecd6af917..7b77bfd3f 100644
--- a/fhem/www/codemirror/fhem_codemirror.js
+++ b/fhem/www/codemirror/fhem_codemirror.js
@@ -1,72 +1,21 @@
+/* $Id$ */
+
var cm_loaded = 0;
-
-$(document).ready(function(){
- var els = document.getElementsByTagName("textarea");
- if(els.length == 0)
- return;
-
- if($(els[0]).closest("div#edit").css("display")=="none") { // DEF special
- $("table.internals a").each(function(){
- var oc = $(this).attr("onclick");
- if(oc) {
- $(this).attr("onclick", oc+
- 's=document.getElementById("edit").getElementsByTagName("textarea");'+
- 'if(!s[0].editor) { s[0].editor=true; AddCodeMirror(s[0]);}');
- }
- });
- } else {
- AddCodeMirror(els[0]);
- }
-});
-
-function
-AddCodeMirror(e, cb)
-{
- if(cm_loaded == 9)
- return cm_wait(e, cb);
- loadLink("codemirror/codemirror.css");
- loadLink("codemirror/show-hint.css");
- loadLink("codemirror/dialog.css");
- loadScript("codemirror/codemirror.js", function(){ cm_loaded++;} );
- loadScript("codemirror/closebrackets.js",function(){ cm_loaded++;} );
- loadScript("codemirror/matchbrackets.js",function(){ cm_loaded++;} );
- loadScript("codemirror/search.js", function(){ cm_loaded++;} );
- loadScript("codemirror/searchcursor.js", function(){ cm_loaded++;} );
- loadScript("codemirror/dialog.js", function(){ cm_loaded++;} );
- loadScript("codemirror/comment.js", function(){ cm_loaded++;} );
- loadScript("codemirror/autorefresh.js", function(){ cm_loaded++;} );
- loadScript("codemirror/show-hint.js", function(){
- cm_loaded++;
- cm_wait(e, cb);
- });
-}
-
-function
-cm_wait(cm_editor, callback)
-{
- if(cm_loaded != 9) {
- setTimeout(cm_wait, 10);
- return;
- }
-
- var ltype,type="fhem"; // get the type from the hidden filename extension
- $("input[name=save]").each(function(){
- ltype = $(this).attr("value");
- ltype = ltype.substr(ltype.lastIndexOf(".")+1);
- if(ltype=="css") type = "css";
- if(ltype=="svg") type = "xml";
- });
- var attr = {
- indentUnit: 4,
- indentWithTabs: false,
- autoCloseBrackets: false,
- matchBrackets: true,
- autofocus: true,
- theme: "blackboard",
- lineNumbers: true,
- autoRefresh: true,
+var cm_active = 0;
+var cm_attr = {
+ matchBrackets: true,
+ autoRefresh: true,
+ search: true,
+ comment: true,
+ autocomplete: true,
+ autoCloseBrackets:false,
+ indentUnit: 4,
+ type: "fhem",
+ theme: "blackboard",
+ indentWithTabs: false,
+ autofocus: true,
+ lineNumbers: true,
extraKeys: {
- 'Ctrl-Space': 'autocomplete',
'Tab': function(cm) {
if (cm.somethingSelected()) {
var sel = cm.getSelection("\n");
@@ -81,9 +30,6 @@ cm_wait(cm_editor, callback)
'Shift-Tab': function(cm) {
cm.indentSelection("subtract");
},
- 'Ctrl-Q': function(cm) { // Needs comment.js
- cm.toggleComment({ indent: false, lineComment: "#" });
- },
'Ctrl-Up': function(cm) {
var info = cm.getScrollInfo();
if (!cm.somethingSelected()) {
@@ -103,23 +49,104 @@ cm_wait(cm_editor, callback)
cm.scrollTo(null, info.top + cm.defaultTextHeight());
}
}
- };
- var userAttr = scriptAttribute("fhem_codemirror.js");
- for(var a in userAttr)
- attr[a] = userAttr[a];
+};
- loadLink("codemirror/"+attr.theme+".css");
- $("head").append(
- '');
+$(document).ready(function(){
+ var els = document.getElementsByTagName("textarea");
+ if(els.length == 0)
+ return;
- loadScript("codemirror/"+type+".js", function(){
- log("Calling CodeMirror");
- var cm = CodeMirror.fromTextArea(cm_editor, attr);
- if(callback)
- callback(cm);
- });
+ if($(els[0]).closest("div#edit").css("display")=="none") { // DEF special
+ $("table.internals a").each(function(){
+ var oc = $(this).attr("onclick");
+ if(oc) {
+ $(this).attr("onclick", oc+
+ 's=document.getElementById("edit").getElementsByTagName("textarea");'+
+ 'if(!s[0].editor) { s[0].editor=true; AddCodeMirror(s[0]);}');
+ }
+ });
+ } else {
+ AddCodeMirror(els[0]);
+ }
+});
+
+function AddCodeMirror(e, cb) {
+ var userAttr = scriptAttribute("fhem_codemirror.js");
+ for(var a in userAttr)
+ cm_attr[a] = userAttr[a];
+
+ if(cm_active && cm_loaded == cm_active)
+ return cm_wait(e, cb);
+
+ cm_active++;
+ loadLink("codemirror/codemirror.css");
+ loadScript("codemirror/codemirror.js", function(){cm_loaded++;} );
+
+ if (cm_attr.autoCloseBrackets) {
+ cm_active++; loadScript("codemirror/closebrackets.js", function(){cm_loaded++;} );
+ }
+ if (cm_attr.matchBrackets) {
+ cm_active++; loadScript("codemirror/matchbrackets.js", function(){cm_loaded++;} );
+ }
+ if (cm_attr.search) {
+ cm_active++; loadScript("codemirror/search.js", function(){cm_loaded++;} );
+ cm_active++; loadScript("codemirror/searchcursor.js", function(){cm_loaded++;} );
+ cm_active++;
+ loadLink("codemirror/dialog.css");
+ loadScript("codemirror/dialog.js", function(){cm_loaded++;} );
+ }
+ if (cm_attr.comment) {
+ cm_active++; loadScript("codemirror/comment.js", function(){cm_loaded++;} );
+ cm_attr.extraKeys['Ctrl-Q'] = function(cm) {
+ cm.toggleComment({ indent: false, lineComment: "#" });
+ };
+ }
+ if (cm_attr.autocomplete) {
+ cm_active++;
+ loadLink("codemirror/show-hint.css");
+ loadScript("codemirror/show-hint.js", function(){cm_loaded++;});
+ cm_attr.extraKeys['Ctrl-Space'] = 'autocomplete';
+ }
+ if (cm_attr.autoRefresh) {
+ cm_active++; loadScript("codemirror/autorefresh.js", function(){cm_loaded++;} );
+ }
+
+
+ // get the type from hidden filename extension, load the type-file.js, theme.css and call cm_wait
+ var ltype;
+ $("input[name=save]").each(function() {
+ ltype = $(this).attr("value");
+ ltype = ltype.substr(ltype.lastIndexOf(".")+1);
+ if(ltype=="css") cm_attr.type = "css";
+ if(ltype=="svg") cm_attr.type = "xml";
+ });
+
+ loadLink("codemirror/"+cm_attr.theme+".css");
+ $("head").append(
+ '');
+
+ cm_active++;
+ loadScript("codemirror/"+cm_attr.type+".js", function(){
+ cm_loaded++;
+ cm_wait(e, cb);
+ });
+}
+
+function cm_wait(cm_editor, callback, recursions) {
+ recursions = typeof recursions !== 'undefined' ? recursions : 0;
+ if(cm_loaded != cm_active) {
+ if(recursions < 100) {
+ recursions++;
+ setTimeout(function(){ cm_wait(cm_editor, callback, recursions) }, 20);
+ }
+ return;
+ }
+
+ var cm = CodeMirror.fromTextArea(cm_editor, cm_attr);
+ if(callback)
+ callback(cm);
}