Make WordPress Core

Ticket #3911: 3911.diff

File 3911.diff, 15.7 KB (added by mdawaffe, 17 years ago)
  • wp-includes/js/list-manipulation.js

     
    1 <?php @require_once('../../wp-config.php'); cache_javascript_headers(); ?>
    2 addLoadEvent(function(){theList=new listMan();});
    3 function deleteSomething(what,id,message,obj){if(!obj)obj=theList;if(!message)message="<?php printf(js_escape(__('Are you sure you want to delete this %s?')),"'+what+'"); ?>";if(confirm(message))return obj.ajaxDelete(what,id);else return false;}
    4 function dimSomething(what,id,dimClass,obj){if(!obj)obj=theList;return obj.ajaxDimmer(what,id,dimClass);}
     1addLoadEvent( function() {
     2        if ( 'undefined' != typeof listManL10n )
     3                Object.extend(listMan.prototype, listManL10n);
     4        theList = new listMan();
     5} );
    56
     7function deleteSomething( what, id, message, obj ) {
     8        if ( !obj )
     9                obj=theList;
     10        if ( !message )
     11                message = obj.delText.replace(/%/g, what);
     12        if( confirm(message) )
     13                return obj.ajaxDelete( what, id );
     14        else return false;
     15}
     16
     17function dimSomething( what, id, dimClass, obj ) {
     18        if ( !obj )
     19                obj = theList;
     20        return obj.ajaxDimmer(what,id,dimClass);
     21}
     22
    623var listMan = Class.create();
    724Object.extend(listMan.prototype, {
    825        ajaxRespEl: 'ajax-response',
     
    1936        dataStore: null,
    2037        formStore: null,
    2138
     39        jumpText: 'Jump to new item',
     40        delText: 'Are you sure you want to delete this %s?',
     41
    2242        initialize: function(theListId) {
    2343                this.theList = $(theListId ? theListId : 'the-list');
    2444                if ( !this.theList )
     
    5373                                        if ( m )
    5474                                                showLinkMessage += m;
    5575                                        else
    56                                                 showLinkMessage += "<a href='#" + what + '-' + id + "'><?php echo js_escape(__('Jump to new item')); ?>";
     76                                                showLinkMessage += "<a href='#" + what + '-' + id + "'>" + tempObj.jumpText + "</a>";
    5777                                });
    5878                                if ( tempObj.showLink && showLinkMessage )
    5979                                        Element.update(ajaxAdd.myResponseElement,"<div id='jumplink' class='updated fade'><p>" + showLinkMessage + "</p></div>");
     
    127147                Element.cleanWhitespace(this.theList);
    128148                var id = this.topAdder ? this.theList.firstChild.id : this.theList.lastChild.id;
    129149                if ( this.alt )
    130                         if ( this.theList.childNodes.length % 2 )
     150                        if ( ( this.theList.childNodes.length + this.altOffset ) % 2 )
    131151                                Element.addClassName($(id),this.alt);
    132152                Fat.fade_element(id);
    133153        },
  • wp-includes/js/list-manipulation-js.php

     
    1 <?php @require_once('../../wp-config.php'); cache_javascript_headers(); ?>
    2 addLoadEvent(function(){theList=new listMan();});
    3 function deleteSomething(what,id,message,obj){if(!obj)obj=theList;if(!message)message="<?php printf(js_escape(__('Are you sure you want to delete this %s?')),"'+what+'"); ?>";if(confirm(message))return obj.ajaxDelete(what,id);else return false;}
    4 function dimSomething(what,id,dimClass,obj){if(!obj)obj=theList;return obj.ajaxDimmer(what,id,dimClass);}
    5 
    6 var listMan = Class.create();
    7 Object.extend(listMan.prototype, {
    8         ajaxRespEl: 'ajax-response',
    9         ajaxHandler: false,
    10         inputData: '',
    11         clearInputs: [],
    12         showLink: true,
    13         topAdder: false,
    14         alt: 'alternate',
    15         altOffset: 0,
    16         addComplete: null,
    17         delComplete: null,
    18         dimComplete: null,
    19         dataStore: null,
    20         formStore: null,
    21 
    22         initialize: function(theListId) {
    23                 this.theList = $(theListId ? theListId : 'the-list');
    24                 if ( !this.theList )
    25                         return false;
    26                 Element.cleanWhitespace(this.theList);
    27         },
    28 
    29         // sends add-what and fields contained in where
    30         // recieves html with top element having an id like what-#
    31         ajaxAdder: function( what, where, update ) { // Do NOT wrap TR in TABLE TBODY
    32                 var ajaxAdd = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
    33                 if ( ajaxAdd.notInitialized() )
    34                         return true;
    35                 var action = ( update ? 'update-' : 'add-' ) + what;
    36                 ajaxAdd.options.parameters = $H(ajaxAdd.options.parameters).merge({action: action}).merge(this.inputData.toQueryParams()).merge(this.grabInputs( where, ajaxAdd ).toQueryParams());
    37 
    38                 var tempObj=this;
    39                 ajaxAdd.addOnComplete( function(transport) {
    40                         var newItems = $A(transport.responseXML.getElementsByTagName(what));
    41                         if ( newItems ) {
    42                                 var showLinkMessage = '';
    43                                 var m = '';
    44                                 newItems.each( function(i) {
    45                                         var id = i.getAttribute('id');
    46                                         var exists = $(what+'-'+id);
    47                                         if ( exists )
    48                                                 tempObj.replaceListItem( exists, getNodeValue(i,'response_data'), update );
    49                                         else
    50                                                 tempObj.addListItem( getNodeValue(i, 'response_data') );
    51                                         m = getNodeValue(i, 'show-link');
    52                                         showLinkMessage += showLinkMessage ? "<br />\n" : '';
    53                                         if ( m )
    54                                                 showLinkMessage += m;
    55                                         else
    56                                                 showLinkMessage += "<a href='#" + what + '-' + id + "'><?php echo js_escape(__('Jump to new item')); ?>";
    57                                 });
    58                                 if ( tempObj.showLink && showLinkMessage )
    59                                         Element.update(ajaxAdd.myResponseElement,"<div id='jumplink' class='updated fade'><p>" + showLinkMessage + "</p></div>");
    60                         }
    61                         if ( tempObj.addComplete && typeof tempObj.addComplete == 'function' )
    62                                 tempObj.addComplete( what, where, update, transport );
    63                         tempObj.recolorList();
    64                         ajaxAdd.restoreInputs = null;
    65                 });
    66                 if ( !update )
    67                         ajaxAdd.addOnWPError( function(transport) { tempObj.restoreForm(ajaxAdd.restoreInputs); });
    68                 ajaxAdd.request(ajaxAdd.url);
    69                 if ( !update )
    70                         this.clear();
    71                 return false;
    72         },
    73 
    74         // sends update-what and fields contained in where
    75         // recieves html with top element having an id like what-#
    76         ajaxUpdater: function( what, where ) { return this.ajaxAdder( what, where, true ); },
    77 
    78         // sends delete-what and id#
    79         ajaxDelete: function( what, id ) {
    80                 var ajaxDel = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
    81                 if( ajaxDel.notInitialized() )
    82                         return true;
    83                 var tempObj = this;
    84                 var action = 'delete-' + what;
    85                 var actionId = action + '&id=' + id;
    86                 var idName = what.replace('-as-spam','') + '-' + id;
    87                 ajaxDel.addOnComplete( function(transport) {
    88                         Element.update(ajaxDel.myResponseElement,'');
    89                         tempObj.destore(actionId);
    90                         if( tempObj.delComplete && typeof tempObj.delComplete == 'function' )
    91                                 tempObj.delComplete( what, id, transport );
    92                 });
    93                 ajaxDel.addOnWPError( function(transport) { tempObj.restore(actionId, true); });
    94                 ajaxDel.options.parameters = $H(ajaxDel.options.parameters).merge({action: action, id: id}).merge(this.inputData.toQueryParams());
    95                 ajaxDel.request(ajaxDel.url);
    96                 this.store(actionId, idName);
    97                 tempObj.removeListItem( idName );
    98                 return false;
    99         },
    100 
    101         // Toggles class nomes
    102         // sends dim-what and id#
    103         ajaxDimmer: function( what, id, dimClass ) {
    104                 ajaxDim = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
    105                 if ( ajaxDim.notInitialized() )
    106                         return true;
    107                 var tempObj = this;
    108                 var action = 'dim-' + what;
    109                 var actionId = action + '&id=' + id;
    110                 var idName = what + '-' + id;
    111                 ajaxDim.addOnComplete( function(transport) {
    112                         Element.update(ajaxDim.myResponseElement,'');
    113                         tempObj.destore(actionId);
    114                         if ( tempObj.dimComplete && typeof tempObj.dimComplete == 'function' )
    115                                 tempObj.dimComplete( what, id, dimClass, transport );
    116                 });
    117                 ajaxDim.addOnWPError( function(transport) { tempObj.restore(actionId, true); });
    118                 ajaxDim.options.parameters = $H(ajaxDim.options.parameters).merge({action: action, id: id}).merge(this.inputData.toQueryParams());
    119                 ajaxDim.request(ajaxDim.url);
    120                 this.store(actionId, idName);
    121                 this.dimItem( idName, dimClass );
    122                 return false;
    123         },
    124 
    125         addListItem: function( h ) {
    126                 new Insertion[this.topAdder ? 'Top' : 'Bottom'](this.theList,h);
    127                 Element.cleanWhitespace(this.theList);
    128                 var id = this.topAdder ? this.theList.firstChild.id : this.theList.lastChild.id;
    129                 if ( this.alt )
    130                         if ( this.theList.childNodes.length % 2 )
    131                                 Element.addClassName($(id),this.alt);
    132                 Fat.fade_element(id);
    133         },
    134 
    135         // only hides the element sa it can be put back again if necessary
    136         removeListItem: function( id, noFade ) {
    137                 id = $(id);
    138                 if ( !noFade ) {
    139                         Fat.fade_element(id.id,null,700,'#FF3333');
    140                         var tempObj = this;
    141                         var func = function() { id.hide(); tempObj.recolorList(); }
    142                         setTimeout(func, 705);
    143                 } else {
    144                         id.hide();
    145                         this.recolorList();
    146                 }
    147         },
    148 
    149         replaceListItem: function( id, h, update ) {
    150                 id = $(id);
    151                 if ( !update ) {
    152                         Element.remove(id);
    153                         this.addListItem( h );
    154                         return;
    155                 }
    156                 id.replace(h);
    157                 Fat.fade_element(id.id);
    158         },
    159 
    160         // toggles class
    161         dimItem: function( id, dimClass, noFade ) {
    162                 id = $(id);
    163                 if ( Element.hasClassName(id,dimClass) ) {
    164                         if ( !noFade )
    165                                 Fat.fade_element(id.id,null,700,null);
    166                         Element.removeClassName(id,dimClass);
    167                 } else {
    168                         if ( !noFade )
    169                                 Fat.fade_element(id.id,null,700,'#FF3333');
    170                         Element.addClassName(id,dimClass);
    171                 }
    172         },
    173 
    174         // store an element in case we need it later
    175         store: function(action, id) {
    176                 if ( !this.dataStore )
    177                         this.dataStore = $H();
    178                 this.dataStore[action] = $(id).cloneNode(true);
    179         },
    180 
    181         // delete from store
    182         destore: function(action) { delete(this.dataStore[action]); },
    183 
    184         // restore element from store into existing (possibly hidden) element of same id
    185         restore: function(action, error) {
    186                 var id = this.dataStore[action].id;
    187                 this.theList.replaceChild(this.dataStore[action], $(id));
    188                 delete(this.dataStore[action]);
    189                 if ( error ) {
    190                         func = function() { Element.setStyle($(id),{backgroundColor:'#FF3333'}); }
    191                         func(); setTimeout(func, 705); // Hit it twice in case it's still fading.
    192                 }
    193         },
    194 
    195         // Like Form.serialize, but excludes action and sets up clearInputs
    196         grabInputs: function( where, ajaxObj ) {
    197                 if ( ajaxObj )
    198                         ajaxObj.restoreInputs = [];
    199                 var elements = Form.getElements($(where));
    200                 var queryComponents = new Array();
    201                 for (var i = 0; i < elements.length; i++) {
    202                         if ( 'action' == elements[i].name )
    203                                 continue;
    204                         if ( 'hidden' != elements[i].type && 'submit' != elements[i].type && 'button' != elements[i].type ) {
    205                                 this.clearInputs.push(elements[i]);
    206                                 if ( ajaxObj )
    207                                         ajaxObj.restoreInputs.push([elements[i], elements[i].value]);
    208                         }
    209                         var queryComponent = Form.Element.serialize(elements[i]);
    210                         if (queryComponent) {
    211                                 queryComponents.push(queryComponent);
    212                         }
    213                 }
    214                 return queryComponents.join('&');
    215         },
    216 
    217         // form.reset() can only do whole forms.  This can do subsections.
    218         clear: function() {
    219                 this.clearInputs.each( function(i) {
    220                         i = $(i);
    221                         if ( 'textarea' == i.tagName.toLowerCase() )
    222                                 i.value = '';
    223                         else
    224                                 switch ( i.type.toLowerCase() ) {
    225                                         case 'password': case 'text':
    226                                                 i.value = '';
    227                                                 break;
    228                                         case 'checkbox': case 'radio':
    229                                                 i.checked = false;
    230                                                 break;
    231                                         case 'select': case 'select-one':
    232                                                 i.selectedIndex = null;
    233                                                 break;
    234                                         case 'select-multiple':
    235                                                 for (var o = 0; o < i.length; o++) i.options[o].selected = false;
    236                                                 break;
    237                                 }
    238                 });
    239                 this.clearInputs = [];
    240         },
    241 
    242         restoreForm: function(elements) {
    243                 elements.each( function(i) {
    244                         i[0].value = i[1];
    245                 });
    246         },
    247 
    248         recolorList: function() {
    249                 if ( !this.alt )
    250                         return;
    251                 var alt = this.alt;
    252                 var offset = this.altOffset;
    253                 var listItems = $A(this.theList.childNodes).findAll( function(i) { return Element.visible(i) } );
    254                 listItems.each( function(i,n) {
    255                         if ( ( n + offset ) % 2 )
    256                                 Element.removeClassName(i,alt);
    257                         else
    258                                 Element.addClassName(i,alt);
    259                 });
    260         }
    261 });
    262 
    263 //No submit unless code returns true.
    264 function killSubmit ( code, e ) {
    265         e = e ? e : window.event;
    266         if ( !e ) return;
    267         var t = e.target ? e.target : e.srcElement;
    268         if ( ( 'text' == t.type && e.keyCode == 13 ) || ( 'submit' == t.type && 'click' == e.type ) ) {
    269                 if ( ( 'string' == typeof code && !eval(code) ) || ( 'function' == typeof code && !code() ) ) {
    270                         e.returnValue = false; e.cancelBubble = true; return false;
    271                 }
    272         }
    273 }
    274 //Generic but lame JS closure
    275 function encloseFunc(f){var a=arguments[1];return function(){return f(a);}}
  • wp-includes/script-loader.php

     
    2121                $this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.5.0-0');
    2222                $this->add( 'autosave', '/wp-includes/js/autosave-js.php', array('prototype', 'sack'), '20070116');
    2323                $this->add( 'wp-ajax', '/wp-includes/js/wp-ajax-js.php', array('prototype'), '20070118');
    24                 $this->add( 'listman', '/wp-includes/js/list-manipulation-js.php', array('wp-ajax', 'fat'), '20070118');
     24                $this->add( 'listman', '/wp-includes/js/list-manipulation.js', array('wp-ajax', 'fat'), '20070305');
     25                $this->localize( 'listman', 'listManL10n', array(
     26                        'jumpText' => __('Jump to new item'),
     27                        'delText' => __('Are you sure you want to delete this %s?')
     28                ) );
    2529                $this->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/wp-scriptaculous.js', array('prototype'), '1.7.0');
    2630                $this->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1.7.0');
    2731                $this->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder', 'scriptaculous-effects'), '1.7.0');
     
    8387                                        $src = add_query_arg('ver', $ver, $src);
    8488                                        $src = apply_filters( 'script_loader_src', $src );
    8589                                        echo "<script type='text/javascript' src='$src'></script>\n";
     90                                        $this->print_scripts_l10n( $handle );
    8691                                }
    8792                                $this->printed[] = $handle;
    8893                        }
    8994                }
    9095        }
    9196
     97        function print_scripts_l10n( $handle ) {
     98                if ( empty($this->scripts[$handle]->l10n_object) || empty($this->scripts[$handle]->l10n) || !is_array($this->scripts[$handle]->l10n) )
     99                        return;
    92100
     101                $object_name = $this->scripts[$handle]->l10n_object;
     102
     103                echo "<script type='text/javascript'>\n";
     104                echo "/* <![CDATA[ */\n";
     105                echo "\t$object_name = {\n";
     106                $eol = '';
     107                foreach ( $this->scripts[$handle]->l10n as $var => $val ) {
     108                        echo "$eol\t\t$var: \"" . js_escape( $val ) . '"';
     109                        $eol = ",\n";
     110                }
     111                echo "\n\t}\n";
     112                echo "/* ]]> */\n";
     113                echo "</script>\n";
     114        }
     115
    93116        /**
    94117         * Determines dependencies of scripts
    95118         *
     
    140163                return true;
    141164        }
    142165
     166        /**
     167         * Localizes a script
     168         *
     169         * Localizes only if script has already been added
     170         *
     171         * @param string handle Script name
     172         * @param string object_name Name of JS object to hold l10n info
     173         * @param array l10n Array of JS var name => localized string
     174         * @return bool Successful localization
     175         */
     176        function localize( $handle, $object_name, $l10n ) {
     177                if ( !isset($this->scripts[$handle]) )
     178                        return false;
     179                return $this->scripts[$handle]->localize( $object_name, $l10n );
     180        }
     181
    143182        function remove( $handles ) {
    144183                foreach ( (array) $handles as $handle )
    145184                        unset($this->scripts[$handle]);
     
    182221        var $src;
    183222        var $deps = array();
    184223        var $ver = false;
    185         var $args = false;
     224        var $l10n_object = '';
     225        var $l10n = array();
    186226
    187227        function _WP_Script() {
    188228                @list($this->handle, $this->src, $this->deps, $this->ver) = func_get_args();
     
    191231                if ( !$this->ver )
    192232                        $this->ver = false;
    193233        }
     234
     235        function localize( $object_name, $l10n ) {
     236                if ( !$object_name || !is_array($l10n) )
     237                        return false;
     238                $this->l10n_object = $object_name;
     239                $this->l10n = $l10n;
     240                return true;
     241        }
    194242}
    195243
    196244/**
     
    227275        $wp_scripts->add( $handle, $src, $deps, $ver );
    228276}
    229277
     278/**
     279 * Localizes a script
     280 *
     281 * Localizes only if script has already been added
     282 *
     283 * @see WP_Script::localize()
     284 */
     285function wp_localize_script( $handle, $object_name, $l10n ) {
     286        global $wp_scripts;
     287        if ( !is_a($wp_scripts, 'WP_Scripts') )
     288                return false;
     289
     290        return $wp_scripts->localize( $handle, $object_name, $l10n );
     291}
     292
    230293function wp_deregister_script( $handle ) {
    231294        global $wp_scripts;
    232295        if ( !is_a($wp_scripts, 'WP_Scripts') )