/* Функция которая возвратит обьект CloudCommander * @window - обьект window * @document - обьект document * @CloudFunc - обьект содержащий общий функционал * клиентский и серверный */ var CloudCommander=(function(){ "use strict"; /* Клиентский обьект, содержащий функциональную часть*/ var CloudClient = { /* Конструктор CloudClient, который * выполняет весь функционал по * инициализации */ init :function(){}, keyBinding :function(){},/* функция нажатий обработки клавишь*/ keyBinded :false, /* оброботка нажатий клавишь установлена */ Editor :function(){},/* function loads and shows editor */ Viewer :function(){},/* function loads and shows viewer */ Terminal :function(){},/* function loads and shows terminal*/ Menu :function(){},/* function loads and shows menu */ _loadDir :function(){}, /* Функция привязываеться ко всем * ссылкам и * загружает содержимое каталогов */ /* ОБЬЕКТЫ */ /* Обьект для работы с кэшем */ Cache :{}, /* Object contain additional system functional */ Util :{}, /* ПРИВАТНЫЕ ФУНКЦИИ */ /* функция загружает json-данные о файловой системе */ _ajaxLoad :function(){}, /* Функция генерирует JSON из html-таблицы файлов */ _getJSONfromFileTable :function(){}, /* функция меняет ссыки на ajax-овые */ _changeLinks :function(){}, /* КОНСТАНТЫ*/ /* название css-класа текущего файла*/ CURRENT_FILE :'current-file', LIBDIR :'/lib/', LIBDIRCLIENT :'/lib/client/', /* height of Cloud Commander * seting up in init() */ HEIGHT :0, MIN_ONE_PANEL_WIDTH :1155, OLD_BROWSER :false }; /* * Обьект для работы с кэшем * в него будут включены функции для * работы с LocalStorage, webdb, * indexed db etc. */ CloudClient.Cache={ _allowed :true, /* приватный переключатель возможности работы с кэшем */ /* функция проверяет возможно ли работать с кэшем каким-либо образом */ isAllowed :function(){}, /* Тип кэша, который доступен*/ type :{}, /* Функция устанавливает кэш, если выбранный вид поддерживаеться браузером*/ set :function(){}, /* Функция достаёт кэш, если выбранный вид поддерживаеться браузером*/ get :function(){}, /* функция чистит весь кэш для всех каталогов*/ clear :function(){} }; /* функция проверяет поддерживаеться ли localStorage */ CloudClient.Cache.isAllowed=(function(){ if(window.localStorage && localStorage.setItem && localStorage.getItem){ CloudClient.Cache._allowed=true; }else { CloudClient.Cache._allowed=false; /* загружаем PolyFill для localStorage, * если он не поддерживаеться браузером * https://gist.github.com/350433 */ /* Util.jsload('https://raw.github.com/gist/350433/c9d3834ace63e5f5d7c8e1f6e3e2874d477cb9c1/gistfile1.js', function(){CloudClient.Cache._allowed=true; }); */ } }); /* если доступен localStorage и * в нём есть нужная нам директория - * записываем данные в него */ CloudClient.Cache.set = (function(pName, pData){ if(CloudClient.Cache._allowed && pName && pData){ localStorage.setItem(pName,pData); } }); /* Если доступен Cache принимаем из него данные*/ CloudClient.Cache.get = (function(pName){ if(CloudClient.Cache._allowed && pName){ return localStorage.getItem(pName); } else return null; }); /* Функция очищает кэш*/ CloudClient.Cache.clear = (function(){ if(CloudClient.Cache._allowed){ localStorage.clear(); } }); /* Object contain additional system functional */ CloudClient.Util = (function(){ /* * Function gets id by src * from http://domain.com/1.js to * 1_js */ this.getIdBySrc = function(pSrc){ var lID = pSrc.replace(pSrc.substr(pSrc, pSrc.lastIndexOf('/')+1), ''); /* убираем точки */ while(lID.indexOf('.') > 0) lID = lID.replace('.','_'); return lID; }, this.loadOnload = function(pFunc_a){ if(pFunc_a instanceof Array) { var lFunc_f = pFunc_a.pop(); if(typeof lFunc_f === 'function') lFunc_f(); return this.loadOnload(pFunc_a); } else if(typeof pFunc_a === 'function') return pFunc_a(); }; this.anyLoadOnload = function(pParams_a){ if(pParams_a instanceof Array) { var lParams_o = pParams_a.pop(); if(!lParams_o.func) lParams_o.func = function(){ lThis.anyLoadOnload(pParams_a); }; return this.anyload(lParams_o); } }; /* * Функция создаёт элемент и * загружает файл с src. * @pName - название тэга * @pSrc - путь к файлу * @pFunc - обьект, содержаий одну из функций * или сразу две onload и onerror * {onload: function(){}, onerror: function();} * @pStyle - стиль * @pId - id * @pElement - элемент, дочерним которо будет этот * @pParams_o = {name: '', src: ' ',func: '', style: '', id: '', parent: '', async: false, inner: 'id{color:red, }, class:'', not_append: false} */ this.anyload = function(pParams_o){ /* if a couple of params was * processing every of params * and quit */ if(pParams_o instanceof Array){ var lElements_a = []; for(var i=0; i < pParams_o.length; i++) lElements_a[i] = this.anyload(pParams_o[i]); return lElements_a; } /* убираем путь к файлу, оставляя только название файла */ var lID = pParams_o.id; var lClass = pParams_o.className; var lSrc = pParams_o.src; var lFunc = pParams_o.func; var lAsync = pParams_o.async; if(!lID && lSrc) lID = this.getIdBySrc(lSrc); var element = getById(lID); /* если скрипт еще не загружен */ if(!element) { if(!pParams_o.name) return {code: -1, text: 'name can not be empty'}; element = document.createElement(pParams_o.name); if(lID) element.id = lID; if(lClass) element.className = lClass; /* if working with external css * using href in any other case * using src */ pParams_o.name === 'link' ? ((element.href = lSrc) && (element.rel = 'stylesheet')) : element.src = lSrc; /* if passed arguments function * then it's onload by default */ if(pParams_o.func) if(typeof lFunc === 'function'){ element.onload = lFunc; /* element.onreadystatechange = function(){ if(this.readyState === 'loaded') lFunc(); };*/ /* ie */ /* if object - then onload or onerror */ }else if (typeof lFunc === 'object') { if(lFunc.onload && typeof lFunc.onload === 'function'){ element.onload = lFunc.onload; /* element.onreadystatechange = function(){ if(this.readyState === 'loaded') lFunc(); };*/ /* ie */ } } /* if element (js/css) will not loaded * it would be removed from DOM tree * and error image would be shown */ element.onerror = (function(){ (pParams_o.element || document.body) .removeChild(element); Util.Images.showError({ responseText: 'file ' + lSrc + ' could not be loaded' }); if(lFunc.onerror && typeof lFunc.onerror === 'function') lFunc.onerror(); }); if(pParams_o.style){ element.style.cssText=pParams_o.style; } if(lAsync || lAsync === undefined) element.async = true; if(!pParams_o.not_append) (pParams_o.parent || document.body).appendChild(element); if(pParams_o.inner){ element.innerHTML = pParams_o.inner; } } /* если js-файл уже загружен * запускаем функцию onload */ else if(lFunc){ if(typeof lFunc === 'function') lFunc(); else if(typeof lFunc === 'object' && typeof lFunc.onload === 'function') lFunc.onload(); } return element; }, /* Функция загружает js-файл */ this.jsload = function(pSrc, pFunc){ if(pSrc instanceof Array){ for(var i=0; i < pSrc.length; i++) pSrc[i].name = 'script'; return this.anyload(pSrc); } this.anyload({ name : 'script', src : pSrc, func : pFunc }); }, /* Функция создаёт елемент style и записывает туда стили * @pParams_o - структура параметров, заполняеться таким * образом: {src: ' ',func: '', id: '', element: '', inner: ''} * все параметры опциональны */ this.cssSet = (CloudCommander.OLD_BROWSER)? /* if browser is old - make in diferen way */ function(pParams_o){ var lElement = '