Index: wp-admin/page-new.php
===================================================================
--- wp-admin/page-new.php	(revision 6545)
+++ wp-admin/page-new.php	(working copy)
@@ -3,8 +3,6 @@
 $title = __('New Page');
 $parent_file = 'post-new.php';
 $editing = true;
-wp_enqueue_script('prototype');
-wp_enqueue_script('jquery');
 wp_enqueue_script('autosave');
 require_once('admin-header.php');
 ?>
Index: wp-admin/page.php
===================================================================
--- wp-admin/page.php	(revision 6545)
+++ wp-admin/page.php	(working copy)
@@ -52,11 +52,9 @@
 		exit();
 	}
 
-	if($post->post_status == 'draft') {
-		wp_enqueue_script('prototype');
-		wp_enqueue_script('jquery');
+	if ( 'draft' == $post->post_status )
 		wp_enqueue_script('autosave');
-	}
+
 	require_once('admin-header.php');
 
 	if ( !current_user_can('edit_page', $page_ID) )
Index: wp-admin/post-new.php
===================================================================
--- wp-admin/post-new.php	(revision 6545)
+++ wp-admin/post-new.php	(working copy)
@@ -3,8 +3,6 @@
 $title = __('Create New Post');
 $parent_file = 'post-new.php';
 $editing = true;
-wp_enqueue_script('prototype');
-wp_enqueue_script('jquery');
 wp_enqueue_script('autosave');
 wp_enqueue_script('post');
 
Index: wp-admin/post.php
===================================================================
--- wp-admin/post.php	(revision 6545)
+++ wp-admin/post.php	(working copy)
@@ -60,10 +60,8 @@
 
 	wp_enqueue_script('post');
 
-	if( 'draft' == $post->post_status ) {
-		wp_enqueue_script('prototype');
+	if ( 'draft' == $post->post_status )
 		wp_enqueue_script('autosave');
-	}
 
 	require_once('admin-header.php');
 
Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php	(revision 6545)
+++ wp-includes/functions.php	(working copy)
@@ -968,7 +968,7 @@
 
 function wp_nonce_field( $action = -1, $name = "_wpnonce", $referer = true ) {
 	$name = attribute_escape( $name );
-	echo '<input type="hidden" name="' . $name . '" value="' . wp_create_nonce( $action ) . '" />';
+	echo '<input type="hidden" id="' . $name . '" name="' . $name . '" value="' . wp_create_nonce( $action ) . '" />';
 	if ( $referer )
 		wp_referer_field();
 }
Index: wp-includes/js/autosave.js
===================================================================
--- wp-includes/js/autosave.js	(revision 6545)
+++ wp-includes/js/autosave.js	(working copy)
@@ -2,20 +2,16 @@
 var autosavePeriodical;
 
 function autosave_start_timer() {
-	var form = $('post');
-	autosaveLast = form.post_title.value+form.content.value;
+	autosaveLast = jQuery('#post #title').val()+jQuery('#post #content').val();
 	// Keep autosave_interval in sync with edit_post().
-	autosavePeriodical = new PeriodicalExecuter(autosave, autosaveL10n.autosaveInterval);
+	autosavePeriodical = jQuery.schedule({time: autosaveL10n.autosaveInterval, func: autosave, repeat: true, protect: true});
+
 	//Disable autosave after the form has been submitted
-	if(form.addEventListener) {
-		form.addEventListener("submit", function () { autosavePeriodical.currentlyExecuting = true; }, false);
-	}
-	if(form.attachEvent) {
-		form.save ? form.save.attachEvent("onclick", function () { autosavePeriodical.currentlyExecuting = true; }) : null;
-		form.submit ? form.submit.attachEvent("onclick", function () { autosavePeriodical.currentlyExecuting = true; }) : null;
-		form.publish ? form.publish.attachEvent("onclick", function () { autosavePeriodical.currentlyExecuting = true; }) : null;
-		form.deletepost ? form.deletepost.attachEvent("onclick", function () { autosavePeriodical.currentlyExecuting = true; }) : null;
-	}
+	jQuery("#post #submit").submit(function() { jQuery.cancel(autosavePeriodical); });
+	jQuery("#post #save").click(function() { jQuery.cancel(autosavePeriodical); });
+	jQuery("#post #submit").click(function() { jQuery.cancel(autosavePeriodical); });
+	jQuery("#post #publish").click(function() { jQuery.cancel(autosavePeriodical); });
+	jQuery("#post #deletepost").click(function() { jQuery.cancel(autosavePeriodical); });
 }
 addLoadEvent(autosave_start_timer)
 
@@ -26,13 +22,7 @@
 	((now.getSeconds() < 10) ? ":0" : ":") + now.getSeconds();
 }
 
-function autosave_update_nonce() {
-	var response = nonceAjax.response;
-	document.getElementsByName('_wpnonce')[0].value = response;
-}
-
-function autosave_update_post_ID() {
-	var response = autosaveAjax.response;
+function autosave_update_post_ID(response) {
 	var res = parseInt(response);
 	var message;
 
@@ -40,31 +30,28 @@
 		message = autosaveL10n.errorText.replace(/%response%/g, response);
 	} else {
 		message = autosaveL10n.saveText.replace(/%time%/g, autosave_cur_time());
-		$('post_ID').name = "post_ID";
-		$('post_ID').value = res;
+		jQuery('#post_ID').attr({name: "post_ID"});
+		jQuery('#post_ID').val(res);
 		// We need new nonces
-		nonceAjax = new sack();
-		nonceAjax.element = null;
-		nonceAjax.setVar("action", "autosave-generate-nonces");
-		nonceAjax.setVar("post_ID", res);
-		nonceAjax.setVar("cookie", document.cookie);
-		nonceAjax.setVar("post_type", $('post_type').value);
-		nonceAjax.requestFile = autosaveL10n.requestFile;
-		nonceAjax.onCompletion = autosave_update_nonce;
-		nonceAjax.method = "POST";
-		nonceAjax.runAJAX();
-		$('hiddenaction').value = 'editpost';
+		jQuery.post(autosaveL10n.requestFile, {
+			action: "autosave-generate-nonces",
+			post_ID: res,
+			cookie: document.cookie,
+			post_type: jQuery('#post_type').val()
+		}, function(html) {
+			jQuery('#_wpnonce').val(html);
+		});
+		jQuery('#hiddenaction').val('editpost');
 	}
-	$('autosave').innerHTML = message;
+	jQuery('#autosave').html(message);
 	autosave_enable_buttons();
 }
 
 function autosave_loading() {
-	$('autosave').innerHTML = autosaveL10n.savingText;
+	jQuery('#autosave').html(autosaveL10n.savingText);
 }
 
-function autosave_saved() {
-	var response = autosaveAjax.response;
+function autosave_saved(response) {
 	var res = parseInt(response);
 	var message;
 
@@ -73,87 +60,87 @@
 	} else {
 		message = autosaveL10n.saveText.replace(/%time%/g, autosave_cur_time());
 	}
-	$('autosave').innerHTML = message;
+	jQuery('#autosave').html(message);
 	autosave_enable_buttons();
 }
 
 function autosave_disable_buttons() {
-	var form = $('post');
-	form.save ? form.save.disabled = 'disabled' : null;
-	form.submit ? form.submit.disabled = 'disabled' : null;
-	form.publish ? form.publish.disabled = 'disabled' : null;
-	form.deletepost ? form.deletepost.disabled = 'disabled' : null;
+	jQuery("#post #save:enabled").attr('disabled', 'disabled');
+	jQuery("#post #submit:enabled").attr('disabled', 'disabled');
+	jQuery("#post #publish:enabled").attr('disabled', 'disabled');
+	jQuery("#post #deletepost:enabled").attr('disabled', 'disabled');
 	setTimeout('autosave_enable_buttons();', 1000); // Re-enable 1 sec later.  Just gives autosave a head start to avoid collisions.
 }
 
 function autosave_enable_buttons() {
-	var form = $('post');
-	form.save ? form.save.disabled = '' : null;
-	form.submit ? form.submit.disabled = '' : null;
-	form.publish ? form.publish.disabled = '' : null;
-	form.deletepost ? form.deletepost.disabled = '' : null;
+	jQuery("#post #save:disabled").attr('disabled', '');
+	jQuery("#post #submit:disabled").attr('disabled', '');
+	jQuery("#post #publish:disabled").attr('disabled', '');
+	jQuery("#post #deletepost:disabled").attr('disabled', '');
 }
 
 function autosave() {
-	var form = $('post');
 	var rich = ((typeof tinyMCE != "undefined") && tinyMCE.getInstanceById('content')) ? true : false;
+	var post_data = {
+			action: "autosave",
+			post_ID:  jQuery("#post_ID").val() || 0,
+			post_title: jQuery("#title").val() || "",
+			cookie: document.cookie,
+			tags_input: jQuery("#tags-input").val() || "",
+			post_type: jQuery('#post_type').val() || ""
+		};
 
-	autosaveAjax = new sack();
-
 	/* Gotta do this up here so we can check the length when tinyMCE is in use */
 	if ( typeof tinyMCE == "undefined" || tinyMCE.configs.length < 1 || rich == false ) {
-		autosaveAjax.setVar("content", form.content.value);
+		post_data["content"] = jQuery("#content").val();
 	} else {
 		// Don't run while the TinyMCE spellcheck is on.
 		if(tinyMCE.selectedInstance.spellcheckerOn) return;
 		tinyMCE.wpTriggerSave();
-		autosaveAjax.setVar("content", form.content.value);
+		post_data["content"] = jQuery("#content").val();
 	}
 
-	if(form.post_title.value.length==0 || form.content.value.length==0 || form.post_title.value+form.content.value == autosaveLast)
+	if(post_data["post_title"].length==0 || post_data["content"].length==0 || post_data["post_title"] + post_data["content"] == autosaveLast) {
 		return;
+	}
 
 	autosave_disable_buttons();
 
-	autosaveLast = form.post_title.value+form.content.value;
-
-	cats = document.getElementsByName("post_category[]");
+	autosaveLast = jQuery("#title").val()+jQuery("#content").val();
 	goodcats = ([]);
-	for(i=0;i<cats.length;i++) {
-		if(cats[i].checked)
-			goodcats.push(cats[i].value);
-	}
-	catslist = goodcats.join(",");
+	jQuery("[@name='post_category[]']:checked").each( function(i) {
+		goodcats.push(this.value);
+	} );
+	post_data["catslist"] = goodcats.join(",");
 
-	autosaveAjax.setVar("action", "autosave");
-	autosaveAjax.setVar("cookie", document.cookie);
-	autosaveAjax.setVar("catslist", catslist);
-	autosaveAjax.setVar("post_ID", $("post_ID").value);
-	autosaveAjax.setVar("post_title", form.post_title.value);
-	autosaveAjax.setVar("post_type", form.post_type.value);
-	autosaveAjax.setVar("tags_input", form.tags_input.value);
-	if ( form.comment_status.checked )
-		autosaveAjax.setVar("comment_status", 'open');
-	if ( form.ping_status.checked )
-		autosaveAjax.setVar("ping_status", 'open');
-	if(form.excerpt)
-		autosaveAjax.setVar("excerpt", form.excerpt.value);
+	if ( jQuery("#comment_status").attr("checked") )
+		post_data["comment_status"] = 'open';
+	if ( jQuery("#ping_status").attr("checked") )
+		post_data["ping_status"] = 'open';
+	if( jQuery("#excerpt"))
+		post_data["excerpt"] = jQuery("#excerpt").val();
 
 	if ( typeof tinyMCE == "undefined" || tinyMCE.configs.length < 1 || rich == false ) {
-		autosaveAjax.setVar("content", form.content.value);
+		post_data["content"] = jQuery("#content").val();
 	} else {
 		tinyMCE.wpTriggerSave();
-		autosaveAjax.setVar("content", form.content.value);
+		post_data["content"] = jQuery("#content").val();
 	}
 
-	autosaveAjax.requestFile = autosaveL10n.requestFile;
-	autosaveAjax.method = "POST";
-	autosaveAjax.element = null;
-	autosaveAjax.onLoading = autosave_loading;
-	autosaveAjax.onInteractive = autosave_loading;
-	if(parseInt($("post_ID").value) < 1)
-		autosaveAjax.onCompletion = autosave_update_post_ID;
-	else
-		autosaveAjax.onCompletion = autosave_saved;
-	autosaveAjax.runAJAX();
+	if(parseInt(post_data["post_ID"]) < 1) {
+		post_data["temp_ID"] = post_data["post_ID"];
+		jQuery.ajaxSetup({
+			success: function(html) { autosave_update_post_ID(html); }
+		});
+	} else {
+		jQuery.ajaxSetup({
+			success: function(html) { autosave_saved(html); }
+		});
+	}
+	jQuery.ajax({
+		data: post_data,
+		beforeSend: function() { autosave_loading() },
+		type: "POST",
+		url: autosaveL10n.requestFile
+	});
 }
Index: wp-includes/js/jquery/jquery.schedule.js
===================================================================
--- wp-includes/js/jquery/jquery.schedule.js	(revision 0)
+++ wp-includes/js/jquery/jquery.schedule.js	(revision 0)
@@ -0,0 +1,236 @@
+/*
+**  jquery.schedule.js -- jQuery plugin for scheduled/deferred actions
+**  Copyright (c) 2007 Ralf S. Engelschall <rse@engelschall.com> 
+**  Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
+**
+**  $LastChangedDate$
+**  $LastChangedRevision$
+*/
+
+/*
+ *  <div id="button">TEST BUTTON</div>
+ *  <div id="test"></div>
+ *
+ *  <script type="text/javascript">
+ *     $(document).ready(
+ *     function(){
+ *         $('#button').click(function () {
+ *             $(this).css("color", "blue").schedule(2000, function (x) {
+ *                 $(this).css("color", "red");
+ *                 $("#test").html("test: x = " + x);
+ *             }, 42);
+ *         });
+ *     });
+ *  </script>
+ */
+
+(function($) {
+
+    /*  object constructor  */
+    $.scheduler = function () {
+        this.bucket = {};
+        return;
+    };
+
+    /*  object methods  */
+    $.scheduler.prototype = {
+        /*  schedule a task  */
+        schedule: function () {
+            /*  schedule context with default parameters */
+            var ctx = {
+                "id":         null,         /* unique identifier of high-level schedule */
+                "time":       1000,         /* time in milliseconds after which the task is run */
+                "repeat":     false,        /* whether schedule should be automatically repeated */
+                "protect":    false,        /* whether schedule should be protected from double scheduling */
+                "obj":        null,         /* function context object ("this") */
+                "func":       function(){}, /* function to call */
+                "args":       []            /* function arguments to pass */
+            };
+
+            /*  helper function: portable checking whether something is a function  */
+            function _isfn (fn) {
+                return (
+                       !!fn
+                    && typeof fn != "string"
+                    && typeof fn[0] == "undefined"
+                    && RegExp("function", "i").test(fn + "")
+                );
+            };
+            
+            /*  parse arguments into context parameters (part 1/4):
+                detect an override object (special case to support jQuery method) */
+            var i = 0;
+            var override = false;
+            if (typeof arguments[i] == "object" && arguments.length > 1) {
+                override = true;
+                i++;
+            }
+
+            /*  parse arguments into context parameters (part 2/4):
+                support the flexible way of an associated array */
+            if (typeof arguments[i] == "object") {
+                for (var option in arguments[i])
+                    if (typeof ctx[option] != "undefined")
+                        ctx[option] = arguments[i][option];
+                i++;
+            }
+
+            /*  parse arguments into context parameters (part 3/4):
+                support: schedule([time [, repeat], ]{{obj, methodname} | func}[, arg, ...]); */
+            if (   typeof arguments[i] == "number"
+                || (   typeof arguments[i] == "string" 
+                    && arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
+                ctx["time"] = arguments[i++];
+            if (typeof arguments[i] == "boolean")
+                ctx["repeat"] = arguments[i++];
+            if (typeof arguments[i] == "boolean")
+                ctx["protect"] = arguments[i++];
+            if (   typeof arguments[i] == "object"
+                && typeof arguments[i+1] == "string"
+                && _isfn(arguments[i][arguments[i+1]])) {
+                ctx["obj"] = arguments[i++];
+                ctx["func"] = arguments[i++];
+            }
+            else if (   typeof arguments[i] != "undefined"
+                     && (   _isfn(arguments[i]) 
+                         || typeof arguments[i] == "string"))
+                ctx["func"] = arguments[i++];
+            while (typeof arguments[i] != "undefined")
+                ctx["args"].push(arguments[i++]);
+
+            /*  parse arguments into context parameters (part 4/4):
+                apply parameters from override object */
+            if (override) {
+                if (typeof arguments[1] == "object") {
+                    for (var option in arguments[0])
+                        if (   typeof ctx[option] != "undefined"
+                            && typeof arguments[1][option] == "undefined")
+                            ctx[option] = arguments[0][option];
+                }
+                else {
+                    for (var option in arguments[0])
+                        if (typeof ctx[option] != "undefined")
+                            ctx[option] = arguments[0][option];
+                }
+                i++;
+            }
+
+            /*  annotate context with internals */
+            ctx["_scheduler"] = this; /* internal: back-reference to scheduler object */
+            ctx["_handle"]    = null; /* internal: unique handle of low-level task */
+
+            /*  determine time value in milliseconds */
+            var match = String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));
+            if (match && match[0] != "undefined" && match[1] != "undefined")
+                ctx["time"] = String(parseInt(match[1]) *
+                    { s: 1000, m: 1000*60, h: 1000*60*60,
+                      d: 1000*60*60*24, w: 1000*60*60*24*7 }[match[2]]);
+
+            /*  determine unique identifier of task  */
+            if (ctx["id"] == null)
+                ctx["id"] = (  String(ctx["repeat"])  + ":"
+                             + String(ctx["protect"]) + ":"
+                             + String(ctx["time"])    + ":"
+                             + String(ctx["obj"])     + ":"
+                             + String(ctx["func"])    + ":"
+                             + String(ctx["args"])         );
+
+            /*  optionally protect from duplicate calls  */
+            if (ctx["protect"])
+                if (typeof this.bucket[ctx["id"]] != "undefined")
+                    return this.bucket[ctx["id"]];
+
+            /*  support execution of methods by name and arbitrary scripts  */
+            if (!_isfn(ctx["func"])) {
+                if (   ctx["obj"] != null
+                    && typeof ctx["obj"] == "object"
+                    && typeof ctx["func"] == "string"
+                    && _isfn(ctx["obj"][ctx["func"]]))
+                    /*  method by name  */
+                    ctx["func"] = ctx["obj"][ctx["func"]];
+                else
+                    /*  arbitrary script  */
+                    ctx["func"] = eval("function () { " + ctx["func"] + " }");
+            }
+
+            /*  pass-through to internal scheduling operation  */
+            ctx["_handle"] = this._schedule(ctx);
+
+            /*  store context into bucket of scheduler object  */
+            this.bucket[ctx["id"]] = ctx;
+
+            /*  return context  */
+            return ctx;
+        },
+
+        /*  re-schedule a task  */
+        reschedule: function (ctx) {
+            if (typeof ctx == "string")
+                ctx = this.bucket[ctx];
+
+            /*  pass-through to internal scheduling operation  */
+            ctx["_handle"] = this._schedule(ctx);
+
+            /*  return context  */
+            return ctx;
+        },
+
+        /*  internal scheduling operation  */
+        _schedule: function (ctx) {
+            /*  closure to act as the call trampoline function  */
+            var trampoline = function () {
+                /*  jump into function  */
+                var obj = (ctx["obj"] != null ? ctx["obj"] : ctx);
+                (ctx["func"]).apply(obj, ctx["args"]);
+
+                /*  either repeat scheduling and keep in bucket or
+                    just stop scheduling and delete from scheduler bucket  */
+                if (   /* not cancelled from inside... */
+                       typeof (ctx["_scheduler"]).bucket[ctx["id"]] != "undefined"
+                    && /* ...and repeating requested */
+                       ctx["repeat"])
+                    (ctx["_scheduler"])._schedule(ctx);
+                else
+                    delete (ctx["_scheduler"]).bucket[ctx["id"]];
+            };
+
+            /*  schedule task and return handle  */
+            return setTimeout(trampoline, ctx["time"]);
+        },
+
+        /*  cancel a scheduled task  */
+        cancel: function (ctx) {
+            if (typeof ctx == "string")
+                ctx = this.bucket[ctx];
+
+            /*  cancel scheduled task  */
+            if (typeof ctx == "object") {
+                clearTimeout(ctx["_handle"]);
+                delete this.bucket[ctx["id"]];
+            }
+        }
+    };
+
+    /* integrate a global instance of the scheduler into the global jQuery object */
+    $.extend({
+        scheduler$: new $.scheduler(),
+        schedule:   function () { return $.scheduler$.schedule.apply  ($.scheduler$, arguments) },
+        reschedule: function () { return $.scheduler$.reschedule.apply($.scheduler$, arguments) },
+        cancel:     function () { return $.scheduler$.cancel.apply    ($.scheduler$, arguments) }
+    });
+
+    /* integrate scheduling convinience method into all jQuery objects */
+    $.fn.extend({
+        schedule: function () {
+            var a = [ {} ];
+            for (var i = 0; i < arguments.length; i++)
+                a.push(arguments[i]);
+            return this.each(function () {
+                a[0] = { "id": this, "obj": this };
+                return $.schedule.apply($, a);
+            });
+        }
+    });
+
+})(jQuery);
+
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 6545)
+++ wp-includes/post.php	(working copy)
@@ -1002,11 +1002,15 @@
 	if (empty($post_date)) {
 		if ( !in_array($post_status, array('draft', 'pending')) )
 			$post_date = current_time('mysql');
+		else
+			$post_date = '0000-00-00 00:00:00';
 	}
 
 	if (empty($post_date_gmt)) {
 		if ( !in_array($post_status, array('draft', 'pending')) )
 			$post_date_gmt = get_gmt_from_date($post_date);
+		else
+			$post_date = '0000-00-00 00:00:00';
 	}
 
 	if ( $update ) {
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 6545)
+++ wp-includes/script-loader.php	(working copy)
@@ -36,9 +36,9 @@
 
 		$this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6');
 
-		$this->add( 'autosave', '/wp-includes/js/autosave.js', array('prototype', 'sack'), '20070306');
+		$this->add( 'autosave', '/wp-includes/js/autosave.js', array('jquery', 'schedule'), '20080104');
 		$this->localize( 'autosave', 'autosaveL10n', array(
-			'autosaveInterval' => apply_filters('autosave_interval', '120'),
+			'autosaveInterval' => apply_filters('autosave_interval', '2m'),
 			'errorText' => __('Error: %response%'),
 			'saveText' => __('Saved at %time%.'),
 			'requestFile' => get_option( 'siteurl' ) . '/wp-admin/admin-ajax.php',
@@ -80,6 +80,7 @@
 		$this->add( 'interface', '/wp-includes/js/jquery/interface.js', array('jquery'), '1.2');
 		$this->add( 'dimensions', '/wp-includes/js/jquery/jquery.dimensions.min.js', array('jquery'), '1.1.2');
 		$this->add( 'suggest', '/wp-includes/js/jquery/suggest.js', array('dimensions'), '1.1');
+		$this->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array('jquery'), '20');
 
 		if ( is_admin() ) {
 			global $pagenow;
