// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
|
|
//
|
|
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
|
|
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
|
|
// $Id$
|
|
|
|
CKEDITOR.plugins.add( 'autosave',
|
|
{
|
|
// declare property to hold the state
|
|
ajaxAutoSaveIsDirty: false,
|
|
// declare a counter to give us a few keystrokes leeway
|
|
ajaxAutoSaveCounter: 0,
|
|
// declare a status flag so we know if a draft has been saved
|
|
ajaxAutoSaveDraftSaved: false,
|
|
// shortcut to my button
|
|
button: null,
|
|
editor: null,
|
|
|
|
init: function( editor ) {
|
|
|
|
var asplugin = this; // for closure references later
|
|
this.editor = editor;
|
|
|
|
editor.ui.addButton( 'autosave', {
|
|
label: 'Auto Save',
|
|
command: 'autosave',
|
|
icon: editor.config._TikiRoot + 'img/ckeditor/ajaxSaveClean.gif'
|
|
|
|
} );
|
|
|
|
editor.addCommand('autosave', new CKEDITOR.command(editor,
|
|
{
|
|
modes: {wysiwyg: 1, source: 1},
|
|
canUndo: false
|
|
})
|
|
);
|
|
|
|
// button clicked or timer
|
|
editor.commands.autosave.exec = function () {
|
|
asplugin.ajaxAutoSaveIsDirty = true; // force
|
|
return asplugin.doAjaxSave(editor);
|
|
};
|
|
|
|
|
|
// preload toolbar loading image
|
|
var tempNode = new Image();
|
|
tempNode.src = editor.config._TikiRoot + 'img/ckeditor/loadingSmall.gif';
|
|
|
|
editor.element.$.form.onsubmit = function() {
|
|
asplugin.onSave( editor );
|
|
};
|
|
|
|
//var plugs = this.plugin;
|
|
editor.on( 'contentDom', function() {
|
|
this.document.on('keydown', function(event) {
|
|
// Do not capture CTRL hotkeys.
|
|
if (!event.data.$.ctrlKey && !event.data.$.metaKey) {
|
|
asplugin.onSelectionChange(editor);
|
|
}
|
|
});
|
|
// Also chgeck for autosave changes after toolbar commands.
|
|
editor.on( 'afterCommandExec', function(event) {asplugin.onSelectionChange(editor);} );
|
|
|
|
});
|
|
|
|
editor.on('blur', function(event) {
|
|
asplugin.doAjaxSave(editor);
|
|
});
|
|
}, // end init
|
|
|
|
doAjaxSave: function (editor) {
|
|
editor.updateElement(); // workaround for a bug in Firefox where the textarea doesn't get updated properly
|
|
var data = editor.getData();
|
|
if (this.ajaxAutoSaveIsDirty && data != "ajax error") {
|
|
this.changeIcon("loadingSmall.gif");
|
|
|
|
var asplugin = this;
|
|
jQuery.ajax({
|
|
url: $.service("autosave", "save"),
|
|
data: {
|
|
referer: editor.config.autoSaveSelf,
|
|
editor_id: editor.name,
|
|
data: data
|
|
},
|
|
type: "POST",
|
|
// good callback
|
|
success: function(data) {
|
|
|
|
// update AJAX preview if there
|
|
if (parent.window.ajaxPreviewWindow && typeof parent.window.ajaxPreviewWindow.get_new_preview === 'function') {
|
|
parent.window.ajaxPreviewWindow.get_new_preview();
|
|
} else {
|
|
ajax_preview( editor.name, editor.config.autoSaveSelf, true );
|
|
}
|
|
// reset state
|
|
asplugin.ajaxAutoSaveIsDirty = false;
|
|
asplugin.ajaxAutoSaveCounter = 0;
|
|
asplugin.ajaxAutoSaveDraftSaved = true;
|
|
// show
|
|
asplugin.changeIcon("tick_animated.gif");
|
|
// clear anim
|
|
setTimeout(function() {
|
|
asplugin.resetAjaxAutoSaveTool();
|
|
}, 2000);
|
|
|
|
},
|
|
// bad callback - no good info in the params :(
|
|
error: function(req, status, error) {
|
|
asplugin.changeIcon("cross_animated.gif"); // just leave a cross there
|
|
}
|
|
});
|
|
}
|
|
return true;
|
|
},
|
|
|
|
onSave: function( editor ) {
|
|
this.ajaxAutoSaveIsDirty = false;
|
|
// remove draft when page saved
|
|
if (parent && typeof parent.remove_save === 'function') {
|
|
parent.remove_save(editor.name, editor.config.autoSaveSelf);
|
|
}
|
|
return true;
|
|
},
|
|
|
|
// what to do when the ckeditor content is changed
|
|
onSelectionChange: function( editor ) {
|
|
|
|
var asplugin;
|
|
|
|
if (!this.ajaxAutoSaveIsDirty) {
|
|
this.changeIcon("ajaxSaveDirty.gif");
|
|
|
|
this.ajaxAutoSaveCounter++;
|
|
|
|
if (this.ajaxAutoSaveCounter > CKEDITOR.config.ajaxAutoSaveSensitivity) {
|
|
if (!asplugin) {
|
|
asplugin = this;
|
|
setTimeout(function() {
|
|
asplugin.doAjaxSave( editor );
|
|
asplugin = null;
|
|
}, CKEDITOR.config.ajaxAutoSaveRefreshTime * 1000);
|
|
|
|
this.ajaxAutoSaveIsDirty = true;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
},
|
|
|
|
getButton: function () {
|
|
if (!this.button) {
|
|
this.button = this.editor.getCommand("autosave").uiItems[0];
|
|
}
|
|
return this.button;
|
|
},
|
|
|
|
changeIcon: function( fileName ) {
|
|
if (this.getButton()) {
|
|
// use of jquery - must be a better "ck-way" of doing this
|
|
var $img = jQuery("#" + this.button._.id + " span:first");
|
|
if ($img.length) {
|
|
$img.css("background-image", $img.css("background-image").replace(/[^\/]*\.gif/i, fileName));
|
|
}
|
|
}
|
|
},
|
|
|
|
setMessage: function(errorMessage, errorData) {
|
|
var message;
|
|
|
|
message = errorMessage + (errorData ? ' ' + errorData : '');
|
|
|
|
if (this.getButton()) {
|
|
this.button.label = message; // doesn't seem to...
|
|
}
|
|
},
|
|
|
|
resetAjaxAutoSaveTool: function() {
|
|
this.changeIcon( "ajaxSaveClean.gif" );
|
|
if (this.getButton()) {
|
|
this.button.label = "Auto Save";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
});
|