web/wp-includes/js/wp-lists.dev.js
branchwordpress
changeset 109 03b0d1493584
child 132 4d4862461b8d
equal deleted inserted replaced
-1:000000000000 109:03b0d1493584
       
     1 (function($) {
       
     2 var fs = {add:'ajaxAdd',del:'ajaxDel',dim:'ajaxDim',process:'process',recolor:'recolor'}, wpList;
       
     3 
       
     4 wpList = {
       
     5 	settings: {
       
     6 		url: wpListL10n.url, 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 		try {
       
    27 			cl = $(e).attr('class') || '';
       
    28 			cl = cl.match(new RegExp(t+':[\\S]+'));
       
    29 			if ( cl ) { c = cl[0].split(':'); }
       
    30 		} catch(r) {}
       
    31 		return c;
       
    32 	},
       
    33 
       
    34 	pre: function(e,s,a) {
       
    35 		var bg, r;
       
    36 		s = $.extend( {}, this.wpList.settings, {
       
    37 			element: null,
       
    38 			nonce: 0,
       
    39 			target: e.get(0)
       
    40 		}, s || {} );
       
    41 		if ( $.isFunction( s.confirm ) ) {
       
    42 			if ( 'add' != a ) {
       
    43 				bg = $('#' + s.element).css('backgroundColor');
       
    44 				$('#' + s.element).css('backgroundColor', '#FF9966');
       
    45 			}
       
    46 			r = s.confirm.call(this,e,s,a,bg);
       
    47 			if ( 'add' != a ) { $('#' + s.element).css('backgroundColor', bg ); }
       
    48 			if ( !r ) { return false; }
       
    49 		}
       
    50 		return s;
       
    51 	},
       
    52 
       
    53 	ajaxAdd: function( e, s ) {
       
    54 		e = $(e);
       
    55 		s = s || {};
       
    56 		var list = this, cls = wpList.parseClass(e,'add'), es, valid, formData;
       
    57 		s = wpList.pre.call( list, e, s, 'add' );
       
    58 
       
    59 		s.element = cls[2] || e.attr( 'id' ) || s.element || null;
       
    60 		if ( cls[3] ) { s.addColor = '#' + cls[3]; }
       
    61 		else { s.addColor = s.addColor || '#FFFF33'; }
       
    62 
       
    63 		if ( !s ) { return false; }
       
    64 
       
    65 		if ( !e.is("[class^=add:" + list.id + ":]") ) { return !wpList.add.call( list, e, s ); }
       
    66 
       
    67 		if ( !s.element ) { return true; }
       
    68 
       
    69 		s.action = 'add-' + s.what;
       
    70 
       
    71 		s.nonce = wpList.nonce(e,s);
       
    72 
       
    73 		es = $('#' + s.element + ' :input').not('[name=_ajax_nonce], [name=_wpnonce], [name=action]');
       
    74 		valid = wpAjax.validateForm( '#' + s.element );
       
    75 		if ( !valid ) { return false; }
       
    76 
       
    77 		s.data = $.param( $.extend( { _ajax_nonce: s.nonce, action: s.action }, wpAjax.unserialize( cls[4] || '' ) ) );
       
    78 		formData = $.isFunction(es.fieldSerialize) ? es.fieldSerialize() : es.serialize();
       
    79 		if ( formData ) { s.data += '&' + formData; }
       
    80 
       
    81 		if ( $.isFunction(s.addBefore) ) {
       
    82 			s = s.addBefore( s );
       
    83 			if ( !s ) { return true; }
       
    84 		}
       
    85 		if ( !s.data.match(/_ajax_nonce=[a-f0-9]+/) ) { return true; }
       
    86 
       
    87 		s.success = function(r) {
       
    88 			var res = wpAjax.parseAjaxResponse(r, s.response, s.element), o;
       
    89 			if ( !res || res.errors ) { return false; }
       
    90 
       
    91 			if ( true === res ) { return true; }
       
    92 
       
    93 			jQuery.each( res.responses, function() {
       
    94 				wpList.add.call( list, this.data, $.extend( {}, s, { // this.firstChild.nodevalue
       
    95 					pos: this.position || 0,
       
    96 					id: this.id || 0,
       
    97 					oldId: this.oldId || null
       
    98 				} ) );
       
    99 			} );
       
   100 
       
   101 			if ( $.isFunction(s.addAfter) ) {
       
   102 				o = this.complete;
       
   103 				this.complete = function(x,st) {
       
   104 					var _s = $.extend( { xml: x, status: st, parsed: res }, s );
       
   105 					s.addAfter( r, _s );
       
   106 					if ( $.isFunction(o) ) { o(x,st); }
       
   107 				};
       
   108 			}
       
   109 			list.wpList.recolor();
       
   110 			wpList.clear.call(list,'#' + s.element);
       
   111 		};
       
   112 
       
   113 		$.ajax( s );
       
   114 		return false;
       
   115 	},
       
   116 
       
   117 	ajaxDel: function( e, s ) {
       
   118 		e = $(e); s = s || {};
       
   119 		var list = this, cls = wpList.parseClass(e,'delete'), element, anim;
       
   120 		s = wpList.pre.call( list, e, s, 'delete' );
       
   121 
       
   122 		s.element = cls[2] || s.element || null;
       
   123 		if ( cls[3] ) { s.delColor = '#' + cls[3]; }
       
   124 		else { s.delColor = s.delColor || '#FF3333'; }
       
   125 
       
   126 		if ( !s || !s.element ) { return false; }
       
   127 
       
   128 		s.action = 'delete-' + s.what;
       
   129 
       
   130 		s.nonce = wpList.nonce(e,s);
       
   131 
       
   132 		s.data = $.extend(
       
   133 			{ action: s.action, id: s.element.split('-').pop(), _ajax_nonce: s.nonce },
       
   134 			wpAjax.unserialize( cls[4] || '' )
       
   135 		);
       
   136 
       
   137 		if ( $.isFunction(s.delBefore) ) {
       
   138 			s = s.delBefore( s );
       
   139 			if ( !s ) { return true; }
       
   140 		}
       
   141 		if ( !s.data._ajax_nonce ) { return true; }
       
   142 
       
   143 		element = $('#' + s.element);
       
   144 
       
   145 		if ( 'none' != s.delColor ) {
       
   146 			anim = 'slideUp';
       
   147 			if ( element.css( 'display' ).match(/table/) )
       
   148 				anim = 'fadeOut'; // Can't slideup table rows and other table elements.  Known jQuery bug
       
   149 			element
       
   150 				.animate( { backgroundColor: s.delColor }, 'fast'  )[anim]( 'fast' )
       
   151 				.queue( function() { list.wpList.recolor(); $(this).dequeue(); } );
       
   152 		} else {
       
   153 			list.wpList.recolor();
       
   154 		}
       
   155 
       
   156 		s.success = function(r) {
       
   157 			var res = wpAjax.parseAjaxResponse(r, s.response, s.element), o;
       
   158 			if ( !res || res.errors ) {
       
   159 				element.stop().stop().css( 'backgroundColor', '#FF3333' ).show().queue( function() { list.wpList.recolor(); $(this).dequeue(); } );
       
   160 				return false;
       
   161 			}
       
   162 			if ( $.isFunction(s.delAfter) ) {
       
   163 				o = this.complete;
       
   164 				this.complete = function(x,st) {
       
   165 					element.queue( function() {
       
   166 						var _s = $.extend( { xml: x, status: st, parsed: res }, s );
       
   167 						s.delAfter( r, _s );
       
   168 						if ( $.isFunction(o) ) { o(x,st); }
       
   169 					} ).dequeue();
       
   170 				};
       
   171 			}
       
   172 		};
       
   173 		$.ajax( s );
       
   174 		return false;
       
   175 	},
       
   176 
       
   177 	ajaxDim: function( e, s ) {
       
   178 		if ( $(e).parent().css('display') == 'none' ) // Prevent hidden links from being clicked by hotkeys
       
   179 			return false;
       
   180 		e = $(e); s = s || {};
       
   181 		var list = this, cls = wpList.parseClass(e,'dim'), element, isClass, color, dimColor;
       
   182 		s = wpList.pre.call( list, e, s, 'dim' );
       
   183 
       
   184 		s.element = cls[2] || s.element || null;
       
   185 		s.dimClass =  cls[3] || s.dimClass || null;
       
   186 		if ( cls[4] ) { s.dimAddColor = '#' + cls[4]; }
       
   187 		else { s.dimAddColor = s.dimAddColor || '#FFFF33'; }
       
   188 		if ( cls[5] ) { s.dimDelColor = '#' + cls[5]; }
       
   189 		else { s.dimDelColor = s.dimDelColor || '#FF3333'; }
       
   190 
       
   191 		if ( !s || !s.element || !s.dimClass ) { return true; }
       
   192 
       
   193 		s.action = 'dim-' + s.what;
       
   194 
       
   195 		s.nonce = wpList.nonce(e,s);
       
   196 
       
   197 		s.data = $.extend(
       
   198 			{ action: s.action, id: s.element.split('-').pop(), dimClass: s.dimClass, _ajax_nonce : s.nonce },
       
   199 			wpAjax.unserialize( cls[6] || '' )
       
   200 		);
       
   201 
       
   202 		if ( $.isFunction(s.dimBefore) ) {
       
   203 			s = s.dimBefore( s );
       
   204 			if ( !s ) { return true; }
       
   205 		}
       
   206 
       
   207 		element = $('#' + s.element);
       
   208 		isClass = element.toggleClass(s.dimClass).is('.' + s.dimClass);
       
   209 		color = wpList.getColor( element );
       
   210 		element.toggleClass( s.dimClass )
       
   211 		dimColor = isClass ? s.dimAddColor : s.dimDelColor;
       
   212 		if ( 'none' != dimColor ) {
       
   213 			element
       
   214 				.animate( { backgroundColor: dimColor }, 'fast' )
       
   215 				.queue( function() { element.toggleClass(s.dimClass); $(this).dequeue(); } )
       
   216 				.animate( { backgroundColor: color }, { complete: function() { $(this).css( 'backgroundColor', '' ); } } );
       
   217 		}
       
   218 
       
   219 		if ( !s.data._ajax_nonce ) { return true; }
       
   220 
       
   221 		s.success = function(r) {
       
   222 			var res = wpAjax.parseAjaxResponse(r, s.response, s.element), o;
       
   223 			if ( !res || res.errors ) {
       
   224 				element.stop().stop().css( 'backgroundColor', '#FF3333' )[isClass?'removeClass':'addClass'](s.dimClass).show().queue( function() { list.wpList.recolor(); $(this).dequeue(); } );
       
   225 				return false;
       
   226 			}
       
   227 			if ( $.isFunction(s.dimAfter) ) {
       
   228 				o = this.complete;
       
   229 				this.complete = function(x,st) {
       
   230 					element.queue( function() {
       
   231 						var _s = $.extend( { xml: x, status: st, parsed: res }, s );
       
   232 						s.dimAfter( r, _s );
       
   233 						if ( $.isFunction(o) ) { o(x,st); }
       
   234 					} ).dequeue();
       
   235 				};
       
   236 			}
       
   237 		};
       
   238 
       
   239 		$.ajax( s );
       
   240 		return false;
       
   241 	},
       
   242 
       
   243 	// From jquery.color.js: jQuery Color Animation by John Resig
       
   244 	getColor: function( el ) {
       
   245 		if ( el.constructor == Object )
       
   246 			el = el.get(0);
       
   247 		var elem = el, color, rgbaTrans = new RegExp( "rgba\\(\\s*0,\\s*0,\\s*0,\\s*0\\s*\\)", "i" );
       
   248 		do {
       
   249 			color = jQuery.curCSS(elem, 'backgroundColor');
       
   250 			if ( color != '' && color != 'transparent' && !color.match(rgbaTrans) || jQuery.nodeName(elem, "body") )
       
   251 				break;
       
   252 		} while ( elem = elem.parentNode );
       
   253 		return color || '#ffffff';
       
   254 	},
       
   255 
       
   256 	add: function( e, s ) {
       
   257 		e = $(e);
       
   258 
       
   259 		var list = $(this), old = false, _s = { pos: 0, id: 0, oldId: null }, ba, ref, color;
       
   260 		if ( 'string' == typeof s ) { s = { what: s }; }
       
   261 		s = $.extend(_s, this.wpList.settings, s);
       
   262 		if ( !e.size() || !s.what ) { return false; }
       
   263 		if ( s.oldId ) { old = $('#' + s.what + '-' + s.oldId); }
       
   264 		if ( s.id && ( s.id != s.oldId || !old || !old.size() ) ) { $('#' + s.what + '-' + s.id).remove(); }
       
   265 
       
   266 		if ( old && old.size() ) {
       
   267 			old.before(e);
       
   268 			old.remove();
       
   269 		} else if ( isNaN(s.pos) ) {
       
   270 			ba = 'after';
       
   271 			if ( '-' == s.pos.substr(0,1) ) {
       
   272 				s.pos = s.pos.substr(1);
       
   273 				ba = 'before';
       
   274 			}
       
   275 			ref = list.find( '#' + s.pos );
       
   276 			if ( 1 === ref.size() ) { ref[ba](e); }
       
   277 			else { list.append(e); }
       
   278 		} else if ( s.pos < 0 ) {
       
   279 			list.prepend(e);
       
   280 		} else {
       
   281 			list.append(e);
       
   282 		}
       
   283 
       
   284 		if ( s.alt ) {
       
   285 			if ( ( list.children(':visible').index( e[0] ) + s.altOffset ) % 2 ) { e.removeClass( s.alt ); }
       
   286 			else { e.addClass( s.alt ); }
       
   287 		}
       
   288 
       
   289 		if ( 'none' != s.addColor ) {
       
   290 			color = wpList.getColor( e );
       
   291 			e.css( 'backgroundColor', s.addColor ).animate( { backgroundColor: color }, { complete: function() { $(this).css( 'backgroundColor', '' ); } } );
       
   292 		}
       
   293 		list.each( function() { this.wpList.process( e ); } );
       
   294 		return e;
       
   295 	},
       
   296 
       
   297 	clear: function(e) {
       
   298 		var list = this, t, tag;
       
   299 		e = $(e);
       
   300 		if ( list.wpList && e.parents( '#' + list.id ).size() ) { return; }
       
   301 		e.find(':input').each( function() {
       
   302 			if ( $(this).parents('.form-no-clear').size() )
       
   303 				return;
       
   304 			t = this.type.toLowerCase();
       
   305 			tag = this.tagName.toLowerCase();
       
   306 			if ( 'text' == t || 'password' == t || 'textarea' == tag ) { this.value = ''; }
       
   307 			else if ( 'checkbox' == t || 'radio' == t ) { this.checked = false; }
       
   308 			else if ( 'select' == tag ) { this.selectedIndex = null; }
       
   309 		});
       
   310 	},
       
   311 
       
   312 	process: function(el) {
       
   313 		var list = this;
       
   314 		$("[class^=add:" + list.id + ":]", el || null)
       
   315 			.filter('form').submit( function() { return list.wpList.add(this); } ).end()
       
   316 			.not('form').click( function() { return list.wpList.add(this); } );
       
   317 		$("[class^=delete:" + list.id + ":]", el || null).click( function() { return list.wpList.del(this); } );
       
   318 		$("[class^=dim:" + list.id + ":]", el || null).click( function() { return list.wpList.dim(this); } );
       
   319 	},
       
   320 
       
   321 	recolor: function() {
       
   322 		var list = this, items, eo;
       
   323 		if ( !list.wpList.settings.alt ) { return; }
       
   324 		items = $('.list-item:visible', list);
       
   325 		if ( !items.size() ) { items = $(list).children(':visible'); }
       
   326 		eo = [':even',':odd'];
       
   327 		if ( list.wpList.settings.altOffset % 2 ) { eo.reverse(); }
       
   328 		items.filter(eo[0]).addClass(list.wpList.settings.alt).end().filter(eo[1]).removeClass(list.wpList.settings.alt);
       
   329 	},
       
   330 
       
   331 	init: function() {
       
   332 		var lists = this;
       
   333 		lists.wpList.process = function(a) {
       
   334 			lists.each( function() {
       
   335 				this.wpList.process(a);
       
   336 			} );
       
   337 		};
       
   338 		lists.wpList.recolor = function() {
       
   339 			lists.each( function() {
       
   340 				this.wpList.recolor();
       
   341 			} );
       
   342 		};
       
   343 	}
       
   344 };
       
   345 
       
   346 $.fn.wpList = function( settings ) {
       
   347 	this.each( function() {
       
   348 		var _this = this;
       
   349 		this.wpList = { settings: $.extend( {}, wpList.settings, { what: wpList.parseClass(this,'list')[1] || '' }, settings ) };
       
   350 		$.each( fs, function(i,f) { _this.wpList[i] = function( e, s ) { return wpList[f].call( _this, e, s ); }; } );
       
   351 	} );
       
   352 	wpList.init.call(this);
       
   353 	this.wpList.process();
       
   354 	return this;
       
   355 };
       
   356 
       
   357 })(jQuery);