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); }