define([ 'jquery', '/common/common-interface.js', '/bower_components/chainpad-json-validator/json-ot.js', '/bower_components/chainpad/chainpad.dist.js', ], function ($, UI, JsonOT) { var ChainPad = window.ChainPad; var History = {}; var getStates = function (rt) { var states = []; var b = rt.getAuthBlock(); if (b) { states.unshift(b); } while (b.getParent()) { b = b.getParent(); states.unshift(b); } return states; }; var loadHistory = function (config, common, cb) { var createRealtime = function () { return ChainPad.create({ userName: 'history', validateContent: function (content) { try { JSON.parse(content); return true; } catch (e) { console.log('Failed to parse, rejecting patch'); return false; } }, initialState: '', transformFunction: JsonOT.validate, logLevel: config.debug ? 1 : 0, noPrune: true }); }; var realtime = createRealtime(); History.readOnly = common.getMetadataMgr().getPrivateData().readOnly; var to = window.setTimeout(function () { cb('[GET_FULL_HISTORY_TIMEOUT]'); }, 30000); common.getFullHistory(realtime, function () { window.clearTimeout(to); cb(null, realtime); }); }; History.create = function (common, config) { if (!config.$toolbar) { return void console.error("config.$toolbar is undefined");} if (History.loading) { return void console.error("History is already being loaded..."); } History.loading = true; var $toolbar = config.$toolbar; if (!config.applyVal || !config.setHistory || !config.onLocal || !config.onRemote) { throw new Error("Missing config element: applyVal, onLocal, onRemote, setHistory"); } // config.setHistory(bool, bool) // - bool1: history value // - bool2: reset old content? var render = function (val) { if (typeof val === "undefined") { return; } try { config.applyVal(val); } catch (e) { // Probably a parse error console.error(e); } }; var onClose = function () { config.setHistory(false, true); }; var onRevert = function () { config.setHistory(false, false); config.onLocal(); config.onRemote(); }; config.setHistory(true); var onReady = function () { }; var Messages = common.Messages; var realtime; var states = []; var c = states.length - 1; var $hist = $toolbar.find('.cp-toolbar-history'); var $left = $toolbar.find('.cp-toolbar-leftside'); var $right = $toolbar.find('.cp-toolbar-rightside'); var $cke = $toolbar.find('.cke_toolbox_main'); $hist.html('').show(); $left.hide(); $right.hide(); $cke.hide(); UI.spinner($hist).get().show(); var onUpdate; var update = function () { if (!realtime) { return []; } states = getStates(realtime); if (typeof onUpdate === "function") { onUpdate(); } return states; }; // Get the content of the selected version, and change the version number var get = function (i) { i = parseInt(i); if (isNaN(i)) { return; } if (i < 0) { i = 0; } if (i > states.length - 1) { i = states.length - 1; } var val = states[i].getContent().doc; c = i; if (typeof onUpdate === "function") { onUpdate(); } $hist.find('.cp-toolbar-history-next, .cp-toolbar-history-previous').css('visibility', ''); if (c === states.length - 1) { $hist.find('.cp-toolbar-history-next').css('visibility', 'hidden'); } if (c === 0) { $hist.find('.cp-toolbar-history-previous').css('visibility', 'hidden'); } if (config.debug) { console.log(states[i]); var ops = states[i] && states[i].getPatch() && states[i].getPatch().operations; if (Array.isArray(ops)) { ops.forEach(function (op) { console.log(op); }); } } return val || ''; }; var getNext = function (step) { return typeof step === "number" ? get(c + step) : get(c + 1); }; var getPrevious = function (step) { return typeof step === "number" ? get(c - step) : get(c - 1); }; // Create the history toolbar var display = function () { $hist.html(''); var $prev =$('