diff --git a/lib/client/editor/_ace.js b/lib/client/editor/_ace.js
new file mode 100644
index 00000000..6ff8cd18
--- /dev/null
+++ b/lib/client/editor/_ace.js
@@ -0,0 +1,212 @@
+var CloudCommander, CloudFunc, ace;
+/* object contains editors Ace
+ * and later will be Ace
+ */
+ (function(){
+ "use strict";
+ var cloudcmd = CloudCommander,
+ Util = CloudCommander.Util,
+ KeyBinding = CloudCommander.KeyBinding,
+ AceEditor = {},
+ AceLoaded = false,
+ ReadOnly = false,
+ AceElement,
+ FM;
+
+ CloudCommander.Editor = {
+ get : (function(){
+ return this.Ace;
+ })
+ };
+
+ cloudcmd.Editor.dir = 'lib/client/editor/';
+ AceEditor.dir = cloudcmd.Editor.dir + 'ace/';
+
+
+ /* private functions */
+ function initCodeMirror(pValue){
+ if(!FM)
+ FM = Util.getById('fm');
+
+ AceElement = Util.anyload({
+ name : 'div',
+ id : 'CodeMirrorEditor',
+ className : 'panel',
+ parent : FM
+ });
+
+ var editor = ace.edit("AceEditor");
+
+ editor.setTheme("ace/theme/tomorrow_night_blue");
+ editor.getSession().setMode("ace/mode/javascript");
+
+ /*
+ editor.commands.addCommand({
+ name : 'new_command',
+ //bindKey : {win: 'Esc', mac: 'Esc'},
+ bindKey: {win: 'Ctrl-M', mac: 'Command-M'},
+ exec : function(pEditor){
+ lThis.hide();
+ }
+ });
+ */
+
+ editor.setReadOnly(ReadOnly);
+
+ editor.setValue(pValue);
+ }
+
+ /* indicator says Ace still loads */
+ AceEditor.loading = false;
+
+ /* function loads Ace js and css files */
+ AceEditor.load = (function(){
+ Util.cssSet({id:'editor',
+ inner : '#AceEditor{' +
+ 'font-size : 15px;' +
+ 'padding : 0 0 0 0;' +
+ '}'
+ });
+
+ /* load Ace main module */
+ Util.jsload(AceEditor.dir + 'ace.js', function() {
+ Util.jsload(AceEditor.dir + 'mode-javascript.js',
+ function(){
+ AceLoaded = true;
+ AceEditor.show();
+ });
+ });
+ });
+
+ /* function shows Ace editor */
+ AceEditor.show = (function(){
+ /* if Ace function show already
+ * called do not call it again
+ * if f4 key pressed couple times
+ */
+ if(this.loading)
+ return;
+
+ if(!AceLoaded){
+ return AceEditor.load();
+ }
+
+ /* getting link */
+ var lCurrentFile = Util.getCurrentFile(),
+ lA = Util.getCurrentLink(lCurrentFile);
+ lA = lA.href;
+
+ /* убираем адрес хоста*/
+ lA = '/' + lA.replace(document.location.href,'');
+
+ /* checking is this link is to directory */
+ var lSize = Util.getByClass('size', lCurrentFile);
+ if(lSize){
+ lSize = lSize[0].textContent;
+
+ /* if directory - load json
+ * not html data
+ */
+ if (lSize === '
'){
+ if (lA.indexOf(CloudFunc.NOJS) ===
+ CloudFunc.FS.length) {
+ lA = lA.replace(CloudFunc.NOJS, '');
+ /* when folder view
+ * is no need to edit
+ * data
+ */
+ ReadOnly = true;
+ }
+ }
+ }
+
+ this.loading = true;
+ setTimeout(function(){
+ lThis.loading = false;},
+ 400);
+
+ /* reading data from current file */
+ Util.ajax({
+ url:lA,
+ error: (function(jqXHR, textStatus, errorThrown){
+ lThis.loading = false;
+
+ return Util.Images.showError(jqXHR);
+ }),
+
+ success:function(data, textStatus, jqXHR){
+ /* if we got json - show it */
+ if(typeof data === 'object')
+ data = JSON.stringify(data, null, 4);
+
+ initAce_f(data);
+
+ /* removing keyBinding if set */
+ KeyBinding.unSet();
+
+ Util.hidePanel();
+ Util.Images.hideLoad();
+
+ lThis.loading = false;
+ }
+ });
+ });
+
+ /* function hides Ace editor */
+ AceEditor.hide = (function() {
+ var lElem = AceElement;
+ KeyBinding.set();
+
+ if(lElem && FM)
+ FM.removeChild(lElem);
+
+ Util.showPanel();
+ });
+
+ cloudcmd.Editor.Keys = (function(pCurrentFile, pIsReadOnly){
+ "use strict";
+
+ var lThis = this.Ace;
+ /* loading js and css of Ace */
+ this.Ace.show(pCurrentFile, pIsReadOnly);
+
+ var key_event = function(pEvent){
+
+ /* если клавиши можно обрабатывать */
+ if( KeyBinding.get() ){
+ /* if f4 or f3 pressed */
+ var lF3 = cloudcmd.KEY.F3;
+ var lF4 = cloudcmd.KEY.F4;
+ var lShow = Util.bind(lThis.show, lThis);
+
+ if(!pEvent.shiftKey){
+ if(pEvent.keyCode === lF4)
+ lShow();
+ else if(pEvent.keyCode === lF3){
+ lShow(true);
+ }
+ }
+ }else if (pEvent.keyCode === cloudcmd.KEY.ESC)
+ AceEditor.hide();
+ };
+
+ /* добавляем обработчик клавишь */
+ if (document.addEventListener)
+ document.addEventListener('keydown', key_event,false);
+
+ else{
+ var lFunc;
+ if(typeof document.onkeydown === 'function')
+ lFunc = document.onkeydown;
+
+ document.onkeydown = function(){
+ if(lFunc)
+ lFunc();
+
+ key_event();
+ };
+ }
+ });
+
+ cloudcmd.Editor.Ace = AceEditor;
+})();
\ No newline at end of file
diff --git a/lib/client/editor/_codemirror.js b/lib/client/editor/_codemirror.js
new file mode 100644
index 00000000..dc61b604
--- /dev/null
+++ b/lib/client/editor/_codemirror.js
@@ -0,0 +1,230 @@
+var CloudCommander, CloudFunc, CodeMirror;
+/* object contains editors CodeMirror
+ * and later will be Ace
+ */
+ (function(){
+ "use strict";
+ var cloudcmd = CloudCommander,
+ Util = CloudCommander.Util,
+ KeyBinding = CloudCommander.KeyBinding,
+ CodeMirrorEditor = {},
+ FM,
+ CodeMirrorElement,
+ CodeMirrorLoaded = false,
+ /* indicator says CodeMirror still loads */
+ Loading = false,
+ ReadOnly = false;
+
+ cloudcmd.Editor = {
+ get : (function(){
+ return this.CodeMirror;
+ })
+ };
+
+
+ /* private functions */
+ function initCodeMirror(pValue){
+ if(!FM)
+ FM = Util.getById('fm');
+
+ CodeMirrorElement = Util.anyload({
+ name : 'div',
+ id : 'CodeMirrorEditor',
+ className : 'panel',
+ parent : FM
+ });
+
+ CodeMirrorEditor.CodeMirror = new CodeMirror(CodeMirrorElement,{
+ mode : 'javascript',
+ value : pValue,
+ theme : 'night',
+ lineNumbers : true,
+ //переносим длинные строки
+ lineWrapping: false,
+ autofocus : true,
+ extraKeys: {
+ //Сохранение
+ "Esc": CodeMirrorEditor.hide
+ },
+ readOnly : ReadOnly
+ });
+ }
+
+ cloudcmd.Editor.dir = 'lib/client/editor/';
+ CodeMirrorEditor.dir = cloudcmd.Editor.dir + 'codemirror/';
+
+ /* function loads CodeMirror js and css files */
+ CodeMirrorEditor.load = (function(){
+ /* function loads css files of CodeMirror */
+ var loadAll = function() {
+ Util.cssLoad([
+ { src : CodeMirrorEditor.dir + 'codemirror.css'},
+ { src : CodeMirrorEditor.dir + 'theme/night.css'}
+ ]);
+
+
+ Util.cssSet({id:'editor',
+ inner : '.CodeMirror{' +
+ 'font-family :\'Droid Sans Mono\';' +
+ 'font-size :15px;' +
+ /* codemirror v3 */
+ //'height : ' + cloudcmd.HEIGHT + 'px' +
+ '}' +
+ '.CodeMirror-scroll{' +
+ 'height : ' + (cloudcmd.HEIGHT) + 'px' +
+ '}' //+
+ /* codemirror v3 */
+ //'#CodeMirrorEditor{' +
+ // 'padding :20px 20px 20px 20px;' +
+ // '}'
+ });
+
+ Util.jsload(CodeMirrorEditor.dir +
+ 'mode/javascript.js', function(){
+ CodeMirrorLoaded = true;
+ CodeMirrorEditor.show();
+ });
+ };
+
+ /* load CodeMirror main module */
+ Util.jsload(CodeMirrorEditor.dir + 'codemirror.js', loadAll);
+ });
+
+ /* function shows CodeMirror editor */
+ CodeMirrorEditor.show = (function(){
+ /* if CodeMirrorEditor is not loaded - loading him */
+ if(!CodeMirrorLoaded)
+ return this.load();
+
+ /* if CodeMirror function show already
+ * called do not call it again
+ * if f4 key pressed couple times
+ */
+ if(Loading)
+ return;
+
+ /* getting link */
+ var lCurrentFile = Util.getCurrentFile(),
+ lA = Util.getCurrentLink(lCurrentFile);
+ lA = lA.href;
+
+ /* убираем адрес хоста*/
+ lA = '/' + lA.replace(document.location.href,'');
+
+ /* checking is this link is to directory */
+ var lSize = Util.getByClass('size', lCurrentFile);
+ if(lSize){
+ lSize = lSize[0].textContent;
+
+ /* if directory - load json
+ * not html data
+ */
+ if (lSize === ''){
+ var lIndexOfNOJS = lA.indexOf(CloudFunc.NOJS);
+ if (lIndexOfNOJS === CloudFunc.FS.length){
+ lA = lA.replace(CloudFunc.NOJS, '');
+ /* when folder view
+ * is no need to edit
+ * data
+ */
+ ReadOnly = true;
+ }
+ }
+ }
+
+ Loading = true;
+ setTimeout(function(){
+ Loading = false;
+ },
+ 400);
+
+ /* reading data from current file */
+ Util.ajax({
+ url:lA,
+ error: function(jqXHR, textStatus, errorThrown){
+ Loading = false;
+ return Util.Images.showError(jqXHR);
+ },
+
+ success:function(data, textStatus, jqXHR){
+ /* if we got json - show it */
+ if(typeof data === 'object')
+ data = JSON.stringify(data, null, 4);
+
+ initCodeMirror(data);
+
+ /* removing keyBinding if set */
+ KeyBinding.unSet();
+
+ Util.hidePanel();
+ Util.Images.hideLoad();
+
+ Loading = false;
+ }
+ });
+ });
+
+ /* function hides CodeMirror editor */
+ CodeMirrorEditor.hide = (function() {
+ var lElem = CodeMirrorElement;
+ KeyBinding.set();
+
+ if(lElem && FM)
+ FM.removeChild(lElem);
+
+ Util.showPanel();
+ });
+
+ cloudcmd.Editor.Keys = (function(pIsReadOnly){
+ ReadOnly = pIsReadOnly;
+
+ var lThis = this.CodeMirror;
+ /* loading js and css of CodeMirror */
+ lThis.show();
+
+ var key_event = function(pEvent){
+
+ /* если клавиши можно обрабатывать */
+ if( KeyBinding.get() ){
+ /* if f4 or f3 pressed */
+ var lF3 = cloudcmd.KEY.F3;
+ var lF4 = cloudcmd.KEY.F4;
+ //var lShow = lThis.show.bind(lThis);
+ var lShow = Util.bind(lThis.show, lThis);
+
+ if(!pEvent.shiftKey){
+ switch(pEvent.keyCode)
+ {
+ case lF4:
+ ReadOnly = false;
+ lShow();
+ break;
+ case lF3:
+ ReadOnly = true;
+ lShow();
+ break;
+ }
+ }
+ }
+ };
+
+ /* добавляем обработчик клавишь */
+ if (document.addEventListener)
+ document.addEventListener('keydown', key_event, false);
+
+ else{
+ var lFunc;
+ if(typeof document.onkeydown === 'function')
+ lFunc = document.onkeydown;
+
+ document.onkeydown = function(){
+ if(lFunc)
+ lFunc();
+
+ key_event();
+ };
+ }
+ });
+
+ cloudcmd.Editor.CodeMirror = CodeMirrorEditor;
+})();
\ No newline at end of file