whole_func_string: function(ed, url) {
  			var self = this, settings = ed.settings;
  
  			self.editor = ed;
  
  			// Parses the specified time string into a milisecond number 10m, 10s etc.
  			function parseTime(time) {
  				var multipels = {
  					s : 1000,
  					m : 60000
  				};
  
  				time = /^(\d+)([ms]?)$/.exec('' + time);
  
  				return (time[2] ? multipels[time[2]] : 1) * parseInt(time);
  			};
  
  			// Default config
  			tinymce.each({
  				ask_before_unload : TRUE,
  				interval : '30s',
  				retention : '20m',
  				minlength : 50
  			}, function(value, key) {
  				key = PLUGIN_NAME + '_' + key;
  
  				if (settings[key] === undefined)
  					settings[key] = value;
  			});
  
  			// Parse times
  			settings.autosave_interval = parseTime(settings.autosave_interval);
  			settings.autosave_retention = parseTime(settings.autosave_retention);
  
  			// Register restore button
  			ed.addButton(RESTORE_DRAFT, {
  				title : PLUGIN_NAME + ".restore_content",
  				onclick : function() {
  					if (ed.getContent({draft: true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/gi, "").length > 0) {
  						// Show confirm dialog if the editor isn't empty
  						ed.windowManager.confirm(
  							PLUGIN_NAME + ".warning_message",
  							function(ok) {
  								if (ok)
  									self.restoreDraft();
  							}
  						);
  					} else
  						self.restoreDraft();
  				}
  			});
  
  			// Enable/disable restoredraft button depending on if there is a draft stored or not
  			ed.onNodeChange.add(function() {
  				var controlManager = ed.controlManager;
  
  				if (controlManager.get(RESTORE_DRAFT))
  					controlManager.setDisabled(RESTORE_DRAFT, !self.hasDraft());
  			});
  
  			ed.onInit.add(function() {
  				// Check if the user added the restore button, then setup auto storage logic
  				if (ed.controlManager.get(RESTORE_DRAFT)) {
  					// Setup storage engine
  					self.setupStorage(ed);
  
  					// Auto save contents each interval time
  					setInterval(function() {
  						if (!ed.removed) {
  							self.storeDraft();
  							ed.nodeChanged();
  						}
  					}, settings.autosave_interval);
  				}
  			});
  
  			/**
  			 * This event gets fired when a draft is stored to local storage.
  			 *
  			 * @event onStoreDraft
  			 * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
  			 * @param {Object} draft Draft object containing the HTML contents of the editor.
  			 */
  			self.onStoreDraft = new Dispatcher(self);
  
  			/**
  			 * This event gets fired when a draft is restored from local storage.
  			 *
  			 * @event onStoreDraft
  			 * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
  			 * @param {Object} draft Draft object containing the HTML contents of the editor.
  			 */
  			self.onRestoreDraft = new Dispatcher(self);
  
  			/**
  			 * This event gets fired when a draft removed/expired.
  			 *
  			 * @event onRemoveDraft
  			 * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
  			 * @param {Object} draft Draft object containing the HTML contents of the editor.
  			 */
  			self.onRemoveDraft = new Dispatcher(self);
  
  			// Add ask before unload dialog only add one unload handler
  			if (!unloadHandlerAdded) {
  				window.onbeforeunload = tinymce.plugins.AutoSave._beforeUnloadHandler;
  				unloadHandlerAdded = TRUE;
  			}
  		}
func_code_string: function(ed, url) {
  			var self = this, settings = ed.settings;
  
  			self.editor = ed;
  
  			// Parses the specified time string into a milisecond number 10m, 10s etc.
  			function parseTime(time) {
  				var multipels = {
  					s : 1000,
  					m : 60000
  				};
  
  				time = /^(\d+)([ms]?)$/.exec('' + time);
  
  				return (time[2] ? multipels[time[2]] : 1) * parseInt(time);
  			};
  
  			// Default config
  			tinymce.each({
  				ask_before_unload : TRUE,
  				interval : '30s',
  				retention : '20m',
  				minlength : 50
  			}, function(value, key) {
  				key = PLUGIN_NAME + '_' + key;
  
  				if (settings[key] === undefined)
  					settings[key] = value;
  			});
  
  			// Parse times
  			settings.autosave_interval = parseTime(settings.autosave_interval);
  			settings.autosave_retention = parseTime(settings.autosave_retention);
  
  			// Register restore button
  			ed.addButton(RESTORE_DRAFT, {
  				title : PLUGIN_NAME + ".restore_content",
  				onclick : function() {
  					if (ed.getContent({draft: true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/gi, "").length > 0) {
  						// Show confirm dialog if the editor isn't empty
  						ed.windowManager.confirm(
  							PLUGIN_NAME + ".warning_message",
  							function(ok) {
  								if (ok)
  									self.restoreDraft();
  							}
  						);
  					} else
  						self.restoreDraft();
  				}
  			});
  
  			// Enable/disable restoredraft button depending on if there is a draft stored or not
  			ed.onNodeChange.add(function() {
  				var controlManager = ed.controlManager;
  
  				if (controlManager.get(RESTORE_DRAFT))
  					controlManager.setDisabled(RESTORE_DRAFT, !self.hasDraft());
  			});
  
  			ed.onInit.add(function() {
  				// Check if the user added the restore button, then setup auto storage logic
  				if (ed.controlManager.get(RESTORE_DRAFT)) {
  					// Setup storage engine
  					self.setupStorage(ed);
  
  					// Auto save contents each interval time
  					setInterval(function() {
  						if (!ed.removed) {
  							self.storeDraft();
  							ed.nodeChanged();
  						}
  					}, settings.autosave_interval);
  				}
  			});
  
  			/**
  			 * This event gets fired when a draft is stored to local storage.
  			 *
  			 * @event onStoreDraft
  			 * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
  			 * @param {Object} draft Draft object containing the HTML contents of the editor.
  			 */
  			self.onStoreDraft = new Dispatcher(self);
  
  			/**
  			 * This event gets fired when a draft is restored from local storage.
  			 *
  			 * @event onStoreDraft
  			 * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
  			 * @param {Object} draft Draft object containing the HTML contents of the editor.
  			 */
  			self.onRestoreDraft = new Dispatcher(self);
  
  			/**
  			 * This event gets fired when a draft removed/expired.
  			 *
  			 * @event onRemoveDraft
  			 * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
  			 * @param {Object} draft Draft object containing the HTML contents of the editor.
  			 */
  			self.onRemoveDraft = new Dispatcher(self);
  
  			// Add ask before unload dialog only add one unload handler
  			if (!unloadHandlerAdded) {
  				window.onbeforeunload = tinymce.plugins.AutoSave._beforeUnloadHandler;
  				unloadHandlerAdded = TRUE;
  			}
  		}
func_documentation_string: Initializes the plugin, this will be executed after the plugin has been created.
  This call is done before the editor instance has finished it's initialization so use the onInit event
  of the editor instance to intercept that event.
  
  @method init
  @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
  @param {string} url Absolute URL to where the plugin is located.