/**
 * Main YITH WooCommerce Wishlist JS
 *
 * @author YITH <plugins@yithemes.com>
 * @package YITH WooCommerce Wishlist
 * @version 3.0.0
 */

/* globals yith_wcwl_l10n, wc_add_to_cart_params, yith_wccl_general */

jQuery( function ( $ ) {

	/* === MAIN INIT === */

	$( document ).on( 'yith_wcwl_init', function () {
		var t = $( this ),
			cart_redirect_after_add = (typeof (wc_add_to_cart_params) !== 'undefined' && wc_add_to_cart_params !== null) ? wc_add_to_cart_params.cart_redirect_after_add : '';

		t.on( 'click', '.add_to_wishlist', function ( ev ) {
			var t = $( this ),
				product_id = t.attr( 'data-product-id' ),
				el_wrap = $( '.add-to-wishlist-' + product_id ),
				filtered_data = null,
				data = {
					action: yith_wcwl_l10n.actions.add_to_wishlist_action,
					nonce: yith_wcwl_l10n.nonce.add_to_wishlist_nonce,
					context: 'frontend',
					add_to_wishlist: product_id,
					product_type: t.data( 'product-type' ),
					wishlist_id: t.data( 'wishlist-id' ),
					fragments: retrieve_fragments( product_id )
				};

			// allow third party code to filter data
			if ( filtered_data = $( document ).triggerHandler( 'yith_wcwl_add_to_wishlist_data', [ t, data ] ) ) {
				data = filtered_data;
			}

			ev.preventDefault();

			jQuery( document.body ).trigger( 'adding_to_wishlist' );

			if ( yith_wcwl_l10n.multi_wishlist && yith_wcwl_l10n.modal_enable ) {
				var wishlist_popup_container = t.parents( '.yith-wcwl-popup-footer' ).prev( '.yith-wcwl-popup-content' ),
					wishlist_popup_select = wishlist_popup_container.find( '.wishlist-select' ),
					wishlist_popup_name = wishlist_popup_container.find( '.wishlist-name' ),
					wishlist_popup_visibility = wishlist_popup_container.find( '.wishlist-visibility' ).filter( ':checked' );

				data.wishlist_id = wishlist_popup_select.is( ':visible' ) ? wishlist_popup_select.val() : 'new';
				data.wishlist_name = wishlist_popup_name.val();
				data.wishlist_visibility = wishlist_popup_visibility.val();

				if ( 'new' === data.wishlist_id && ! data.wishlist_name ) {
					wishlist_popup_name.closest( 'p' ).addClass( 'woocommerce-invalid' );
					return false;
				} else {
					wishlist_popup_name.closest( 'p' ).removeClass( 'woocommerce-invalid' );
				}
			}

			if ( ! is_cookie_enabled() ) {
				window.alert( yith_wcwl_l10n.labels.cookie_disabled );
				return;
			}

			$.ajax( {
				type: 'POST',
				url: yith_wcwl_l10n.ajax_url,
				data: data,
				dataType: 'json',
				beforeSend: function () {
					block( t );
				},
				complete: function () {
					unblock( t );
				},
				success: function ( response ) {
					var response_result = response.result,
						response_message = response.message;

					if ( yith_wcwl_l10n.multi_wishlist && yith_wcwl_l10n.modal_enable ) {
						// close PrettyPhoto popup
						close_pretty_photo( response_message, response_result );

						// update options for all wishlist selects
						if ( typeof (response.user_wishlists) !== 'undefined' ) {
							update_wishlists( response.user_wishlists );
						}
					} else {
						print_message( response_message );
					}

					if ( response_result === 'true' || response_result === 'exists' ) {
						if ( typeof response.fragments !== 'undefined' ) {
							replace_fragments( response.fragments );
						}

						if ( ! yith_wcwl_l10n.multi_wishlist || yith_wcwl_l10n.hide_add_button ) {
							el_wrap.find( '.yith-wcwl-add-button' ).remove();
						}

						el_wrap.addClass( 'exists' );
					}

					init_handling_after_ajax();

					$( 'body' ).trigger( 'added_to_wishlist', [ t, el_wrap ] );
				}

			} );

			return false;
		} );

		t.on( 'click', '.wishlist_table .remove_from_wishlist', function ( ev ) {
			var t = $( this );

			ev.preventDefault();

			remove_item_from_wishlist( t );

			return false;
		} );

		t.on( 'adding_to_cart', 'body', function ( ev, button, data ) {
			if ( typeof button !== 'undefined' && typeof data !== 'undefined' && button.closest( '.wishlist_table' ).length ) {
				data.remove_from_wishlist_after_add_to_cart = button.closest( '[data-row-id]' ).data( 'row-id' );
				data.wishlist_id = button.closest( '.wishlist_table' ).data( 'id' );
				typeof wc_add_to_cart_params !== 'undefined' && (wc_add_to_cart_params.cart_redirect_after_add = yith_wcwl_l10n.redirect_to_cart);
				typeof yith_wccl_general !== 'undefined' && (yith_wccl_general.cart_redirect = isTrue( yith_wcwl_l10n.redirect_to_cart ));
			}
		} );

		t.on( 'added_to_cart', 'body', function ( ev, fragments, carthash, button ) {
			if ( typeof button !== 'undefined' && button.closest( '.wishlist_table' ).length ) {
				typeof wc_add_to_cart_params !== 'undefined' && (wc_add_to_cart_params.cart_redirect_after_add = cart_redirect_after_add);
				typeof yith_wccl_general !== 'undefined' && (yith_wccl_general.cart_redirect = isTrue( cart_redirect_after_add ));

				var tr = button.closest( '[data-row-id]' ),
					table = tr.closest( '.wishlist-fragment' ),
					options = table.data( 'fragment-options' );

				button.removeClass( 'added' );
				tr.find( '.added_to_cart' ).remove();

				if ( yith_wcwl_l10n.remove_from_wishlist_after_add_to_cart && options.is_user_owner ) {
					tr.remove();
				}
			}
		} );

		t.on( 'added_to_cart', 'body', function () {
			var messages = $( '.woocommerce-message' );

			if ( messages.length === 0 ) {
				$( '#yith-wcwl-form' ).prepend( yith_wcwl_l10n.labels.added_to_cart_message );
			} else {
				messages.fadeOut( 300, function () {
					$( this ).replaceWith( yith_wcwl_l10n.labels.added_to_cart_message ).fadeIn();
				} );
			}
		} );

		t.on( 'cart_page_refreshed', 'body', init_handling_after_ajax );

		t.on( 'click', '.show-title-form', show_title_form );

		t.on( 'click', '.wishlist-title-with-form h2', show_title_form );

		t.on( 'click', '.remove_from_all_wishlists', function ( ev ) {
			var t = $( this ),
				prod_id = t.attr( 'data-product-id' ),
				wishlist_id = t.data( 'wishlist-id' ),
				content = t.closest( '.content' ),
				data = {
					action: yith_wcwl_l10n.actions.remove_from_all_wishlists,
					nonce: yith_wcwl_l10n.nonce.remove_from_all_wishlists_nonce,
					context: 'frontend',
					prod_id: prod_id,
					wishlist_id: wishlist_id,
					fragments: retrieve_fragments( prod_id )
				};

			ev.preventDefault();

			$.ajax( {
				beforeSend: function () {
					block( content );
				},
				complete: function () {
					unblock( content );
				},
				data: data,
				dataType: 'json',
				method: 'post',
				success: function ( data ) {
					if ( typeof data.fragments !== 'undefined' ) {
						replace_fragments( data.fragments );
					}

					init_handling_after_ajax();
				},
				url: yith_wcwl_l10n.ajax_url
			} );
		} );

		t.on( 'click', '.hide-title-form', hide_title_form );

		t.on( 'click', '.save-title-form', submit_title_form );

		t.on( 'change', '.wishlist_manage_table .wishlist-visibility', save_privacy );

		t.on( 'change', '.change-wishlist', function () {
			var t = $( this ),
				table = t.parents( '.cart.wishlist_table' ),
				wishlist_token = table.data( 'token' ),
				item_id = t.parents( '[data-row-id]' ).data( 'row-id' ),
				to_token = t.val();

			call_ajax_move_item_to_another_wishlist(
				{
					wishlist_token: wishlist_token,
					destination_wishlist_token: to_token,
					item_id: item_id,
					fragments: retrieve_fragments()
				},
				function () {
					block( table );
				},
				function ( data ) {
					if ( typeof data.fragments !== 'undefined' ) {
						replace_fragments( data.fragments );
					}

					unblock( table );
				}
			);
		} );

		t.on( 'click', '.yith-wcwl-popup-footer .move_to_wishlist', function () {
			var t = $( this ),
				product_id = t.attr( 'data-product-id' ),
				wishlist_token = t.data( 'origin-wishlist-id' ),
				form = t.closest( 'form' ),
				to_token = form.find( '.wishlist-select' ).val(),
				wishlist_name_field = form.find( '.wishlist-name' ),
				wishlist_name = wishlist_name_field.val(),
				wishlist_visibility = form.find( '.wishlist-visibility' ).filter( ':checked' ).val();

			if ( 'new' === to_token && ! wishlist_name ) {
				wishlist_name_field.closest( 'p' ).addClass( 'woocommerce-invalid' );
				return false;
			} else {
				wishlist_name_field.closest( 'p' ).removeClass( 'woocommerce-invalid' );
			}

			call_ajax_move_item_to_another_wishlist(
				{
					wishlist_token: wishlist_token,
					destination_wishlist_token: to_token,
					item_id: product_id,
					wishlist_name: wishlist_name,
					wishlist_visibility: wishlist_visibility,
					fragments: retrieve_fragments( product_id )
				},
				function () {
					block( t );
				},
				function ( response ) {
					var response_message = response.message;

					if ( yith_wcwl_l10n.multi_wishlist ) {
						close_pretty_photo( response_message );

						if ( typeof (response.user_wishlists) !== 'undefined' ) {
							update_wishlists( response.user_wishlists );
						}
					} else {
						print_message( response_message );
					}

					if ( typeof response.fragments !== 'undefined' ) {
						replace_fragments( response.fragments );
					}

					init_handling_after_ajax();

					unblock( t );
				}
			);
		} );

		t.on( 'click', '.delete_item', function () {
			var t = $( this ),
				product_id = t.attr( 'data-product-id' ),
				item_id = t.data( 'item-id' ),
				el_wrap = $( '.add-to-wishlist-' + product_id ),
				data = {
					action: yith_wcwl_l10n.actions.delete_item_action,
					nonce: yith_wcwl_l10n.nonce.delete_item_nonce,
					context: 'frontend',
					item_id: item_id,
					fragments: retrieve_fragments( product_id )
				};

			$.ajax( {
				url: yith_wcwl_l10n.ajax_url,
				data: data,
				dataType: 'json',
				beforeSend: function () {
					block( t );
				},
				complete: function () {
					unblock( t );
				},
				method: 'post',
				success: function ( response ) {
					var fragments = response.fragments,
						response_message = response.message;

					if ( yith_wcwl_l10n.multi_wishlist ) {
						close_pretty_photo( response_message );
					}

					if ( ! t.closest( '.yith-wcwl-remove-button' ).length ) {
						print_message( response_message );
					}

					if ( typeof fragments !== 'undefined' ) {
						replace_fragments( fragments );
					}

					init_handling_after_ajax();

					$( 'body' ).trigger( 'removed_from_wishlist', [ t, el_wrap ] );
				}
			} );

			return false;
		} );

		t.on( 'change', '.yith-wcwl-popup-content .wishlist-select', function () {
			var t = $( this );

			if ( t.val() === 'new' ) {
				t.parents( '.yith-wcwl-first-row' ).next( '.yith-wcwl-second-row' ).show();
			} else {
				t.parents( '.yith-wcwl-first-row' ).next( '.yith-wcwl-second-row' ).hide();
			}
		} );

		t.on( 'change', '#bulk_add_to_cart', function () {
			var t = $( this ),
				checkboxes = t.closest( '.wishlist_table' ).find( '[data-row-id]' ).find( 'input[type="checkbox"]:not(:disabled)' );

			if ( t.is( ':checked' ) ) {
				checkboxes.prop( 'checked', 'checked' ).change();
			} else {
				checkboxes.prop( 'checked', false ).change();
			}
		} );

		t.on( 'submit', '.wishlist-ask-an-estimate-popup', function () {
			var t = $( this ),
				form = t.closest( 'form' ),
				pp_content = t.closest( '.pp_content' ),
				data = form.serializeArray().reduce( ( data, field ) => {
					data[ field.name ] = field.value;
					return data;
				}, {} );

			data.action = yith_wcwl_l10n.actions.ask_an_estimate;
			data.nonce = yith_wcwl_l10n.nonce.ask_an_estimate_nonce;
			data.context = 'frontend';

			$.ajax( {
				beforeSend: function () {
					block( form );
				},
				complete: function () {
					unblock( form );
				},
				data: data,
				dataType: 'json',
				method: 'post',
				success: function ( data ) {
					if ( typeof data.result !== 'undefined' && data.result ) {
						var template = data.template;

						if ( typeof template !== 'undefined' ) {
							form.replaceWith( template );
							pp_content.css( 'height', 'auto' );

							setTimeout( close_pretty_photo, yith_wcwl_l10n.time_to_close_prettyphoto );
						}
					} else if ( typeof data.message !== 'undefined' ) {
						form.find( '.woocommerce-error' ).remove();
						form.find( '.popup-description' ).after( $( '<div>', {
							'text': data.message,
							'class': 'woocommerce-error'
						} ) );
					}
				},
				url: yith_wcwl_l10n.ajax_url
			} );

			return false;
		} );

		t.on( 'click', '.yith-wfbt-add-wishlist', function ( e ) {
			e.preventDefault();
			var t = $( this ),
				form = $( '#yith-wcwl-form' );

			$( 'html, body' ).animate( {
				scrollTop: (form.offset().top)
			}, 500 );

			// ajax call
			reload_wishlist_and_adding_elem( t, form );
		} );

		t.on( 'submit', '.yith-wcwl-popup-form', function () {
			return false;
		} );

		t.on( 'yith_infs_added_elem', function () {
			init_wishlist_pretty_photo();
		} );

		t.on( 'found_variation', function ( ev, variation ) {
			var t = $( ev.target ),
				product_id = t.data( 'product_id' ),
				variation_id = variation.variation_id,
				target1 = $( '.yith-wcwl-add-to-wishlist' )
					.find( '[data-product-id="' + product_id + '"]' ),
				target2 = $( '.yith-wcwl-add-to-wishlist' )
					.find( '[data-original-product-id="' + product_id + '"]' ),
				targets = target1.add( target2 ),
				fragments = targets.closest( '.wishlist-fragment' ).filter( ':visible' );

			if ( ! product_id || ! variation_id || ! targets.length ) {
				return;
			}

			targets.each( function () {
				var t = $( this ),
					container = t.closest( '.yith-wcwl-add-to-wishlist' ),
					options;

				t.attr( 'data-original-product-id', product_id );
				t.attr( 'data-product-id', variation_id );

				if ( container.length ) {
					options = container.data( 'fragment-options' );

					if ( typeof options !== 'undefined' ) {
						options.product_id = variation_id;
						container.data( 'fragment-options', options );
					}

					container
						.removeClass( function ( i, classes ) {
							return classes.match( /add-to-wishlist-\S+/g ).join( ' ' );
						} )
						.addClass( 'add-to-wishlist-' + variation_id )
						.attr( 'data-fragment-ref', variation_id );
				}
			} );

			if ( ! yith_wcwl_l10n.reload_on_found_variation ) {
				return;
			}

			block( fragments );

			load_fragments( {
				fragments: fragments,
				firstLoad: false
			} );
		} );

		t.on( 'reset_data', function ( ev ) {
			var t = $( ev.target ),
				product_id = t.data( 'product_id' ),
				targets = $( '[data-original-product-id="' + product_id + '"]' ),
				fragments = targets.closest( '.wishlist-fragment' ).filter( ':visible' );

			if ( ! product_id || ! targets.length ) {
				return;
			}

			targets.each( function () {
				var t = $( this ),
					container = t.closest( '.yith-wcwl-add-to-wishlist' ),
					variation_id = t.attr( 'data-product-id' ),
					options;

				t.attr( 'data-product-id', product_id );
				t.attr( 'data-original-product-id', '' );

				if ( container.length ) {
					options = container.data( 'fragment-options' );

					if ( typeof options !== 'undefined' ) {
						options.product_id = product_id;
						container.data( 'fragment-options', options );
					}

					container
						.removeClass( 'add-to-wishlist-' + variation_id )
						.addClass( 'add-to-wishlist-' + product_id )
						.attr( 'data-fragment-ref', product_id );
				}
			} );

			if ( ! yith_wcwl_l10n.reload_on_found_variation ) {
				return;
			}

			block( fragments );

			load_fragments( {
				fragments: fragments,
				firstLoad: false
			} );

		} );

		t.on( 'yith_wcwl_reload_fragments', ( event, data ) => load_fragments( data ) );

		t.on( 'yith_wcwl_reload_after_ajax', init_handling_after_ajax );

		t.on( 'yith_infs_added_elem', function ( ev, elem ) {
			load_fragments( {
				container: elem,
				firstLoad: false
			} );
		} );

		t.on( 'yith_wcwl_fragments_loaded', function ( ev, original, update, firstLoad ) {
			if ( ! firstLoad ) {
				return;
			}

			$( '.variations_form' ).find( '.variations select' ).last().change();
		} );

		t.on( 'click', '.yith-wcwl-popup-feedback .close-popup', function ( ev ) {
			ev.preventDefault();

			close_pretty_photo();
		} );

		init_wishlist_popup();

		init_wishlist_tooltip();

		init_wishlist_dropdown();

		init_wishlist_drag_n_drop();

		init_quantity();

		init_wishlist_details_popup();

		init_wishlist_popup_tabs();

		init_select_box();

		init_checkbox_handling();

		init_wishlist_pretty_photo();

		init_add_to_cart_icon();

		init_wishlist_responsive();

		init_copy_wishlist_link();

		if ( yith_wcwl_l10n.enable_ajax_loading ) {
			load_fragments();
		}

	} ).trigger( 'yith_wcwl_init' );

	// Avoid pressing the enter key in the qty input.
	$( 'form#yith-wcwl-form .wishlist_table .product-quantity input' ).on( 'keypress', function ( e ) {
		if ( e.keyCode == '13' ) {
			e.preventDefault();
			return false;
		}
	} );

	// Move the Add to Wishlist button under the gallery
	$( document ).ready( function () {
		if ( yith_wcwl_l10n.yith_wcwl_button_position === 'thumbnails' ) {
			$( '.woocommerce-product-gallery + div.yith-wcwl-add-to-wishlist' ).appendTo( '.woocommerce-product-gallery' );
		}
	} );

	$( document ).on( 'keydown', '#yith-wcwl-form input[name="wishlist_name"]', function ( event ) {
		const key = event.key;
		if ( [ 'Enter', 'Escape' ].includes( key ) ) {
			const $container = $( this ).closest( '.wishlist-title-container' );
			if ( 'Enter' === key ) {
				$container.find( 'a.save-title-form' ).trigger( 'click' );
			} else {
				$container.find( 'a.hide-title-form' ).trigger( 'click' );
			}

			event.preventDefault();
		}
	} )


	/* === INIT FUNCTIONS === */

	/**
	 * Adds selectbox where needed
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_select_box() {
		if ( typeof $.fn.selectBox !== 'undefined' ) {
			$( 'select.selectBox' ).filter( ':visible' ).not( '.enhanced' ).selectBox().addClass( 'enhanced' );
		}
	}

	/**
	 * Init PrettyPhoto for all links withi the plugin that open a popup
	 *
	 * @return void
	 * @since 2.0.16
	 */
	function init_wishlist_pretty_photo() {
		if ( typeof $.prettyPhoto === 'undefined' ) {
			return;
		}

		var ppParams = {
			hook: 'data-rel',
			social_tools: false,
			theme: 'pp_woocommerce yith-wcwl-pp-modal',
			horizontal_padding: 20,
			opacity: 0.8,
			deeplinking: false,
			overlay_gallery: false,
			keyboard_shortcuts: false,
			default_width: 500,
			changepicturecallback: function () {
				init_select_box();

				$( '.wishlist-select' ).filter( ':visible' ).change();
				$( document ).trigger( 'yith_wcwl_popup_opened', [ this ] );
			},
			markup: '<div class="pp_pic_holder">' +
				'<div class="pp_content_container">' +
				'<div class="pp_content">' +
				'<div class="pp_loaderIcon"></div>' +
				'<div class="pp_fade">' +
				'<a href="#" class="pp_expand" title="Expand the image">Expand</a>' +
				'<div class="pp_hoverContainer">' +
				'<a class="pp_next" href="#">next</a>' +
				'<a class="pp_previous" href="#">previous</a>' +
				'</div>' +
				'<div id="pp_full_res"></div>' +
				'<div class="pp_details">' +
				'<a class="pp_close" href="#">Close</a>' +
				'</div>' +
				'</div>' +
				'</div>' +
				'</div>' +
				'</div>' +
				'<div class="pp_overlay yith-wcwl-overlay"></div>'
		};

		$( 'a[data-rel^="prettyPhoto[add_to_wishlist_"]' )
			.add( 'a[data-rel="prettyPhoto[ask_an_estimate]"]' )
			.add( 'a[data-rel="prettyPhoto[create_wishlist]"]' )
			.off( 'click' )
			.prettyPhoto( ppParams );

		$( 'a[data-rel="prettyPhoto[move_to_another_wishlist]"]' ).on( 'click', function () {
			var t = $( this ),
				popup = $( '#move_to_another_wishlist' ),
				form = popup.find( 'form' ),
				row_id = form.find( '.row-id' ),
				id = t.closest( '[data-row-id]' ).data( 'row-id' );

			if ( row_id.length ) {
				row_id.remove();
			}

			var input = $( '<input>', {
				type: 'hidden',
				name: 'row_id',
				class: 'row-id'
			} ).val( id );
			form.append( input );
		} ).prettyPhoto( ppParams );

		// add & remove class to body when popup is opened
		var callback = function ( node, op ) {
				if ( typeof node.classList !== 'undefined' && node.classList.contains( 'yith-wcwl-overlay' ) ) {
					var method = 'remove' === op ? 'removeClass' : 'addClass';

					$( 'body' )[ method ]( 'yith-wcwl-with-pretty-photo' );
				}
			},
			callbackAdd = function ( node ) {
				callback( node, 'add' );
			},
			callbackRemove = function ( node ) {
				callback( node, 'remove' );
			},
			observer = new MutationObserver( function ( mutationsList ) {
				for ( var i in mutationsList ) {
					var mutation = mutationsList[ i ];
					if ( mutation.type === 'childList' ) {
						typeof mutation.addedNodes !== 'undefined' && typeof mutation.addedNodes.forEach === 'function' && mutation.addedNodes.forEach( callbackAdd );
						typeof mutation.removedNodes !== 'undefined' && typeof mutation.addedNodes.forEach === 'function' && mutation.removedNodes.forEach( callbackRemove );
					}
				}
			} );

		observer.observe( document.body, {
			childList: true
		} );
	}

	/**
	 * Init checkbox handling
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_checkbox_handling() {
		var checkboxes = $( '.wishlist_table' ).find( '.product-checkbox input[type="checkbox"]' );

		checkboxes.off( 'change' ).on( 'change', function () {
			var t = $( this ),
				p = t.parent();

			p
				.removeClass( 'checked' )
				.removeClass( 'unchecked' )
				.addClass( t.is( ':checked' ) ? 'checked' : 'unchecked' );
		} ).trigger( 'change' );
	}

	/**
	 * Show icon on Add to Cart button
	 *
	 * @return void
	 */
	function init_add_to_cart_icon() {
		$( '.add_to_cart' ).filter( '[data-icon]' ).not( '.icon-added' ).each( function () {
			var t = $( this ),
				data = t.data( 'icon' ),
				icon;

			if ( data.match( /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)?/gi ) ) {
				icon = $( '<img/>', { 'src': data } );
			} else {
				icon = $( '<i/>', { 'class': 'fa ' + data } );
			}

			t.prepend( icon ).addClass( 'icon-added' );
		} );
	}

	/**
	 * Init js handling on wishlist table items after ajax update
	 *
	 * @return void
	 * @since 2.0.7
	 */
	function init_handling_after_ajax() {
		init_select_box();
		init_wishlist_pretty_photo();
		init_checkbox_handling();
		init_add_to_cart_icon();
		init_wishlist_dropdown();
		init_wishlist_tooltip();
		init_wishlist_details_popup();
		init_wishlist_drag_n_drop();
		init_quantity();
		init_copy_wishlist_link();

		$( document ).trigger( 'yith_wcwl_init_after_ajax' );
	}

	/**
	 * Add tooltip to Add to Wishlist buttons
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_wishlist_tooltip() {
		if ( ! yith_wcwl_l10n.enable_tooltip ) {
			return;
		}

		$( '.yith-wcwl-add-to-wishlist' ).find( '[data-title]' ).each( function () {
			var t = $( this );

			if ( t.hasClass( 'tooltip-added' ) ) {
				return;
			}

			t
				.on( 'mouseenter', function () {
					var t = $( this );

					var tooltip = $( '<span>', { 'class': 'yith-wcwl-tooltip', 'text': t.data( 'title' ) } );

					t.append( tooltip );

					var width = tooltip.outerWidth() + 6;
					tooltip.outerWidth( width );

					tooltip.fadeIn( 200 );

					t.addClass( 'with-tooltip' );
				} )
				.on( 'mouseleave', function () {
					var t = $( this );

					t.find( '.yith-wcwl-tooltip' ).fadeOut( 200, function () {
						t.removeClass( 'with-tooltip' ).find( '.yith-wcwl-tooltip' ).remove();
					} );
				} );

			t.addClass( 'tooltip-added' );
		} );
	}

	/**
	 * Add wishlist popup message
	 *
	 * @return void
	 * @since 2.0.0
	 */
	function init_wishlist_popup() {
		if ( typeof yith_wcwl_l10n.enable_notices !== 'undefined' && ! yith_wcwl_l10n.enable_notices ) {
			return;
		}

		if ( $( '.yith-wcwl-add-to-wishlist' ).length && ! $( '#yith-wcwl-popup-message' ).length ) {
			var message_div = $( '<div>' )
					.attr( 'id', 'yith-wcwl-message' ),
				popup_div = $( '<div>' )
					.attr( 'id', 'yith-wcwl-popup-message' )
					.html( message_div )
					.hide();

			$( 'body' ).prepend( popup_div );
		}
	}

	/**
	 * Add Dropdown to Add to Wishlist when modal is disabled and Multi Wishlist enabled
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_wishlist_dropdown() {
		$( '.yith-wcwl-add-button' ).filter( '.with-dropdown' )
			.on( 'mouseleave', function () {
				var t = $( this ),
					dropdown = t.find( '.yith-wcwl-dropdown' );

				if ( dropdown.length ) {
					dropdown.fadeOut( 200 );
				}
			} )
			.children( 'a' )
			.on( 'mouseenter', function () {
				var t = $( this ),
					el_wrap = t.closest( '.with-dropdown' ),
					dropdown = el_wrap.find( '.yith-wcwl-dropdown' );

				if ( dropdown.length && dropdown.children().length ) {
					el_wrap.find( '.yith-wcwl-dropdown' ).fadeIn( 200 );
				}
			} );
	}

	/**
	 * Handle Drag & Drop of wishlist items for sorting
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_wishlist_drag_n_drop() {
		if ( typeof yith_wcwl_l10n.enable_drag_n_drop === 'undefined' || ! yith_wcwl_l10n.enable_drag_n_drop ) {
			return;
		}

		$( '.wishlist_table' ).filter( '.sortable' ).not( '.no-interactions' ).each( function () {
			var t = $( this ),
				jqxhr = false;

			t.sortable( {
				items: '[data-row-id]',
				scroll: true,
				helper: function ( e, ui ) {
					ui.children().each( function () {
						$( this ).width( $( this ).width() );
					} );
					return ui;
				},
				update: function () {
					var row = t.find( '[data-row-id]' ),
						positions = [],
						i = 0;

					if ( ! row.length ) {
						return;
					}

					if ( jqxhr ) {
						jqxhr.abort();
					}

					row.each( function () {
						var t = $( this );

						t.find( 'input[name*="[position]"]' ).val( i++ );

						positions.push( t.data( 'row-id' ) );
					} );

					jqxhr = $.ajax( {
						data: {
							action: yith_wcwl_l10n.actions.sort_wishlist_items,
							nonce: yith_wcwl_l10n.nonce.sort_wishlist_items_nonce,
							context: 'frontend',
							positions: positions,
							wishlist_token: t.data( 'token' ),
							page: t.data( 'page' ),
							per_page: t.data( 'per-page' )
						},
						method: 'POST',
						url: yith_wcwl_l10n.ajax_url
					} );
				}
			} );
		} );
	}

	/**
	 * Handle quantity input change for each wishlist item
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_quantity() {
		var jqxhr,
			timeout;

		$( '.wishlist_table' ).on( 'change', '.product-quantity :input', function () {
			var t = $( this ),
				row = t.closest( '[data-row-id]' ),
				product_id = row.data( 'row-id' ),
				table = t.closest( '.wishlist_table' ),
				token = table.data( 'token' );

			clearTimeout( timeout );

			// set add to cart link to add specific qty to cart
			row.find( '.add_to_cart' ).attr( 'data-quantity', t.val() );

			timeout = setTimeout( function () {
				if ( jqxhr ) {
					jqxhr.abort();
				}

				jqxhr = $.ajax( {
					beforeSend: function () {
						block( table );
					},
					complete: function () {
						unblock( table );
					},
					data: {
						action: yith_wcwl_l10n.actions.update_item_quantity,
						nonce: yith_wcwl_l10n.nonce.update_item_quantity_nonce,
						context: 'frontend',
						product_id: product_id,
						wishlist_token: token,
						quantity: t.val()
					},
					method: 'POST',
					url: yith_wcwl_l10n.ajax_url
				} );
			}, 1000 );
		} );
	}

	/**
	 * Init handling for copy button
	 *
	 * @return void
	 * @since 2.2.11
	 */
	function init_copy_wishlist_link() {
		$( '.copy-trigger' ).on( 'click', function () {

			var obj_to_copy = $( '.copy-target' );

			if ( obj_to_copy.length > 0 ) {
				if ( obj_to_copy.is( 'input' ) ) {

					if ( isOS() ) {

						obj_to_copy[ 0 ].setSelectionRange( 0, 9999 );
					} else {
						obj_to_copy.select();
					}
					document.execCommand( 'copy' );
				} else {

					var hidden = $( '<input/>', {
						val: obj_to_copy.text(),
						type: 'text'
					} );

					$( 'body' ).append( hidden );

					if ( isOS() ) {
						hidden[ 0 ].setSelectionRange( 0, 9999 );
					} else {
						hidden.select();
					}
					document.execCommand( 'copy' );

					hidden.remove();
				}
			}
		} );
	}

	/**
	 * Handle popup for images grid layout
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_wishlist_details_popup() {

		$( '.wishlist_table' ).filter( '.images_grid' ).not( '.enhanced' )
			.on( 'click', '[data-row-id] .product-thumbnail a', function ( ev ) {
				if ( ! yith_wcwl_l10n.disable_popup_grid_view ) {
					var t = $( this ),
						item = t.closest( '[data-row-id]' ),
						items = item.siblings( '[data-row-id]' ),
						popup = item.find( '.item-details' );

					ev.preventDefault();

					if ( popup.length ) {
						items.removeClass( 'show' );
						item.toggleClass( 'show' );
					}
				}
			} )
			.on( 'click', '[data-row-id] a.close', function ( ev ) {
				var t = $( this ),
					item = t.closest( '[data-row-id]' ),
					popup = item.find( '.item-details' );

				ev.preventDefault();

				if ( popup.length ) {
					item.removeClass( 'show' );
				}
			} )
			.on( 'click', '[data-row-id] a.remove_from_wishlist', function ( ev ) {
				var t = $( this );

				ev.stopPropagation();

				remove_item_from_wishlist( t );

				return false;
			} )
			.addClass( 'enhanced' );


		$( document )
			.on( 'click', function ( ev ) {
				if ( ! $( ev.target ).closest( '[data-row-id]' ).length ) {
					$( '.wishlist_table' ).filter( '.images_grid' ).find( '.show' ).removeClass( 'show' );
				}
			} )
			.on( 'added_to_cart', function () {
				$( '.wishlist_table' ).filter( '.images_grid' ).find( '.show' ).removeClass( 'show' );
			} );
	}

	/**
	 * Handle tabs inside wishlist popups
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_wishlist_popup_tabs() {
		$( document ).on( 'click', '.show-tab', function ( ev ) {
			var t = $( this ),
				container = t.closest( '.yith-wcwl-popup-content' ),
				tab = t.data( 'tab' ),
				target = container.find( '.tab' ).filter( '.' + tab );

			ev.preventDefault();

			if ( ! target.length ) {
				return false;
			}

			t.addClass( 'active' ).siblings( '.show-tab' ).removeClass( 'active' );

			target.show().siblings( '.tab' ).hide();

			if ( 'create' === tab ) {
				container.prepend( '<input type="hidden" id="new_wishlist_selector" class="wishlist-select" value="new">' );
			} else {
				container.find( '#new_wishlist_selector' ).remove();
			}

			$( document ).trigger( 'yith_wcwl_tab_selected', [ tab, target ] );
		} );

		$( document ).on( 'change', '.wishlist-select', function () {
			var t = $( this ),
				container = t.closest( '.yith-wcwl-popup-content' ),
				tab = t.closest( '.tab' ),
				createTab = container.find( '.tab.create' ),
				showTab = container.find( '.show-tab' ),
				createShowTab = showTab.filter( '[data-tab="create"]' ),
				val = t.val();

			if ( val === 'new' && createTab.length ) {
				tab.hide();
				createTab.show();

				showTab.removeClass( 'active' );
				createShowTab.addClass( 'active' );
				t.find( 'option:selected' ).prop( 'selected', false );
				t.change();
			}
		} );
	}

	/**
	 * Init responsive behaviour of the wishlist
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function init_wishlist_responsive() {
		var jqxhr = false;

		if ( ! yith_wcwl_l10n.is_wishlist_responsive ) {
			return;
		}

		$( window ).on( 'resize', function () {
			var table = $( '.wishlist_table.responsive' ),
				mobile = table.is( '.mobile' ),
				media = window.matchMedia( '(max-width: ' + yith_wcwl_l10n.mobile_media_query + 'px)' ),
				form = table.closest( 'form' ),
				id = form.attr( 'class' ),
				options = form.data( 'fragment-options' ),
				fragments = {},
				load = false;

			if ( ! table.length ) {
				return;
			}

			if ( media.matches && table && ! mobile ) {
				options.is_mobile = 'yes';
				load = true;
			} else if ( ! media.matches && table && mobile ) {
				options.is_mobile = 'no';
				load = true;
			}

			if ( load ) {
				if ( jqxhr ) {
					jqxhr.abort();
				}

				fragments[ id.split( ' ' ).join( yith_wcwl_l10n.fragments_index_glue ) ] = options;

				jqxhr = $.ajax( {
					beforeSend: function () {
						block( table );
					},
					complete: function () {
						unblock( table );
					},
					data: {
						action: yith_wcwl_l10n.actions.load_mobile_action,
						nonce: yith_wcwl_l10n.nonce.load_mobile_nonce,
						context: 'frontend',
						fragments: fragments
					},
					method: 'post',
					success: function ( data ) {
						if ( typeof data.fragments !== 'undefined' ) {
							replace_fragments( data.fragments );

							init_handling_after_ajax();

							$( document ).trigger( 'yith_wcwl_responsive_template', [ mobile, data.fragments ] );
						}
					},
					url: yith_wcwl_l10n.ajax_url
				} );
			}
		} );
	}

	/* === EVENT HANDLING === */

	/**
	 * Move item to another wishlist
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function call_ajax_move_item_to_another_wishlist( data, beforeSend, complete ) {
		data.action = yith_wcwl_l10n.actions.move_to_another_wishlist_action;
		data.nonce = yith_wcwl_l10n.nonce.move_to_another_wishlist_nonce;
		data.context = 'frontend';

		if ( data.wishlist_token === '' || data.destination_wishlist_token === '' || data.item_id === '' ) {
			return;
		}

		$.ajax( {
			beforeSend: beforeSend,
			url: yith_wcwl_l10n.ajax_url,
			data: data,
			dataType: 'json',
			method: 'post',
			success: function ( response ) {
				complete( response );

				init_handling_after_ajax();

				$( 'body' ).trigger( 'moved_to_another_wishlist', [ $( this ), data.item_id ] );
			}
		} );
	}

	/**
	 * Remove a product from the wishlist.
	 *
	 * @param el
	 * @return void
	 * @since 1.0.0
	 */
	function remove_item_from_wishlist( el ) {
		var table = el.parents( '.cart.wishlist_table' ),
			row = el.parents( '[data-row-id]' ),
			data_row_id = row.data( 'row-id' ),
			wishlist_id = table.data( 'id' ),
			wishlist_token = table.data( 'token' ),
			data = {
				action: yith_wcwl_l10n.actions.remove_from_wishlist_action,
				nonce: yith_wcwl_l10n.nonce.remove_from_wishlist_nonce,
				context: 'frontend',
				remove_from_wishlist: data_row_id,
				wishlist_id: wishlist_id,
				wishlist_token: wishlist_token,
				fragments: retrieve_fragments( data_row_id )
			};

		$.ajax( {
			beforeSend: function () {
				block( table );
			},
			complete: function () {
				unblock( table );
			},
			data: data,
			method: 'post',
			success: function ( data ) {
				if ( typeof data.fragments !== 'undefined' ) {
					replace_fragments( data.fragments );
				}

				init_handling_after_ajax();

				$( 'body' ).trigger( 'removed_from_wishlist', [ el, row ] );
			},
			url: yith_wcwl_l10n.ajax_url
		} );
	}

	/**
	 * Remove a product from the wishlist.
	 *
	 * @param el
	 * @param form
	 * @return void
	 * @since 1.0.0
	 */
	function reload_wishlist_and_adding_elem( el, form ) {

		var product_id = el.attr( 'data-product-id' ),
			table = $( document ).find( '.cart.wishlist_table' ),
			pagination = table.data( 'pagination' ),
			per_page = table.data( 'per-page' ),
			wishlist_id = table.data( 'id' ),
			wishlist_token = table.data( 'token' ),
			data = {
				action: yith_wcwl_l10n.actions.reload_wishlist_and_adding_elem_action,
				nonce: yith_wcwl_l10n.nonce.reload_wishlist_and_adding_elem_nonce,
				context: 'frontend',
				pagination: pagination,
				per_page: per_page,
				wishlist_id: wishlist_id,
				wishlist_token: wishlist_token,
				add_to_wishlist: product_id,
				product_type: el.data( 'product-type' )
			};

		if ( ! is_cookie_enabled() ) {
			window.alert( yith_wcwl_l10n.labels.cookie_disabled );
			return;
		}

		$.ajax( {
			type: 'POST',
			url: yith_wcwl_l10n.ajax_url,
			data: data,
			dataType: 'html',
			beforeSend: function () {
				block( table );
			},
			complete: function () {
				unblock( table );
			},
			success: function ( res ) {
				var obj = $( res ),
					new_form = obj.find( '#yith-wcwl-form' ), // get new form
					shortcode = obj.find( '.yith-wfbt-slider-wrapper' ); // get new form

				form.replaceWith( new_form );
				$( '.yith-wfbt-slider-wrapper' ).replaceWith( shortcode );
				init_handling_after_ajax();

				$( document ).trigger( 'yith_wcwl_reload_wishlist_from_frequently' );
			}
		} );
	}

	/**
	 * Show form to edit wishlist title
	 *
	 * @param ev event
	 * @return void
	 * @since 2.0.0
	 */
	function show_title_form( ev ) {
		var t = $( this ),
			table = t.closest( '.wishlist_table' ),
			title = null;
		ev.preventDefault();

		// if button is in table
		if ( table.length ) {
			title = t.closest( '[data-wishlist-id]' ).find( '.wishlist-title' );
		} else {
			title = t.parents( '.wishlist-title' );
		}

		title.next().css( 'display', 'inline-block' ).find( 'input[type="text"]' ).focus();
		title.hide();
	}

	/**
	 * Hide form to edit wishlist title
	 *
	 * @param ev event
	 * @return void
	 * @since 2.0.0
	 */
	function hide_title_form( ev ) {
		var t = $( this );
		ev.preventDefault();

		t.parents( '.hidden-title-form' ).hide();
		t.parents( '.hidden-title-form' ).prev().show();
	}

	/**
	 * Submit form to save a new wishlist title
	 *
	 * @param ev event
	 * @return void
	 * @since 2.0.7
	 */
	function submit_title_form( ev ) {
		var t = $( this ),
			form = t.closest( '.hidden-title-form' ),
			row = t.closest( '[data-wishlist-id]' ),
			wishlist_id = row.data( 'wishlist-id' ),
			title_input = form.find( 'input[type="text"]' ),
			new_title = title_input.val(),
			data = {};

		ev.preventDefault();

		if ( ! new_title ) {
			form.addClass( 'woocommerce-invalid' );
			title_input.focus();
			return;
		}

		if ( ! wishlist_id ) {
			wishlist_id = $( '#wishlist_id' ).val();
		}

		data = {
			action: yith_wcwl_l10n.actions.save_title_action,
			nonce: yith_wcwl_l10n.nonce.save_title_nonce,
			context: 'frontend',
			wishlist_id: wishlist_id,
			title: new_title,
			fragments: retrieve_fragments()
		};

		$.ajax( {
			type: 'POST',
			url: yith_wcwl_l10n.ajax_url,
			data: data,
			dataType: 'json',
			beforeSend: function () {
				block( form );
			},
			complete: function () {
				unblock( form );
			},
			success: function ( response ) {
				var fragments = response.fragments,
					status = response.result;

				if ( status ) {
					form.hide();
					form.prev().find( '.wishlist-anchor, h1, h2' ).text( new_title ).end().show();
				} else {
					form.addClass( 'woocommerce-invalid' );
					title_input.focus();
				}

				if ( typeof fragments !== 'undefined' ) {
					replace_fragments( fragments );
				}

				init_handling_after_ajax();
			}
		} );
	}

	/**
	 * Submit form to save a new wishlist privacy
	 *
	 * @return void
	 * @since 2.0.7
	 */
	function save_privacy() {
		var t = $( this ),
			new_privacy = t.val(),
			row = t.closest( '[data-wishlist-id]' ),
			wishlist_id = row.data( 'wishlist-id' ),
			data = {
				action: yith_wcwl_l10n.actions.save_privacy_action,
				nonce: yith_wcwl_l10n.nonce.save_privacy_nonce,
				context: 'frontend',
				wishlist_id: wishlist_id,
				privacy: new_privacy,
				fragments: retrieve_fragments()
			};

		$.ajax( {
			type: 'POST',
			url: yith_wcwl_l10n.ajax_url,
			data: data,
			dataType: 'json',
			success: function ( response ) {
				var fragments = response.fragments;

				if ( typeof fragments !== 'undefined' ) {
					replace_fragments( fragments );
				}
			}
		} );
	}

	/* === UTILS === */

	/**
	 * Closes pretty photo popup, if any
	 *
	 * @return void
	 * @since 3.0.0
	 */
	function close_pretty_photo( message, status ) {
		if ( typeof $.prettyPhoto !== 'undefined' && typeof $.prettyPhoto.close !== 'undefined' ) {
			if ( typeof message !== 'undefined' ) {
				var container = $( '.pp_content_container' ),
					content = container.find( '.pp_content' ),
					form = container.find( '.yith-wcwl-popup-form' ),
					popup = form.closest( '.pp_pic_holder' );

				if ( form.length ) {
					var new_content = $( '<div/>', {
						'class': 'yith-wcwl-popup-feedback'
					} );

					new_content.append( $( '<i/>', { 'class': 'fa heading-icon ' + ('error' === status ? 'fa-exclamation-triangle' : 'fa-check') } ) );
					new_content.append( $( '<p/>', { 'class': 'feedback', 'html': message } ) );
					new_content.css( 'display', 'none' );

					content.css( 'height', 'auto' );

					form.after( new_content );
					form.fadeOut( 200, function () {
						new_content.fadeIn();
					} );

					popup.addClass( 'feedback' );
					popup.css( 'left', (($( window ).innerWidth() / 2) - (popup.outerWidth() / 2)) + 'px' );

					if ( typeof yith_wcwl_l10n.auto_close_popup === 'undefined' || yith_wcwl_l10n.auto_close_popup ) {
						setTimeout( close_pretty_photo, yith_wcwl_l10n.popup_timeout );
					}
				}
			} else {
				try {
					$.prettyPhoto.close();

					if ( yith_wcwl_l10n.redirect_after_ask_estimate ) {
						window.location.replace( yith_wcwl_l10n.ask_estimate_redirect_url );
					}
				} catch ( e ) { /* do nothing, no popup to close */
				}
			}
		}
	}

	/**
	 * Print wishlist message for the user
	 *
	 * @var response_message string Message to print
	 * @return void
	 * @since 3.0.0
	 */
	function print_message( response_message ) {
		var msgPopup = $( '#yith-wcwl-popup-message' ),
			msg = $( '#yith-wcwl-message' ),
			timeout = typeof yith_wcwl_l10n.popup_timeout !== 'undefined' ? yith_wcwl_l10n.popup_timeout : 3000;

		if ( typeof yith_wcwl_l10n.enable_notices !== 'undefined' && ! yith_wcwl_l10n.enable_notices ) {
			return;
		}

		msg.html( response_message );
		msgPopup.css( 'margin-left', '-' + $( msgPopup ).width() + 'px' ).fadeIn();
		window.setTimeout( function () {
			msgPopup.fadeOut();
		}, timeout );
	}

	/**
	 * Update lists after a new list is added
	 *
	 * @param wishlists array Array of wishlists
	 * @return void
	 * @since 3.0.0
	 */
	function update_wishlists( wishlists ) {
		var wishlist_select = $( 'select.wishlist-select' ),
			wishilst_dropdown = $( 'ul.yith-wcwl-dropdown' );

		// update options for all wishlist selects
		wishlist_select.each( function () {
			var t = $( this ),
				wishlist_options = t.find( 'option' ),
				new_option = wishlist_options.filter( '[value="new"]' );

			wishlist_options.not( new_option ).remove();

			$.each( wishlists, function ( i, v ) {
				$( '<option>', { value: v.id, html: v.wishlist_name } ).appendTo( t );
			} );

			t.append( new_option );
		} );

		// update options for all wishlist dropdown
		wishilst_dropdown.each( function () {
			var t = $( this ),
				wishlist_options = t.find( 'li' ),
				container = t.closest( '.yith-wcwl-add-button' ),
				default_button = container.children( 'a.add_to_wishlist' ),
				product_id = default_button.attr( 'data-product-id' ),
				product_type = default_button.attr( 'data-product-type' );

			wishlist_options.remove();
			$.each( wishlists, function ( i, v ) {
				if ( v[ 'default' ] ) {
					return;
				}

				$( '<li>' ).append( $( '<a>', {
					'rel': 'nofollow',
					'html': v.wishlist_name,
					'class': 'add_to_wishlist',
					'href': v.add_to_this_wishlist_url,
					'data-product-id': product_id,
					'data-product-type': product_type,
					'data-wishlist-id': v.id
				} ) ).appendTo( t );
			} );
		} );
	}

	/**
	 * Block item if possible
	 *
	 * @param item jQuery object
	 * @return void
	 * @since 3.0.0
	 */
	function block( item ) {
		if ( typeof $.fn.block !== 'undefined' ) {
			item.fadeTo( '400', '0.6' ).block( {
				message: null,
				overlayCSS: {
					background: 'transparent url(' + yith_wcwl_l10n.ajax_loader_url + ') no-repeat center',
					backgroundSize: '40px 40px',
					opacity: 1
				}
			} );
		}
	}

	/**
	 * Unblock item if possible
	 *
	 * @param item jQuery object
	 * @return void
	 * @since 3.0.0
	 */
	function unblock( item ) {
		if ( typeof $.fn.unblock !== 'undefined' ) {
			item.stop( true ).css( 'opacity', '1' ).unblock();
		}
	}

	/**
	 * Check if cookies are enabled
	 *
	 * @return bool
	 * @since 2.0.0
	 */
	function is_cookie_enabled() {
		if ( navigator.cookieEnabled ) {
			return true;
		}

		// set and read cookie
		document.cookie = 'cookietest=1';
		var ret = document.cookie.indexOf( 'cookietest=' ) !== -1;

		// delete cookie
		document.cookie = 'cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT';

		return ret;
	}

	/**
	 * Retrieve fragments that need to be refreshed in the page
	 *
	 * @param search string Ref to search among all fragments in the page
	 * @return object Object containing a property for each fragments that matches search
	 * @since 3.0.0
	 */
	function retrieve_fragments( search ) {
		var options = {},
			fragments = null;

		if ( search ) {
			if ( typeof search === 'object' ) {
				search = $.extend( {
					fragments: null,
					s: '',
					container: $( document ),
					firstLoad: false
				}, search );

				if ( ! search.fragments ) {
					fragments = search.container.find( '.wishlist-fragment' );
				} else {
					fragments = search.fragments;
				}

				if ( search.s ) {
					fragments = fragments.not( '[data-fragment-ref]' ).add( fragments.filter( '[data-fragment-ref="' + search.s + '"]' ) );
				}

				if ( search.firstLoad ) {
					fragments = fragments.filter( '.on-first-load' );
				}
			} else {
				fragments = $( '.wishlist-fragment' );

				if ( typeof search === 'string' || typeof search === 'number' ) {
					fragments = fragments.not( '[data-fragment-ref]' ).add( fragments.filter( '[data-fragment-ref="' + search + '"]' ) );
				}
			}
		} else {
			fragments = $( '.wishlist-fragment' );
		}

		if ( fragments.length ) {
			fragments.each( function () {
				var t = $( this ),
					id = t.attr( 'class' ).split( ' ' ).filter( ( val ) => {
						return val.length && val !== 'exists';
					} ).join( yith_wcwl_l10n.fragments_index_glue );

				options[ id ] = t.data( 'fragment-options' );
			} );
		} else {
			return null;
		}

		return options;
	}

	/**
	 * Load fragments on page loading
	 *
	 * @param search string Ref to search among all fragments in the page
	 * @since 3.0.0
	 */
	function load_fragments( search ) {
		search = $.extend( {
			firstLoad: true
		}, search );

		var fragments = retrieve_fragments( search );

		if ( ! fragments ) {
			return;
		}

		$.ajax( {
			data: {
				action: yith_wcwl_l10n.actions.load_fragments,
				nonce: yith_wcwl_l10n.nonce.load_fragments_nonce,
				context: 'frontend',
				fragments: fragments
			},
			method: 'post',
			success: function ( data ) {
				if ( typeof data.fragments !== 'undefined' ) {
					replace_fragments( data.fragments, search );

					init_handling_after_ajax();

					$( document ).trigger( 'yith_wcwl_fragments_loaded', [ fragments, data.fragments, search.firstLoad ] );

				}
			},
			url: yith_wcwl_l10n.ajax_url
		} );
	}

	/**
	 * Replace fragments with template received
	 *
	 * @param fragments array Array of fragments to replace
	 * @param data additional data passed to the trigger
	 * @since 3.0.0
	 */
	function replace_fragments( fragments, data = {} ) {
		$.each( fragments, function ( i, v ) {
			var itemSelector = '.' + i.split( yith_wcwl_l10n.fragments_index_glue ).filter( ( val ) => {
					return val.length && val !== 'exists' && val !== 'with-count';
				} ).join( '.' ),
				toReplace = $( itemSelector );

			// find replace template
			var replaceWith = $( v ).filter( itemSelector );

			if ( ! replaceWith.length ) {
				replaceWith = $( v ).find( itemSelector );
			}

			if ( toReplace.length && replaceWith.length ) {
				toReplace.replaceWith( replaceWith );
			}
		} );

		$( document.body ).trigger( 'yith_wcwl_fragments_replaced', { fragments, data } );
	}

	(() => {
		var applyBulkButton = $( 'input[name="apply_bulk_actions"]' );

		function maybeDisableApplyBulkButton() {
			var buttons = $( '.product-checkbox input:checked' );
			applyBulkButton.prop( 'disabled', ! buttons.length );
		};

		$( document ).on( 'change', '.product-checkbox input', maybeDisableApplyBulkButton );
		maybeDisableApplyBulkButton();
	})();

	/**
	 * Check if device is an IOS device
	 * @since 2.2.11
	 */
	function isOS() {
		return navigator.userAgent.match( /ipad|iphone/i );
	}

	/**
	 * Check if passed value could be considered true
	 * @since 3.0.14
	 */
	function isTrue( value ) {
		return true === value || 'yes' === value || '1' === value || 1 === value;
	}
} );
