define([ 'jquery', '/bower_components/nthen/index.js', '/customize/messages.js', '/common/sframe-chainpad-netflux-inner.js', '/common/sframe-channel.js', '/common/sframe-common-title.js', '/common/sframe-common-interface.js', '/common/sframe-common-history.js', '/common/metadata-manager.js', '/customize/application_config.js', '/common/cryptpad-common.js', '/common/common-realtime.js' ], function ($, nThen, Messages, CpNfInner, SFrameChannel, Title, UI, History, MetadataMgr, AppConfig, Cryptpad, CommonRealtime) { // Chainpad Netflux Inner var funcs = {}; var ctx = {}; funcs.Messages = Messages; funcs.startRealtime = function (options) { if (ctx.cpNfInner) { return ctx.cpNfInner; } options.sframeChan = ctx.sframeChan; options.metadataMgr = ctx.metadataMgr; ctx.cpNfInner = CpNfInner.start(options); ctx.cpNfInner.metadataMgr.onChangeLazy(options.onLocal); return ctx.cpNfInner; }; funcs.getMetadataMgr = function () { return ctx.metadataMgr; }; funcs.getCryptpadCommon = function () { return Cryptpad; }; var isLoggedIn = funcs.isLoggedIn = function () { if (!ctx.cpNfInner) { throw new Error("cpNfInner is not ready!"); } return ctx.cpNfInner.metadataMgr.getPrivateData().accountName; }; var titleUpdated; funcs.updateTitle = function (title, cb) { ctx.metadataMgr.updateTitle(title); titleUpdated = cb; }; // UI funcs.createUserAdminMenu = UI.createUserAdminMenu; funcs.displayAvatar = UI.displayAvatar; // History funcs.getHistory = function (config) { return History.create(funcs, config); }; // Title module funcs.createTitle = Title.create; funcs.getDefaultTitle = function () { if (!ctx.cpNfInner) { throw new Error("cpNfInner is not ready!"); } return ctx.cpNfInner.metadataMgr.getMetadata().defaultTitle; }; funcs.setDisplayName = function (name, cb) { ctx.sframeChan.query('Q_SETTINGS_SET_DISPLAY_NAME', name, function (err) { if (cb) { cb(err); } }); }; funcs.logout = function (cb) { ctx.sframeChan.query('Q_LOGOUT', null, function (err) { if (cb) { cb(err); } }); }; funcs.notify = function () { ctx.sframeChan.event('EV_NOTIFY'); }; funcs.setLoginRedirect = function (cb) { ctx.sframeChan.query('Q_SET_LOGIN_REDIRECT', null, function (err) { if (cb) { cb(err); } }); }; funcs.sendAnonRpcMsg = function (msg, content, cb) { ctx.sframeChan.query('Q_ANON_RPC_MESSAGE', { msg: msg, content: content }, function (err, data) { if (cb) { cb(data); } }); }; funcs.isOverPinLimit = function (cb) { ctx.sframeChan.query('Q_GET_PIN_LIMIT_STATUS', null, function (err, data) { cb(data.error, data.overLimit, data.limits); }); }; funcs.getFullHistory = function (realtime, cb) { ctx.sframeChan.on('EV_RT_HIST_MESSAGE', function (content) { realtime.message(content); }); ctx.sframeChan.query('Q_GET_FULL_HISTORY', null, cb); }; funcs.getPadAttribute = function (key, cb) { ctx.sframeChan.query('Q_GET_PAD_ATTRIBUTE', { key: key }, function (err, res) { cb (err || res.error, res.data); }); }; funcs.setPadAttribute = function (key, value, cb) { ctx.sframeChan.query('Q_SET_PAD_ATTRIBUTE', { key: key, value: value }, function (err, data) { cb(); }); }; // Friends var pendingFriends = []; funcs.getPendingFriends = function () { return pendingFriends.slice(); }; funcs.sendFriendRequest = function (netfluxId) { ctx.sframeChan.query('Q_SEND_FRIEND_REQUEST', netfluxId, $.noop); pendingFriends.push(netfluxId); }; // Feedback funcs.feedback = function (action, force) { if (force !== true) { if (!action) { return; } try { if (!ctx.metadataMgr.getPrivateData().feedbackAllowed) { return; } } catch (e) { return void console.error(e); } } var randomToken = Math.random().toString(16).replace(/0./, ''); //var origin = ctx.metadataMgr.getPrivateData().origin; var href = /*origin +*/ '/common/feedback.html?' + action + '=' + randomToken; $.ajax({ type: "HEAD", url: href, }); }; var prepareFeedback = function (key) { if (typeof(key) !== 'string') { return $.noop; } var type = ctx.metadataMgr.getMetadata().type; return function () { funcs.feedback((key + (type? '_' + type: '')).toUpperCase()); }; }; // BUTTONS var isStrongestStored = function () { var data = ctx.metadataMgr.getPrivateData(); return !data.readOnly || !data.availableHashes.editHash; }; funcs.createButton = function (type, rightside, data, callback) { var button; var size = "17px"; switch (type) { case 'export': button = $('