jQuery.fn.editor = function() {
	
	var methods = {
		init: function(wrapper) {
			var editLink = $('<a>')
				.addClass('edit')
				.html('Edit this page')
				.click(function(){
					wrapper = methods.loadEditor(wrapper);
				}).hide();
			wrapper
				.prepend(editLink)
				.hover(function(){
					$(this).find('a.edit').show();
				}, function(){
					$(this).find('a.edit').hide();
				}).find('div.revisions').show();
			// editor functions
			$('div.actions a.preview').live('click', function(){
				return methods.preview(wrapper);
			});
			$('div.actions a.publish').live('click', function(){
				return methods.publish(wrapper, editLink);
			});
			$('div.actions a.cancel').live('click', function(){
				return methods.cancel(wrapper, editLink);
			});
			$('div.actions a.resume-editing').live('click', function(){
				return methods.edit(wrapper);
			});
			$('div.actions a.revert').live('click', function(){
				return methods.revert(wrapper, editLink, this.rel);
			});
			$('div.revisions a.preview').live('click', function(){
				return methods.revisionPreview(wrapper, this.rel);
			});
			return wrapper;
		},
		loadEditor: function(wrapper) {
			wrapper.load('/engine/pages/edit/'+$('#PageId').val()+'?rand='+new Date().getTime(), null, function(){
				$('textarea#PageContent').tinymce({
					// Location of TinyMCE script
					script_url : '/js/tiny_mce/tiny_mce.js',

					// General options
					theme : "advanced",
					plugins : "safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,filemanager",
					// Allow iframes
					extended_valid_elements : "iframe[src|width|height|name|align|style]",

					// Theme options
					body_class: 'tiny',
					theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,sub,sup,|,justifyleft,justifycenter,justifyright,justifyfull,formatselect,|,bullist,numlist,|,outdent,indent,blockquote,link,unlink,anchor,image,code",
					theme_advanced_buttons2 : "undo,redo,|,cut,copy,paste,pastetext,pasteword,|,tablecontrols,|,hr,removeformat,visualaid,|,charmap,iespell",
					theme_advanced_buttons3 : "",
					theme_advanced_toolbar_location : "top",
					theme_advanced_toolbar_align : "left",
					theme_advanced_statusbar_location : "bottom",
					theme_advanced_resizing : true,
					theme_advanced_resizing_min_width : 930,
					theme_advanced_resizing_max_width : 930,
					theme_advanced_resizing_use_cookie : false,

					// Example content CSS (should be your site CSS)
					content_css : "/css/global.css",

					// Drop lists for link/image/media/template dialogs
					template_external_list_url : "lists/template_list.js",
					external_link_list_url : "lists/link_list.js",
					external_image_list_url : "lists/image_list.js",
					media_external_list_url : "lists/media_list.js",

					// Replace values for the template plugin
					template_replace_values : {
						username : "Some User",
						staffid : "991234"
					}
				});
				$('select.ui-multiselect').multiselect({
					dividerLocation: .5,
					sortable: false
				});
			});
			return wrapper;
		},
		preview: function(wrapper) {
			wrapper.find('div.preview-content').html(tinyMCE.activeEditor.getContent());
			wrapper.children('div.preview').show();
			wrapper.children('div.form').hide();
			return false;
		},
		publish: function(wrapper, editLink) {
			$.post('/engine/pages/edit/'+$('#PageId').val(), $('#PageEditForm').serialize(), function(resp){
				if (resp.success) {
					wrapper.load(window.location.href+'?rand='+new Date().getTime()+' div.page-content-wrapper', function(){
						var editLink = $('<a>')
							.addClass('edit')
							.html('Edit this page')
							.click(function(){
								wrapper = methods.loadEditor(wrapper);
							});
						wrapper.prepend(editLink);
						$('div.revisions').show();
						methods.flash(wrapper, resp.success);
					});
				}
			}, 'json');
			return false;
		},
		cancel: function(wrapper, editLink) {
			wrapper.load(window.location.href+'?rand='+new Date().getTime()+' div.page-content-wrapper', function(){
				var editLink = $('<a>')
					.addClass('edit')
					.html('Edit this page')
					.click(function(){
						wrapper = methods.loadEditor(wrapper);
					});
				wrapper.prepend(editLink).find('div.revisions').show();
				editLink.click(function(){
					return wrapper = methods.loadEditor(wrapper);
				})
			});
			return false;
		},
		edit: function(wrapper) {
			wrapper.children('div.preview').hide();
			wrapper.children('div.form').show();
			return false;
		},
		revert: function(wrapper, editLink, versionId) {
			wrapper.load('/engine/pages/revert/'+versionId+'?rand='+new Date().getTime()+' div.page-content-wrapper', null, function(){
				var editLink = $('<a>')
					.addClass('edit')
					.html('Edit this page')
					.click(function(){
						wrapper = methods.loadEditor(wrapper);
					});
				wrapper.prepend(editLink);
				$('div.revisions').show();
				methods.flash(wrapper, true);
			});
			return false;
		},
		revisionPreview: function(wrapper, versionId) {
			wrapper.load('/engine/pages/view_revision/'+versionId+'?rand='+new Date().getTime());
			return false;
		},
		// displays flash message after publish
		flash: function(wrapper, success) {
			var flash = $('<div>').addClass('flash ajax');
			if (success) {
				flash.addClass('success').html('Your changes have been saved')
			} else {
				flash.addClass('error').html('There was a problem saving your changes');
			}
			wrapper.before(flash).prev('div.flash.ajax').fadeIn(200).delay(1000).fadeOut(200, function(){
				$(this).remove();
			});
		}
	}
	
	return methods.init(this);
}
