diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php
index 0beb5bca0a..4e27900216 100644
--- a/wp-admin/admin-ajax.php
+++ b/wp-admin/admin-ajax.php
@@ -5,7 +5,6 @@ require_once('admin-db.php');
define('DOING_AJAX', true);
-
check_ajax_referer();
if ( !is_user_logged_in() )
die('-1');
@@ -13,19 +12,17 @@ if ( !is_user_logged_in() )
function get_out_now() { exit; }
add_action( 'shutdown', 'get_out_now', -1 );
-function wp_ajax_echo_meta( $pid, $mid, $key, $value ) {
+function wp_ajax_meta_row( $pid, $mid, $key, $value ) {
$value = wp_specialchars($value, true);
$key_js = addslashes(wp_specialchars($key, 'double'));
$key = wp_specialchars($key, true);
- $r = "$mid$pid";
$r .= "";
$r .= "";
$r .= " | | ";
$r .= " ";
$r .= "";
- $r .= " |
]]>";
+ $r .= "' );\" class='deletemeta' tabindex='6' value='Delete' />";
return $r;
}
@@ -113,7 +110,7 @@ case 'add-category' : // On the Fly
if ( !current_user_can( 'manage_categories' ) )
die('-1');
$names = explode(',', $_POST['newcat']);
- $r = "";
+ $x = new WP_Ajax_Response();
foreach ( $names as $cat_name ) {
$cat_name = trim($cat_name);
if ( !$category_nicename = sanitize_title($cat_name) )
@@ -121,14 +118,13 @@ case 'add-category' : // On the Fly
if ( !$cat_id = category_exists( $cat_name ) )
$cat_id = wp_create_category( $cat_name );
$cat_name = wp_specialchars(stripslashes($cat_name));
- $r .= "$cat_id";
- $r .= "]]>";
+ $x->add( array(
+ 'what' => 'category',
+ 'id' => $cat_id,
+ 'data' => ""
+ ) );
}
- $r .= '';
- header('Content-type: text/xml');
- die($r);
+ $x->send();
break;
case 'add-cat' : // From Manage->Categories
if ( !current_user_can( 'manage_categories' ) )
@@ -147,12 +143,13 @@ case 'add-cat' : // From Manage->Categories
}
$cat_full_name = wp_specialchars( $cat_full_name, 1 );
- $r = "";
- $r .= "$cat->cat_ID$cat_full_name";
- $r .= _cat_row( $cat, $level, $cat_full_name );
- $r .= "]]>";
- header('Content-type: text/xml');
- die($r);
+ $x = new WP_Ajax_Response( array(
+ 'what' => 'cat',
+ 'id' => $cat->cat_ID,
+ 'data' => _cat_row( $cat, $level, $cat_full_name ),
+ 'supplemental' => array('name' => $cat_full_name)
+ ) );
+ $x->send();
break;
case 'add-meta' :
if ( !current_user_can( 'edit_post', $id ) )
@@ -171,11 +168,13 @@ case 'add-meta' :
$value = $meta->meta_value;
$pid = (int) $meta->post_id;
- $r = "";
- $r .= wp_ajax_echo_meta( $pid, $mid, $key, $value );
- $r .= '';
- header('Content-type: text/xml');
- die($r);
+ $x = new WP_Ajax_Response( array(
+ 'what' => 'meta',
+ 'id' => $mid,
+ 'data' => wp_ajax_meta_row( $pid, $mid, $key, $value ),
+ 'supplemental' => array('postid' => $pid)
+ ) );
+ $x->send();
break;
case 'update-meta' :
$mid = (int) array_pop(array_keys($_POST['meta']));
@@ -185,33 +184,36 @@ case 'update-meta' :
die('0');
if ( !current_user_can( 'edit_post', $meta->post_id ) )
die('-1');
- $r = "";
if ( $u = update_meta( $mid, $key, $value ) ) {
$key = stripslashes($key);
$value = stripslashes($value);
- $r .= wp_ajax_echo_meta( $meta->post_id, $mid, $key, $value );
+ $x = new WP_Ajax_Response( array(
+ 'what' => 'meta',
+ 'id' => $mid,
+ 'data' => wp_ajax_meta_row( $meta->post_id, $mid, $key, $value ),
+ 'supplemental' => array('postid' => $meta->post_id)
+ ) );
+ $x->send();
}
- $r .= '';
- header('Content-type: text/xml');
- die($r);
+ die('0');
break;
case 'add-user' :
if ( !current_user_can('edit_users') )
die('-1');
require_once(ABSPATH . WPINC . '/registration.php');
- $user_id = add_user();
- if ( is_wp_error( $user_id ) ) {
- foreach( $user_id->get_error_messages() as $message )
- echo "$message
";
- exit;
- } elseif ( !$user_id ) {
+ if ( !$user_id = add_user() )
die('0');
+ elseif ( is_wp_error( $user_id ) ) {
+ foreach( $user_id->get_error_messages() as $message )
+ echo "
$message
";
+ exit;
}
- $r = "$user_id";
- $r .= user_row( $user_id );
- $r .= "]]>";
- header('Content-type: text/xml');
- die($r);
+ $x = new WP_Ajax_Response( array(
+ 'what' => 'user',
+ 'id' => $user_id,
+ 'data' => user_row( $user_id )
+ ) );
+ $x->send();
break;
case 'autosave' :
$_POST['post_content'] = $_POST['content'];
diff --git a/wp-admin/cat-js.php b/wp-admin/cat-js.php
index 77305ac391..e1b0e288ea 100644
--- a/wp-admin/cat-js.php
+++ b/wp-admin/cat-js.php
@@ -5,31 +5,10 @@ cache_javascript_headers();
addLoadEvent(function(){catList=new listMan('categorychecklist');catList.ajaxRespEl='jaxcat';catList.topAdder=1;catList.alt=0;catList.showLink=0;});
addLoadEvent(newCatAddIn);
function newCatAddIn() {
- if ( !document.getElementById('jaxcat') ) return false;
- var ajaxcat = document.createElement('span');
- ajaxcat.id = 'ajaxcat';
-
- newcat = document.createElement('input');
- newcat.type = 'text';
- newcat.name = 'newcat';
- newcat.id = 'newcat';
- newcat.size = '16';
- newcat.setAttribute('autocomplete', 'off');
- newcat.onkeypress = function(e) { return killSubmit("catList.ajaxAdder('category','categorydiv');", e); };
-
- var newcatSub = document.createElement('input');
- newcatSub.type = 'button';
- newcatSub.name = 'Button';
- newcatSub.id = 'catadd';
- newcatSub.value = '';
- newcatSub.onclick = function() { catList.ajaxAdder('category', 'categorydiv'); };
-
- ajaxcat.appendChild(newcat);
- ajaxcat.appendChild(newcatSub);
- document.getElementById('jaxcat').appendChild(ajaxcat);
-
- howto = document.createElement('span');
- howto.innerHTML = "";
- howto.id = 'howto';
- ajaxcat.appendChild(howto);
+ var jaxcat = $('jaxcat');
+ if ( !jaxcat )
+ return false;
+ jaxcat.update('');
+ $('newcat').onkeypress = function(e) { return killSubmit("catList.ajaxAdder('category','jaxcat');", e); };
+ $('catadd').onclick = function() { catList.ajaxAdder('category', 'jaxcat'); };
}
diff --git a/wp-admin/categories.js b/wp-admin/categories.js
index 7555182631..e0adc47f40 100644
--- a/wp-admin/categories.js
+++ b/wp-admin/categories.js
@@ -1,9 +1,9 @@
addLoadEvent(function() {
if (!theList.theList) return false;
document.forms.addcat.submit.onclick = function(e) {return killSubmit('theList.ajaxAdder("cat", "addcat");', e); };
- theList.addComplete = function(what, where, update) {
- var name = getNodeValue(theList.ajaxAdd.responseXML, 'name');
- var id = getNodeValue(theList.ajaxAdd.responseXML, 'id');
+ theList.addComplete = function(what, where, update, transport) {
+ var name = getNodeValue(transport.responseXML, 'name');
+ var id = transport.responseXML.getElementsByTagName(what)[0].getAttribute('id');
var options = document.forms['addcat'].category_parent.options;
options[options.length] = new Option(name, id);
};
diff --git a/wp-admin/custom-fields.js b/wp-admin/custom-fields.js
index e86c87ebd6..a48661fe79 100644
--- a/wp-admin/custom-fields.js
+++ b/wp-admin/custom-fields.js
@@ -1,8 +1,8 @@
-function customFieldsOnComplete() {
- var pidEl = document.getElementById('post_ID');
+function customFieldsOnComplete( what, where, update, transport ) {
+ var pidEl = $('post_ID');
pidEl.name = 'post_ID';
- pidEl.value = getNodeValue(theList.ajaxAdd.responseXML, 'postid');
- var aEl = document.getElementById('hiddenaction')
+ pidEl.value = getNodeValue(transport.responseXML, 'postid');
+ var aEl = $('hiddenaction')
if ( aEl.value == 'post' ) aEl.value = 'postajaxpost';
}
addLoadEvent(customFieldsAddIn);
@@ -21,6 +21,6 @@ function customFieldsAddIn() {
}
}
- document.getElementById('metakeyinput').onkeypress = function(e) {return killSubmit('theList.inputData+="&id="+document.getElementById("post_ID").value;theList.ajaxAdder("meta", "newmeta");', e); };
- document.getElementById('updatemetasub').onclick = function(e) {return killSubmit('theList.inputData+="&id="+document.getElementById("post_ID").value;theList.ajaxAdder("meta", "newmeta");', e); };
+ $('metakeyinput').onkeypress = function(e) {return killSubmit('theList.inputData+="&id="+$("post_ID").value;theList.ajaxAdder("meta", "newmeta");', e); };
+ $('updatemetasub').onclick = function(e) {return killSubmit('theList.inputData+="&id="+$("post_ID").value;theList.ajaxAdder("meta", "newmeta");', e); };
}
diff --git a/wp-admin/list-manipulation-js.php b/wp-admin/list-manipulation-js.php
deleted file mode 100644
index fd1887c222..0000000000
--- a/wp-admin/list-manipulation-js.php
+++ /dev/null
@@ -1,170 +0,0 @@
-
-addLoadEvent(function(){theList=new listMan();});
-function deleteSomething(what,id,message,obj){if(!obj)obj=theList;if(!message)message="";if(confirm(message))return obj.ajaxDelete(what,id);else return false;}
-function dimSomething(what,id,dimClass,obj){if(!obj)obj=theList;return obj.ajaxDimmer(what,id,dimClass);}
-
-function WPAjax(file, responseEl){//class WPAjax extends sack
- this.getResponseElement=function(r){var p=document.getElementById(r+'-p');if(!p){p=document.createElement('span');p.id=r+'-p';document.getElementById(r).appendChild(p);}this.myResponseElement=p; }
- this.parseAjaxResponse=function(){
- if(isNaN(this.response)){this.myResponseElement.innerHTML='
';return false;}
- this.response=parseInt(this.response,10);
- if(-1==this.response){this.myResponseElement.innerHTML="";return false;}
- else if(0==this.response){this.myResponseElement.innerHTML="";return false;}
- return true;
- }
- this.parseAjaxResponseXML=function(){
- if(this.responseXML&&typeof this.responseXML=='object')return true;
- if(isNaN(this.response)){this.myResponseElement.innerHTML='';return false;}
- var r=parseInt(this.response,10);
- if(-1==r){this.myResponseElement.innerHTML="";}
- else if(0==r){this.myResponseElement.innerHTML="";}
- return false;
- }
- this.init(file,responseEl);
-} WPAjax.prototype=new sack;
- WPAjax.prototype.init=function(f,r){
- this.encVar('cookie', document.cookie);
- this.requestFile=f?f:'';this.getResponseElement(r);this.method='POST';
- }
-
-function listMan(theListId){
- this.theList=null;this.theListId=theListId;
- this.ajaxRespEl=null;this.ajaxHandler='';
- this.inputData='';this.clearInputs=new Array();this.showLink=1;
- this.topAdder=0;this.alt='alternate';this.recolorPos;this.reg_color='#FFFFFF';this.alt_color='#F1F1F1';
- this.addComplete=null;this.delComplete=null;this.dimComplete=null;
- var listType;var listItems;
- self.aTrap=0;
-
- this.ajaxAdder=function(what,where,update){//for TR, server must wrap TR in TABLE TBODY. this.makeEl cleans it
- if(self.aTrap)return;self.aTrap=1;setTimeout('aTrap=0',300);
- this.ajaxAdd=new WPAjax(this.ajaxHandler,this.ajaxRespEl?this.ajaxRespEl:'ajax-response');
- if(this.ajaxAdd.failed)return true;
- this.grabInputs(where);
- var tempObj=this;
- this.ajaxAdd.onCompletion=function(){
- if(!this.parseAjaxResponseXML())return;
- var newItems=this.responseXML.getElementsByTagName(what);
- if(tempObj.topAdder)tempObj.recolorPos=0;
- if(newItems){for (c=0;c
';}
- else this.myResponseElement.innerHTML='';
- for(var i=0;i
-
get_error_messages() as $message )
- echo "$message
";
+ echo "$message
";
?>
-
diff --git a/wp-includes/classes.php b/wp-includes/classes.php
index a23442c886..5437ed94e8 100644
--- a/wp-includes/classes.php
+++ b/wp-includes/classes.php
@@ -709,4 +709,67 @@ class Walker_CategoryDropdown extends Walker {
}
}
+class WP_Ajax_Response {
+ var $responses = array();
+
+ function WP_Ajax_Response( $args = '' ) {
+ if ( !empty($args) )
+ $this->add($args);
+ }
+
+ // a WP_Error object can be passed in 'id' or 'data'
+ function add( $args = '' ) {
+ if ( is_array($args) )
+ $r = &$args;
+ else
+ parse_str($args, $r);
+
+ $defaults = array('what' => 'object', 'action' => false, 'id' => '0', 'old_id' => false,
+ 'data' => '', 'supplemental' => array());
+
+ $r = array_merge($defaults, $r);
+ extract($r);
+
+ if ( is_wp_error($id) ) {
+ $data = $id;
+ $id = 0;
+ }
+
+ $response = '';
+ if ( is_wp_error($data) )
+ foreach ( $data->get_error_codes() as $code )
+ $response .= "get_error_message($code) . "]]>";
+ else
+ $response = "";
+
+ $s = '';
+ if ( (array) $supplemental )
+ foreach ( $supplemental as $k => $v )
+ $s .= "<$k>$k>";
+
+ if ( false === $action )
+ $action = $_POST['action'];
+
+ $x = '';
+ $x .= ""; // The action attribute in the xml output is formatted like a nonce action
+ $x .= "<$what id='$id'" . ( false !== $old_id ? "old_id='$old_id'>" : '>' );
+ $x .= $response;
+ $x .= $s;
+ $x .= "$what>";
+ $x .= "";
+
+ $this->responses[] = $x;
+ return $x;
+ }
+
+ function send() {
+ header('Content-type: text/xml');
+ echo "";
+ foreach ( $this->responses as $response )
+ echo $response;
+ echo '';
+ die();
+ }
+}
+
?>
diff --git a/wp-includes/js/list-manipulation-js.php b/wp-includes/js/list-manipulation-js.php
new file mode 100644
index 0000000000..6c89d5f003
--- /dev/null
+++ b/wp-includes/js/list-manipulation-js.php
@@ -0,0 +1,268 @@
+
+addLoadEvent(function(){theList=new listMan();});
+function deleteSomething(what,id,message,obj){if(!obj)obj=theList;if(!message)message="";if(confirm(message))return obj.ajaxDelete(what,id);else return false;}
+function dimSomething(what,id,dimClass,obj){if(!obj)obj=theList;return obj.ajaxDimmer(what,id,dimClass);}
+
+var listMan = Class.create();
+Object.extend(listMan.prototype, {
+ ajaxRespEl: 'ajax-response',
+ ajaxHandler: '',
+ inputData: '',
+ clearInputs: [],
+ showLink: true,
+ topAdder: false,
+ alt: 'alternate',
+ altOffset: 0,
+ addComplete: null,
+ delComplete: null,
+ dimComplete: null,
+ dataStore: null,
+ formStore: null,
+
+ initialize: function(theListId) {
+ this.theList = $(theListId ? theListId : 'the-list');
+ if ( !this.theList )
+ return false;
+ this.theList.cleanWhitespace();
+ },
+
+ // sends add-what and fields contained in where
+ // recieves html with top element having an id like what-#
+ ajaxAdder: function( what, where, update ) { // Do NOT wrap TR in TABLE TBODY
+ var ajaxAdd = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
+ if ( ajaxAdd.notInitialized() )
+ return true;
+ ajaxAdd.options.parameters += '&action=' + ( update ? 'update-' : 'add-' ) + what + '&' + this.grabInputs( where, ajaxAdd ) + this.inputData;
+ var tempObj=this;
+ ajaxAdd.addOnComplete( function(transport) {
+ var newItems = $A(transport.responseXML.getElementsByTagName(what));
+ if ( newItems ) {
+ newItems.each( function(i) {
+ var id = i.getAttribute('id');
+ var exists = $(what+'-'+id);
+ if ( exists )
+ tempObj.replaceListItem( exists, getNodeValue(i,'response_data'), update );
+ else
+ tempObj.addListItem( getNodeValue(i, 'response_data') );
+ if ( tempObj.showLink )
+ tempObj.showLink = id;
+ });
+ }
+ ajaxAdd.myResponseElement.update(tempObj.showLink ? ( "" ) : '');
+ if ( tempObj.addComplete && typeof tempObj.addComplete == 'function' )
+ tempObj.addComplete( what, where, update, transport );
+ tempObj.recolorList();
+ ajaxAdd.restoreInputs = null;
+ });
+ ajaxAdd.addOnWPError( function(transport) { tempObj.restoreForm(ajaxAdd.restoreInputs); });
+ ajaxAdd.request(ajaxAdd.url);
+ this.clear();
+ return false;
+ },
+
+ // sends update-what and fields contained in where
+ // recieves html with top element having an id like what-#
+ ajaxUpdater: function( what, where ) { return this.ajaxAdder( what, where, true ); },
+
+ // sends delete-what and id#
+ ajaxDelete: function( what, id ) {
+ var ajaxDel = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
+ if( ajaxDel.notInitialized() )
+ return true;
+ var tempObj = this;
+ var action = 'delete-' + what + '&id=' + id;
+ var idName = what.replace('-as-spam','') + '-' + id;
+ ajaxDel.addOnComplete( function(transport) {
+ ajaxDel.myResponseElement.update('');
+ tempObj.destore(action);
+ if( tempObj.delComplete && typeof tempObj.delComplete == 'function' )
+ tempObj.delComplete( what, id, transport );
+ });
+ ajaxDel.addOnWPError( function(transport) { tempObj.restore(action, true); });
+ ajaxDel.options.parameters += '&action=' + action + this.inputData;
+ ajaxDel.request(ajaxDel.url);
+ this.store(action, idName);
+ tempObj.removeListItem( idName );
+ return false;
+ },
+
+ // Toggles class nomes
+ // sends dim-what and id#
+ ajaxDimmer: function( what, id, dimClass ) {
+ ajaxDim = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
+ if ( ajaxDim.notInitialized() )
+ return true;
+ var tempObj = this;
+ var action = 'dim-' + what + '&id=' + id;
+ var idName = what + '-' + id;
+ ajaxDim.addOnComplete( function(transport) {
+ ajaxDim.myResponseElement.update('');
+ tempObj.destore(action);
+ if ( tempObj.dimComplete && typeof tempObj.dimComplete == 'function' )
+ tempObj.dimComplete( what, id, dimClass, transport );
+ });
+ ajaxDim.addOnWPError( function(transport) { tempObj.restore(action, true); });
+ ajaxDim.options.parameters += '&action=' + action + this.inputData;
+ ajaxDim.request(ajaxDim.url);
+ this.store(action, idName);
+ this.dimItem( idName, dimClass );
+ return false;
+ },
+
+ addListItem: function( h ) {
+ new Insertion[this.topAdder ? 'Top' : 'Bottom'](this.theList,h);
+ this.theList.cleanWhitespace();
+ var id = this.topAdder ? this.theList.firstChild.id : this.theList.lastChild.id;
+ if ( this.alt )
+ if ( this.theList.childNodes.length % 2 )
+ $(id).addClassName(this.alt);
+ Fat.fade_element(id);
+ },
+
+ // only hides the element sa it can be put back again if necessary
+ removeListItem: function( id, noFade ) {
+ id = $(id);
+ if ( !noFade ) {
+ Fat.fade_element(id.id,null,700,'#FF3333');
+ var tempObj = this;
+ var func = function() { id.hide(); tempObj.recolorList(); }
+ setTimeout(func, 705);
+ } else {
+ id.hide();
+ this.recolorList();
+ }
+ },
+
+ replaceListItem: function( id, h, update ) {
+ id = $(id);
+ if ( !update ) {
+ id.remove();
+ this.addListItem( h );
+ return;
+ }
+ id.replace(h);
+ Fat.fade_element(id.id);
+ },
+
+ // toggles class
+ dimItem: function( id, dimClass, noFade ) {
+ id = $(id);
+ if ( id.hasClassName(dimClass) ) {
+ if ( !noFade )
+ Fat.fade_element(id.id,null,700,null);
+ id.removeClassName(dimClass);
+ } else {
+ if ( !noFade )
+ Fat.fade_element(id.id,null,700,'#FF3333');
+ id.addClassName(dimClass);
+ }
+ },
+
+ // store an element in case we need it later
+ store: function(action, id) {
+ if ( !this.dataStore )
+ this.dataStore = $H();
+ this.dataStore[action] = $(id).cloneNode(true);
+ },
+
+ // delete from store
+ destore: function(action) { delete(this.dataStore[action]); },
+
+ // restore element from store into existing (possibly hidden) element of same id
+ restore: function(action, error) {
+ var id = this.dataStore[action].id;
+ this.theList.replaceChild(this.dataStore[action], $(id));
+ delete(this.dataStore[action]);
+ if ( error ) {
+ func = function() { $(id).setStyle( { 'background-color': '#FF3333' } ); }
+ func(); setTimeout(func, 705); // Hit it twice in case it's still fading.
+ }
+ },
+
+ // Like Form.serialize, but excludes action and sets up clearInputs
+ grabInputs: function( where, ajaxObj ) {
+ if ( ajaxObj )
+ ajaxObj.restoreInputs = [];
+ var elements = Form.getElements($(where));
+ var queryComponents = new Array();
+ for (var i = 0; i < elements.length; i++) {
+ if ( 'action' == elements[i].name )
+ continue;
+ if ( 'hidden' != elements[i].type && 'submit' != elements[i].type && 'button' != elements[i].type ) {
+ this.clearInputs.push(elements[i]);
+ if ( ajaxObj )
+ ajaxObj.restoreInputs.push([elements[i], elements[i].value]);
+ }
+ var queryComponent = Form.Element.serialize(elements[i]);
+ if (queryComponent) {
+ queryComponents.push(queryComponent);
+ }
+ }
+ return queryComponents.join('&');
+ },
+
+ // form.reset() can only do whole forms. This can do subsections.
+ clear: function() {
+ this.clearInputs.each( function(i) {
+ i = $(i);
+ if ( 'textarea' == i.tagName.toLowerCase() )
+ i.value = '';
+ else
+ switch ( i.type.toLowerCase() ) {
+ case 'password': case 'text':
+ i.value = '';
+ break;
+ case 'checkbox': case 'radio':
+ i.checked = false;
+ break;
+ case 'select': case 'select-one':
+ i.selectedIndex = null;
+ break;
+ case 'select-multiple':
+ for (var o = 0; o < i.length; o++) i.options[o].selected = false;
+ break;
+ }
+ });
+ this.clearInputs = [];
+ },
+
+ restoreForm: function(elements) {
+ elements.each( function(i) {
+ i[0].value = i[1];
+ });
+ },
+
+ recolorList: function() {
+ if ( !this.alt )
+ return;
+ var alt = this.alt;
+ var offset = this.altOffset;
+ var listItems = $A(this.theList.childNodes).findAll( function(i) { return i.visible() } );
+ listItems.each( function(i,n) {
+ if ( ( n + offset ) % 2 )
+ i.removeClassName(alt);
+ else
+ i.addClassName(alt);
+ });
+ }
+});
+
+//No submit unless code returns true.
+function killSubmit ( code, e ) {
+ e = e ? e : window.event;
+ if ( !e ) return;
+ var t = e.target ? e.target : e.srcElement;
+ if ( ( 'text' == t.type && e.keyCode == 13 ) || ( 'submit' == t.type && 'click' == e.type ) ) {
+ if ( ( 'string' == typeof code && !eval(code) ) || ( 'function' == typeof code && !code() ) ) {
+ e.returnValue = false; e.cancelBubble = true; return false;
+ }
+ }
+}
+//Pretty func adapted from ALA http://www.alistapart.com/articles/gettingstartedwithajax
+function getNodeValue(tree,el){try { var r = tree.getElementsByTagName(el)[0].firstChild.nodeValue; } catch(err) { var r = null; } return r; }
+//Generic but lame JS closure
+function encloseFunc(f){var a=arguments[1];return function(){return f(a);}}
diff --git a/wp-includes/js/wp-ajax-js.php b/wp-includes/js/wp-ajax-js.php
new file mode 100644
index 0000000000..e56cba9b05
--- /dev/null
+++ b/wp-includes/js/wp-ajax-js.php
@@ -0,0 +1,93 @@
+
+var WPAjax = Class.create();
+Object.extend(WPAjax.prototype, Ajax.Request.prototype);
+Object.extend(WPAjax.prototype, {
+ WPComplete: false, // onComplete function
+ WPError: false, // onWPError function
+ initialize: function(url, responseEl) {
+ var tempObj = this;
+ this.transport = Ajax.getTransport();
+ if ( !this.transport )
+ return false;
+ this.setOptions( {
+ parameters: 'cookie=' + encodeURIComponent(document.cookie),
+ onComplete: function(transport) { // transport = XMLHttpRequest object
+ if ( tempObj.parseAjaxResponse() ) {
+ if ( 'function' == typeof tempObj.WPComplete )
+ tempObj.WPComplete(transport);
+ } else if ( 'function' == typeof tempObj.WPError ) // if response corresponds to an error (bad data, say, not 404)
+ tempObj.WPError(transport);
+ }
+ });
+ this.url = url;
+ this.getResponseElement(responseEl);
+ },
+ addArg: function(key, value) {
+ var a = $H(this.options.parameters.parseQuery());
+ a[encodeURIComponent(key)] = encodeURIComponent(value);
+ this.options.parameters = a.map(function(pair) {
+ return pair.join('=');
+ }).join('&');
+ },
+ getResponseElement: function(r) {
+ var p = $(r + '-p');
+ if ( !p ) {
+ new Insertion.Bottom(r, "");
+ var p = $(r + '-p');
+ }
+ this.myResponseElement = p;
+ },
+ parseAjaxResponse: function() { // 1 = good, 0 = strange (bad data?), -1 = you lack permission
+ if ( this.transport.responseXML && typeof this.transport.responseXML == 'object' ) {
+ var err = this.transport.responseXML.getElementsByTagName('wp_error');
+ if ( err[0] ) {
+ var msg = $A(err).inject( '', function(a, b) { return a + '' + b.firstChild.nodeValue + '
'; } );
+ this.myResponseElement.update('' + msg + '
');
+ return false;
+ }
+ return true;
+ }
+ var r = this.transport.responseText;
+ if ( isNaN(r) ) {
+ this.myResponseElement.update('');
+ return false;
+ }
+ var r = parseInt(r,10);
+ if ( -1 == r ) {
+ this.myResponseElement.update("");
+ return false;
+ } else if ( 0 == r ) {
+ this.myResponseElement.update("");
+ return false;
+ }
+ return true;
+ },
+ addOnComplete: function(f) {
+ if ( 'function' == typeof f ) { var of = this.WPComplete; this.WPComplete = function(t) { if ( of ) of(t); f(t); } }
+ },
+ addOnWPError: function(f) {
+ if ( 'function' == typeof f ) { var of = this.WPError; this.WPError = function(t) { if ( of ) of(t); f(t); } }
+ },
+ notInitialized: function() {
+ return this.transport ? false : true;
+ }
+});
+
+Ajax.activeSendCount = 0;
+Ajax.Responders.register( {
+ onCreate: function() {
+ Ajax.activeSendCount++;
+ if ( 1 != Ajax.activeSendCount )
+ return;
+ wpBeforeUnload = window.onbeforeunload;
+ window.onbeforeunload = function() {
+ return "";
+ }
+ },
+ onLoading: function() { // Can switch to onLoaded if we lose data
+ Ajax.activeSendCount--;
+ if ( 0 != Ajax.activeSendCount )
+ return;
+ window.onbeforeunload = wpBeforeUnload;
+ }
+});
diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php
index 5cdd65edf1..4fd89d6524 100644
--- a/wp-includes/script-loader.php
+++ b/wp-includes/script-loader.php
@@ -19,9 +19,11 @@ class WP_Scripts {
$this->add( 'wp_tiny_mce', '/wp-includes/js/tinymce/tiny_mce_config.php', array('tiny_mce'), '04162006' );
$this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.5.0');
$this->add( 'autosave', '/wp-includes/js/autosave.js.php', array('prototype', 'sack'), '4183');
+ $this->add( 'wp-ajax', '/wp-includes/js/wp-ajax-js.php', array('prototype'), '4187');
+ $this->add( 'listman', '/wp-includes/js/list-manipulation-js.php', array('wp-ajax', 'fat'), rand());
if ( is_admin() ) {
$this->add( 'dbx-admin-key', '/wp-admin/dbx-admin-key-js.php', array('dbx'), '3651' );
- $this->add( 'listman', '/wp-admin/list-manipulation-js.php', array('sack', 'fat'), '4042' ); // Make changeset # the correct one
+ $this->add( 'listman-old', '/wp-admin/list-manipulation-js.php', array('sack', 'fat'), '4042' ); // Make changeset # the correct one
$this->add( 'ajaxcat', '/wp-admin/cat-js.php', array('listman'), '3684' );
$this->add( 'admin-categories', '/wp-admin/categories.js', array('listman'), '3684' );
$this->add( 'admin-custom-fields', '/wp-admin/custom-fields.js', array('listman'), '3733' );