/**
 * $Id: editor_plugin_src.js 251 2007-04-10 20:16:15Z spocke $
 *
 * @author Moxiecode
 * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
 */

/* Import plugin specific language pack */
tinyMCE.importPluginLanguagePack('save');

var TinyMCE_SavePlugin = {
	getInfo : function() {
		return {
			longname : 'Save',
			author : 'Moxiecode Systems AB',
			authorurl : 'http://tinymce.moxiecode.com',
			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save',
			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
		};
	},

	initInstance : function(inst) {
		inst.addShortcut('ctrl', 's', 'lang_save_desc', 'mceSave');
	},

	/**
	 * Returns the HTML contents of the save control.
	 */
	getControlHTML : function(cn) {
		switch (cn) {
			case "save":
				return tinyMCE.getButtonHTML(cn, 'lang_save_desc', '{$pluginurl}/images/save.gif', 'mceSave');

			case "cancel":
				return tinyMCE.getButtonHTML(cn, 'lang_cancel_desc', '{$pluginurl}/images/cancel.gif', 'mceCancel');
		}

		return "";
	},

	/**
	 * Executes the save command.
	 */
	execCommand : function(editor_id, element, command, user_interface, value) {
		// Handle commands
		switch (command) {
			case "mceSave":
				return this._save(editor_id, element, command, user_interface, value);

			case "mceCancel":
				return this._cancel(editor_id, element, command, user_interface, value);
		}

		// Pass to next handler in chain
		return false;
	},

	_save : function(editor_id, element, command, user_interface, value) {
		var inst, formObj, os, i, elementId;

		if (tinyMCE.getParam("fullscreen_is_enabled"))
			return true;

		inst = tinyMCE.selectedInstance;
		formObj = inst.formElement.form;

		if (tinyMCE.getParam("save_enablewhendirty") && !inst.isDirty())
			return true;

		if (formObj) {
			tinyMCE.triggerSave();

			// Use callback instead
			if ((os = tinyMCE.getParam("save_onsavecallback"))) {
				if (eval(os + '(inst);')) {
					inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);
					/*inst.undoLevels = new Array();
					inst.undoIndex = 0;
					inst.typingUndoIndex = -1;
					inst.undoRedo = true;
					inst.undoLevels[inst.undoLevels.length] = inst.startContent;*/
					tinyMCE.triggerNodeChange(false, true);
				}

				return true;
			}

			// Disable all UI form elements that TinyMCE created
			for (i=0; i<formObj.elements.length; i++) {
				elementId = formObj.elements[i].name ? formObj.elements[i].name : formObj.elements[i].id;

				if (elementId.indexOf('mce_editor_') == 0)
					formObj.elements[i].disabled = true;
			}

			inst.isNotDirty = true;

			if (formObj.onsubmit == null || formObj.onsubmit() != false)
				inst.formElement.form.submit();

			tinyMCE.triggerNodeChange(false, true);
		} else
			alert("Error: No form element found.");

		return true;
	},

	_cancel : function(editor_id, element, command, user_interface, value) {
		var inst = tinyMCE.getInstanceById(editor_id), os, h = tinyMCE.trim(inst.startContent);

		// Use callback instead
		if ((os = tinyMCE.getParam("save_oncancelcallback"))) {
			if (eval(os + '(inst);'))
				return true;
		}

		inst.setHTML(h);

		inst.undoRedo.undoLevels = [];
		inst.undoRedo.add({ content : h });
		inst.undoRedo.undoIndex = 0;
		inst.undoRedo.typingUndoIndex = -1;

		tinyMCE.triggerNodeChange(false, true);

		return true;
	},

	handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
		var inst;

		if (tinyMCE.getParam("fullscreen_is_enabled")) {
			tinyMCE.switchClass(editor_id + '_save', 'mceButtonDisabled');
			return true;
		}

		if (tinyMCE.getParam("save_enablewhendirty")) {
			inst = tinyMCE.getInstanceById(editor_id);

			if (inst.isDirty()) {
				tinyMCE.switchClass(editor_id + '_save', 'mceButtonNormal');
				return true;
			}

			tinyMCE.switchClass(editor_id + '_save', 'mceButtonDisabled');
		}

		return true;
	}
};

tinyMCE.addPlugin("save", TinyMCE_SavePlugin);
