jQuery.fn.editInPlace = function(options) {

	var settings = {
		url: "",
		maxlength: "16",
		success: null
	};

	if(options) {
		jQuery.extend(settings, options);
	}

	var loading_image = new Image();
	loading_image.src = "/img/loader.gif";

	String.prototype.escape_html = function() {
		return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
	};

	return this.each(function() {
		
		var editing          = false;
		var click_count      = 0;
		var original_element = $(this);
		
		$(this).click(function(event) {
			event.preventDefault();
			
			click_count++;
			
			if (!editing) {
				editing = true;
				
				var original_html = $(this).html();
				
				original_element.html('<form><input type="text" maxlength="' + settings.maxlength + '" value="' + $.trim($(this).children("span").text().escape_html()) + '" class="editinplace-text" /><br /><input type="submit" value="Save" class="editinplace-save" /> or <a href="/account" title="Cancel" class="editinplace-cancel">Cancel</a></form>');
			
				original_element.children("form").children("input").siblings(0).focus().select();
			}
			
			if (click_count == 1) {
				original_element.children("form").children(".editinplace-cancel").click(function(event) {
					event.preventDefault();				
					
					editing = false;
					click_count = 0;
					
					original_element.html(original_html);
				});
	
				original_element.children("form").children(".editinplace-save").click(function(event) {
					event.preventDefault();
					
					var new_value = $.trim($(this).siblings(0).val().toLowerCase());
	
					original_element.html('<img src="/img/loader.gif" alt="Saving..." class="no-border" />');
					
					if (new_value == "") {
						editing = false;						
						click_count = 0;
						
						original_element.html(original_html);
						
						original_element.children("span").highlightFade({
							start: "#ff8080",
							end: "#fff",
							speed: 1500
						});
					}
					else {
						$.ajax({
							url: settings.url,
							type: "POST",
							data: "field=" + new_value,
							dataType: "json",
							complete: function(request){
								editing = false;
								click_count = 0;
							},
							success: function(json) {
								original_element.html(original_html);
								
								settings.success(json, original_element);
							},
							error: function(request) {
								original_element.html(original_html)
								
								original_element.children("span").highlightFade({
									start: "#ff8080",
									end: "#fff",
									speed: 1500
								});
								
								alert("Error saving value. Please try again.");
							}
						});
					}
				});
			}
		});
	});
};