You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

186 lines
6.0 KiB

// (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";
}
}
});