Plugin Directory

Changeset 3167298


Ignore:
Timestamp:
10/11/2024 05:34:15 PM (17 months ago)
Author:
templateinvaders
Message:

version 2.9.0

Location:
ti-woocommerce-wishlist
Files:
295 added
2 deleted
27 edited

Legend:

Unmodified
Added
Removed
  • ti-woocommerce-wishlist/trunk/assets/css/admin-form-rtl.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/admin-form.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/admin-rtl.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/admin-setup-rtl.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/admin-setup.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/admin.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/public-rtl.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/public.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/theme-rtl.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/theme.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/webfont-rtl.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/css/webfont.min.css

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
  • ti-woocommerce-wishlist/trunk/assets/js/admin.min.js

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
    6 "use strict";function TInvWL($,h){this.pf="tinvwl",this.g="_",this.ho=h||!1,this.n="TInvWL",this.aj_act=function(t){return[this.pf,t].join(this.g)},this._csel=function(t,n){n=n||".";return"{0}{1}{2}".format(n,this.pf,t)},this._tm=function(t){t=$("script#{0}[type='text/template']".format(t));return t.length?t.html():""},this.formElm=function(){var e,n;$(this._csel("-form-onoff")).tiwl_onoff(),$("input[type=checkbox][tiwl-show], input[type=checkbox][tiwl-hide]").tiwl_onoffblock(),$("[tiwl-value][tiwl-show], [tiwl-value][tiwl-hide]").tiwl_byvalueblock(),void 0!==$.fn.wpColorPicker&&(e=function(t){t=t.substring(1),t=parseInt(t,16);return.2126*(t>>16&255)+.7152*(t>>8&255)+.0722*(t>>0&255)},n=this._csel("-form-color"),$(n).each(function(){var n=$(this),t=$(this).closest(".tinvwl-color-picker"),i=t.find(".tinvwl-eyedropper");n.css("background-color",n.val()),175<e(n.val())&&n.css("color","#000000"),n.iris({mode:"hsv",target:$(this).parent().parent(),change:function(t,n){175<e(n.color.toCSS())?$(this).css("color","#000000"):$(this).css("color",""),$(this).css("background-color",n.color.toCSS())}}),t.on("click",".iris-square-value",function(t){t.preventDefault(),n.iris("toggle")}),i.on("click",function(t){t.preventDefault(),n.iris("show")}),n.on("focusin",function(){n.iris("show")})}),$(document).on("click",function(t){($(t.target).is(n+", .iris-picker, .iris-picker-inner, .iris-slider-offset, .tinvwl-eyedropper, .tinvwl-eyedropper .ftinvwl-eyedropper")?$(n).not($(t.target).closest(".tinvwl-color-picker").find(n)):$(n)).iris("hide")}))},this.wizard_page=function(t){$(t).find("select").change(this._wizard_page_ch),this.wizard_page_ch($(t).find("select"))},this.wizard_page_ch=function(t){var n=(t=$(t)).parent(this._csel("-page-select")),i=n.find("input[type=hidden]").val(),e=n.find(this._csel("-error-icon")),o=n.find(this._csel("-error-desc"));""!==t.val()?(n.removeClass("tinvwl-error"),e.hide(),o.hide()):0==i&&(n.addClass("tinvwl-error"),e.show(),o.show())},this.pageElm=function(){$(this._csel("-header","div.")).prependTo("#wpbody-content"),$(this._csel("-page-select")).each(this._wizard_page),$(".bulkactions [type=submit]").each(this._control_bulkactions),$(".action-search [type=submit]").each(this._control_search)},this.control_bulkactions=function(t){$(t).on("click",this._control_bulkactions_ck)},this.control_bulkactions_ck=function(t,n){var i=(t=$(t)).parents(".bulkactions").eq(0).find("[name=action]"),t=t.parents("form").eq(0);i&&("-1"!==i.val()&&t.find("input[type=checkbox]:checked").length||n.preventDefault())},this.control_search=function(t){$(t).on("click",this._control_search_ck)},this.control_search_ck=function(t,n){t=(t=$(t)).parents(".action-search").eq(0).find("[name=s]");t&&""===t.val()&&n.preventDefault()},this.Run=function(){this.formElm(),this.pageElm()},this.cg=function(){var t,n=this.n;this.ho&&(n=n+(t=new Date).getFullYear()+t.getMonth()+t.getDate()),window[n]=this},this.cg(),String.prototype.format||(String.prototype.format=function(){var i=arguments;return this.replace(/{(\d+)}/g,function(t,n){return void 0!==i[n]?i[n]:t})});var o=this,n=o.n,ho=o.ho,c=ho?"t=new Date(),n=n+t.getFullYear()+t.getMonth()+t.getDate(),":"",i;for(i in o)"function"!=typeof o[i]||"_"===i[0]||o.hasOwnProperty("_"+i)||eval("o._"+i+"=function(a,b,c,d){var n='"+n+"',"+c+"o=window[n]||null;if (o) {return o."+i+"(this,a,b,c,d);};};")}!function(s){s.fn.tiwl_onoff=function(t){var o=s.extend(!0,{},{value:{on:"",off:""},class:"tiwlform-onoff",wrap:"container",button:"button"},t);return s(this).each(function(){var n=s(this),t=s("<div>").attr({class:o.class+"-"+o.button}),i=o.class+"-"+o.wrap,e=s("<div>").attr({id:n.attr("id")+"_"+o.wrap,class:i});return n.is("input")&&(e.attr("class",e.attr("class")+" "+n.attr("class")),n.is(":disabled")&&(e.toggleClass("disabled",n.is(":disabled")),n.prop("disabled",!1)),e.toggleClass("checked",n.is(":checked")),n.hide().removeAttr("class").wrap(e).before(t),e=n.parent(),n.on("change",function(t){if(e.hasClass("disabled"))return t.preventDefault();e.toggleClass("checked",s(this).is(":checked"))}),e.on("click",function(t){if(e.hasClass("disabled"))return t.preventDefault();n.is(":enabled")&&e.hasClass("checked")===n.is(":checked")&&n.click()})),n})},s.fn.tiwl_onoffblock=function(t){var c=s.extend(!0,{},{onEachElm:function(){},isChecked:function(){return s(this).is(":checked")}},t);return s(this).each(function(){function t(){function t(t,i){t=t.match(/[\w\d-\>\.\#\:\=\[\]]+/gim)||[],s.each(t,function(t,n){c.onEachElm.call(s(n).toggle(i))})}var n=s(this),i=n.attr("tiwl-show"),e=n.attr("tiwl-hide"),o=c.isChecked.call(n);return"string"==typeof i&&t(i,o),"string"==typeof e&&t(e,!o),n}var n=s(this);return n.is("input")&&"checkbox"==n.attr("type")?(s(this).on("change",t),t.call(n)):n})},s.fn.tiwl_byvalueblock=function(t){var i=s.extend(!0,{},{onEachElm:function(){},onClick:function(){return s(this).val()==s(this).attr("tiwl-value")}},t);return s(this).each(function(){function t(e){function t(t,i){t=t.match(/[\w\d-\>\.\#\:\=\[\]]+/gim)||[],s.each(t,function(t,n){e.onEachElm.call(s(n).toggle(i))})}var n=s(this),i=n.attr("tiwl-show"),o=n.attr("tiwl-hide"),c=e.onClick.call(n);return"string"==typeof i&&t(i,c),"string"==typeof o&&t(o,!c),n}var n=s(this);return n.is("input")||n.is("select")?(s(this).on("change",function(){t.call(this,i)}),t.call(n,i)):n})};var n=new TInvWL(s);s(document).ready(function(){var t;n.Run(),jQuery('input[name="general-show_notice"]').change(function(){var t=!jQuery(this).is(":checked"),n=jQuery('input[name="general-redirect_require_login"]');t&&!n.is(":checked")&&n.click().trigger("change"),n.closest(".tiwlform-onoff-container").toggleClass("disabled",t)}).change(),s(".tablenav").each(function(){var t=s(this);s.trim(t.find(".alignleft").html()).length||t.find(".alignleft").remove(),s.trim(t.find(".alignright").html()).length&&!t.find(".tablenav-pages").hasClass("one-page")||(t.find(".alignright").remove(),t.find(".tinv-wishlist-clear").remove()),s.trim(t.html()).length||t.remove()}),s(".tablenav .bulkactions select").addClass("tinvwl-select grey").wrap('<span class="tinvwl-select-wrap">').parent().append('<span class="tinvwl-caret"><span></span></span>'),s(".tablenav .bulkactions .button.action, .tablenav #search-submit").removeClass("button").addClass("tinvwl-btn grey"),s(".tinvwl-modal-btn").on("click",function(){s(this).next(".tinvwl-modal").addClass("tinvwl-modal-open")}),s(".tinvwl-overlay, .tinvwl-close-modal, .tinvwl_button_close").on("click",function(t){t.preventDefault(),s(this).parents(".tinvwl-modal:first").removeClass("tinvwl-modal-open")}),void 0!==s.fn.popover&&((t=s(".tinvwl-help")).popover({content:function(){return s(this).closest(".tinvwl-info-wrap").find(".tinvwl-info-desc").html()}}),t.on("click",function(){s(this).popover("toggle")}),t.on("focusout",function(){s(this).popover("hide")}),s(window).on("resize",function(){t.popover("hide")})),s("body").on("click",".tinvwl-confirm-reset",function(t){t.preventDefault(),confirm(tinvwl_comfirm.text_comfirm_reset)&&s(this).removeClass("tinvwl-confirm-reset").trigger("click")})})}(jQuery);
     6function TInvWL($,h){this.pf="tinvwl",this.g="_",this.ho=h||!1,this.n="TInvWL",this.aj_act=function(t){return[this.pf,t].join(this.g)},this._csel=function(t,n){n=n||".";return"{0}{1}{2}".format(n,this.pf,t)},this._tm=function(t){t=$("script#{0}[type='text/template']".format(t));return t.length?t.html():""},this.formElm=function(){var e,n;$(this._csel("-form-onoff")).tiwl_onoff(),$("input[type=checkbox][tiwl-show], input[type=checkbox][tiwl-hide]").tiwl_onoffblock(),$("[tiwl-value][tiwl-show], [tiwl-value][tiwl-hide]").tiwl_byvalueblock(),void 0!==$.fn.wpColorPicker&&(e=function(t){t=t.substring(1),t=parseInt(t,16);return.2126*(t>>16&255)+.7152*(t>>8&255)+.0722*(t>>0&255)},n=this._csel("-form-color"),$(n).each(function(){var n=$(this),t=$(this).closest(".tinvwl-color-picker"),i=t.find(".tinvwl-eyedropper");n.css("background-color",n.val()),175<e(n.val())&&n.css("color","#000000"),n.iris({mode:"hsv",target:$(this).parent().parent(),change:function(t,n){175<e(n.color.toCSS())?$(this).css("color","#000000"):$(this).css("color",""),$(this).css("background-color",n.color.toCSS())}}),t.on("click",".iris-square-value",function(t){t.preventDefault(),n.iris("toggle")}),i.on("click",function(t){t.preventDefault(),n.iris("show")}),n.on("focusin",function(){n.iris("show")})}),$(document).on("click",function(t){($(t.target).is(n+", .iris-picker, .iris-picker-inner, .iris-slider-offset, .tinvwl-eyedropper, .tinvwl-eyedropper .ftinvwl-eyedropper")?$(n).not($(t.target).closest(".tinvwl-color-picker").find(n)):$(n)).iris("hide")}))},this.wizard_page=function(t){$(t).find("select").change(this._wizard_page_ch),this.wizard_page_ch($(t).find("select"))},this.wizard_page_ch=function(t){var n=(t=$(t)).parent(this._csel("-page-select")),i=n.find("input[type=hidden]").val(),e=n.find(this._csel("-error-icon")),o=n.find(this._csel("-error-desc"));""===t.val()?0==i&&(n.addClass("tinvwl-error"),e.show(),o.show()):(n.removeClass("tinvwl-error"),e.hide(),o.hide())},this.pageElm=function(){$(this._csel("-header","div.")).prependTo("#wpbody-content"),$(this._csel("-page-select")).each(this._wizard_page),$(".bulkactions [type=submit]").each(this._control_bulkactions),$(".action-search [type=submit]").each(this._control_search)},this.control_bulkactions=function(t){$(t).on("click",this._control_bulkactions_ck)},this.control_bulkactions_ck=function(t,n){var i=(t=$(t)).parents(".bulkactions").eq(0).find("[name=action]"),t=t.parents("form").eq(0);!i||"-1"!==i.val()&&t.find("input[type=checkbox]:checked").length||n.preventDefault()},this.control_search=function(t){$(t).on("click",this._control_search_ck)},this.control_search_ck=function(t,n){t=(t=$(t)).parents(".action-search").eq(0).find("[name=s]");t&&""===t.val()&&n.preventDefault()},this.Run=function(){this.formElm(),this.pageElm()},this.cg=function(){var t,n=this.n;this.ho&&(n=n+(t=new Date).getFullYear()+t.getMonth()+t.getDate()),window[n]=this},this.cg(),String.prototype.format||(String.prototype.format=function(){var i=arguments;return this.replace(/{(\d+)}/g,function(t,n){return void 0!==i[n]?i[n]:t})}),!function(o){var n=o.n,ho=o.ho,c=ho?"t=new Date(),n=n+t.getFullYear()+t.getMonth()+t.getDate(),":"",i;for(i in o)"function"!=typeof o[i]||"_"===i[0]||o.hasOwnProperty("_"+i)||eval("o._"+i+"=function(a,b,c,d){var n='"+n+"',"+c+"o=window[n]||null;if (o) {return o."+i+"(this,a,b,c,d);};};")}(this)}(s=>{s.fn.tiwl_onoff=function(t){var o=s.extend(!0,{},{value:{on:"",off:""},class:"tiwlform-onoff",wrap:"container",button:"button"},t);return s(this).each(function(){var n=s(this),t=s("<div>").attr({class:o.class+"-"+o.button}),i=o.class+"-"+o.wrap,e=s("<div>").attr({id:n.attr("id")+"_"+o.wrap,class:i});return n.is("input")&&(e.attr("class",e.attr("class")+" "+n.attr("class")),n.is(":disabled")&&(e.toggleClass("disabled",n.is(":disabled")),n.prop("disabled",!1)),e.toggleClass("checked",n.is(":checked")),n.hide().removeAttr("class").wrap(e).before(t),e=n.parent(),n.on("change",function(t){if(e.hasClass("disabled"))return t.preventDefault();e.toggleClass("checked",s(this).is(":checked"))}),e.on("click",function(t){if(e.hasClass("disabled"))return t.preventDefault();n.is(":enabled")&&e.hasClass("checked")===n.is(":checked")&&n.click()})),n})},s.fn.tiwl_onoffblock=function(t){var c=s.extend(!0,{},{onEachElm:function(){},isChecked:function(){return s(this).is(":checked")}},t);return s(this).each(function(){function t(){function t(t,i){t=t.match(/[\w\d-\>\.\#\:\=\[\]]+/gim)||[],s.each(t,function(t,n){c.onEachElm.call(s(n).toggle(i))})}var n=s(this),i=n.attr("tiwl-show"),e=n.attr("tiwl-hide"),o=c.isChecked.call(n);return"string"==typeof i&&t(i,o),"string"==typeof e&&t(e,!o),n}var n=s(this);return n.is("input")&&"checkbox"==n.attr("type")?(s(this).on("change",t),t.call(n)):n})},s.fn.tiwl_byvalueblock=function(t){var i=s.extend(!0,{},{onEachElm:function(){},onClick:function(){return s(this).val()==s(this).attr("tiwl-value")}},t);return s(this).each(function(){function t(e){function t(t,i){t=t.match(/[\w\d-\>\.\#\:\=\[\]]+/gim)||[],s.each(t,function(t,n){e.onEachElm.call(s(n).toggle(i))})}var n=s(this),i=n.attr("tiwl-show"),o=n.attr("tiwl-hide"),c=e.onClick.call(n);return"string"==typeof i&&t(i,c),"string"==typeof o&&t(o,!c),n}var n=s(this);return n.is("input")||n.is("select")?(s(this).on("change",function(){t.call(this,i)}),t.call(n,i)):n})};var n=new TInvWL(s);s(document).ready(function(){var t;n.Run(),jQuery('input[name="general-show_notice"]').change(function(){var t=!jQuery(this).is(":checked"),n=jQuery('input[name="general-redirect_require_login"]');t&&!n.is(":checked")&&n.click().trigger("change"),n.closest(".tiwlform-onoff-container").toggleClass("disabled",t)}).change(),s(".tablenav").each(function(){var t=s(this);s.trim(t.find(".alignleft").html()).length||t.find(".alignleft").remove(),s.trim(t.find(".alignright").html()).length&&!t.find(".tablenav-pages").hasClass("one-page")||(t.find(".alignright").remove(),t.find(".tinv-wishlist-clear").remove()),s.trim(t.html()).length||t.remove()}),s(".tablenav .bulkactions select").addClass("tinvwl-select grey").wrap('<span class="tinvwl-select-wrap">').parent().append('<span class="tinvwl-caret"><span></span></span>'),s(".tablenav .bulkactions .button.action, .tablenav #search-submit").removeClass("button").addClass("tinvwl-btn grey"),s(".tinvwl-modal-btn").on("click",function(){s(this).next(".tinvwl-modal").addClass("tinvwl-modal-open")}),s(".tinvwl-overlay, .tinvwl-close-modal, .tinvwl_button_close").on("click",function(t){t.preventDefault(),s(this).parents(".tinvwl-modal:first").removeClass("tinvwl-modal-open")}),void 0!==s.fn.popover&&((t=s(".tinvwl-help")).popover({content:function(){return s(this).closest(".tinvwl-info-wrap").find(".tinvwl-info-desc").html()}}),t.on("click",function(){s(this).popover("toggle")}),t.on("focusout",function(){s(this).popover("hide")}),s(window).on("resize",function(){t.popover("hide")})),s("body").on("click",".tinvwl-confirm-reset",function(t){t.preventDefault(),confirm(tinvwl_comfirm.text_comfirm_reset)&&s(this).removeClass("tinvwl-confirm-reset").trigger("click")})})})(jQuery);
  • ti-woocommerce-wishlist/trunk/assets/js/public.js

    r3001363 r3167298  
    196196            value_elm = $(this).val(),
    197197            count = 10,
    198             ti_merge_value = function ti_merge_value(o1, o2) {
     198            _ti_merge_value = function ti_merge_value(o1, o2) {
    199199              if ('object' === _typeof(o2)) {
    200200                if ('undefined' === typeof o1) {
     
    208208                    }
    209209                    j = parseInt(j) + 1;
    210                     o1[j] = ti_merge_value(o1[i], o2[i]);
     210                    o1[j] = _ti_merge_value(o1[i], o2[i]);
    211211                  } else {
    212                     o1[i] = ti_merge_value(o1[i], o2[i]);
     212                    o1[i] = _ti_merge_value(o1[i], o2[i]);
    213213                  }
    214214                }
     
    242242                value_elm = true;
    243243              }
    244               data.form[name_elm] = ti_merge_value(data.form[name_elm], value_elm);
     244              data.form[name_elm] = _ti_merge_value(data.form[name_elm], value_elm);
    245245            }
    246246          } else {
    247             data.form[name_elm] = ti_merge_value(data.form[name_elm], value_elm);
     247            data.form[name_elm] = _ti_merge_value(data.form[name_elm], value_elm);
    248248          }
    249249          if ('hidden' === type_elm) {
  • ti-woocommerce-wishlist/trunk/assets/js/public.min.js

    r3044331 r3167298  
    11/**
    22 * TI WooCommerce Wishlist Plugin - Allow your store guests and customers to add products to Wishlist.  Add Wishlist functionality to your store for free.
    3  * @version 2.8.2
     3 * @version 2.9.0
    44 * @link https://wordpress.org/plugins/ti-woocommerce-wishlist/
    55 */
    6 "use strict";function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function showTooltip(t,i){t.setAttribute("class","social social-clipboard tooltipped tooltipped-s"),t.setAttribute("aria-label",i)}function clearTooltip(t){t.currentTarget.setAttribute("class","social social-clipboard "),t.currentTarget.removeAttribute("aria-label")}!function(w){w.fn.tinvwl_to_wishlist=function(t){var i={api_url:window.location.href.split("?")[0],text_create:window.tinvwl_add_to_wishlist.text_create,text_already_in:window.tinvwl_add_to_wishlist.text_already_in,class:{dialogbox:".tinvwl_add_to_select_wishlist",select:".tinvwl_wishlist",newtitle:".tinvwl_new_input",dialogbutton:".tinvwl_button_add"},redirectTimer:null,onPrepareList:function(){},onGetDialogBox:function(){},onPrepareDialogBox:function(){w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w(this).appendTo("body > .tinv-wishlist")},onCreateWishList:function(t){w(this).append(w("<option>").html(t.title).val(t.ID).toggleClass("tinv_in_wishlist",t.in))},onSelectWishList:function(){},onDialogShow:function(t){w(t).addClass("tinv-modal-open"),w(t).removeClass("ftinvwl-pulse")},onDialogHide:function(t){w(this).removeClass("tinv-modal-open"),w(t).removeClass("ftinvwl-pulse")},onInited:function(){},onClick:function(){if(w(this).is(".disabled-add-wishlist"))return!1;w(this).is(".ftinvwl-animated")&&w(this).addClass("ftinvwl-pulse"),(this.tinvwl_dialog?this.tinvwl_dialog.show_list:s.onActionProduct).call(this)},onPrepareDataAction:function(t,i){w("body").trigger("tinvwl_wishlist_button_clicked",[t,i])},filterProductAlreadyIn:function(t){var t=t||[],n={};return w("form.cart[method=post], .woocommerce-variation-add-to-cart, form.vtajaxform[method=post]").find("input, select").each(function(){var t=w(this).attr("name"),i=w(this).attr("type"),e=w(this).val();("checkbox"!==i&&"radio"!==i||w(this).is(":checked"))&&(n["form"+t]=e)}),n=n.formvariation_id,t.filter(function(t){var i;return"object"===_typeof(t.in)&&"string"==typeof n?(i=parseInt(n),0<=t.in.indexOf(i)):t.in})},onMultiProductAlreadyIn:function(t){var t=t||[],e=(t=s.onPrepareList.call(t)||t,t=s.filterProductAlreadyIn.call(this,t)||t,w(this).parent().parent().find(".already-in").remove(),"");0===t.length||(e=w("<ul>"),w.each(t,function(t,i){e.append(w("<li>").html(w("<a>").html(i.title).attr({href:i.url})).val(i.ID))})),e.length&&w(this).closest(".tinv-modal-inner").find("img").after(w("<div>").addClass("already-in").html(s.text_already_in+" ").append(e))},onAction:{redirect:function(t){s.redirectTimer&&clearTimeout(s.redirectTimer),s.redirectTimer=window.setTimeout(function(){window.location.href=t},4e3)},force_redirect:function(t){window.location.href=t},wishlists:function(t){},msg:function(t){if(!t)return!1;var i=w(t).eq(0);w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),s.redirectTimer||(s.removeTimer=window.setTimeout(function(){i.remove(),s.redirectTimer&&clearTimeout(s.redirectTimer)},tinvwl_add_to_wishlist.popup_timer)),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove(),s.redirectTimer&&clearTimeout(s.redirectTimer),s.removeTimer&&clearTimeout(s.removeTimer)})},status:function(t){w("body").trigger("tinvwl_wishlist_added_status",[this,t])},removed:function(t){},make_remove:function(t){},wishlists_data:function(t){d(JSON.stringify(t))}}},s=(i.onActionProduct=function(t,i){var d={form:{},tinv_wishlist_id:t||"",tinv_wishlist_name:i||"",product_type:w(this).attr("data-tinv-wl-producttype"),product_id:w(this).attr("data-tinv-wl-product")||0,product_variation:w(this).attr("data-tinv-wl-productvariation")||0,product_action:w(this).attr("data-tinv-wl-action")||"addto",redirect:window.location.href},e=this,n=[],r=[],c=new FormData;tinvwl_add_to_wishlist.wpml&&(d.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(d.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(d.stats=tinvwl_add_to_wishlist.stats),w('form.cart[method=post][data-product_id="'+w(this).attr("data-tinv-wl-product")+'"], form.vtajaxform[method=post][data-product_id="'+w(this).attr("data-tinv-wl-product")+'"]').each(function(){n.push(w(this))}),n.length||(w(e).closest("form.cart[method=post], form.vtajaxform[method=post]").each(function(){n.push(w(this))}),n.length||n.push(w("form.cart[method=post]"))),w('.tinv-wraper[data-tinvwl_product_id="'+w(this).attr("data-tinv-wl-product")+'"]').each(function(){n.push(w(this))}),w.each(n,function(t,i){w(i).find("input:not(:disabled), select:not(:disabled), textarea:not(:disabled)").each(function(){function s(t,i){if("object"!==_typeof(i))return i;for(var e in void 0===t&&(t={}),i)if(""===e){var n=-1;for(n in t);t[n=parseInt(n)+1]=s(t[e],i[e])}else t[e]=s(t[e],i[e]);return t}var t,i=w(this).attr("name"),e=w(this).attr("type"),n=w(this).val(),o=10;if("button"!==e&&void 0!==i){for(;/^(.+)\[([^\[\]]*?)\]$/.test(i)&&0<o;){var a,l=i.match(/^(.+)\[([^\[\]]*?)\]$/);3===l.length&&((a={})[l[2]]=n,n=a),i=l[1],o--}"file"!==e||(t=w(this)[0].files)&&c.append(i,t[0]),"checkbox"===e||"radio"===e?w(this).is(":checked")&&(n.length||"object"===_typeof(n)||(n=!0),d.form[i]=s(d.form[i],n)):d.form[i]=s(d.form[i],n),"hidden"===e&&r.push(i)}})}),d.form["tinvwl-hidden-fields"]=r,d=s.onPrepareDataAction.call(e,e,d)||d,w.each(d,function(e,t){"form"===e?w.each(t,function(t,i){"object"===_typeof(i)&&(i=JSON.stringify(i)),c.append(e+"["+t+"]",i)}):c.append(e,t)}),w.ajax({url:s.api_url,method:"POST",contentType:!1,processData:!1,data:c}).done(function(t){if(w("body").trigger("tinvwl_wishlist_ajax_response",[this,t]),s.onDialogHide.call(e.tinvwl_dialog,e),"object"===_typeof(t))for(var i in t)"function"==typeof s.onAction[i]&&s.onAction[i].call(e,t[i]);else"function"==typeof s.onAction.msg&&s.onAction.msg.call(e,t)})},w.extend(!0,{},i,t));return w(this).each(function(){if(!w(this).attr("data-tinv-wl-list"))return!1;var t,n;s.dialogbox&&s.dialogbox.length&&(this.tinvwl_dialog=s.dialogbox),this.tinvwl_dialog||(this.tinvwl_dialog=s.onGetDialogBox.call(this)),this.tinvwl_dialog||(t=w(this).nextAll(s.class.dialogbox).eq(0)).length&&(this.tinvwl_dialog=t),this.tinvwl_dialog&&(s.onPrepareDialogBox.call(this.tinvwl_dialog),"function"!=typeof this.tinvwl_dialog.update_list&&(this.tinvwl_dialog.update_list=function(t){var e=w(this).find(s.class.select).eq(0);w(this).find(s.class.newtitle).hide().val(""),e.html(""),w.each(t,function(t,i){s.onCreateWishList.call(e,i)}),s.text_create&&s.onCreateWishList.call(e,{ID:"",title:s.text_create,in:!1}),s.onMultiProductAlreadyIn.call(e,t),s.onSelectWishList.call(e,t),w(this).find(s.class.newtitle).toggle(""===e.val())}),"function"!=typeof this.tinvwl_dialog.show_list&&(this.tinvwl_dialog.show_list=function(){var t=JSON.parse(w(this).attr("data-tinv-wl-list"))||[];t.length?(t=s.onPrepareList.call(t)||t,this.tinvwl_dialog.update_list(t),s.onDialogShow.call(this.tinvwl_dialog,this)):s.onActionProduct.call(this)}),w((n=this).tinvwl_dialog).find(s.class.dialogbutton).off("click").on("click",function(){var t,i=w(n.tinvwl_dialog).find(s.class.select),e=w(n.tinvwl_dialog).find(s.class.newtitle);i.val()||e.val()?s.onActionProduct.call(n,i.val(),e.val()):((t=e.is(":visible")?e:i).addClass("empty-name-wishlist"),window.setTimeout(function(){t.removeClass("empty-name-wishlist")},1e3))})),w(this).off("click").on("click",s.onClick),s.onInited.call(this,s)})},w(document).ready(function(){w("body").on("click keydown",".tinvwl_add_to_wishlist_button",function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return;t.preventDefault()}if(w("body").trigger("tinvwl_add_to_wishlist_button_click",[this]),w(this).is(".disabled-add-wishlist"))return t.preventDefault(),void window.alert(tinvwl_add_to_wishlist.i18n_make_a_selection_text);w(this).is(".inited-add-wishlist")||w(this).tinvwl_to_wishlist({onInited:function(t){w(this).addClass("inited-add-wishlist"),t.onClick.call(this)}})}),w("body").on("click keydown",'button[name="tinvwl-remove"]',function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return}t.preventDefault();var n=w(this);n.is(".inited-wishlist-action")||(n.addClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),i={"tinvwl-product_id":n.val(),"tinvwl-action":"remove","tinvwl-security":tinvwl_add_to_wishlist.nonce,"tinvwl-paged":n.data("tinvwl_paged")||n.closest("form").data("tinvwl_paged"),"tinvwl-per-page":n.data("tinvwl_per_page")||n.closest("form").data("tinvwl_per_page"),"tinvwl-sharekey":n.data("tinvwl_sharekey")||n.closest("form").data("tinvwl_sharekey")},tinvwl_add_to_wishlist.wpml&&(i.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(i.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(i.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:i,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){var i,e;n.removeClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),t.msg&&(i=w(t.msg).eq(0),w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove()}),e=e||window.setTimeout(function(){i.remove(),e&&clearTimeout(e)},tinvwl_add_to_wishlist.popup_timer)),t.status&&(w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),w(".tinvwl-break-input").tinvwl_break_submit({selector:".tinvwl-break-input-filed"}),w(".tinvwl-break-checkbox").tinvwl_break_submit({selector:"table td input[type=checkbox]",validate:function(){return w(this).is(":checked")}}),jQuery.fn.tinvwl_get_wishlist_data()),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t])}))}),w("body").on("click keydown",'button[name="tinvwl-add-to-cart"]',function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return}t.preventDefault();var n=w(this);n.is(".inited-wishlist-action")||(n.addClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),i={"tinvwl-product_id":n.val(),"tinvwl-action":"add_to_cart_single","tinvwl-security":tinvwl_add_to_wishlist.nonce,"tinvwl-paged":n.data("tinvwl_paged")||n.closest("form").data("tinvwl_paged"),"tinvwl-per-page":n.data("tinvwl_per_page")||n.closest("form").data("tinvwl_per_page"),"tinvwl-sharekey":n.data("tinvwl_sharekey")||n.closest("form").data("tinvwl_sharekey")},tinvwl_add_to_wishlist.wpml&&(i.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(i.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(i.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:i,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){var i,e;n.removeClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),t.msg&&(i=w(t.msg).eq(0),w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove()}),e=e||window.setTimeout(function(){i.remove(),e&&clearTimeout(e)},tinvwl_add_to_wishlist.popup_timer)),w(document.body).trigger("wc_fragment_refresh"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),jQuery.fn.tinvwl_get_wishlist_data(),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t]),t.redirect&&(window.location.href=t.redirect)}))}),w("body").on("click keydown",'button[name="tinvwl-action-product_all"]',function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return}t.preventDefault();var n=w(this);n.is(".inited-wishlist-action")||(n.addClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),i={"tinvwl-action":"add_to_cart_all","tinvwl-security":tinvwl_add_to_wishlist.nonce,"tinvwl-paged":n.closest("form").data("tinvwl_paged"),"tinvwl-per-page":n.closest("form").data("tinvwl_per_page"),"tinvwl-sharekey":n.closest("form").data("tinvwl_sharekey")},tinvwl_add_to_wishlist.wpml&&(i.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(i.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(i.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:i,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){var i,e;n.removeClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),t.msg&&(i=w(t.msg).eq(0),w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove()}),e=e||window.setTimeout(function(){i.remove(),e&&clearTimeout(e)},tinvwl_add_to_wishlist.popup_timer)),w(document.body).trigger("wc_fragment_refresh"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),jQuery.fn.tinvwl_get_wishlist_data(),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t]),t.redirect&&(window.location.href=t.redirect)}))}),w("body").on("click keydown",'button[name="tinvwl-action-product_apply"], button[name="tinvwl-action-product_selected"]',function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return}t.preventDefault();var n,e=[],s=(w('input[name="wishlist_pr[]"]:checked').each(function(){e.push(this.value)}),w(this));e.length&&("tinvwl-action-product_selected"===s.attr("name")||w("select#tinvwl_product_actions option").filter(":selected").val())?s.is(".inited-wishlist-action")||(s.addClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),n="",n="tinvwl-action-product_selected"===s.attr("name")?"add_to_cart_selected":w("select#tinvwl_product_actions option").filter(":selected").val(),i={"tinvwl-products":e,"tinvwl-action":n,"tinvwl-security":tinvwl_add_to_wishlist.nonce,"tinvwl-paged":s.closest("form").data("tinvwl_paged"),"tinvwl-per-page":s.closest("form").data("tinvwl_per_page"),"tinvwl-sharekey":s.closest("form").data("tinvwl_sharekey")},tinvwl_add_to_wishlist.wpml&&(i.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(i.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(i.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:i,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){var i,e;s.removeClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),t.msg&&(i=w(t.msg).eq(0),w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove()}),e=e||window.setTimeout(function(){i.remove(),e&&clearTimeout(e)},tinvwl_add_to_wishlist.popup_timer)),"add_to_cart_selected"===n&&w(document.body).trigger("wc_fragment_refresh"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),jQuery.fn.tinvwl_get_wishlist_data(),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t]),t.redirect&&(window.location.href=t.redirect)})):alert(window.tinvwl_add_to_wishlist.tinvwl_break_submit)}),w(document).on("hide_variation",".variations_form",function(t){var i=w('.tinvwl_add_to_wishlist_button:not(.tinvwl-loop)[data-tinv-wl-product="'+w(this).data("product_id")+'"]'),e=(i.attr("data-tinv-wl-productvariation",0),tinvwl_add_to_wishlist.block_ajax_wishlists_data);tinvwl_add_to_wishlist.block_ajax_wishlists_data=!0,w.fn.tinvwl_get_wishlist_data(),tinvwl_add_to_wishlist.block_ajax_wishlists_data=e,i.length&&!tinvwl_add_to_wishlist.allow_parent_variable&&(t.preventDefault(),i.addClass("disabled-add-wishlist"))}),w(document).on("show_variation",".variations_form",function(t,i,e){var n=w('.tinvwl_add_to_wishlist_button:not(.tinvwl-loop)[data-tinv-wl-product="'+w(this).data("product_id")+'"]'),i=(n.attr("data-tinv-wl-productvariation",i.variation_id),tinvwl_add_to_wishlist.block_ajax_wishlists_data);tinvwl_add_to_wishlist.block_ajax_wishlists_data=!0,w.fn.tinvwl_get_wishlist_data(),tinvwl_add_to_wishlist.block_ajax_wishlists_data=i,t.preventDefault(),n.removeClass("disabled-add-wishlist")}),w(window).on("storage onstorage",function(t){a===t.originalEvent.key&&localStorage.getItem(a)!==sessionStorage.getItem(a)&&(!localStorage.getItem(a)||"object"===_typeof(t=JSON.parse(localStorage.getItem(a)))&&null!==t&&(t.hasOwnProperty("products")||t.hasOwnProperty("counter"))&&d(localStorage.getItem(a)))});function e(i){var t,e;(n.length||s)&&tinvwl_add_to_wishlist.user_interacted&&(t={"tinvwl-action":"get_data","tinvwl-security":tinvwl_add_to_wishlist.nonce},"refresh"!==i||(e=w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear form[data-tinvwl_sharekey]")).length&&(w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),t["tinvwl-paged"]=e.data("tinvwl_paged"),t["tinvwl-per-page"]=e.data("tinvwl_per_page"),t["tinvwl-sharekey"]=e.data("tinvwl_sharekey")),tinvwl_add_to_wishlist.wpml&&(t.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(t.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(t.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:t,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){"refresh"===i&&(w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),w(document.body).trigger("wc_fragment_refresh"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),localStorage.setItem(a+"_refresh","")),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t])}))}var n=[],s=!1,t=(w("a.tinvwl_add_to_wishlist_button").each(function(){"undefined"!==w(this).data("tinv-wl-product")&&w(this).data("tinv-wl-product")&&n.push(w(this).data("tinv-wl-product"))}),w(".wishlist_products_counter_number").each(function(){s=!0}),w.fn.tinvwl_get_wishlist_data=function(t){if("refresh"!==t){if(o&&("undefined"!=typeof Cookies&&void 0!==Cookies.get("tinvwl_update_data")&&(Cookies.set("tinvwl_update_data",0,{expires:-1}),localStorage.setItem(a,"")),localStorage.getItem(a))){var i=JSON.parse(localStorage.getItem(a));if("object"===_typeof(i)&&null!==i&&(i.hasOwnProperty("products")||i.hasOwnProperty("counter"))&&(!i.hasOwnProperty("lang")&&!tinvwl_add_to_wishlist.wpml||tinvwl_add_to_wishlist.wpml&&i.lang===tinvwl_add_to_wishlist.wpml)){if("undefined"!=typeof Cookies&&void 0===Cookies.get("tinvwl_wishlists_data_counter"))return void l(i);if("undefined"!=typeof Cookies&&Cookies.get("tinvwl_wishlists_data_counter")==i.counter&&(!i.hasOwnProperty("stats_count")||Cookies.get("tinvwl_wishlists_data_stats")==i.stats_count))return void l(i)}}tinvwl_add_to_wishlist.block_ajax_wishlists_data?setTimeout(function(){l(i)},500):e()}else e(t)},tinvwl_add_to_wishlist.user_interacted=!1,w.fn.tinvwl_get_wishlist_data(),w(document).one("click keydown scroll",function(){tinvwl_add_to_wishlist.user_interacted=!0,w.fn.tinvwl_get_wishlist_data()}),new MutationObserver(function(t){var i=[];t.forEach(function(t){t=t.addedNodes;null!==t&&w(t).each(function(){var t=w(this).find(".tinvwl_add_to_wishlist_button");t.length&&t.each(function(){var t=w(this).data("tinv-wl-product");void 0!==t&&t&&i.push(t)})})}),i.length&&w.fn.tinvwl_get_wishlist_data()})),i=document.body;t.observe(i,{childList:!0,subtree:!0})});var o=!0,a=tinvwl_add_to_wishlist.hash_key;try{o="sessionStorage"in window&&null!==window.sessionStorage,window.sessionStorage.setItem("ti","test"),window.sessionStorage.removeItem("ti"),window.localStorage.setItem("ti","test"),window.localStorage.removeItem("ti")}catch(t){o=!1}function l(t){var a="1"==window.tinvwl_add_to_wishlist.simple_flow,i=(w("a.tinvwl_add_to_wishlist_button").each(function(){w(this).removeClass("tinvwl-product-make-remove").removeClass("tinvwl-product-in-list").attr("data-tinv-wl-action","addto").attr("data-tinv-wl-list","[]"),t&&t.stats&&w(this).find("span.tinvwl-product-stats").remove()}),w("body").trigger("tinvwl_wishlist_mark_products",[t]),w.each(t.products,function(t,s){var o=t;w('a.tinvwl_add_to_wishlist_button[data-tinv-wl-product="'+o+'"]').each(function(){var i,t=parseInt(w(this).attr("data-tinv-wl-productvariation")),e=w(this).data("tinv-wl-productvariations")||[],n=!1;for(i in s)s[i].hasOwnProperty("in")&&Array.isArray(s[i].in)&&(-1<(s[i].in||[]).indexOf(o)||-1<(s[i].in||[]).indexOf(t)||e.some(function(t){return 0<=(s[i].in||[]).indexOf(t)}))&&(n=!0);w(this).attr("data-tinv-wl-list",JSON.stringify(s)).toggleClass("tinvwl-product-in-list",n).toggleClass("tinvwl-product-make-remove",n&&a).attr("data-tinv-wl-action",n&&a?"remove":"addto"),w("body").trigger("tinvwl_wishlist_product_marked",[this,n])})}),t&&t.stats&&tinvwl_add_to_wishlist.stats&&w.each(t.stats,function(t,e){w('a.tinvwl_add_to_wishlist_button[data-tinv-wl-product="'+t+'"]').each(function(){w(this).attr("data-tinv-wl-product-stats",JSON.stringify(e));var t,i=parseInt(w(this).attr("data-tinv-wl-productvariation"));for(t in e)-1<t.indexOf(i)&&(w("body").trigger("tinvwl_wishlist_product_stats",[this,!0]),w(this).append('<span class="tinvwl-product-stats">'+e[t]+"</span>"))})}),t.counter);"1"==window.tinvwl_add_to_wishlist.hide_zero_counter&&0===i&&(i="false"),jQuery("i.wishlist-icon").addClass("added"),"false"!==i?(jQuery(".wishlist_products_counter_number, .theme-item-count.wishlist-item-count").html(i),jQuery("i.wishlist-icon").attr("data-icon-label",i)):(jQuery(".wishlist_products_counter_number, .theme-item-count.wishlist-item-count").html("").closest("span.wishlist-counter-with-products").removeClass("wishlist-counter-with-products"),jQuery("i.wishlist-icon").removeAttr("data-icon-label")),i=!("0"==i||"false"==i),jQuery(".wishlist_products_counter").toggleClass("wishlist-counter-with-products",i),setTimeout(function(){jQuery("i.wishlist-icon").removeClass("added")},500)}function d(t){o&&(localStorage.setItem(a,t),sessionStorage.setItem(a,t),l(JSON.parse(t)))}function r(t){var t=w(t).find("select, input, textarea, button, a").filter(":visible"),i=t.first(),e=t.last();i.focus().blur(),e.on("keydown",function(t){9!==t.which||t.shiftKey||(t.preventDefault(),i.focus())}),i.on("keydown",function(t){9===t.which&&t.shiftKey&&(t.preventDefault(),e.focus())})}}(jQuery),function(n){n(document).ready(function(){if(n(".tinv-lists-nav").each(function(){n(this).html().trim().length||n(this).remove()}),n("body").on("click",".social-buttons .social:not(.social-email,.social-whatsapp,.social-clipboard)",function(t){var i=window.open(n(this).attr("href"),n(this).attr("title"),"width=420,height=320,resizable=yes,scrollbars=yes,status=yes");i&&(i.focus(),t.preventDefault())}),"undefined"!=typeof ClipboardJS){new ClipboardJS(".social-buttons .social.social-clipboard",{text:function(t){return t.getAttribute("href")}}).on("success",function(t){showTooltip(t.trigger,tinvwl_add_to_wishlist.tinvwl_clipboard)});for(var t=document.querySelectorAll(".social-buttons .social.social-clipboard"),i=0;i<t.length;i++)t[i].addEventListener("mouseleave",clearTooltip),t[i].addEventListener("blur",clearTooltip)}n("body").on("click",".social-buttons .social.social-clipboard",function(t){t.preventDefault()}),n("body").on("click",".tinv-wishlist .tinv-overlay, .tinv-wishlist .tinv-close-modal, .tinv-wishlist .tinvwl_button_close",function(t){t.preventDefault(),n(this).parents(".tinv-modal:first").removeClass("tinv-modal-open"),n("body").trigger("tinvwl_modal_closed",[this])}),n("body").on("click",".tinv-wishlist .tinvwl-btn-onclick",function(t){n(this).data("url")&&(t.preventDefault(),window.location=n(this).data("url"))});var e=n(".tinv-wishlist .navigation-button");e.length&&e.each(function(){var t=n(this).find("> li");t.length<5&&t.parent().addClass("tinvwl-btns-count-"+t.length)}),n(".tinv-login .showlogin").off("click").on("click",function(t){t.preventDefault(),n(this).closest(".tinv-login").find(".login").toggle()}),n(".tinv-wishlist table.tinvwl-table-manage-list tfoot td").each(function(){n(this).toggle(!!n(this).children().not(".look_in").length||!!n(this).children(".look_in").children().length)})})}(jQuery),function(s){s.fn.tinvwl_break_submit=function(t){var e=s.extend(!0,{},{selector:"input, select, textarea",ifempty:!0,invert:!1,validate:function(){return s(this).val()},rule:function(){var t=s(this).parents("form").eq(0).find(e.selector),i=e.invert;return 0===t.length?e.ifempty:(t.each(function(){i&&!e.invert||!i&&e.invert||(i=Boolean(e.validate.call(s(this))))}),i)}},t);return s(this).each(function(){s(this).on("click",function(t){var i=[];void 0!==s(this).attr("tinvwl_break_submit")&&(i=s(this).attr("tinvwl_break_submit").split(",")),-1!==jQuery.inArray(e.selector,i)&&(i=[]),e.rule.call(s(this))||0!==i.length||(alert(window.tinvwl_add_to_wishlist.tinvwl_break_submit),t.preventDefault()),i.push(e.selector),s(this).attr("tinvwl_break_submit",i),e.rule.call(s(this))&&s(this).removeAttr("tinvwl_break_submit")})})},s(document).ready(function(){s("body").on("click",".global-cb",function(){s(this).closest("table").eq(0).find(".product-cb input[type=checkbox], .wishlist-cb input[type=checkbox]").prop("checked",s(this).is(":checked"))});var n=tinvwl_add_to_wishlist.hash_key+"_refresh";s(document.body).on("tinvwl_wishlist_ajax_response",function(t,i,e){(e.status||e.removed)&&["add_to_wishlist"].includes(e.action)&&e.wishlist&&e.wishlist.share_key&&(localStorage.setItem(n,""),localStorage.setItem(n,e.wishlist.share_key))})})}(jQuery);
     6function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function showTooltip(t,i){t.setAttribute("class","social social-clipboard tooltipped tooltipped-s"),t.setAttribute("aria-label",i)}function clearTooltip(t){t.currentTarget.setAttribute("class","social social-clipboard "),t.currentTarget.removeAttribute("aria-label")}(w=>{w.fn.tinvwl_to_wishlist=function(t){var i={api_url:window.location.href.split("?")[0],text_create:window.tinvwl_add_to_wishlist.text_create,text_already_in:window.tinvwl_add_to_wishlist.text_already_in,class:{dialogbox:".tinvwl_add_to_select_wishlist",select:".tinvwl_wishlist",newtitle:".tinvwl_new_input",dialogbutton:".tinvwl_button_add"},redirectTimer:null,onPrepareList:function(){},onGetDialogBox:function(){},onPrepareDialogBox:function(){w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w(this).appendTo("body > .tinv-wishlist")},onCreateWishList:function(t){w(this).append(w("<option>").html(t.title).val(t.ID).toggleClass("tinv_in_wishlist",t.in))},onSelectWishList:function(){},onDialogShow:function(t){w(t).addClass("tinv-modal-open"),w(t).removeClass("ftinvwl-pulse")},onDialogHide:function(t){w(this).removeClass("tinv-modal-open"),w(t).removeClass("ftinvwl-pulse")},onInited:function(){},onClick:function(){if(w(this).is(".disabled-add-wishlist"))return!1;w(this).is(".ftinvwl-animated")&&w(this).addClass("ftinvwl-pulse"),(this.tinvwl_dialog?this.tinvwl_dialog.show_list:s.onActionProduct).call(this)},onPrepareDataAction:function(t,i){w("body").trigger("tinvwl_wishlist_button_clicked",[t,i])},filterProductAlreadyIn:function(t){var t=t||[],n={};return w("form.cart[method=post], .woocommerce-variation-add-to-cart, form.vtajaxform[method=post]").find("input, select").each(function(){var t=w(this).attr("name"),i=w(this).attr("type"),e=w(this).val();("checkbox"!==i&&"radio"!==i||w(this).is(":checked"))&&(n["form"+t]=e)}),n=n.formvariation_id,t.filter(function(t){var i;return"object"===_typeof(t.in)&&"string"==typeof n?(i=parseInt(n),0<=t.in.indexOf(i)):t.in})},onMultiProductAlreadyIn:function(t){var t=t||[],e=(t=s.onPrepareList.call(t)||t,t=s.filterProductAlreadyIn.call(this,t)||t,w(this).parent().parent().find(".already-in").remove(),"");0!==t.length&&(e=w("<ul>"),w.each(t,function(t,i){e.append(w("<li>").html(w("<a>").html(i.title).attr({href:i.url})).val(i.ID))})),e.length&&w(this).closest(".tinv-modal-inner").find("img").after(w("<div>").addClass("already-in").html(s.text_already_in+" ").append(e))},onAction:{redirect:function(t){s.redirectTimer&&clearTimeout(s.redirectTimer),s.redirectTimer=window.setTimeout(function(){window.location.href=t},4e3)},force_redirect:function(t){window.location.href=t},wishlists:function(t){},msg:function(t){if(!t)return!1;var i=w(t).eq(0);w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),s.redirectTimer||(s.removeTimer=window.setTimeout(function(){i.remove(),s.redirectTimer&&clearTimeout(s.redirectTimer)},tinvwl_add_to_wishlist.popup_timer)),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove(),s.redirectTimer&&clearTimeout(s.redirectTimer),s.removeTimer&&clearTimeout(s.removeTimer)})},status:function(t){w("body").trigger("tinvwl_wishlist_added_status",[this,t])},removed:function(t){},make_remove:function(t){},wishlists_data:function(t){d(JSON.stringify(t))}},onActionProduct:function(t,i){var d={form:{},tinv_wishlist_id:t||"",tinv_wishlist_name:i||"",product_type:w(this).attr("data-tinv-wl-producttype"),product_id:w(this).attr("data-tinv-wl-product")||0,product_variation:w(this).attr("data-tinv-wl-productvariation")||0,product_action:w(this).attr("data-tinv-wl-action")||"addto",redirect:window.location.href},e=this,n=[],r=[],c=new FormData;tinvwl_add_to_wishlist.wpml&&(d.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(d.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(d.stats=tinvwl_add_to_wishlist.stats),w('form.cart[method=post][data-product_id="'+w(this).attr("data-tinv-wl-product")+'"], form.vtajaxform[method=post][data-product_id="'+w(this).attr("data-tinv-wl-product")+'"]').each(function(){n.push(w(this))}),n.length||(w(e).closest("form.cart[method=post], form.vtajaxform[method=post]").each(function(){n.push(w(this))}),n.length)||n.push(w("form.cart[method=post]")),w('.tinv-wraper[data-tinvwl_product_id="'+w(this).attr("data-tinv-wl-product")+'"]').each(function(){n.push(w(this))}),w.each(n,function(t,i){w(i).find("input:not(:disabled), select:not(:disabled), textarea:not(:disabled)").each(function(){var t,i=w(this).attr("name"),e=w(this).attr("type"),n=w(this).val(),s=10,o=function(t,i){if("object"!==_typeof(i))return i;for(var e in void 0===t&&(t={}),i)if(""===e){var n=-1;for(n in t);t[n=parseInt(n)+1]=o(t[e],i[e])}else t[e]=o(t[e],i[e]);return t};if("button"!==e&&void 0!==i){for(;/^(.+)\[([^\[\]]*?)\]$/.test(i)&&0<s;){var a,l=i.match(/^(.+)\[([^\[\]]*?)\]$/);3===l.length&&((a={})[l[2]]=n,n=a),i=l[1],s--}"file"===e&&(t=w(this)[0].files)&&c.append(i,t[0]),"checkbox"===e||"radio"===e?w(this).is(":checked")&&(n.length||"object"===_typeof(n)||(n=!0),d.form[i]=o(d.form[i],n)):d.form[i]=o(d.form[i],n),"hidden"===e&&r.push(i)}})}),d.form["tinvwl-hidden-fields"]=r,d=s.onPrepareDataAction.call(e,e,d)||d,w.each(d,function(e,t){"form"===e?w.each(t,function(t,i){"object"===_typeof(i)&&(i=JSON.stringify(i)),c.append(e+"["+t+"]",i)}):c.append(e,t)}),w.ajax({url:s.api_url,method:"POST",contentType:!1,processData:!1,data:c}).done(function(t){if(w("body").trigger("tinvwl_wishlist_ajax_response",[this,t]),s.onDialogHide.call(e.tinvwl_dialog,e),"object"===_typeof(t))for(var i in t)"function"==typeof s.onAction[i]&&s.onAction[i].call(e,t[i]);else"function"==typeof s.onAction.msg&&s.onAction.msg.call(e,t)})}},s=w.extend(!0,{},i,t);return w(this).each(function(){if(!w(this).attr("data-tinv-wl-list"))return!1;var t,n;s.dialogbox&&s.dialogbox.length&&(this.tinvwl_dialog=s.dialogbox),this.tinvwl_dialog||(this.tinvwl_dialog=s.onGetDialogBox.call(this)),this.tinvwl_dialog||(t=w(this).nextAll(s.class.dialogbox).eq(0)).length&&(this.tinvwl_dialog=t),this.tinvwl_dialog&&(s.onPrepareDialogBox.call(this.tinvwl_dialog),"function"!=typeof this.tinvwl_dialog.update_list&&(this.tinvwl_dialog.update_list=function(t){var e=w(this).find(s.class.select).eq(0);w(this).find(s.class.newtitle).hide().val(""),e.html(""),w.each(t,function(t,i){s.onCreateWishList.call(e,i)}),s.text_create&&s.onCreateWishList.call(e,{ID:"",title:s.text_create,in:!1}),s.onMultiProductAlreadyIn.call(e,t),s.onSelectWishList.call(e,t),w(this).find(s.class.newtitle).toggle(""===e.val())}),"function"!=typeof this.tinvwl_dialog.show_list&&(this.tinvwl_dialog.show_list=function(){var t=JSON.parse(w(this).attr("data-tinv-wl-list"))||[];t.length?(t=s.onPrepareList.call(t)||t,this.tinvwl_dialog.update_list(t),s.onDialogShow.call(this.tinvwl_dialog,this)):s.onActionProduct.call(this)}),w((n=this).tinvwl_dialog).find(s.class.dialogbutton).off("click").on("click",function(){var t,i=w(n.tinvwl_dialog).find(s.class.select),e=w(n.tinvwl_dialog).find(s.class.newtitle);i.val()||e.val()?s.onActionProduct.call(n,i.val(),e.val()):((t=e.is(":visible")?e:i).addClass("empty-name-wishlist"),window.setTimeout(function(){t.removeClass("empty-name-wishlist")},1e3))})),w(this).off("click").on("click",s.onClick),s.onInited.call(this,s)})},w(document).ready(function(){w("body").on("click keydown",".tinvwl_add_to_wishlist_button",function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return;t.preventDefault()}w("body").trigger("tinvwl_add_to_wishlist_button_click",[this]),w(this).is(".disabled-add-wishlist")?(t.preventDefault(),window.alert(tinvwl_add_to_wishlist.i18n_make_a_selection_text)):w(this).is(".inited-add-wishlist")||w(this).tinvwl_to_wishlist({onInited:function(t){w(this).addClass("inited-add-wishlist"),t.onClick.call(this)}})}),w("body").on("click keydown",'button[name="tinvwl-remove"]',function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return}t.preventDefault();var n=w(this);n.is(".inited-wishlist-action")||(n.addClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),i={"tinvwl-product_id":n.val(),"tinvwl-action":"remove","tinvwl-security":tinvwl_add_to_wishlist.nonce,"tinvwl-paged":n.data("tinvwl_paged")||n.closest("form").data("tinvwl_paged"),"tinvwl-per-page":n.data("tinvwl_per_page")||n.closest("form").data("tinvwl_per_page"),"tinvwl-sharekey":n.data("tinvwl_sharekey")||n.closest("form").data("tinvwl_sharekey")},tinvwl_add_to_wishlist.wpml&&(i.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(i.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(i.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:i,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){var i,e;n.removeClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),t.msg&&(i=w(t.msg).eq(0),w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove()}),e=e||window.setTimeout(function(){i.remove(),e&&clearTimeout(e)},tinvwl_add_to_wishlist.popup_timer)),t.status&&(w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),w(".tinvwl-break-input").tinvwl_break_submit({selector:".tinvwl-break-input-filed"}),w(".tinvwl-break-checkbox").tinvwl_break_submit({selector:"table td input[type=checkbox]",validate:function(){return w(this).is(":checked")}}),jQuery.fn.tinvwl_get_wishlist_data()),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t])}))}),w("body").on("click keydown",'button[name="tinvwl-add-to-cart"]',function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return}t.preventDefault();var n=w(this);n.is(".inited-wishlist-action")||(n.addClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),i={"tinvwl-product_id":n.val(),"tinvwl-action":"add_to_cart_single","tinvwl-security":tinvwl_add_to_wishlist.nonce,"tinvwl-paged":n.data("tinvwl_paged")||n.closest("form").data("tinvwl_paged"),"tinvwl-per-page":n.data("tinvwl_per_page")||n.closest("form").data("tinvwl_per_page"),"tinvwl-sharekey":n.data("tinvwl_sharekey")||n.closest("form").data("tinvwl_sharekey")},tinvwl_add_to_wishlist.wpml&&(i.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(i.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(i.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:i,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){var i,e;n.removeClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),t.msg&&(i=w(t.msg).eq(0),w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove()}),e=e||window.setTimeout(function(){i.remove(),e&&clearTimeout(e)},tinvwl_add_to_wishlist.popup_timer)),w(document.body).trigger("wc_fragment_refresh"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),jQuery.fn.tinvwl_get_wishlist_data(),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t]),t.redirect&&(window.location.href=t.redirect)}))}),w("body").on("click keydown",'button[name="tinvwl-action-product_all"]',function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return}t.preventDefault();var n=w(this);n.is(".inited-wishlist-action")||(n.addClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),i={"tinvwl-action":"add_to_cart_all","tinvwl-security":tinvwl_add_to_wishlist.nonce,"tinvwl-paged":n.closest("form").data("tinvwl_paged"),"tinvwl-per-page":n.closest("form").data("tinvwl_per_page"),"tinvwl-sharekey":n.closest("form").data("tinvwl_sharekey")},tinvwl_add_to_wishlist.wpml&&(i.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(i.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(i.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:i,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){var i,e;n.removeClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),t.msg&&(i=w(t.msg).eq(0),w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove()}),e=e||window.setTimeout(function(){i.remove(),e&&clearTimeout(e)},tinvwl_add_to_wishlist.popup_timer)),w(document.body).trigger("wc_fragment_refresh"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),jQuery.fn.tinvwl_get_wishlist_data(),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t]),t.redirect&&(window.location.href=t.redirect)}))}),w("body").on("click keydown",'button[name="tinvwl-action-product_apply"], button[name="tinvwl-action-product_selected"]',function(t){if("keydown"===t.type){var i=void 0!==t.key?t.key:t.keyCode;if(!("Enter"===i||13===i||0<=["Spacebar"," "].indexOf(i)||32===i))return}t.preventDefault();var n,e=[],s=(w('input[name="wishlist_pr[]"]:checked').each(function(){e.push(this.value)}),w(this));!e.length||"tinvwl-action-product_selected"!==s.attr("name")&&!w("select#tinvwl_product_actions option").filter(":selected").val()?alert(window.tinvwl_add_to_wishlist.tinvwl_break_submit):s.is(".inited-wishlist-action")||(s.addClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),n="",n="tinvwl-action-product_selected"===s.attr("name")?"add_to_cart_selected":w("select#tinvwl_product_actions option").filter(":selected").val(),i={"tinvwl-products":e,"tinvwl-action":n,"tinvwl-security":tinvwl_add_to_wishlist.nonce,"tinvwl-paged":s.closest("form").data("tinvwl_paged"),"tinvwl-per-page":s.closest("form").data("tinvwl_per_page"),"tinvwl-sharekey":s.closest("form").data("tinvwl_sharekey")},tinvwl_add_to_wishlist.wpml&&(i.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(i.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(i.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:i,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){var i,e;s.removeClass("inited-wishlist-action"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),t.msg&&(i=w(t.msg).eq(0),w("body > .tinv-wishlist").length||w("body").append(w("<div>").addClass("tinv-wishlist")),w("body > .tinv-wishlist").append(i),r("body > .tinv-wishlist"),i.on("click",".tinv-close-modal, .tinvwl_button_close, .tinv-overlay",function(t){t.preventDefault(),i.remove()}),e=e||window.setTimeout(function(){i.remove(),e&&clearTimeout(e)},tinvwl_add_to_wishlist.popup_timer)),"add_to_cart_selected"===n&&w(document.body).trigger("wc_fragment_refresh"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),jQuery.fn.tinvwl_get_wishlist_data(),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t]),t.redirect&&(window.location.href=t.redirect)}))}),w(document).on("hide_variation",".variations_form",function(t){var i=w('.tinvwl_add_to_wishlist_button:not(.tinvwl-loop)[data-tinv-wl-product="'+w(this).data("product_id")+'"]'),e=(i.attr("data-tinv-wl-productvariation",0),tinvwl_add_to_wishlist.block_ajax_wishlists_data);tinvwl_add_to_wishlist.block_ajax_wishlists_data=!0,w.fn.tinvwl_get_wishlist_data(),tinvwl_add_to_wishlist.block_ajax_wishlists_data=e,i.length&&!tinvwl_add_to_wishlist.allow_parent_variable&&(t.preventDefault(),i.addClass("disabled-add-wishlist"))}),w(document).on("show_variation",".variations_form",function(t,i,e){var n=w('.tinvwl_add_to_wishlist_button:not(.tinvwl-loop)[data-tinv-wl-product="'+w(this).data("product_id")+'"]'),i=(n.attr("data-tinv-wl-productvariation",i.variation_id),tinvwl_add_to_wishlist.block_ajax_wishlists_data);tinvwl_add_to_wishlist.block_ajax_wishlists_data=!0,w.fn.tinvwl_get_wishlist_data(),tinvwl_add_to_wishlist.block_ajax_wishlists_data=i,t.preventDefault(),n.removeClass("disabled-add-wishlist")}),w(window).on("storage onstorage",function(t){a===t.originalEvent.key&&localStorage.getItem(a)!==sessionStorage.getItem(a)&&localStorage.getItem(a)&&"object"===_typeof(t=JSON.parse(localStorage.getItem(a)))&&null!==t&&(t.hasOwnProperty("products")||t.hasOwnProperty("counter"))&&d(localStorage.getItem(a))});function e(i){var t,e;(n.length||s)&&tinvwl_add_to_wishlist.user_interacted&&(t={"tinvwl-action":"get_data","tinvwl-security":tinvwl_add_to_wishlist.nonce},"refresh"===i&&(e=w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear form[data-tinvwl_sharekey]")).length&&(w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),t["tinvwl-paged"]=e.data("tinvwl_paged"),t["tinvwl-per-page"]=e.data("tinvwl_per_page"),t["tinvwl-sharekey"]=e.data("tinvwl_sharekey")),tinvwl_add_to_wishlist.wpml&&(t.lang=tinvwl_add_to_wishlist.wpml),tinvwl_add_to_wishlist.wpml_default&&(t.lang_default=tinvwl_add_to_wishlist.wpml_default),tinvwl_add_to_wishlist.stats&&(t.stats=tinvwl_add_to_wishlist.stats),w.ajax({url:tinvwl_add_to_wishlist.wc_ajax_url,method:"POST",cache:!1,data:t,beforeSend:function(t){t.setRequestHeader("X-WP-Nonce",tinvwl_add_to_wishlist.nonce)}}).done(function(t){"refresh"===i&&(w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").unblock(),w(document.body).trigger("wc_fragment_refresh"),w("div.tinv-wishlist.woocommerce.tinv-wishlist-clear").replaceWith(t.content),localStorage.setItem(a+"_refresh","")),t.wishlists_data&&d(JSON.stringify(t.wishlists_data)),w("body").trigger("tinvwl_wishlist_ajax_response",[this,t])}))}var n=[],s=!1,t=(w("a.tinvwl_add_to_wishlist_button").each(function(){"undefined"!==w(this).data("tinv-wl-product")&&w(this).data("tinv-wl-product")&&n.push(w(this).data("tinv-wl-product"))}),w(".wishlist_products_counter_number").each(function(){s=!0}),w.fn.tinvwl_get_wishlist_data=function(t){if("refresh"===t)e(t);else{if(o&&("undefined"!=typeof Cookies&&void 0!==Cookies.get("tinvwl_update_data")&&(Cookies.set("tinvwl_update_data",0,{expires:-1}),localStorage.setItem(a,"")),localStorage.getItem(a))){var i=JSON.parse(localStorage.getItem(a));if("object"===_typeof(i)&&null!==i&&(i.hasOwnProperty("products")||i.hasOwnProperty("counter"))&&(!i.hasOwnProperty("lang")&&!tinvwl_add_to_wishlist.wpml||tinvwl_add_to_wishlist.wpml&&i.lang===tinvwl_add_to_wishlist.wpml)){if("undefined"!=typeof Cookies&&void 0===Cookies.get("tinvwl_wishlists_data_counter"))return void l(i);if("undefined"!=typeof Cookies&&Cookies.get("tinvwl_wishlists_data_counter")==i.counter&&(!i.hasOwnProperty("stats_count")||Cookies.get("tinvwl_wishlists_data_stats")==i.stats_count))return void l(i)}}tinvwl_add_to_wishlist.block_ajax_wishlists_data?setTimeout(function(){l(i)},500):e()}},tinvwl_add_to_wishlist.user_interacted=!1,w.fn.tinvwl_get_wishlist_data(),w(document).one("click keydown scroll",function(){tinvwl_add_to_wishlist.user_interacted=!0,w.fn.tinvwl_get_wishlist_data()}),new MutationObserver(function(t){var i=[];t.forEach(function(t){t=t.addedNodes;null!==t&&w(t).each(function(){var t=w(this).find(".tinvwl_add_to_wishlist_button");t.length&&t.each(function(){var t=w(this).data("tinv-wl-product");void 0!==t&&t&&i.push(t)})})}),i.length&&w.fn.tinvwl_get_wishlist_data()})),i=document.body;t.observe(i,{childList:!0,subtree:!0})});var o=!0,a=tinvwl_add_to_wishlist.hash_key;try{o="sessionStorage"in window&&null!==window.sessionStorage,window.sessionStorage.setItem("ti","test"),window.sessionStorage.removeItem("ti"),window.localStorage.setItem("ti","test"),window.localStorage.removeItem("ti")}catch(t){o=!1}function l(t){var a="1"==window.tinvwl_add_to_wishlist.simple_flow,i=(w("a.tinvwl_add_to_wishlist_button").each(function(){w(this).removeClass("tinvwl-product-make-remove").removeClass("tinvwl-product-in-list").attr("data-tinv-wl-action","addto").attr("data-tinv-wl-list","[]"),t&&t.stats&&w(this).find("span.tinvwl-product-stats").remove()}),w("body").trigger("tinvwl_wishlist_mark_products",[t]),w.each(t.products,function(t,s){var o=t;w('a.tinvwl_add_to_wishlist_button[data-tinv-wl-product="'+o+'"]').each(function(){var i,t=parseInt(w(this).attr("data-tinv-wl-productvariation")),e=w(this).data("tinv-wl-productvariations")||[],n=!1;for(i in s)s[i].hasOwnProperty("in")&&Array.isArray(s[i].in)&&(-1<(s[i].in||[]).indexOf(o)||-1<(s[i].in||[]).indexOf(t)||e.some(function(t){return 0<=(s[i].in||[]).indexOf(t)}))&&(n=!0);w(this).attr("data-tinv-wl-list",JSON.stringify(s)).toggleClass("tinvwl-product-in-list",n).toggleClass("tinvwl-product-make-remove",n&&a).attr("data-tinv-wl-action",n&&a?"remove":"addto"),w("body").trigger("tinvwl_wishlist_product_marked",[this,n])})}),t&&t.stats&&tinvwl_add_to_wishlist.stats&&w.each(t.stats,function(t,e){w('a.tinvwl_add_to_wishlist_button[data-tinv-wl-product="'+t+'"]').each(function(){w(this).attr("data-tinv-wl-product-stats",JSON.stringify(e));var t,i=parseInt(w(this).attr("data-tinv-wl-productvariation"));for(t in e)-1<t.indexOf(i)&&(w("body").trigger("tinvwl_wishlist_product_stats",[this,!0]),w(this).append('<span class="tinvwl-product-stats">'+e[t]+"</span>"))})}),t.counter);"1"==window.tinvwl_add_to_wishlist.hide_zero_counter&&0===i&&(i="false"),jQuery("i.wishlist-icon").addClass("added"),"false"!==i?(jQuery(".wishlist_products_counter_number, .theme-item-count.wishlist-item-count").html(i),jQuery("i.wishlist-icon").attr("data-icon-label",i)):(jQuery(".wishlist_products_counter_number, .theme-item-count.wishlist-item-count").html("").closest("span.wishlist-counter-with-products").removeClass("wishlist-counter-with-products"),jQuery("i.wishlist-icon").removeAttr("data-icon-label")),i=!("0"==i||"false"==i),jQuery(".wishlist_products_counter").toggleClass("wishlist-counter-with-products",i),setTimeout(function(){jQuery("i.wishlist-icon").removeClass("added")},500)}function d(t){o&&(localStorage.setItem(a,t),sessionStorage.setItem(a,t),l(JSON.parse(t)))}function r(t){var t=w(t).find("select, input, textarea, button, a").filter(":visible"),i=t.first(),e=t.last();i.focus().blur(),e.on("keydown",function(t){9!==t.which||t.shiftKey||(t.preventDefault(),i.focus())}),i.on("keydown",function(t){9===t.which&&t.shiftKey&&(t.preventDefault(),e.focus())})}})(jQuery),(n=>{n(document).ready(function(){if(n(".tinv-lists-nav").each(function(){n(this).html().trim().length||n(this).remove()}),n("body").on("click",".social-buttons .social:not(.social-email,.social-whatsapp,.social-clipboard)",function(t){var i=window.open(n(this).attr("href"),n(this).attr("title"),"width=420,height=320,resizable=yes,scrollbars=yes,status=yes");i&&(i.focus(),t.preventDefault())}),"undefined"!=typeof ClipboardJS){new ClipboardJS(".social-buttons .social.social-clipboard",{text:function(t){return t.getAttribute("href")}}).on("success",function(t){showTooltip(t.trigger,tinvwl_add_to_wishlist.tinvwl_clipboard)});for(var t=document.querySelectorAll(".social-buttons .social.social-clipboard"),i=0;i<t.length;i++)t[i].addEventListener("mouseleave",clearTooltip),t[i].addEventListener("blur",clearTooltip)}n("body").on("click",".social-buttons .social.social-clipboard",function(t){t.preventDefault()}),n("body").on("click",".tinv-wishlist .tinv-overlay, .tinv-wishlist .tinv-close-modal, .tinv-wishlist .tinvwl_button_close",function(t){t.preventDefault(),n(this).parents(".tinv-modal:first").removeClass("tinv-modal-open"),n("body").trigger("tinvwl_modal_closed",[this])}),n("body").on("click",".tinv-wishlist .tinvwl-btn-onclick",function(t){n(this).data("url")&&(t.preventDefault(),window.location=n(this).data("url"))});var e=n(".tinv-wishlist .navigation-button");e.length&&e.each(function(){var t=n(this).find("> li");t.length<5&&t.parent().addClass("tinvwl-btns-count-"+t.length)}),n(".tinv-login .showlogin").off("click").on("click",function(t){t.preventDefault(),n(this).closest(".tinv-login").find(".login").toggle()}),n(".tinv-wishlist table.tinvwl-table-manage-list tfoot td").each(function(){n(this).toggle(!!n(this).children().not(".look_in").length||!!n(this).children(".look_in").children().length)})})})(jQuery),(s=>{s.fn.tinvwl_break_submit=function(t){var e=s.extend(!0,{},{selector:"input, select, textarea",ifempty:!0,invert:!1,validate:function(){return s(this).val()},rule:function(){var t=s(this).parents("form").eq(0).find(e.selector),i=e.invert;return 0===t.length?e.ifempty:(t.each(function(){i&&!e.invert||!i&&e.invert||(i=Boolean(e.validate.call(s(this))))}),i)}},t);return s(this).each(function(){s(this).on("click",function(t){var i=[];void 0!==s(this).attr("tinvwl_break_submit")&&(i=s(this).attr("tinvwl_break_submit").split(",")),-1!==jQuery.inArray(e.selector,i)&&(i=[]),e.rule.call(s(this))||0!==i.length||(alert(window.tinvwl_add_to_wishlist.tinvwl_break_submit),t.preventDefault()),i.push(e.selector),s(this).attr("tinvwl_break_submit",i),e.rule.call(s(this))&&s(this).removeAttr("tinvwl_break_submit")})})},s(document).ready(function(){s("body").on("click",".global-cb",function(){s(this).closest("table").eq(0).find(".product-cb input[type=checkbox], .wishlist-cb input[type=checkbox]").prop("checked",s(this).is(":checked"))});var n=tinvwl_add_to_wishlist.hash_key+"_refresh";s(document.body).on("tinvwl_wishlist_ajax_response",function(t,i,e){(e.status||e.removed)&&["add_to_wishlist"].includes(e.action)&&e.wishlist&&e.wishlist.share_key&&(localStorage.setItem(n,""),localStorage.setItem(n,e.wishlist.share_key))})})})(jQuery);
  • ti-woocommerce-wishlist/trunk/includes/analytics.class.php

    r3044331 r3167298  
    390390     */
    391391    function get( $data = array() ) {
     392        global $wpdb;
     393
    392394        $default = array(
    393395            'count'    => 10,
     
    409411        $default['offset'] = absint( $default['offset'] );
    410412        $default['count']  = absint( $default['count'] );
     413        //the order value is passed directly to the db so it needs to be protected against sql_injections
     414        $valid_order_values = array( 'ASC', 'DESC' );
     415        if ( ! in_array( strtoupper( $default['order'] ), $valid_order_values, true ) ) {
     416            $default['order'] = 'ASC';
     417        }
     418
    411419        if ( is_array( $default['field'] ) ) {
    412420            $default['field'] = '`' . implode( '`,`', $default['field'] ) . '`';
     
    424432                $s = is_array( $v ) ? ' IN ' : '=';
    425433                if ( is_array( $v ) ) {
    426                     $v = "'" . implode( "','", $v ) . "'";
     434                    foreach ( $v as $_f => $_v ) {
     435                        $v[ $_f ] = $wpdb->prepare( '%s', $_v );
     436                    }
     437                    $v = implode( ',', $v );
    427438                    $v = "($v)";
    428439                } else {
    429                     $v = "'$v'";
     440                    $v = $wpdb->prepare( '%s', $v );
    430441                }
    431442                $data[ $f ] = sprintf( '`%s`%s%s', $f, $s, $v );
     
    452463            $sql = str_replace( $replace, $replacer, $default['sql'] );
    453464        }
    454         global $wpdb;
     465
    455466        $products = $wpdb->get_results( $sql, ARRAY_A ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
    456467
  • ti-woocommerce-wishlist/trunk/includes/api/wishlist.class.php

    r3039108 r3167298  
    106106
    107107        if ( $user_id && ! $this->user_id_exists( $user_id ) ) {
    108             return new WP_Error( 'ti_woocommerce_wishlist_api_wishlist_user_not_exists', __( 'WordPress user does not exist.', 'ti-woocommerce-wishlist' ), [ 'status' => 400 ] );
     108            //don't expose which user_ids exist by not returning an error that says that
     109            return new WP_Error( 'ti_woocommerce_wishlist_api_wishlist_not_found', __( 'No wishlists found for this user.', 'ti-woocommerce-wishlist' ), [ 'status' => 400 ] );
    109110        }
    110111        $wl = new TInvWL_Wishlist();
     
    185186        ];
    186187
     188        //proper sanitizing
    187189        if ( null !== ( $count = $request->get_param( 'count' ) ) ) {
    188             $args['count'] = $count;
     190            $args['count'] = absint( $count );
    189191        }
    190192        if ( null !== ( $offset = $request->get_param( 'offset' ) ) ) {
    191             $args['offset'] = $offset;
    192         }
     193            $args['offset'] = absint( $offset );
     194        }
     195        //the order value is passed directly to the db so it needs to be protected against sql_injections
    193196        if ( null !== ( $order = $request->get_param( 'order' ) ) ) {
    194             $args['order'] = $order;
    195         }
    196 
     197            $order              = strtoupper( $order );
     198            $valid_order_values = array( 'ASC', 'DESC' );
     199            if ( in_array( $order, $valid_order_values, true ) ) {
     200                $args['order'] = $order;
     201            }
     202        }
    197203
    198204        $products = $wlp->get( $args );
     
    353359    public function user_id_exists( int $user_id ): bool {
    354360        global $wpdb;
    355 
     361        $user_id = absint( $user_id );
    356362        // Check cache:
    357363        if ( wp_cache_get( $user_id, 'users' ) ) {
  • ti-woocommerce-wishlist/trunk/includes/product.helper.php

    r3044331 r3167298  
    296296        $default['offset'] = absint( $default['offset'] );
    297297        $default['count']  = absint( $default['count'] );
     298        //the order value is passed directly to the db so it needs to be protected against sql_injections
     299        $valid_order_values = array( 'ASC', 'DESC' );
     300        if ( ! in_array( strtoupper( $default['order'] ), $valid_order_values, true ) ) {
     301            $default['order'] = 'DESC';
     302        }
     303
    298304        if ( is_array( $default['field'] ) ) {
    299305            $default['field'] = '`' . implode( '`,`', $default['field'] ) . '`';
     
    543549            do_action( 'tinvwl_product_updated', $data );
    544550
    545             return ( $id ) ? $id : true;
     551            return ( $id ) ?: true;
    546552        }
    547553
     
    561567    function remove_product_from_wl( int $wishlist_id = 0, int $product_id = 0, int $variation_id = 0, array $meta = [] ): bool {
    562568        global $wpdb;
     569
     570        $wishlist_id  = absint( $wishlist_id );
     571        $product_id   = absint( $product_id );
     572        $variation_id = absint( $variation_id );
     573
    563574        if ( empty( $wishlist_id ) ) {
    564575            $wishlist_id = $this->wishlist_id();
     
    616627     */
    617628    function remove_product( $product_id = 0 ) {
     629        global $wpdb;
    618630        if ( empty( $product_id ) ) {
    619631            return false;
    620632        }
    621 
    622         global $wpdb;
     633        $product_id = absint( $product_id );
     634
    623635        $result = false !== $wpdb->delete( $this->table, array( 'product_id' => $product_id ) ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
    624636        if ( $result ) {
     
    639651     */
    640652    function get_wishlist_by_product_id( $product_id = 0 ) {
     653        global $wpdb;
    641654        if ( empty( $product_id ) ) {
    642655            return false;
    643656        }
    644 
    645         global $wpdb;
    646         $sql    = "SELECT `wishlist_id` FROM `{$this->table}` WHERE `ID`={$product_id}";
    647         $result = $wpdb->get_results( $sql, ARRAY_A );
     657        $product_id = absint( $product_id );
     658
     659        $prepared_sql = $wpdb->prepare( "SELECT `wishlist_id` FROM `{$this->table}` WHERE `ID`=%d", $product_id );
     660        $result       = $wpdb->get_results( $prepared_sql, ARRAY_A );
    648661
    649662        if ( ! $result ) {
  • ti-woocommerce-wishlist/trunk/includes/wishlist.class.php

    r3039108 r3167298  
    109109     */
    110110    function add_user_default( $user_id = 0 ) {
     111        $user_id = absint( $user_id );
    111112        if ( empty( $user_id ) ) {
    112113            $user_id = $this->user;
     
    247248            $sharekey = $this->get_sharekey();
    248249        }
    249         if ( empty( $sharekey ) ) {
     250
     251        //validate sharekey
     252        if ( empty( $sharekey ) || ! is_string( $sharekey ) || ! preg_match( '/[a-f0-9]{6}/i', $sharekey ) ) {
    250253            return array();
    251254        }
     
    267270     * @return array
    268271     */
    269     function get_by_user( $user_id = 0, $data = array() ) {
     272    function get_by_user( $user_id = 0 ) {
    270273        $user_id = absint( $user_id );
    271274        if ( empty( $user_id ) ) {
     
    273276        }
    274277        $this->add_user_default( $user_id );
    275         $_data = array(
     278        $data = array(
    276279            'author' => $user_id,
    277280        );
    278281
    279         if ( ! current_user_can( 'tinvwl_general_settings' ) && ( empty( $this->user ) || ( $_data['author'] != $this->user ) ) ) { // WPCS: loose comparison ok.
    280             $_data['status'] = 'public';
    281         }
    282         $data = tinv_array_merge( $data, $_data );
     282        if ( ! current_user_can( 'tinvwl_general_settings' ) && ( empty( $this->user ) || ( $data['author'] != $this->user ) ) ) { // WPCS: loose comparison ok.
     283            $data['status'] = 'public';
     284        }
    283285
    284286        return $this->get( $data );
     
    355357                unset( $data[ $_k ] );
    356358            }
     359        }
     360
     361        //proper sanitizing
     362        $default['offset'] = absint( $default['offset'] );
     363        $default['count']  = absint( $default['count'] );
     364        //the order value is passed directly to the db so it needs to be protected against sql_injections
     365        $valid_order_values = array( 'ASC', 'DESC' );
     366        if ( ! in_array( strtoupper( $default['order'] ), $valid_order_values, true ) ) {
     367            $default['order'] = 'ASC';
    357368        }
    358369
     
    446457     */
    447458    function update( $id, $data, $type = 'list', $status = 'public' ) {
     459        global $wpdb;
     460
     461        $id = absint( $id );
     462
    448463        if ( ! is_array( $data ) ) {
    449464            $data = array(
     
    459474            'author' => FILTER_VALIDATE_INT,
    460475        ) ) );
     476
    461477        $data = array_filter( $data );
    462478        $data = apply_filters( 'tinvwl_wishlist_update', $data, $id );
     
    467483            }
    468484        }
    469         global $wpdb;
    470 
    471         return false !== $wpdb->update( $this->table, $data, array( 'ID' => $id ) ); // WPCS: db call ok; no-cache ok; unprepared SQL ok.
     485
     486        return false !== $wpdb->update( $this->table, $data, array( 'ID' => $id ) );
    472487    }
    473488
  • ti-woocommerce-wishlist/trunk/languages/ti-woocommerce-wishlist.pot

    r3044331 r3167298  
    1 # Copyright (C) 2024 TI WooCommerce Wishlist Plugin - 2.8.2
    2 # This file is distributed under the same license as the TI WooCommerce Wishlist Plugin - 2.8.2 package.
     1# Copyright (C) 2024 TI WooCommerce Wishlist Plugin - 2.9.0
     2# This file is distributed under the same license as the TI WooCommerce Wishlist Plugin - 2.9.0 package.
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: TI WooCommerce Wishlist Plugin - 2.8.2\n"
     5"Project-Id-Version: TI WooCommerce Wishlist Plugin - 2.9.0\n"
    66"MIME-Version: 1.0\n"
    77"Content-Type: text/plain; charset=UTF-8\n"
    88"Content-Transfer-Encoding: 8bit\n"
    9 "Content-Transfer-Econdig: 8bit\n"
    10 "Content-Type: text/plain; charset=UTF-8\n"
    119"Language-Team: TemplateInvaders (https://templateinvaders.com/)\n"
    1210"Last-Translator: TemplateInvaders (https://templateinvaders.com/)\n"
    13 "MIME-Version: 1.0\n"
    14 "Project-Id-Version: TI WooCommerce Wishlist Plugin - 2.8.2\n"
     11"POT-Creation-Date: 2024-10-11 17:26+0000\n"
    1512"Report-Msgid-Bugs-To: https://templateinvaders.com/help/\n"
    1613"X-Poedit-Basepath: ..\n"
     
    933930msgstr ""
    934931
    935 #: includes/api/wishlist.class.php:83, includes/api/wishlist.class.php:89, includes/api/wishlist.class.php:293, includes/api/wishlist.class.php:300
     932#: includes/api/wishlist.class.php:83, includes/api/wishlist.class.php:89, includes/api/wishlist.class.php:299, includes/api/wishlist.class.php:306
    936933msgid "Invalid wishlist share key."
    937934msgstr ""
    938935
    939 #: includes/api/wishlist.class.php:108
    940 msgid "WordPress user does not exist."
    941 msgstr ""
    942 
    943 #: includes/api/wishlist.class.php:121
     936#: includes/api/wishlist.class.php:109, includes/api/wishlist.class.php:122
    944937msgid "No wishlists found for this user."
    945938msgstr ""
    946939
    947 #: includes/api/wishlist.class.php:155, includes/api/wishlist.class.php:159
     940#: includes/api/wishlist.class.php:156, includes/api/wishlist.class.php:160
    948941msgid "Update wishlist data failed."
    949942msgstr ""
    950943
    951 #: includes/api/wishlist.class.php:222, includes/api/wishlist.class.php:237
     944#: includes/api/wishlist.class.php:228, includes/api/wishlist.class.php:243
    952945msgid "Add product to wishlist failed."
    953946msgstr ""
    954947
    955 #: includes/api/wishlist.class.php:259
     948#: includes/api/wishlist.class.php:265
    956949msgid "Invalid item ID."
    957950msgstr ""
    958951
    959 #: includes/api/wishlist.class.php:266, includes/api/wishlist.class.php:276
     952#: includes/api/wishlist.class.php:272, includes/api/wishlist.class.php:282
    960953msgid "Product not found."
    961954msgstr ""
    962955
    963 #: includes/api/wishlist.class.php:270
     956#: includes/api/wishlist.class.php:276
    964957msgid "Remove product from wishlist failed."
    965958msgstr ""
    966959
    967 #: includes/api/wishlist.class.php:279
     960#: includes/api/wishlist.class.php:285
    968961msgid "Product removed from a wishlist."
    969962msgstr ""
     
    13711364msgstr ""
    13721365
    1373 #. translators: %s: product name
    13741366#. translators: %s: product name
    13751367#: public/wishlist/ajax.class.php:238, public/wishlist/ajax.class.php:387, public/wishlist/ajax.class.php:468
     
    13861378
    13871379#. translators: %s: product name
    1388 #. translators: %s: product name
    13891380#: public/wishlist/ajax.class.php:380, public/wishlist/ajax.class.php:461
    13901381msgctxt "Item name in quotes"
  • ti-woocommerce-wishlist/trunk/readme.txt

    r3044334 r3167298  
    33Tags: woocommerce, wishlist, woocommerce wishlist, shop, ecommerce
    44Requires at least: 6.1
    5 Tested up to: 6.4
    6 Stable tag: 2.8.2
     5Tested up to: 6.6
     6Stable tag: 2.9.0
    77Requires PHP: 7.4
    88License: GPLv3
     
    159159
    160160== Changelog ==
    161 = 2.8.2 =
    162 *Release Date - 3 March 2024*
    163161
    164 - **Added**: Support for PHP 8.3
    165 - **Added**: Integration with [WP Armour - Honeypot Anti Spam](https://wordpress.org/plugins/honeypot/) plugin
     162= 2.9.0 =
     163*Release Date - 11 October 2024*
    166164
    167 = 2.8.1 =
    168 *Release Date - 21 February 2024*
    169 
    170 - **Added**: Support for WooCommerce 8.6.x
    171 - **Added**: Wishlist creation for guests via REST API. Use the route wp-json/wc/v3/wishlist/get_by_user/0
    172 - **Fixed**: PHP warning in wishlist products counter
    173 - **Fixed**: PHP error on plugin uninstall
    174 - **Removed**: Network activation restriction
    175 - **Fixed**: Issue with REST API get products request arguments
    176 
    177 
    178 = 2.8.0 =
    179 *Release Date - 24 November 2023*
    180 
    181 - **Added**: Support for WordPress 6.4
    182 - **Added**: Support for WooCommerce 8.3
    183 - **Added**: Option to erase all data on uninstall
    184 - **Updated**: Integration with [WPC Product Bundles for WooCommerce](https://wordpress.org/plugins/woo-product-bundle/)
    185 - **Fixed**: Issue with `alt` attribute of a custom image for products counter icon
    186 - **Fixed**: 'Add to Cart' button issue for parent product
    187 - **Fixed**: Scheduled event hooks issue
    188 - **Fixed**: PHP 8.1 deprecation warnings
    189 - **Fixed**: Missing space in HTML markup
    190 - **Fixed**: REST API wishlist data inconsistencies
     165- **Added**: Support for WordPress 6.6.x
     166- **Added**: Support for WooCommerce 9.3.x
     167- **Fixed**: SQL Injection vulnerability
    191168
    192169[See the changelog for all versions](https://templateinvaders.com/changelogs/ti-woocommerce-wishlist-plugin-free-changelog/?utm_source=wordpressorg&utm_content=changelog).
     
    194171== Upgrade Notice ==
    195172
    196 = 2.0.0 =
    197 Major update with new features
     173= 2.9.0 =
     174Fixed SQL Injection vulnerability
  • ti-woocommerce-wishlist/trunk/ti-woocommerce-wishlist.php

    r3044331 r3167298  
    55 * Plugin URI:        https://wordpress.org/plugins/ti-woocommerce-wishlist/
    66 * Description:       Wishlist functionality for your WooCommerce store.
    7  * Version:           2.8.2
     7 * Version:           2.9.0
    88 * Requires at least: 6.1
    9  * Tested up to: 6.4
     9 * Tested up to: 6.6
    1010 * Requires PHP: 7.4
     11 * Requires Plugins: woocommerce
    1112 * WC requires at least: 3.2
    12  * WC tested up to: 8.6
     13 * WC tested up to: 9.3
    1314 * Author:            TemplateInvaders
    1415 * Author URI:        https://templateinvaders.com/
     
    2930defined( 'TINVWL_PREFIX' ) || define( 'TINVWL_PREFIX', 'tinvwl' );
    3031defined( 'TINVWL_DOMAIN' ) || define( 'TINVWL_DOMAIN', 'ti-woocommerce-wishlist' );
    31 defined( 'TINVWL_FVERSION' ) || define( 'TINVWL_FVERSION', '2.8.2' );
     32defined( 'TINVWL_FVERSION' ) || define( 'TINVWL_FVERSION', '2.9.0' );
    3233defined( 'TINVWL_LOAD_FREE' ) || define( 'TINVWL_LOAD_FREE', plugin_basename( __FILE__ ) );
    3334defined( 'TINVWL_NAME' ) || define( 'TINVWL_NAME', 'TI WooCommerce Wishlist' );
  • ti-woocommerce-wishlist/trunk/vendor/autoload.php

    r3044331 r3167298  
    2323require_once __DIR__ . '/composer/autoload_real.php';
    2424
    25 return ComposerAutoloaderInit811f57b3d5528d9c8defd6995d70c7b0::getLoader();
     25return ComposerAutoloaderInitd2af101309227f90c6d42451ac81d635::getLoader();
  • ti-woocommerce-wishlist/trunk/vendor/composer/ClassLoader.php

    r3044331 r3167298  
    4646    private static $includeFile;
    4747
    48     /** @var ?string */
     48    /** @var string|null */
    4949    private $vendorDir;
    5050
    5151    // PSR-4
    5252    /**
    53      * @var array[]
    54      * @psalm-var array<string, array<string, int>>
     53     * @var array<string, array<string, int>>
    5554     */
    5655    private $prefixLengthsPsr4 = array();
    5756    /**
    58      * @var array[]
    59      * @psalm-var array<string, array<int, string>>
     57     * @var array<string, list<string>>
    6058     */
    6159    private $prefixDirsPsr4 = array();
    6260    /**
    63      * @var array[]
    64      * @psalm-var array<string, string>
     61     * @var list<string>
    6562     */
    6663    private $fallbackDirsPsr4 = array();
     
    6865    // PSR-0
    6966    /**
    70      * @var array[]
    71      * @psalm-var array<string, array<string, string[]>>
     67     * List of PSR-0 prefixes
     68     *
     69     * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
     70     *
     71     * @var array<string, array<string, list<string>>>
    7272     */
    7373    private $prefixesPsr0 = array();
    7474    /**
    75      * @var array[]
    76      * @psalm-var array<string, string>
     75     * @var list<string>
    7776     */
    7877    private $fallbackDirsPsr0 = array();
     
    8281
    8382    /**
    84      * @var string[]
    85      * @psalm-var array<string, string>
     83     * @var array<string, string>
    8684     */
    8785    private $classMap = array();
     
    9189
    9290    /**
    93      * @var bool[]
    94      * @psalm-var array<string, bool>
     91     * @var array<string, bool>
    9592     */
    9693    private $missingClasses = array();
    9794
    98     /** @var ?string */
     95    /** @var string|null */
    9996    private $apcuPrefix;
    10097
    10198    /**
    102      * @var self[]
     99     * @var array<string, self>
    103100     */
    104101    private static $registeredLoaders = array();
    105102
    106103    /**
    107      * @param ?string $vendorDir
     104     * @param string|null $vendorDir
    108105     */
    109106    public function __construct($vendorDir = null)
     
    114111
    115112    /**
    116      * @return string[]
     113     * @return array<string, list<string>>
    117114     */
    118115    public function getPrefixes()
     
    126123
    127124    /**
    128      * @return array[]
    129      * @psalm-return array<string, array<int, string>>
     125     * @return array<string, list<string>>
    130126     */
    131127    public function getPrefixesPsr4()
     
    135131
    136132    /**
    137      * @return array[]
    138      * @psalm-return array<string, string>
     133     * @return list<string>
    139134     */
    140135    public function getFallbackDirs()
     
    144139
    145140    /**
    146      * @return array[]
    147      * @psalm-return array<string, string>
     141     * @return list<string>
    148142     */
    149143    public function getFallbackDirsPsr4()
     
    153147
    154148    /**
    155      * @return string[] Array of classname => path
    156      * @psalm-return array<string, string>
     149     * @return array<string, string> Array of classname => path
    157150     */
    158151    public function getClassMap()
     
    162155
    163156    /**
    164      * @param string[] $classMap Class to filename map
    165      * @psalm-param array<string, string> $classMap
     157     * @param array<string, string> $classMap Class to filename map
    166158     *
    167159     * @return void
     
    180172     * appending or prepending to the ones previously set for this prefix.
    181173     *
    182      * @param string          $prefix  The prefix
    183      * @param string[]|string $paths   The PSR-0 root directories
    184      * @param bool            $prepend Whether to prepend the directories
     174     * @param string              $prefix  The prefix
     175     * @param list<string>|string $paths   The PSR-0 root directories
     176     * @param bool                $prepend Whether to prepend the directories
    185177     *
    186178     * @return void
     
    188180    public function add($prefix, $paths, $prepend = false)
    189181    {
     182        $paths = (array) $paths;
    190183        if (!$prefix) {
    191184            if ($prepend) {
    192185                $this->fallbackDirsPsr0 = array_merge(
    193                     (array) $paths,
     186                    $paths,
    194187                    $this->fallbackDirsPsr0
    195188                );
     
    197190                $this->fallbackDirsPsr0 = array_merge(
    198191                    $this->fallbackDirsPsr0,
    199                     (array) $paths
     192                    $paths
    200193                );
    201194            }
     
    206199        $first = $prefix[0];
    207200        if (!isset($this->prefixesPsr0[$first][$prefix])) {
    208             $this->prefixesPsr0[$first][$prefix] = (array) $paths;
     201            $this->prefixesPsr0[$first][$prefix] = $paths;
    209202
    210203            return;
     
    212205        if ($prepend) {
    213206            $this->prefixesPsr0[$first][$prefix] = array_merge(
    214                 (array) $paths,
     207                $paths,
    215208                $this->prefixesPsr0[$first][$prefix]
    216209            );
     
    218211            $this->prefixesPsr0[$first][$prefix] = array_merge(
    219212                $this->prefixesPsr0[$first][$prefix],
    220                 (array) $paths
     213                $paths
    221214            );
    222215        }
     
    227220     * appending or prepending to the ones previously set for this namespace.
    228221     *
    229      * @param string          $prefix  The prefix/namespace, with trailing '\\'
    230      * @param string[]|string $paths   The PSR-4 base directories
    231      * @param bool            $prepend Whether to prepend the directories
     222     * @param string              $prefix  The prefix/namespace, with trailing '\\'
     223     * @param list<string>|string $paths   The PSR-4 base directories
     224     * @param bool                $prepend Whether to prepend the directories
    232225     *
    233226     * @throws \InvalidArgumentException
     
    237230    public function addPsr4($prefix, $paths, $prepend = false)
    238231    {
     232        $paths = (array) $paths;
    239233        if (!$prefix) {
    240234            // Register directories for the root namespace.
    241235            if ($prepend) {
    242236                $this->fallbackDirsPsr4 = array_merge(
    243                     (array) $paths,
     237                    $paths,
    244238                    $this->fallbackDirsPsr4
    245239                );
     
    247241                $this->fallbackDirsPsr4 = array_merge(
    248242                    $this->fallbackDirsPsr4,
    249                     (array) $paths
     243                    $paths
    250244                );
    251245            }
     
    257251            }
    258252            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
    259             $this->prefixDirsPsr4[$prefix] = (array) $paths;
     253            $this->prefixDirsPsr4[$prefix] = $paths;
    260254        } elseif ($prepend) {
    261255            // Prepend directories for an already registered namespace.
    262256            $this->prefixDirsPsr4[$prefix] = array_merge(
    263                 (array) $paths,
     257                $paths,
    264258                $this->prefixDirsPsr4[$prefix]
    265259            );
     
    268262            $this->prefixDirsPsr4[$prefix] = array_merge(
    269263                $this->prefixDirsPsr4[$prefix],
    270                 (array) $paths
     264                $paths
    271265            );
    272266        }
     
    277271     * replacing any others previously set for this prefix.
    278272     *
    279      * @param string          $prefix The prefix
    280      * @param string[]|string $paths  The PSR-0 base directories
     273     * @param string              $prefix The prefix
     274     * @param list<string>|string $paths  The PSR-0 base directories
    281275     *
    282276     * @return void
     
    295289     * replacing any others previously set for this namespace.
    296290     *
    297      * @param string          $prefix The prefix/namespace, with trailing '\\'
    298      * @param string[]|string $paths  The PSR-4 base directories
     291     * @param string              $prefix The prefix/namespace, with trailing '\\'
     292     * @param list<string>|string $paths  The PSR-4 base directories
    299293     *
    300294     * @throws \InvalidArgumentException
     
    482476
    483477    /**
    484      * Returns the currently registered loaders indexed by their corresponding vendor directories.
    485      *
    486      * @return self[]
     478     * Returns the currently registered loaders keyed by their corresponding vendor directories.
     479     *
     480     * @return array<string, self>
    487481     */
    488482    public static function getRegisteredLoaders()
  • ti-woocommerce-wishlist/trunk/vendor/composer/autoload_real.php

    r3044331 r3167298  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit811f57b3d5528d9c8defd6995d70c7b0
     5class ComposerAutoloaderInitd2af101309227f90c6d42451ac81d635
    66{
    77    private static $loader;
     
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit811f57b3d5528d9c8defd6995d70c7b0', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitd2af101309227f90c6d42451ac81d635', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit811f57b3d5528d9c8defd6995d70c7b0', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitd2af101309227f90c6d42451ac81d635', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInit811f57b3d5528d9c8defd6995d70c7b0::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInitd2af101309227f90c6d42451ac81d635::getInitializer($loader));
    3333
    3434        $loader->register(true);
  • ti-woocommerce-wishlist/trunk/vendor/composer/autoload_static.php

    r2738026 r3167298  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInit811f57b3d5528d9c8defd6995d70c7b0
     7class ComposerStaticInitd2af101309227f90c6d42451ac81d635
    88{
    99    public static $prefixLengthsPsr4 = array (
     
    2828    {
    2929        return \Closure::bind(function () use ($loader) {
    30             $loader->prefixLengthsPsr4 = ComposerStaticInit811f57b3d5528d9c8defd6995d70c7b0::$prefixLengthsPsr4;
    31             $loader->prefixDirsPsr4 = ComposerStaticInit811f57b3d5528d9c8defd6995d70c7b0::$prefixDirsPsr4;
    32             $loader->classMap = ComposerStaticInit811f57b3d5528d9c8defd6995d70c7b0::$classMap;
     30            $loader->prefixLengthsPsr4 = ComposerStaticInitd2af101309227f90c6d42451ac81d635::$prefixLengthsPsr4;
     31            $loader->prefixDirsPsr4 = ComposerStaticInitd2af101309227f90c6d42451ac81d635::$prefixDirsPsr4;
     32            $loader->classMap = ComposerStaticInitd2af101309227f90c6d42451ac81d635::$classMap;
    3333
    3434        }, null, ClassLoader::class);
  • ti-woocommerce-wishlist/trunk/vendor/composer/installed.php

    r3044331 r3167298  
    22    'root' => array(
    33        'name' => '__root__',
    4         'pretty_version' => 'dev-master',
    5         'version' => 'dev-master',
    6         'reference' => 'd79a0d81124ea10c775c63d1a920a4f7fa8090be',
     4        'pretty_version' => '1.0.0+no-version-set',
     5        'version' => '1.0.0.0',
     6        'reference' => null,
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    1212    'versions' => array(
    1313        '__root__' => array(
    14             'pretty_version' => 'dev-master',
    15             'version' => 'dev-master',
    16             'reference' => 'd79a0d81124ea10c775c63d1a920a4f7fa8090be',
     14            'pretty_version' => '1.0.0+no-version-set',
     15            'version' => '1.0.0.0',
     16            'reference' => null,
    1717            'type' => 'library',
    1818            'install_path' => __DIR__ . '/../../',
Note: See TracChangeset for help on using the changeset viewer.