You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

855 lines
25 KiB

  1. /* global ajaxurl, wpAjax */
  2. /**
  3. * @param {jQuery} $ jQuery object.
  4. */
  5. ( function( $ ) {
  6. var functions = {
  7. add: 'ajaxAdd',
  8. del: 'ajaxDel',
  9. dim: 'ajaxDim',
  10. process: 'process',
  11. recolor: 'recolor'
  12. }, wpList;
  13. /**
  14. * @namespace
  15. */
  16. wpList = {
  17. /**
  18. * @member {object}
  19. */
  20. settings: {
  21. /**
  22. * URL for Ajax requests.
  23. *
  24. * @member {string}
  25. */
  26. url: ajaxurl,
  27. /**
  28. * The HTTP method to use for Ajax requests.
  29. *
  30. * @member {string}
  31. */
  32. type: 'POST',
  33. /**
  34. * ID of the element the parsed Ajax response will be stored in.
  35. *
  36. * @member {string}
  37. */
  38. response: 'ajax-response',
  39. /**
  40. * The type of list.
  41. *
  42. * @member {string}
  43. */
  44. what: '',
  45. /**
  46. * CSS class name for alternate styling.
  47. *
  48. * @member {string}
  49. */
  50. alt: 'alternate',
  51. /**
  52. * Offset to start alternate styling from.
  53. *
  54. * @member {number}
  55. */
  56. altOffset: 0,
  57. /**
  58. * Color used in animation when adding an element.
  59. *
  60. * Can be 'none' to disable the animation.
  61. *
  62. * @member {string}
  63. */
  64. addColor: '#ffff33',
  65. /**
  66. * Color used in animation when deleting an element.
  67. *
  68. * Can be 'none' to disable the animation.
  69. *
  70. * @member {string}
  71. */
  72. delColor: '#faafaa',
  73. /**
  74. * Color used in dim add animation.
  75. *
  76. * Can be 'none' to disable the animation.
  77. *
  78. * @member {string}
  79. */
  80. dimAddColor: '#ffff33',
  81. /**
  82. * Color used in dim delete animation.
  83. *
  84. * Can be 'none' to disable the animation.
  85. *
  86. * @member {string}
  87. */
  88. dimDelColor: '#ff3333',
  89. /**
  90. * Callback that's run before a request is made.
  91. *
  92. * @callback wpList~confirm
  93. * @param {object} this
  94. * @param {HTMLElement} list The list DOM element.
  95. * @param {object} settings Settings for the current list.
  96. * @param {string} action The type of action to perform: 'add', 'delete', or 'dim'.
  97. * @param {string} backgroundColor Background color of the list's DOM element.
  98. * @returns {boolean} Whether to proceed with the action or not.
  99. */
  100. confirm: null,
  101. /**
  102. * Callback that's run before an item gets added to the list.
  103. *
  104. * Allows to cancel the request.
  105. *
  106. * @callback wpList~addBefore
  107. * @param {object} settings Settings for the Ajax request.
  108. * @returns {object|boolean} Settings for the Ajax request or false to abort.
  109. */
  110. addBefore: null,
  111. /**
  112. * Callback that's run after an item got added to the list.
  113. *
  114. * @callback wpList~addAfter
  115. * @param {XML} returnedResponse Raw response returned from the server.
  116. * @param {object} settings Settings for the Ajax request.
  117. * @param {jqXHR} settings.xml jQuery XMLHttpRequest object.
  118. * @param {string} settings.status Status of the request: 'success', 'notmodified', 'nocontent', 'error',
  119. * 'timeout', 'abort', or 'parsererror'.
  120. * @param {object} settings.parsed Parsed response object.
  121. */
  122. addAfter: null,
  123. /**
  124. * Callback that's run before an item gets deleted from the list.
  125. *
  126. * Allows to cancel the request.
  127. *
  128. * @callback wpList~delBefore
  129. * @param {object} settings Settings for the Ajax request.
  130. * @param {HTMLElement} list The list DOM element.
  131. * @returns {object|boolean} Settings for the Ajax request or false to abort.
  132. */
  133. delBefore: null,
  134. /**
  135. * Callback that's run after an item got deleted from the list.
  136. *
  137. * @callback wpList~delAfter
  138. * @param {XML} returnedResponse Raw response returned from the server.
  139. * @param {object} settings Settings for the Ajax request.
  140. * @param {jqXHR} settings.xml jQuery XMLHttpRequest object.
  141. * @param {string} settings.status Status of the request: 'success', 'notmodified', 'nocontent', 'error',
  142. * 'timeout', 'abort', or 'parsererror'.
  143. * @param {object} settings.parsed Parsed response object.
  144. */
  145. delAfter: null,
  146. /**
  147. * Callback that's run before an item gets dim'd.
  148. *
  149. * Allows to cancel the request.
  150. *
  151. * @callback wpList~dimBefore
  152. * @param {object} settings Settings for the Ajax request.
  153. * @returns {object|boolean} Settings for the Ajax request or false to abort.
  154. */
  155. dimBefore: null,
  156. /**
  157. * Callback that's run after an item got dim'd.
  158. *
  159. * @callback wpList~dimAfter
  160. * @param {XML} returnedResponse Raw response returned from the server.
  161. * @param {object} settings Settings for the Ajax request.
  162. * @param {jqXHR} settings.xml jQuery XMLHttpRequest object.
  163. * @param {string} settings.status Status of the request: 'success', 'notmodified', 'nocontent', 'error',
  164. * 'timeout', 'abort', or 'parsererror'.
  165. * @param {object} settings.parsed Parsed response object.
  166. */
  167. dimAfter: null
  168. },
  169. /**
  170. * Finds a nonce.
  171. *
  172. * 1. Nonce in settings.
  173. * 2. `_ajax_nonce` value in element's href attribute.
  174. * 3. `_ajax_nonce` input field that is a descendant of element.
  175. * 4. `_wpnonce` value in element's href attribute.
  176. * 5. `_wpnonce` input field that is a descendant of element.
  177. * 6. 0 if none can be found.
  178. *
  179. * @param {jQuery} element Element that triggered the request.
  180. * @param {object} settings Settings for the Ajax request.
  181. * @returns {string|number} Nonce
  182. */
  183. nonce: function( element, settings ) {
  184. var url = wpAjax.unserialize( element.attr( 'href' ) ),
  185. $element = $( '#' + settings.element );
  186. return settings.nonce || url._ajax_nonce || $element.find( 'input[name="_ajax_nonce"]' ).val() || url._wpnonce || $element.find( 'input[name="_wpnonce"]' ).val() || 0;
  187. },
  188. /**
  189. * Extract list item data from a DOM element.
  190. *
  191. * Example 1: data-wp-lists="delete:the-comment-list:comment-{comment_ID}:66cc66:unspam=1"
  192. * Example 2: data-wp-lists="dim:the-comment-list:comment-{comment_ID}:unapproved:e7e7d3:e7e7d3:new=approved"
  193. *
  194. * Returns an unassociated array with the following data:
  195. * data[0] - Data identifier: 'list', 'add', 'delete', or 'dim'.
  196. * data[1] - ID of the corresponding list. If data[0] is 'list', the type of list ('comment', 'category', etc).
  197. * data[2] - ID of the parent element of all inputs necessary for the request.
  198. * data[3] - Hex color to be used in this request. If data[0] is 'dim', dim class.
  199. * data[4] - Additional arguments in query syntax that are added to the request. Example: 'post_id=1234'.
  200. * If data[0] is 'dim', dim add color.
  201. * data[5] - Only available if data[0] is 'dim', dim delete color.
  202. * data[6] - Only available if data[0] is 'dim', additional arguments in query syntax that are added to the request.
  203. *
  204. * Result for Example 1:
  205. * data[0] - delete
  206. * data[1] - the-comment-list
  207. * data[2] - comment-{comment_ID}
  208. * data[3] - 66cc66
  209. * data[4] - unspam=1
  210. *
  211. * @param {HTMLElement} element The DOM element.
  212. * @param {string} type The type of data to look for: 'list', 'add', 'delete', or 'dim'.
  213. * @returns {Array} Extracted list item data.
  214. */
  215. parseData: function( element, type ) {
  216. var data = [], wpListsData;
  217. try {
  218. wpListsData = $( element ).data( 'wp-lists' ) || '';
  219. wpListsData = wpListsData.match( new RegExp( type + ':[\\S]+' ) );
  220. if ( wpListsData ) {
  221. data = wpListsData[0].split( ':' );
  222. }
  223. } catch ( error ) {}
  224. return data;
  225. },
  226. /**
  227. * Calls a confirm callback to verify the action that is about to be performed.
  228. *
  229. * @param {HTMLElement} list The DOM element.
  230. * @param {object} settings Settings for this list.
  231. * @param {string} action The type of action to perform: 'add', 'delete', or 'dim'.
  232. * @returns {object|boolean} Settings if confirmed, false if not.
  233. */
  234. pre: function( list, settings, action ) {
  235. var $element, backgroundColor, confirmed;
  236. settings = $.extend( {}, this.wpList.settings, {
  237. element: null,
  238. nonce: 0,
  239. target: list.get( 0 )
  240. }, settings || {} );
  241. if ( $.isFunction( settings.confirm ) ) {
  242. $element = $( '#' + settings.element );
  243. if ( 'add' !== action ) {
  244. backgroundColor = $element.css( 'backgroundColor' );
  245. $element.css( 'backgroundColor', '#ff9966' );
  246. }
  247. confirmed = settings.confirm.call( this, list, settings, action, backgroundColor );
  248. if ( 'add' !== action ) {
  249. $element.css( 'backgroundColor', backgroundColor );
  250. }
  251. if ( ! confirmed ) {
  252. return false;
  253. }
  254. }
  255. return settings;
  256. },
  257. /**
  258. * Adds an item to the list via AJAX.
  259. *
  260. * @param {HTMLElement} element The DOM element.
  261. * @param {object} settings Settings for this list.
  262. * @returns {boolean} Whether the item was added.
  263. */
  264. ajaxAdd: function( element, settings ) {
  265. var list = this,
  266. $element = $( element ),
  267. data = wpList.parseData( $element, 'add' ),
  268. formValues, formData, parsedResponse, returnedResponse;
  269. settings = settings || {};
  270. settings = wpList.pre.call( list, $element, settings, 'add' );
  271. settings.element = data[2] || $element.prop( 'id' ) || settings.element || null;
  272. settings.addColor = data[3] ? '#' + data[3] : settings.addColor;
  273. if ( ! settings ) {
  274. return false;
  275. }
  276. if ( ! $element.is( '[id="' + settings.element + '-submit"]' ) ) {
  277. return ! wpList.add.call( list, $element, settings );
  278. }
  279. if ( ! settings.element ) {
  280. return true;
  281. }
  282. settings.action = 'add-' + settings.what;
  283. settings.nonce = wpList.nonce( $element, settings );
  284. if ( ! wpAjax.validateForm( '#' + settings.element ) ) {
  285. return false;
  286. }
  287. settings.data = $.param( $.extend( {
  288. _ajax_nonce: settings.nonce,
  289. action: settings.action
  290. }, wpAjax.unserialize( data[4] || '' ) ) );
  291. formValues = $( '#' + settings.element + ' :input' ).not( '[name="_ajax_nonce"], [name="_wpnonce"], [name="action"]' );
  292. formData = $.isFunction( formValues.fieldSerialize ) ? formValues.fieldSerialize() : formValues.serialize();
  293. if ( formData ) {
  294. settings.data += '&' + formData;
  295. }
  296. if ( $.isFunction( settings.addBefore ) ) {
  297. settings = settings.addBefore( settings );
  298. if ( ! settings ) {
  299. return true;
  300. }
  301. }
  302. if ( ! settings.data.match( /_ajax_nonce=[a-f0-9]+/ ) ) {
  303. return true;
  304. }
  305. settings.success = function( response ) {
  306. parsedResponse = wpAjax.parseAjaxResponse( response, settings.response, settings.element );
  307. returnedResponse = response;
  308. if ( ! parsedResponse || parsedResponse.errors ) {
  309. return false;
  310. }
  311. if ( true === parsedResponse ) {
  312. return true;
  313. }
  314. $.each( parsedResponse.responses, function() {
  315. wpList.add.call( list, this.data, $.extend( {}, settings, { // this.firstChild.nodevalue
  316. position: this.position || 0,
  317. id: this.id || 0,
  318. oldId: this.oldId || null
  319. } ) );
  320. } );
  321. list.wpList.recolor();
  322. $( list ).trigger( 'wpListAddEnd', [ settings, list.wpList ] );
  323. wpList.clear.call( list, '#' + settings.element );
  324. };
  325. settings.complete = function( jqXHR, status ) {
  326. if ( $.isFunction( settings.addAfter ) ) {
  327. settings.addAfter( returnedResponse, $.extend( {
  328. xml: jqXHR,
  329. status: status,
  330. parsed: parsedResponse
  331. }, settings ) );
  332. }
  333. };
  334. $.ajax( settings );
  335. return false;
  336. },
  337. /**
  338. * Delete an item in the list via AJAX.
  339. *
  340. * @param {HTMLElement} element A DOM element containing item data.
  341. * @param {object} settings Settings for this list.
  342. * @returns {boolean} Whether the item was deleted.
  343. */
  344. ajaxDel: function( element, settings ) {
  345. var list = this,
  346. $element = $( element ),
  347. data = wpList.parseData( $element, 'delete' ),
  348. $eventTarget, parsedResponse, returnedResponse;
  349. settings = settings || {};
  350. settings = wpList.pre.call( list, $element, settings, 'delete' );
  351. settings.element = data[2] || settings.element || null;
  352. settings.delColor = data[3] ? '#' + data[3] : settings.delColor;
  353. if ( ! settings || ! settings.element ) {
  354. return false;
  355. }
  356. settings.action = 'delete-' + settings.what;
  357. settings.nonce = wpList.nonce( $element, settings );
  358. settings.data = $.extend( {
  359. _ajax_nonce: settings.nonce,
  360. action: settings.action,
  361. id: settings.element.split( '-' ).pop()
  362. }, wpAjax.unserialize( data[4] || '' ) );
  363. if ( $.isFunction( settings.delBefore ) ) {
  364. settings = settings.delBefore( settings, list );
  365. if ( ! settings ) {
  366. return true;
  367. }
  368. }
  369. if ( ! settings.data._ajax_nonce ) {
  370. return true;
  371. }
  372. $eventTarget = $( '#' + settings.element );
  373. if ( 'none' !== settings.delColor ) {
  374. $eventTarget.css( 'backgroundColor', settings.delColor ).fadeOut( 350, function() {
  375. list.wpList.recolor();
  376. $( list ).trigger( 'wpListDelEnd', [ settings, list.wpList ] );
  377. } );
  378. } else {
  379. list.wpList.recolor();
  380. $( list ).trigger( 'wpListDelEnd', [ settings, list.wpList ] );
  381. }
  382. settings.success = function( response ) {
  383. parsedResponse = wpAjax.parseAjaxResponse( response, settings.response, settings.element );
  384. returnedResponse = response;
  385. if ( ! parsedResponse || parsedResponse.errors ) {
  386. $eventTarget.stop().stop().css( 'backgroundColor', '#faa' ).show().queue( function() {
  387. list.wpList.recolor();
  388. $( this ).dequeue();
  389. } );
  390. return false;
  391. }
  392. };
  393. settings.complete = function( jqXHR, status ) {
  394. if ( $.isFunction( settings.delAfter ) ) {
  395. $eventTarget.queue( function() {
  396. settings.delAfter( returnedResponse, $.extend( {
  397. xml: jqXHR,
  398. status: status,
  399. parsed: parsedResponse
  400. }, settings ) );
  401. } ).dequeue();
  402. }
  403. };
  404. $.ajax( settings );
  405. return false;
  406. },
  407. /**
  408. * Dim an item in the list via AJAX.
  409. *
  410. * @param {HTMLElement} element A DOM element containing item data.
  411. * @param {object} settings Settings for this list.
  412. * @returns {boolean} Whether the item was dim'ed.
  413. */
  414. ajaxDim: function( element, settings ) {
  415. var list = this,
  416. $element = $( element ),
  417. data = wpList.parseData( $element, 'dim' ),
  418. $eventTarget, isClass, color, dimColor, parsedResponse, returnedResponse;
  419. // Prevent hidden links from being clicked by hotkeys.
  420. if ( 'none' === $element.parent().css( 'display' ) ) {
  421. return false;
  422. }
  423. settings = settings || {};
  424. settings = wpList.pre.call( list, $element, settings, 'dim' );
  425. settings.element = data[2] || settings.element || null;
  426. settings.dimClass = data[3] || settings.dimClass || null;
  427. settings.dimAddColor = data[4] ? '#' + data[4] : settings.dimAddColor;
  428. settings.dimDelColor = data[5] ? '#' + data[5] : settings.dimDelColor;
  429. if ( ! settings || ! settings.element || ! settings.dimClass ) {
  430. return true;
  431. }
  432. settings.action = 'dim-' + settings.what;
  433. settings.nonce = wpList.nonce( $element, settings );
  434. settings.data = $.extend( {
  435. _ajax_nonce: settings.nonce,
  436. action: settings.action,
  437. id: settings.element.split( '-' ).pop(),
  438. dimClass: settings.dimClass
  439. }, wpAjax.unserialize( data[6] || '' ) );
  440. if ( $.isFunction( settings.dimBefore ) ) {
  441. settings = settings.dimBefore( settings );
  442. if ( ! settings ) {
  443. return true;
  444. }
  445. }
  446. $eventTarget = $( '#' + settings.element );
  447. isClass = $eventTarget.toggleClass( settings.dimClass ).is( '.' + settings.dimClass );
  448. color = wpList.getColor( $eventTarget );
  449. dimColor = isClass ? settings.dimAddColor : settings.dimDelColor;
  450. $eventTarget.toggleClass( settings.dimClass );
  451. if ( 'none' !== dimColor ) {
  452. $eventTarget
  453. .animate( { backgroundColor: dimColor }, 'fast' )
  454. .queue( function() {
  455. $eventTarget.toggleClass( settings.dimClass );
  456. $( this ).dequeue();
  457. } )
  458. .animate( { backgroundColor: color }, {
  459. complete: function() {
  460. $( this ).css( 'backgroundColor', '' );
  461. $( list ).trigger( 'wpListDimEnd', [ settings, list.wpList ] );
  462. }
  463. } );
  464. } else {
  465. $( list ).trigger( 'wpListDimEnd', [ settings, list.wpList ] );
  466. }
  467. if ( ! settings.data._ajax_nonce ) {
  468. return true;
  469. }
  470. settings.success = function( response ) {
  471. parsedResponse = wpAjax.parseAjaxResponse( response, settings.response, settings.element );
  472. returnedResponse = response;
  473. if ( true === parsedResponse ) {
  474. return true;
  475. }
  476. if ( ! parsedResponse || parsedResponse.errors ) {
  477. $eventTarget.stop().stop().css( 'backgroundColor', '#ff3333' )[isClass ? 'removeClass' : 'addClass']( settings.dimClass ).show().queue( function() {
  478. list.wpList.recolor();
  479. $( this ).dequeue();
  480. } );
  481. return false;
  482. }
  483. /** @property {string} comment_link Link of the comment to be dimmed. */
  484. if ( 'undefined' !== typeof parsedResponse.responses[0].supplemental.comment_link ) {
  485. var $submittedOn = $element.find( '.submitted-on' ),
  486. $commentLink = $submittedOn.find( 'a' );
  487. // Comment is approved; link the date field.
  488. if ( '' !== parsedResponse.responses[0].supplemental.comment_link ) {
  489. $submittedOn.html( $('<a></a>').text( $submittedOn.text() ).prop( 'href', parsedResponse.responses[0].supplemental.comment_link ) );
  490. // Comment is not approved; unlink the date field.
  491. } else if ( $commentLink.length ) {
  492. $submittedOn.text( $commentLink.text() );
  493. }
  494. }
  495. };
  496. settings.complete = function( jqXHR, status ) {
  497. if ( $.isFunction( settings.dimAfter ) ) {
  498. $eventTarget.queue( function() {
  499. settings.dimAfter( returnedResponse, $.extend( {
  500. xml: jqXHR,
  501. status: status,
  502. parsed: parsedResponse
  503. }, settings ) );
  504. } ).dequeue();
  505. }
  506. };
  507. $.ajax( settings );
  508. return false;
  509. },
  510. /**
  511. * Returns the background color of the passed element.
  512. *
  513. * @param {jQuery|string} element Element to check.
  514. * @returns {string} Background color value in HEX. Default: '#ffffff'.
  515. */
  516. getColor: function( element ) {
  517. return $( element ).css( 'backgroundColor' ) || '#ffffff';
  518. },
  519. /**
  520. * Adds something.
  521. *
  522. * @param {HTMLElement} element A DOM element containing item data.
  523. * @param {object} settings Settings for this list.
  524. * @returns {boolean} Whether the item was added.
  525. */
  526. add: function( element, settings ) {
  527. var $list = $( this ),
  528. $element = $( element ),
  529. old = false,
  530. position, reference;
  531. if ( 'string' === typeof settings ) {
  532. settings = { what: settings };
  533. }
  534. settings = $.extend( { position: 0, id: 0, oldId: null }, this.wpList.settings, settings );
  535. if ( ! $element.length || ! settings.what ) {
  536. return false;
  537. }
  538. if ( settings.oldId ) {
  539. old = $( '#' + settings.what + '-' + settings.oldId );
  540. }
  541. if ( settings.id && ( settings.id !== settings.oldId || ! old || ! old.length ) ) {
  542. $( '#' + settings.what + '-' + settings.id ).remove();
  543. }
  544. if ( old && old.length ) {
  545. old.before( $element );
  546. old.remove();
  547. } else if ( isNaN( settings.position ) ) {
  548. position = 'after';
  549. if ( '-' === settings.position.substr( 0, 1 ) ) {
  550. settings.position = settings.position.substr( 1 );
  551. position = 'before';
  552. }
  553. reference = $list.find( '#' + settings.position );
  554. if ( 1 === reference.length ) {
  555. reference[position]( $element );
  556. } else {
  557. $list.append( $element );
  558. }
  559. } else if ( 'comment' !== settings.what || 0 === $( '#' + settings.element ).length ) {
  560. if ( settings.position < 0 ) {
  561. $list.prepend( $element );
  562. } else {
  563. $list.append( $element );
  564. }
  565. }
  566. if ( settings.alt ) {
  567. $element.toggleClass( settings.alt, ( $list.children( ':visible' ).index( $element[0] ) + settings.altOffset ) % 2 );
  568. }
  569. if ( 'none' !== settings.addColor ) {
  570. $element.css( 'backgroundColor', settings.addColor ).animate( { backgroundColor: wpList.getColor( $element ) }, {
  571. complete: function() {
  572. $( this ).css( 'backgroundColor', '' );
  573. }
  574. } );
  575. }
  576. // Add event handlers.
  577. $list.each( function( index, list ) {
  578. list.wpList.process( $element );
  579. } );
  580. return $element;
  581. },
  582. /**
  583. * Clears all input fields within the element passed.
  584. *
  585. * @param {string} elementId ID of the element to check, including leading #.
  586. */
  587. clear: function( elementId ) {
  588. var list = this,
  589. $element = $( elementId ),
  590. type, tagName;
  591. // Bail if we're within the list.
  592. if ( list.wpList && $element.parents( '#' + list.id ).length ) {
  593. return;
  594. }
  595. // Check each input field.
  596. $element.find( ':input' ).each( function( index, input ) {
  597. // Bail if the form was marked to not to be cleared.
  598. if ( $( input ).parents( '.form-no-clear' ).length ) {
  599. return;
  600. }
  601. type = input.type.toLowerCase();
  602. tagName = input.tagName.toLowerCase();
  603. if ( 'text' === type || 'password' === type || 'textarea' === tagName ) {
  604. input.value = '';
  605. } else if ( 'checkbox' === type || 'radio' === type ) {
  606. input.checked = false;
  607. } else if ( 'select' === tagName ) {
  608. input.selectedIndex = null;
  609. }
  610. } );
  611. },
  612. /**
  613. * Registers event handlers to add, delete, and dim items.
  614. *
  615. * @param {string} elementId
  616. */
  617. process: function( elementId ) {
  618. var list = this,
  619. $element = $( elementId || document );
  620. $element.on( 'submit', 'form[data-wp-lists^="add:' + list.id + ':"]', function() {
  621. return list.wpList.add( this );
  622. } );
  623. $element.on( 'click', 'a[data-wp-lists^="add:' + list.id + ':"], input[data-wp-lists^="add:' + list.id + ':"]', function() {
  624. return list.wpList.add( this );
  625. } );
  626. $element.on( 'click', '[data-wp-lists^="delete:' + list.id + ':"]', function() {
  627. return list.wpList.del( this );
  628. } );
  629. $element.on( 'click', '[data-wp-lists^="dim:' + list.id + ':"]', function() {
  630. return list.wpList.dim( this );
  631. } );
  632. },
  633. /**
  634. * Updates list item background colors.
  635. */
  636. recolor: function() {
  637. var list = this,
  638. evenOdd = [':even', ':odd'],
  639. items;
  640. // Bail if there is no alternate class name specified.
  641. if ( ! list.wpList.settings.alt ) {
  642. return;
  643. }
  644. items = $( '.list-item:visible', list );
  645. if ( ! items.length ) {
  646. items = $( list ).children( ':visible' );
  647. }
  648. if ( list.wpList.settings.altOffset % 2 ) {
  649. evenOdd.reverse();
  650. }
  651. items.filter( evenOdd[0] ).addClass( list.wpList.settings.alt ).end();
  652. items.filter( evenOdd[1] ).removeClass( list.wpList.settings.alt );
  653. },
  654. /**
  655. * Sets up `process()` and `recolor()` functions.
  656. */
  657. init: function() {
  658. var $list = this;
  659. $list.wpList.process = function( element ) {
  660. $list.each( function() {
  661. this.wpList.process( element );
  662. } );
  663. };
  664. $list.wpList.recolor = function() {
  665. $list.each( function() {
  666. this.wpList.recolor();
  667. } );
  668. };
  669. }
  670. };
  671. /**
  672. * Initializes wpList object.
  673. *
  674. * @param {Object} settings
  675. * @param {string} settings.url URL for ajax calls. Default: ajaxurl.
  676. * @param {string} settings.type The HTTP method to use for Ajax requests. Default: 'POST'.
  677. * @param {string} settings.response ID of the element the parsed ajax response will be stored in.
  678. * Default: 'ajax-response'.
  679. *
  680. * @param {string} settings.what Default: ''.
  681. * @param {string} settings.alt CSS class name for alternate styling. Default: 'alternate'.
  682. * @param {number} settings.altOffset Offset to start alternate styling from. Default: 0.
  683. * @param {string} settings.addColor Hex code or 'none' to disable animation. Default: '#ffff33'.
  684. * @param {string} settings.delColor Hex code or 'none' to disable animation. Default: '#faafaa'.
  685. * @param {string} settings.dimAddColor Hex code or 'none' to disable animation. Default: '#ffff33'.
  686. * @param {string} settings.dimDelColor Hex code or 'none' to disable animation. Default: '#ff3333'.
  687. *
  688. * @param {wpList~confirm} settings.confirm Callback that's run before a request is made. Default: null.
  689. * @param {wpList~addBefore} settings.addBefore Callback that's run before an item gets added to the list.
  690. * Default: null.
  691. * @param {wpList~addAfter} settings.addAfter Callback that's run after an item got added to the list.
  692. * Default: null.
  693. * @param {wpList~delBefore} settings.delBefore Callback that's run before an item gets deleted from the list.
  694. * Default: null.
  695. * @param {wpList~delAfter} settings.delAfter Callback that's run after an item got deleted from the list.
  696. * Default: null.
  697. * @param {wpList~dimBefore} settings.dimBefore Callback that's run before an item gets dim'd. Default: null.
  698. * @param {wpList~dimAfter} settings.dimAfter Callback that's run after an item got dim'd. Default: null.
  699. * @returns {$.fn} wpList API function.
  700. */
  701. $.fn.wpList = function( settings ) {
  702. this.each( function( index, list ) {
  703. list.wpList = {
  704. settings: $.extend( {}, wpList.settings, { what: wpList.parseData( list, 'list' )[1] || '' }, settings )
  705. };
  706. $.each( functions, function( func, callback ) {
  707. list.wpList[func] = function( element, setting ) {
  708. return wpList[callback].call( list, element, setting );
  709. };
  710. } );
  711. } );
  712. wpList.init.call( this );
  713. this.wpList.process();
  714. return this;
  715. };
  716. } ) ( jQuery );