From ce0c2a2f6479655db5a148b05791d76d2e874daf Mon Sep 17 00:00:00 2001 From: ryan Date: Wed, 13 Sep 2006 21:39:53 +0000 Subject: [PATCH] AJAX responsiveness improvements from mdawaffe. fixes #3099 git-svn-id: http://svn.automattic.com/wordpress/trunk@4187 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/admin-ajax.php | 82 ++++---- wp-admin/cat-js.php | 33 +-- wp-admin/categories.js | 6 +- wp-admin/custom-fields.js | 12 +- wp-admin/list-manipulation-js.php | 170 --------------- wp-admin/users.php | 4 +- wp-includes/classes.php | 63 ++++++ wp-includes/js/list-manipulation-js.php | 268 ++++++++++++++++++++++++ wp-includes/js/wp-ajax-js.php | 93 ++++++++ wp-includes/script-loader.php | 4 +- 10 files changed, 485 insertions(+), 250 deletions(-) delete mode 100644 wp-admin/list-manipulation-js.php create mode 100644 wp-includes/js/list-manipulation-js.php create mode 100644 wp-includes/js/wp-ajax-js.php diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php index 0beb5bca0..4e2790021 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 77305ac39..e1b0e288e 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 755518263..e0adc47f4 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 e86c87ebd..a48661fe7 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 fd1887c22..000000000 --- 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='

    '+this.response+'

    ';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='

    '+this.response+'

    ';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 a23442c88..5437ed94e 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>"; + + 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 .= ""; + $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 000000000..6c89d5f00 --- /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 000000000..e56cba9b0 --- /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('

    ' + r + '

    '); + 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 5cdd65edf..4fd89d652 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' );