970a1f805bee39c60d4cc88ef31a6e648079a189
[autoinstalls/wordpress.git] / wp-includes / js / wp-lists.dev.js
1 (function($) {
2 var fs = {add:'ajaxAdd',del:'ajaxDel',dim:'ajaxDim',process:'process',recolor:'recolor'}, wpList;
3
4 wpList = {
5         settings: {
6                 url: ajaxurl, type: 'POST',
7                 response: 'ajax-response',
8
9                 what: '',
10                 alt: 'alternate', altOffset: 0,
11                 addColor: null, delColor: null, dimAddColor: null, dimDelColor: null,
12
13                 confirm: null,
14                 addBefore: null, addAfter: null,
15                 delBefore: null, delAfter: null,
16                 dimBefore: null, dimAfter: null
17         },
18
19         nonce: function(e,s) {
20                 var url = wpAjax.unserialize(e.attr('href'));
21                 return s.nonce || url._ajax_nonce || $('#' + s.element + ' input[name="_ajax_nonce"]').val() || url._wpnonce || $('#' + s.element + ' input[name="_wpnonce"]').val() || 0;
22         },
23
24         parseClass: function(e,t) {
25                 var c = [], cl;
26
27                 try {
28                         cl = $(e).attr('class') || '';
29                         cl = cl.match(new RegExp(t+':[\\S]+'));
30
31                         if ( cl )
32                                 c = cl[0].split(':');
33                 } catch(r) {}
34
35                 return c;
36         },
37
38         pre: function(e,s,a) {
39                 var bg, r;
40
41                 s = $.extend( {}, this.wpList.settings, {
42                         element: null,
43                         nonce: 0,
44                         target: e.get(0)
45                 }, s || {} );
46
47                 if ( $.isFunction( s.confirm ) ) {
48                         if ( 'add' != a ) {
49                                 bg = $('#' + s.element).css('backgroundColor');
50                                 $('#' + s.element).css('backgroundColor', '#FF9966');
51                         }
52                         r = s.confirm.call(this, e, s, a, bg);
53
54                         if ( 'add' != a )
55                                 $('#' + s.element).css('backgroundColor', bg );
56
57                         if ( !r )
58                                 return false;
59                 }
60
61                 return s;
62         },
63
64         ajaxAdd: function( e, s ) {
65                 e = $(e);
66                 s = s || {};
67                 var list = this, cls = wpList.parseClass(e,'add'), es, valid, formData, res, rres;
68
69                 s = wpList.pre.call( list, e, s, 'add' );
70
71                 s.element = cls[2] || e.attr( 'id' ) || s.element || null;
72
73                 if ( cls[3] )
74                         s.addColor = '#' + cls[3];
75                 else
76                         s.addColor = s.addColor || '#FFFF33';
77
78                 if ( !s )
79                         return false;
80
81                 if ( !e.is('[class^="add:' + list.id + ':"]') )
82                         return !wpList.add.call( list, e, s );
83
84                 if ( !s.element )
85                         return true;
86
87                 s.action = 'add-' + s.what;
88
89                 s.nonce = wpList.nonce(e,s);
90
91                 es = $('#' + s.element + ' :input').not('[name="_ajax_nonce"], [name="_wpnonce"], [name="action"]');
92                 valid = wpAjax.validateForm( '#' + s.element );
93
94                 if ( !valid )
95                         return false;
96
97                 s.data = $.param( $.extend( { _ajax_nonce: s.nonce, action: s.action }, wpAjax.unserialize( cls[4] || '' ) ) );
98                 formData = $.isFunction(es.fieldSerialize) ? es.fieldSerialize() : es.serialize();
99
100                 if ( formData )
101                         s.data += '&' + formData;
102
103                 if ( $.isFunction(s.addBefore) ) {
104                         s = s.addBefore( s );
105                         if ( !s )
106                                 return true;
107                 }
108
109                 if ( !s.data.match(/_ajax_nonce=[a-f0-9]+/) )
110                         return true;
111
112                 s.success = function(r) {
113                         res = wpAjax.parseAjaxResponse(r, s.response, s.element);
114
115                         rres = r;
116
117                         if ( !res || res.errors )
118                                 return false;
119
120                         if ( true === res )
121                                 return true;
122
123                         jQuery.each( res.responses, function() {
124                                 wpList.add.call( list, this.data, $.extend( {}, s, { // this.firstChild.nodevalue
125                                         pos: this.position || 0,
126                                         id: this.id || 0,
127                                         oldId: this.oldId || null
128                                 } ) );
129                         } );
130
131                         list.wpList.recolor();
132                         $(list).trigger( 'wpListAddEnd', [ s, list.wpList ] );
133                         wpList.clear.call(list,'#' + s.element);
134                 };
135
136                 s.complete = function(x, st) {
137                         if ( $.isFunction(s.addAfter) ) {
138                                 var _s = $.extend( { xml: x, status: st, parsed: res }, s );
139                                 s.addAfter( rres, _s );
140                         }
141                 };
142
143                 $.ajax( s );
144                 return false;
145         },
146
147         ajaxDel: function( e, s ) {
148                 e = $(e);
149                 s = s || {};
150                 var list = this, cls = wpList.parseClass(e,'delete'), element, res, rres;
151
152                 s = wpList.pre.call( list, e, s, 'delete' );
153
154                 s.element = cls[2] || s.element || null;
155
156                 if ( cls[3] )
157                         s.delColor = '#' + cls[3];
158                 else
159                         s.delColor = s.delColor || '#faa';
160
161                 if ( !s || !s.element )
162                         return false;
163
164                 s.action = 'delete-' + s.what;
165
166                 s.nonce = wpList.nonce(e,s);
167
168                 s.data = $.extend(
169                         { action: s.action, id: s.element.split('-').pop(), _ajax_nonce: s.nonce },
170                         wpAjax.unserialize( cls[4] || '' )
171                 );
172
173                 if ( $.isFunction(s.delBefore) ) {
174                         s = s.delBefore( s, list );
175                         if ( !s )
176                                 return true;
177                 }
178
179                 if ( !s.data._ajax_nonce )
180                         return true;
181
182                 element = $('#' + s.element);
183
184                 if ( 'none' != s.delColor ) {
185                         element.css( 'backgroundColor', s.delColor ).fadeOut( 350, function(){
186                                 list.wpList.recolor();
187                                 $(list).trigger( 'wpListDelEnd', [ s, list.wpList ] );
188                         });
189                 } else {
190                         list.wpList.recolor();
191                         $(list).trigger( 'wpListDelEnd', [ s, list.wpList ] );
192                 }
193
194                 s.success = function(r) {
195                         res = wpAjax.parseAjaxResponse(r, s.response, s.element);
196                         rres = r;
197
198                         if ( !res || res.errors ) {
199                                 element.stop().stop().css( 'backgroundColor', '#faa' ).show().queue( function() { list.wpList.recolor(); $(this).dequeue(); } );
200                                 return false;
201                         }
202                 };
203
204                 s.complete = function(x, st) {
205                         if ( $.isFunction(s.delAfter) ) {
206                                 element.queue( function() {
207                                         var _s = $.extend( { xml: x, status: st, parsed: res }, s );
208                                         s.delAfter( rres, _s );
209                                 }).dequeue();
210                         }
211                 }
212
213                 $.ajax( s );
214                 return false;
215         },
216
217         ajaxDim: function( e, s ) {
218                 if ( $(e).parent().css('display') == 'none' ) // Prevent hidden links from being clicked by hotkeys
219                         return false;
220
221                 e = $(e);
222                 s = s || {};
223
224                 var list = this, cls = wpList.parseClass(e,'dim'), element, isClass, color, dimColor, res, rres;
225
226                 s = wpList.pre.call( list, e, s, 'dim' );
227
228                 s.element = cls[2] || s.element || null;
229                 s.dimClass =  cls[3] || s.dimClass || null;
230
231                 if ( cls[4] )
232                         s.dimAddColor = '#' + cls[4];
233                 else
234                         s.dimAddColor = s.dimAddColor || '#FFFF33';
235
236                 if ( cls[5] )
237                         s.dimDelColor = '#' + cls[5];
238                 else
239                         s.dimDelColor = s.dimDelColor || '#FF3333';
240
241                 if ( !s || !s.element || !s.dimClass )
242                         return true;
243
244                 s.action = 'dim-' + s.what;
245
246                 s.nonce = wpList.nonce(e,s);
247
248                 s.data = $.extend(
249                         { action: s.action, id: s.element.split('-').pop(), dimClass: s.dimClass, _ajax_nonce : s.nonce },
250                         wpAjax.unserialize( cls[6] || '' )
251                 );
252
253                 if ( $.isFunction(s.dimBefore) ) {
254                         s = s.dimBefore( s );
255                         if ( !s )
256                                 return true;
257                 }
258
259                 element = $('#' + s.element);
260                 isClass = element.toggleClass(s.dimClass).is('.' + s.dimClass);
261                 color = wpList.getColor( element );
262                 element.toggleClass( s.dimClass );
263                 dimColor = isClass ? s.dimAddColor : s.dimDelColor;
264
265                 if ( 'none' != dimColor ) {
266                         element
267                                 .animate( { backgroundColor: dimColor }, 'fast' )
268                                 .queue( function() { element.toggleClass(s.dimClass); $(this).dequeue(); } )
269                                 .animate( { backgroundColor: color }, { complete: function() {
270                                                 $(this).css( 'backgroundColor', '' );
271                                                 $(list).trigger( 'wpListDimEnd', [ s, list.wpList ] );
272                                         }
273                                 });
274                 } else {
275                         $(list).trigger( 'wpListDimEnd', [ s, list.wpList ] );
276                 }
277
278                 if ( !s.data._ajax_nonce )
279                         return true;
280
281                 s.success = function(r) {
282                         res = wpAjax.parseAjaxResponse(r, s.response, s.element);
283                         rres = r;
284
285                         if ( !res || res.errors ) {
286                                 element.stop().stop().css( 'backgroundColor', '#FF3333' )[isClass?'removeClass':'addClass'](s.dimClass).show().queue( function() { list.wpList.recolor(); $(this).dequeue(); } );
287                                 return false;
288                         }
289                 };
290
291                 s.complete = function(x, st) {
292                         if ( $.isFunction(s.dimAfter) ) {
293                                 element.queue( function() {
294                                         var _s = $.extend( { xml: x, status: st, parsed: res }, s );
295                                         s.dimAfter( rres, _s );
296                                 }).dequeue();
297                         }
298                 };
299
300                 $.ajax( s );
301                 return false;
302         },
303
304         getColor: function( el ) {
305                 var color = jQuery(el).css('backgroundColor');
306
307                 return color || '#ffffff';
308         },
309
310         add: function( e, s ) {
311                 e = $(e);
312
313                 var list = $(this), old = false, _s = { pos: 0, id: 0, oldId: null }, ba, ref, color;
314
315                 if ( 'string' == typeof s )
316                         s = { what: s };
317
318                 s = $.extend(_s, this.wpList.settings, s);
319
320                 if ( !e.size() || !s.what )
321                         return false;
322
323                 if ( s.oldId )
324                         old = $('#' + s.what + '-' + s.oldId);
325
326                 if ( s.id && ( s.id != s.oldId || !old || !old.size() ) )
327                         $('#' + s.what + '-' + s.id).remove();
328
329                 if ( old && old.size() ) {
330                         old.before(e);
331                         old.remove();
332                 } else if ( isNaN(s.pos) ) {
333                         ba = 'after';
334
335                         if ( '-' == s.pos.substr(0,1) ) {
336                                 s.pos = s.pos.substr(1);
337                                 ba = 'before';
338                         }
339
340                         ref = list.find( '#' + s.pos );
341
342                         if ( 1 === ref.size() )
343                                 ref[ba](e);
344                         else
345                                 list.append(e);
346
347                 } else if ( 'comment' != s.what || 0 === $('#' + s.element).length ) {
348                         if ( s.pos < 0 ) {
349                                 list.prepend(e);
350                         } else {
351                                 list.append(e);
352                         }
353                 }
354
355                 if ( s.alt ) {
356                         if ( ( list.children(':visible').index( e[0] ) + s.altOffset ) % 2 ) { e.removeClass( s.alt ); }
357                         else { e.addClass( s.alt ); }
358                 }
359
360                 if ( 'none' != s.addColor ) {
361                         color = wpList.getColor( e );
362                         e.css( 'backgroundColor', s.addColor ).animate( { backgroundColor: color }, { complete: function() { $(this).css( 'backgroundColor', '' ); } } );
363                 }
364                 list.each( function() { this.wpList.process( e ); } );
365                 return e;
366         },
367
368         clear: function(e) {
369                 var list = this, t, tag;
370
371                 e = $(e);
372
373                 if ( list.wpList && e.parents( '#' + list.id ).size() )
374                         return;
375
376                 e.find(':input').each( function() {
377                         if ( $(this).parents('.form-no-clear').size() )
378                                 return;
379
380                         t = this.type.toLowerCase();
381                         tag = this.tagName.toLowerCase();
382
383                         if ( 'text' == t || 'password' == t || 'textarea' == tag )
384                                 this.value = '';
385                         else if ( 'checkbox' == t || 'radio' == t )
386                                 this.checked = false;
387                         else if ( 'select' == tag )
388                                 this.selectedIndex = null;
389                 });
390         },
391
392         process: function(el) {
393                 var list = this,
394                         $el = $(el || document);
395
396                 $el.delegate( 'form[class^="add:' + list.id + ':"]', 'submit', function(){
397                         return list.wpList.add(this);
398                 });
399
400                 $el.delegate( '[class^="add:' + list.id + ':"]:not(form)', 'click', function(){
401                         return list.wpList.add(this);
402                 });
403
404                 $el.delegate( '[class^="delete:' + list.id + ':"]', 'click', function(){
405                         return list.wpList.del(this);
406                 });
407
408                 $el.delegate( '[class^="dim:' + list.id + ':"]', 'click', function(){
409                         return list.wpList.dim(this);
410                 });
411         },
412
413         recolor: function() {
414                 var list = this, items, eo;
415
416                 if ( !list.wpList.settings.alt )
417                         return;
418
419                 items = $('.list-item:visible', list);
420
421                 if ( !items.size() )
422                         items = $(list).children(':visible');
423
424                 eo = [':even',':odd'];
425
426                 if ( list.wpList.settings.altOffset % 2 )
427                         eo.reverse();
428
429                 items.filter(eo[0]).addClass(list.wpList.settings.alt).end().filter(eo[1]).removeClass(list.wpList.settings.alt);
430         },
431
432         init: function() {
433                 var lists = this;
434
435                 lists.wpList.process = function(a) {
436                         lists.each( function() {
437                                 this.wpList.process(a);
438                         } );
439                 };
440
441                 lists.wpList.recolor = function() {
442                         lists.each( function() {
443                                 this.wpList.recolor();
444                         } );
445                 };
446         }
447 };
448
449 $.fn.wpList = function( settings ) {
450         this.each( function() {
451                 var _this = this;
452
453                 this.wpList = { settings: $.extend( {}, wpList.settings, { what: wpList.parseClass(this,'list')[1] || '' }, settings ) };
454                 $.each( fs, function(i,f) { _this.wpList[i] = function( e, s ) { return wpList[f].call( _this, e, s ); }; } );
455         } );
456
457         wpList.init.call(this);
458
459         this.wpList.process();
460
461         return this;
462 };
463
464 })(jQuery);