wp/wp-includes/js/wp-lists.js
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
equal deleted inserted replaced
-1:000000000000 0:d970ebf37754
       
     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 	parseData: function(e,t) {
       
    25 		var d = [], wpListsData;
       
    26 
       
    27 		try {
       
    28 			wpListsData = $(e).attr('data-wp-lists') || '';
       
    29 			wpListsData = wpListsData.match(new RegExp(t+':[\\S]+'));
       
    30 
       
    31 			if ( wpListsData )
       
    32 				d = wpListsData[0].split(':');
       
    33 		} catch(r) {}
       
    34 
       
    35 		return d;
       
    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, data = wpList.parseData(e,'add'), es, valid, formData, res, rres;
       
    68 
       
    69 		s = wpList.pre.call( list, e, s, 'add' );
       
    70 
       
    71 		s.element = data[2] || e.attr( 'id' ) || s.element || null;
       
    72 
       
    73 		if ( data[3] )
       
    74 			s.addColor = '#' + data[3];
       
    75 		else
       
    76 			s.addColor = s.addColor || '#FFFF33';
       
    77 
       
    78 		if ( !s )
       
    79 			return false;
       
    80 
       
    81 		if ( !e.is('[id="' + s.element + '-submit"]') )
       
    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( data[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, data = wpList.parseData(e,'delete'), element, res, rres;
       
   151 
       
   152 		s = wpList.pre.call( list, e, s, 'delete' );
       
   153 
       
   154 		s.element = data[2] || s.element || null;
       
   155 
       
   156 		if ( data[3] )
       
   157 			s.delColor = '#' + data[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( data[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, data = wpList.parseData(e,'dim'), element, isClass, color, dimColor, res, rres;
       
   225 
       
   226 		s = wpList.pre.call( list, e, s, 'dim' );
       
   227 
       
   228 		s.element = data[2] || s.element || null;
       
   229 		s.dimClass =  data[3] || s.dimClass || null;
       
   230 
       
   231 		if ( data[4] )
       
   232 			s.dimAddColor = '#' + data[4];
       
   233 		else
       
   234 			s.dimAddColor = s.dimAddColor || '#FFFF33';
       
   235 
       
   236 		if ( data[5] )
       
   237 			s.dimDelColor = '#' + data[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( data[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 = $( $.trim(e) ); // Trim leading whitespaces
       
   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[data-wp-lists^="add:' + list.id + ':"]', 'submit', function(){
       
   397 			return list.wpList.add(this);
       
   398 		});
       
   399 
       
   400 		$el.delegate( 'a[data-wp-lists^="add:' + list.id + ':"], input[data-wp-lists^="add:' + list.id + ':"]', 'click', function(){
       
   401 			return list.wpList.add(this);
       
   402 		});
       
   403 
       
   404 		$el.delegate( '[data-wp-lists^="delete:' + list.id + ':"]', 'click', function(){
       
   405 			return list.wpList.del(this);
       
   406 		});
       
   407 
       
   408 		$el.delegate( '[data-wp-lists^="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.parseData(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);