( function( window, document, $ ) { 'use strict'; var tcAPI = {}; var TMEPOJS = window.TMEPOJS; var wp = window.wp; var TMEPOQTRANSLATEXJS = window.TMEPOQTRANSLATEXJS; var noUiSlider = window.noUiSlider; var ClipboardEvent = window.ClipboardEvent; var DataTransfer = window.DataTransfer; var lateVariationEvent = []; var latecpflogicactions = []; var tmLazyloadContainer = false; var variationsFormIsLoaded = false; var jBody = $( 'body' ); var jWindow = $( window ); var jDocument = $( document ); var errorObject; var FloatingTotalsBox; var currentAjaxButton; var errorContainer = $( window ); var tcmexp = window.tcmexp; var _ = window._; var priceCache = false; var getLocalInputDecimalSeparator = function() { if ( TMEPOJS.tm_epo_global_input_decimal_separator === '' ) { return TMEPOJS.currency_format_decimal_sep; } return $.epoAPI.locale.getSystemDecimalSeparator(); }; var getLocalDecimalSeparator = function() { if ( TMEPOJS.tm_epo_global_displayed_decimal_separator === '' ) { return TMEPOJS.currency_format_decimal_sep; } return $.epoAPI.locale.getSystemDecimalSeparator(); }; var getLocalThousandSeparator = function() { if ( TMEPOJS.tm_epo_global_displayed_decimal_separator === '' ) { return TMEPOJS.currency_format_thousand_sep; } return $.epoAPI.locale.getSystemDecimalSeparator(); }; var getEpoDelay = function() { if ( TMEPOJS.tm_epo_start_animation_delay ) { return TMEPOJS.tm_epo_start_animation_delay; } else if ( window.tc_epo_delay ) { return window.tc_epo_delay; } return 500; }; var getEpoAnimationDelay = function() { if ( TMEPOJS.tm_epo_animation_delay ) { return TMEPOJS.tm_epo_start_animation_delay; } else if ( window.tc_epo_animation_delay ) { return window.tc_epo_animation_delay; } return 500; }; var originalVal = $.fn.val; if ( ! TMEPOJS || ! wp ) { return; } // Trigger plugin events when other plugins use val. $.fn.val = function() { var result = originalVal.apply( this, arguments ); if ( arguments.length > 0 ) { if ( $( this ).is( '.input-text.qty' ) ) { $( this ).trigger( 'change.cpf' ); } } return result; }; // Set update event for Lazy Load XT if ( TMEPOJS.tm_epo_no_lazy_load === 'no' && $.lazyLoadXT ) { $.extend( $.lazyLoadXT, { autoInit: false, updateEvent: $.lazyLoadXT.updateEvent + ' tmlazy' } ); } tcAPI.localInputDecimalSeparator = getLocalInputDecimalSeparator(); tcAPI.localDecimalSeparator = getLocalDecimalSeparator(); tcAPI.localThousandSeparator = getLocalThousandSeparator(); tcAPI.epoDelay = getEpoDelay(); tcAPI.epoAnimationDelay = getEpoAnimationDelay(); tcAPI.getElementFromFieldCache = []; tcAPI.epoSelector = '.tc-extra-product-options'; tcAPI.associatedEpoSelector = '.tc-extra-product-options-inline'; tcAPI.associatedEpoCart = '.tc-epo-element-product-container-cart'; tcAPI.addToCartSelector = "input[name='add-to-cart']"; tcAPI.tcAddToCartSelector = 'input.tc-add-to-cart'; tcAPI.qtySelector = "input.qty,input[name='quantity'],select.qty,.drop-down-button #qty,.plus-minus-button #qty,.slider-input #amount"; tcAPI.associateQtySelector = 'input.tm-qty-alt'; tcAPI.addToCartButtonSelector = '.add_to_cart_button, .single_add_to_cart_button'; tcAPI.compositeSelector = '.bto_item,.component'; tcAPI.nativeProductPriceSelector = '.woocommerce .product p.price'; tcAPI.associatedNativeProductPriceSelector = '.product-price span.price'; tcAPI.templateEngine = $.epoAPI.applyFilter( 'tc_adjust_templateEngine', { price: wp.template( 'tc-price' ), sale_price: wp.template( 'tc-sale-price' ), tc_chars_remanining: wp.template( 'tc-chars-remanining' ), tc_final_totals: wp.template( 'tc-final-totals' ), tc_floating_box: wp.template( 'tc-floating-box' ), tc_floating_box_nks: wp.template( 'tc-floating-box-nks' ), tc_formatted_price: wp.template( 'tc-formatted-price' ), tc_formatted_sale_price: wp.template( 'tc-formatted-sale-price' ), tc_lightbox: wp.template( 'tc-lightbox' ), tc_lightbox_zoom: wp.template( 'tc-lightbox-zoom' ), tc_section_pop_link: wp.template( 'tc-section-pop-link' ), tc_upload_messages: wp.template( 'tc-upload-messages' ) } ); // make API available to 3rd party plugins $.tcAPI = function() { return tcAPI; }; // method for accessing internal api variables $.tcAPIGet = function( name ) { return tcAPI[ name ]; }; // method for setting internal api variables $.tcAPISet = function( name, value ) { tcAPI[ name ] = value; }; if ( $.tc_validator ) { $.extend( $.tc_validator.messages, { required: TMEPOJS.tm_epo_global_validator_messages.required, email: TMEPOJS.tm_epo_global_validator_messages.email, url: TMEPOJS.tm_epo_global_validator_messages.url, number: TMEPOJS.tm_epo_global_validator_messages.number, digits: TMEPOJS.tm_epo_global_validator_messages.digits, maxlengthsingle: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.maxlengthsingle ), maxlength: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.maxlength ), minlengthsingle: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.minlengthsingle ), minlength: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.minlength ), max: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.max ), min: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.min ), step: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.step ), lettersonly: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.lettersonly ), lettersspaceonly: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.lettersspaceonly ), alphanumeric: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.alphanumeric ), alphanumericunicode: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.alphanumericunicode ), alphanumericunicodespace: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.alphanumericunicodespace ), repeaterminrows: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.repeaterminrows ), repeatermaxrows: $.tc_validator.format( TMEPOJS.tm_epo_global_validator_messages.repeatermaxrows ) } ); /* ASCII Digits \u0030-\u0039 Latin Alphabet \u0041-\u005A\u0061-\u007A Latin-1 Supplement \u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF Latin Extended-A \u0100-\u0148\u014A-\u017F Latin Extended-B \u0180-\u01BF\u01C4-\u024F Latin Extended Additional \u1E02-\u1EF3 Greek and Coptic \u0370-\u03FF Cyrillic \u0400-\u04FF\u0500-\u052F Japanese Hiragana \u3040-\u309f Japanese Katakana \u30a0-\u30ff Japanese Kanji (common & uncommon) \u4e00-\u9faf Japanese Kanji (rare) \u3400-\u4dbf Arabic \u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF \u0600-\u06ff \u0600-\u06FF Armenian \u0530-\u1058F \u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F */ $.tc_validator.addMethod( 'alphanumeric', function( value, element ) { return this.optional( element ) || /^[a-zA-Z0-9.-]+$/i.test( value ); }, $.tc_validator.messages.alphanumeric ); $.tc_validator.addMethod( 'lettersonly', function( value, element ) { return this.optional( element ) || /^[a-z]+$/i.test( value ); }, $.tc_validator.messages.lettersonly ); $.tc_validator.addMethod( 'lettersspaceonly', function( value, element ) { return this.optional( element ) || /^[a-z,\u0020]+$/i.test( value ); }, $.tc_validator.messages.lettersspaceonly ); $.tc_validator.addMethod( 'alphanumericunicode', function( value, element ) { return ( this.optional( element ) || /^[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F]+$/i.test( value ) ); }, $.tc_validator.messages.alphanumericunicode ); $.tc_validator.addMethod( 'alphanumericunicodespace', function( value, element ) { return ( this.optional( element ) || /^[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u0148\u014A-\u017F\u0180-\u01BF\u01C4-\u024F\u1E02-\u1EF3\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf\u3400-\u4dbf\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u10E60-\u10E7F\u1EC70-\u1ECBF\u1ED00-\u1ED4F\u1EE00-\u1EEFF\u0530-\u1058F,\u0020]+$/i.test( value ) ); }, $.tc_validator.messages.alphanumericunicodespace ); $.tc_validator.addMethod( 'repeaterminrows', function( value, element, param ) { return $.epoAPI.math.toInt( $( element ).closest( '.tc-element-inner-wrap' ).find( '.tc-repeater-element' ).length ) >= $.epoAPI.math.toInt( param ); }, $.tc_validator.messages.repeaterminrows ); $.tc_validator.addMethod( 'repeatermaxrows', function( value, element, param ) { return $.epoAPI.math.toInt( $( element ).closest( '.tc-element-inner-wrap' ).find( '.tc-repeater-element' ).length ) <= $.epoAPI.math.toInt( param ); }, $.tc_validator.messages.repeatermaxrows ); $.tc_validator.addMethod( 'product_element_radio_qty', function( value, element ) { var qty = $( element ).closest( '.tm-element-ul-product' ).find( 'input.tc-epo-field-product.tmcp-radio:checked' ).closest( '.tc-epo-element-product-holder' ).find( '.tm-qty' ).first().val(); return qty > 0; }, $.tc_validator.messages.required ); $.tc_validator.addMethod( 'product_element_select_qty', function( value, element ) { var qty = $( element ).closest( '.tm-element-ul-product' ).find( 'select.tc-epo-field-product.tmcp-select' ).closest( '.tc-epo-element-product-holder' ).find( '.tm-qty' ).first().val(); return qty > 0; }, $.tc_validator.messages.required ); } $.epoAPI.util.escapeSelector = ( function() { /* original escape string * /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g; */ var selectorEscape = /([!"$%&'()*+,/:;<=>?@[\]^`{|}~])/g; return function( selector ) { return selector.replace( selectorEscape, '\\$1' ); }; }() ); $.epoAPI.util.unformat = function( o ) { var a = $.epoAPI.math.unformat( o, tcAPI.localInputDecimalSeparator ); var n = parseFloat( a ); if ( ! Number.isFinite( n ) ) { return a; } return n; }; $.epoAPI.util.parseParams = function( string, decode ) { if ( typeof string !== 'string' || string.split === undefined ) { return []; } return string .split( '&' ) .map( function( value ) { var obj = {}; if ( decode === true ) { value = decodeURIComponent( value.replace( /\+/g, '%20' ) ); } value = value.split( '=' ).map( function( v ) { var a = v.split( '?' ); if ( a.length > 1 ) { return a[ 1 ]; } return v; } ); if ( value.length > 1 ) { obj[ value[ 0 ] ] = value[ 1 ]; } return obj; } ) .filter( function( n ) { return n !== null; } ) .reduce( function( current, next ) { return Object.assign( {}, current, next ); }, {} ); }; if ( ! $.tmempty ) { $.tmempty = function( obj ) { var emptyValues = [ undefined, null, false, 0, '', '0' ]; var isEmptyValue = emptyValues.filter( function( item ) { return obj === item; } ).length === 1; var isEmptyObject = false; if ( typeof obj === 'object' ) { isEmptyObject = Object.keys( obj ).filter( function( key ) { return Object.prototype.hasOwnProperty.call( obj, key ); } ).length === 0; return isEmptyObject; } return isEmptyValue || isEmptyObject; }; } if ( ! $.tmType ) { $.tmType = function( obj ) { return Object.prototype.toString .call( obj ) .match( /\s([a-zA-Z]+)/ )[ 1 ] .toLowerCase(); }; } if ( ! $.is_on_screen ) { $.fn.is_on_screen = function() { // we don't use jWindow because we want the current window object var win = $( window ); var scroll = $.epoAPI.dom.scroll(); var bounds = this.offset(); var viewport = { top: scroll.top, left: scroll.left }; viewport.right = viewport.left + win.width(); viewport.bottom = viewport.top + win.height(); bounds.right = bounds.left + this.outerWidth(); bounds.bottom = bounds.top + this.outerHeight(); return ! ( viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom ); }; } if ( ! $().tmtoggle ) { $.fn.tmtoggle = function() { var elements = this; var is_one_open_for_accordion = false; var init_done = 0; if ( elements.length === 0 ) { return; } if ( window.tc_accordion_offset === undefined ) { window.tc_accordion_offset = -100; } elements.each( function() { var t = $( this ); var headers; var wrap; var wraps; if ( ! t.data( 'tm-toggle-init' ) ) { t.data( 'tm-toggle-init', 1 ); headers = t.find( '.tm-toggle' ); wrap = t.find( '.tm-collapse-wrap' ); wraps = $( '.tm-collapse.tmaccordion' ).find( '.tm-toggle' ); if ( headers.length === 0 || wrap.length === 0 ) { return; } if ( wrap.is( '.closed' ) ) { $( wrap ).removeClass( 'closed open' ).addClass( 'closed' ).hide(); $( headers ).find( '.tm-arrow' ).removeClass( 'tcfa-angle-down tcfa-angle-up' ).addClass( 'tcfa-angle-down' ); $( headers ).removeClass( 'toggle-header-open toggle-header-closed' ).addClass( 'toggle-header-closed' ); } else { $( wrap ).removeClass( 'closed open' ).addClass( 'open' ).show(); $( headers ).find( '.tm-arrow' ).removeClass( 'tcfa-angle-down tcfa-angle-up' ).addClass( 'tcfa-angle-up' ); $( headers ).removeClass( 'toggle-header-open toggle-header-closed' ).addClass( 'toggle-header-open' ); is_one_open_for_accordion = true; } headers.each( function( i, header ) { $( header ).on( 'closewrap.tmtoggle', function() { if ( t.is( '.tmaccordion' ) && $( wrap ).is( '.closed' ) ) { return; } $( wrap ).removeClass( 'closed open' ).addClass( 'closed' ); $( this ).find( '.tm-arrow' ).removeClass( 'tcfa-angle-down tcfa-angle-up' ).addClass( 'tcfa-angle-down' ); $( this ).removeClass( 'toggle-header-open toggle-header-closed' ).addClass( 'toggle-header-closed' ); $( wrap ).removeClass( 'tm-animated fadein' ); if ( t.is( '.tmaccordion' ) ) { $( wrap ).animate( { height: 'toggle' }, 100, function() { $( wrap ).hide(); } ); } else { $( wrap ).animate( { height: 'toggle' }, 100, function() { $( wrap ).hide(); } ); } jWindow.trigger( 'tmlazy' ); } ); $( header ).on( 'openwrap.tmtoggle', function() { if ( t.is( '.tmaccordion' ) ) { $( wraps ).not( $( this ) ).trigger( 'closewrap.tmtoggle' ); } $( wrap ).removeClass( 'closed open' ).addClass( 'open' ); $( this ).find( '.tm-arrow' ).removeClass( 'tcfa-angle-down tcfa-angle-up' ).addClass( 'tcfa-angle-up' ); $( this ).removeClass( 'toggle-header-open toggle-header-closed' ).addClass( 'toggle-header-open' ); $( wrap ).show().removeClass( 'tm-animated fadein' ).addClass( 'tm-animated fadein' ); setTimeout( function() { jWindow.trigger( 'tmlazy' ); }, 200 ); setTimeout( function() { if ( init_done && t.is( '.tmaccordion' ) && ! t.is_on_screen() ) { jWindow.tcScrollTo( $( header ), 10, window.tc_accordion_offset ); } }, 110 ); } ); $( header ).on( 'click.tmtoggle', function( e ) { e.preventDefault(); if ( $( wrap ).is( '.closed' ) ) { $( this ).trigger( 'openwrap.tmtoggle' ); } else { $( this ).trigger( 'closewrap.tmtoggle' ); } } ); $( header ) .find( '.tm-qty' ) .closest( '.cpf-element' ) .find( '.tm-epo-field' ) .on( 'change.cpf', function() { $( header ).trigger( 'openwrap.tmtoggle' ); } ); } ); } } ); if ( undefined === window.tc_accordion_closed_on_page_load && ! is_one_open_for_accordion && elements.filter( '.tmaccordion' ).length > 0 ) { elements.filter( '.tmaccordion' ).first().find( '.tm-toggle' ).trigger( 'openwrap.tmtoggle' ); } init_done = 1; return elements; }; } if ( ! $().tmpoplink ) { $.fn.tmpoplink = function() { var elements = this; var floatbox_template; if ( elements.length === 0 ) { return; } floatbox_template = function( data ) { return $.epoAPI.template.html( wp.template( 'tc-cart-options-popup' ), { title: data.title, id: data.id, html: data.html, close: TMEPOJS.i18n_close } ); }; return elements.each( function() { var t = $( this ); var id; var title; var html; var $_html; if ( t.is( '.tc-poplink' ) ) { return; } t.addClass( 'tc-poplink' ); id = $( this ).attr( 'href' ); title = $( this ).attr( 'data-title' ); html = $( id ).html(); if ( ! title ) { title = TMEPOJS.i18n_addition_options; } $_html = floatbox_template( { id: 'tc-floatbox-content', html: html, title: title } ); t.on( 'click.tmpoplink', function( e ) { $.tcFloatBox( { fps: 1, ismodal: false, refresh: 100, width: '80%', height: '80%', classname: 'flasho tc-wrapper', data: $_html } ); e.preventDefault(); } ); } ); }; } function readableFileSize( a, b, c, d, e ) { b = Math; c = b.log; d = 1024; e = c( a ) / c( d ) | 0; //eslint-disable-line no-bitwise return ( ( a / b.pow( d, e ) ).toFixed( e ? 2 : 0 ) ) + ' ' + ( e ? 'KMGTPEZY'[ --e ] + 'B' : 'bytes' ); } function toggleState( thisProductContainerWrap, disabled ) { thisProductContainerWrap.toArray().forEach( function( setter ) { setter = $( setter ); setter.find( ':input' ).prop( 'disabled', function( i, v ) { var state = $( this ).data( 'tc-state' ); if ( state === undefined ) { $( this ).data( 'tc-state', v ); return disabled; } if ( state === false ) { return disabled; } return state; } ); } ); } // Taxes setup function get_price_including_tax( price, _cart, element, force, variation, pricetype, doubleforce ) { var taxable; var tax_rate; var prices_include_tax; var is_vat_exempt; var non_base_location_prices; var taxes_of_one; var base_taxes_of_one; var modded_taxes_of_one; var current_variation; if ( ! Number.isFinite( parseFloat( price ) ) ) { price = 0; } price = price * 10000; if ( _cart ) { taxable = _cart.attr( 'data-taxable' ); tax_rate = _cart.attr( 'data-tax-rate' ); prices_include_tax = _cart.attr( 'data-prices-include-tax' ) || TMEPOJS.prices_include_tax; is_vat_exempt = _cart.attr( 'data-is-vat-exempt' ); non_base_location_prices = _cart.attr( 'data-non-base-location-prices' ); taxes_of_one = _cart.attr( 'data-taxes-of-one' ); base_taxes_of_one = _cart.attr( 'data-base-taxes-of-one' ); modded_taxes_of_one = _cart.attr( 'data-modded-taxes-of-one' ); if ( _cart.data( 'current_variation' ) !== undefined ) { current_variation = _cart.data( 'current_variation' ); } else if ( variation !== undefined ) { current_variation = variation; } if ( current_variation !== undefined ) { current_variation = _cart.data( 'current_variation' ); taxable = current_variation.tc_is_taxable; tax_rate = current_variation.tc_tax_rate; non_base_location_prices = current_variation.tc_non_base_location_prices; taxes_of_one = current_variation.tc_taxes_of_one; base_taxes_of_one = current_variation.tc_base_taxes_of_one; modded_taxes_of_one = current_variation.tc_modded_taxes_of_one; } if ( element ) { if ( element.data( 'tax-obj' ) ) { tax_rate = element.data( 'tax-obj' ); if ( tax_rate.has_fee === 'no' ) { taxable = false; } else if ( tax_rate.has_fee === 'yes' ) { taxable = true; } tax_rate = tax_rate.tax_rate; taxes_of_one = tax_rate / 100; base_taxes_of_one = tax_rate / 100; } } if ( taxable ) { if ( prices_include_tax === '1' && ! force ) { if ( is_vat_exempt === '1' ) { if ( non_base_location_prices === '1' ) { price = parseFloat( price ) - ( taxes_of_one * price ); } else { price = parseFloat( price ) - ( base_taxes_of_one * price ); } } else if ( non_base_location_prices === '1' ) { price = parseFloat( price ) - ( base_taxes_of_one * price ) + ( modded_taxes_of_one * price ); } } else if ( element || current_variation === undefined || doubleforce ) { price = parseFloat( price ) + ( parseFloat( price ) * taxes_of_one ); } } } price = price / 10000; return price; } function get_price_excluding_tax( price, _cart, element, force, variation, pricetype, doubleforce ) { var taxable; var tax_rate; var taxes_of_one; var prices_include_tax; var current_variation; var tax_display_mode; if ( ! Number.isFinite( parseFloat( price ) ) ) { price = 0; } price = price * 10000; if ( _cart ) { tax_display_mode = _cart.attr( 'data-tax-display-mode' ); taxable = _cart.attr( 'data-taxable' ); tax_rate = _cart.attr( 'data-tax-rate' ); taxes_of_one = _cart.attr( 'data-taxes-of-one' ); prices_include_tax = _cart.attr( 'data-prices-include-tax' ); if ( _cart.data( 'current_variation' ) !== undefined ) { current_variation = _cart.data( 'current_variation' ); } else if ( variation !== undefined ) { current_variation = variation; } if ( current_variation !== undefined ) { taxable = current_variation.tc_is_taxable; tax_rate = current_variation.tc_tax_rate; taxes_of_one = current_variation.tc_taxes_of_one; } if ( element ) { if ( element.data( 'tax-obj' ) ) { tax_rate = element.data( 'tax-obj' ); if ( tax_rate.has_fee === 'no' ) { taxable = false; } else if ( tax_rate.has_fee === 'yes' ) { taxable = true; } tax_rate = tax_rate.tax_rate; } } if ( taxable ) { if ( prices_include_tax === '1' || force ) { if ( tax_display_mode === 'incl' ) { // This should never run on this function } else if ( element || current_variation === undefined || force || doubleforce ) { price = parseFloat( price ) - parseFloat( taxes_of_one * price ); } } } } price = price / 10000; return price; } function tm_set_tax_price( value, _cart, element, pricetype, force, variation, doubleforce ) { var tax_display_mode; if ( ! Number.isFinite( parseFloat( value ) ) ) { value = 0; } if ( _cart ) { tax_display_mode = _cart.attr( 'data-tax-display-mode' ) || TMEPOJS.tax_display_mode; if ( tax_display_mode === 'incl' ) { value = get_price_including_tax( value, _cart, element, force, variation, pricetype, doubleforce ); } else { value = get_price_excluding_tax( value, _cart, element, force, variation, pricetype, doubleforce ); } } return value; } // Return a formatted currency value function formatPrice( value, args ) { var data; if ( ! args ) { args = {}; } data = $.extend( { symbol: '', format: '', decimal: tcAPI.localDecimalSeparator, thousand: tcAPI.localThousandSeparator, precision: TMEPOJS.currency_format_num_decimals }, args ); if ( TMEPOJS.tm_epo_trim_zeros === 'yes' ) { if ( ( ( value % 1 ).toString() !== '0' ) === false ) { data.precision = 0; } } return $.epoAPI.applyFilter( 'tc_formatPrice', $.epoAPI.math.format( value, data ), data, value ); } // Return a formatted currency value function tm_set_price_( value, sign, inc_tax_string ) { return ( sign + formatPrice( value, { symbol: TMEPOJS.currency_format_symbol, format: TMEPOJS.currency_format } ) + inc_tax_string ); } // Return a formatted currency value function tm_set_price( value, _cart, notax, taxstring, element, pricetype ) { var inc_tax_string = ''; var val; var sign = TMEPOJS.option_plus_sign + ' '; if ( ! notax ) { value = tm_set_tax_price( value, _cart, element, pricetype ); } val = Math.abs( value ); if ( TMEPOJS.tm_epo_global_options_price_sign === 'minus' ) { sign = ''; } if ( value < 0 ) { sign = TMEPOJS.option_minus_sign + ' '; } if ( _cart && taxstring ) { inc_tax_string = _cart.attr( 'data-tax-string' ); } if ( inc_tax_string === undefined ) { inc_tax_string = ''; } return tm_set_price_( val, sign, inc_tax_string ); } // FloatingTotalsBox plugin FloatingTotalsBox = function( this_epo_totals_container, is_quickview, main_cart ) { this.this_epo_totals_container = this_epo_totals_container; this.is_quickview = is_quickview; this.main_cart = main_cart; if ( ! is_quickview && TMEPOJS.floating_totals_box && TMEPOJS.floating_totals_box !== 'disable' && main_cart && this_epo_totals_container.length ) { this.init(); return this; } return false; }; FloatingTotalsBox.prototype = { constructor: FloatingTotalsBox, onUpdate: function() { var tm_epo_totals_html = this.this_epo_totals_container.data( 'tm-html' ); var tm_floating_box_data = this.this_epo_totals_container.data( 'tm-floating-box-data' ); var values_obj = []; var floatingBoxHtml; var floatingBoxaddToCartButton; if ( tm_floating_box_data && tm_floating_box_data.length ) { $.each( tm_floating_box_data, function( i, row ) { if ( row.title === '' ) { row.title = ' '; } if ( row.value === '' ) { row.value = ' '; } if ( ! row.title ) { row.title = ' '; } else { row.title = $( '
' + row.title + '
' ); row.title.find( 'span' ).remove(); row.title = row.title.html(); } if ( this.is_nks ) { if ( row.label_show !== '' ) { row.title = ''; } if ( row.value_show !== '' ) { row.value = ''; } } if ( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && $.tmempty( row.price ) === true ) { row.price = ''; } else { row.price = tm_set_price( row.price, this.this_epo_totals_container, true, false ); } values_obj.push( { label_show: row.label_show, value_show: row.value_show, title: row.title, value: row.value, quantity: row.quantity, price: row.price } ); } ); } if ( ! ( ( tm_epo_totals_html && tm_epo_totals_html !== '' ) || this.is_nks ) ) { tm_epo_totals_html = ''; this.floatingBox.hide(); } if ( values_obj && ! values_obj.length ) { values_obj.push( { label_show: 'hidden', value_show: 'hidden', title: '', value: '', quantity: 0, price: 0 } ); } floatingBoxHtml = $.epoAPI.template.html( this.engineTemplate, { html_before: TMEPOJS.floating_totals_box_html_before, html_after: TMEPOJS.floating_totals_box_html_after, option_label: TMEPOJS.i18n_option_label, option_value: TMEPOJS.i18n_option_value, option_qty: TMEPOJS.i18n_option_qty, option_price: TMEPOJS.i18n_option_price, values: values_obj, totals: tm_epo_totals_html } ); this.floatingBox.html( floatingBoxHtml ); this.onUpdateScroll(); if ( TMEPOJS.floating_totals_box_add_button === 'yes' ) { floatingBoxaddToCartButton = this.main_cart.find( tcAPI.addToCartButtonSelector ).first(); floatingBoxaddToCartButton .tcClone() .addClass( 'tc-add-to-cart-button' ) .on( 'click', function() { floatingBoxaddToCartButton.trigger( 'click' ); } ) .appendTo( this.floatingBox ); } }, onUpdateScroll: function() { if ( TMEPOJS.floating_totals_box_visibility === 'always' ) { this.floatingBox.show(); return; } if ( TMEPOJS.floating_totals_box_visibility === 'hideafterscroll' ) { if ( jWindow.scrollTop() > $.epoAPI.math.toFloat( TMEPOJS.floating_totals_box_pixels ) && ! this.is_nks_alt ) { if ( ! this.floatingBox.is( ':hidden' ) ) { if ( this.is_nks === false ) { this.floatingBox.fadeOut(); } else { this.floatingBox.hide(); } } } else if ( this.floatingBox.is( ':hidden' ) || this.is_nks_alt ) { if ( ! this.floatingBox.is( ':empty' ) || this.is_nks_alt ) { if ( this.is_nks === false ) { this.floatingBox.fadeIn(); } else { this.floatingBox.show(); } } } } if ( TMEPOJS.floating_totals_box_visibility === 'afterscroll' ) { if ( jWindow.scrollTop() > $.epoAPI.math.toFloat( TMEPOJS.floating_totals_box_pixels ) || this.is_nks_alt ) { if ( ( this.floatingBox.is( ':hidden' ) && ! this.floatingBox.is( ':empty' ) ) || this.is_nks_alt ) { if ( this.is_nks === false ) { this.floatingBox.fadeIn(); } else { this.floatingBox.show(); } } else if ( ! this.floatingBox.is( ':hidden' ) && this.floatingBox.is( ':empty' ) ) { if ( this.is_nks === false ) { this.floatingBox.fadeOut(); } else { this.floatingBox.hide(); } } } else if ( ! this.floatingBox.is( ':hidden' ) ) { if ( this.is_nks === false ) { this.floatingBox.fadeOut(); } else { this.floatingBox.hide(); } } } }, addEvents: function() { this.onUpdate(); this.main_cart.on( 'tm-epo-after-update', this.onUpdate.bind( this ) ); if ( this.is_nks === false ) { jWindow.on( 'scroll', this.onUpdateScroll.bind( this ) ); } }, init: function() { this.floatingBox = $( '
' ); this.nks_selector = $( '.tm-floating-box-nks' ).first(); this.alt_selector = $( '.tm-floating-box-alt' ).first(); this.engineTemplate = tcAPI.templateEngine.tc_floating_box; this.is_nks = false; this.is_nks_alt = false; if ( this.nks_selector.length > 0 ) { this.is_nks = true; this.floatingBox.removeClass( 'top left right bottom' ).appendTo( this.nks_selector ).show(); } else if ( this.alt_selector.length > 0 ) { this.floatingBox.removeClass( 'top left right bottom' ).appendTo( this.alt_selector ).hide(); } else { this.floatingBox.appendTo( 'body' ).hide(); } if ( this.nks_selector.length > 0 || this.alt_selector.length > 0 ) { this.is_nks_alt = true; this.engineTemplate = tcAPI.templateEngine.tc_floating_box_nks; } this.addEvents(); } }; $.tcFloatingTotalsBox = function( this_epo_totals_container, is_quickview, main_cart ) { var data = false; if ( this_epo_totals_container && this_epo_totals_container.length && this_epo_totals_container.data( 'tcfloatingtotalsbox' ) === undefined ) { data = new FloatingTotalsBox( this_epo_totals_container, is_quickview, main_cart ); this_epo_totals_container.data( 'tcfloatingtotalsbox', data ); } return data; }; $.tc_product_image = {}; $.tc_product_image_store = {}; // replace obj1 values with obj2 values $.tc_replace_object_values = function( obj1, obj2 ) { Object.keys( obj1 ).forEach( function( x ) { Object.keys( obj1[ x ] ).forEach( function( attr ) { if ( undefined !== obj2[ x ] && undefined !== obj2[ x ][ attr ] && Object.prototype.hasOwnProperty.call( obj2[ x ], attr ) ) { obj1[ x ][ attr ] = obj2[ x ][ attr ]; } } ); } ); return obj1; }; // copy obj2 values to obj1 $.tc_maybe_copy_object_values = function( obj1, obj2 ) { Object.keys( obj2 ).forEach( function( x ) { Object.keys( obj2[ x ] ).forEach( function( attr ) { if ( undefined !== obj2[ x ] && Object.prototype.hasOwnProperty.call( obj2[ x ], attr ) && undefined !== obj2[ x ][ attr ] && ( undefined === obj1[ x ] || undefined === obj1[ x ][ attr ] ) ) { if ( undefined === obj1[ x ] ) { obj1[ x ] = {}; } obj1[ x ][ attr ] = obj2[ x ][ attr ]; } } ); } ); return obj1; }; $.tc_pre_populate_store = function() { var obj = {}; obj[ 0 ] = {}; obj[ 1 ] = {}; obj[ 2 ] = {}; obj[ 3 ] = {}; obj[ 0 ].src = ''; obj[ 0 ].srcset = ''; obj[ 0 ].sizes = ''; obj[ 0 ].title = ''; obj[ 0 ].alt = ''; obj[ 0 ][ 'data-src' ] = ''; obj[ 0 ][ 'data-large_image' ] = ''; obj[ 0 ][ 'data-large_image_width' ] = ''; obj[ 0 ][ 'data-large_image_height' ] = ''; obj[ 1 ][ 'data-thumb' ] = ''; obj[ 2 ].src = ''; obj[ 3 ].href = ''; obj[ 3 ].title = ''; return obj; }; $.tc_populate_store = function( img, product_element ) { var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' ); var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ); var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ); var $product_img = img; var $product_link = img.closest( 'a' ); var obj = {}; obj[ 0 ] = {}; obj[ 1 ] = {}; obj[ 2 ] = {}; obj[ 3 ] = {}; obj[ 0 ].src = $product_img.attr( 'src' ); obj[ 0 ].srcset = $product_img.attr( 'srcset' ); obj[ 0 ].sizes = $product_img.attr( 'sizes' ); obj[ 0 ].title = $product_img.attr( 'title' ); obj[ 0 ].alt = $product_img.attr( 'alt' ); obj[ 0 ][ 'data-src' ] = $product_img.attr( 'data-src' ); obj[ 0 ][ 'data-large_image' ] = $product_img.attr( 'data-large_image' ); obj[ 0 ][ 'data-large_image_width' ] = $product_img.attr( 'data-large_image_width' ); obj[ 0 ][ 'data-large_image_height' ] = $product_img.attr( 'data-large_image_height' ); obj[ 1 ][ 'data-thumb' ] = $product_img_wrap.attr( 'data-thumb' ); obj[ 2 ].src = $gallery_img.attr( 'src' ); obj[ 3 ].href = $product_link.attr( 'href' ); obj[ 3 ].title = $product_link.attr( 'title' ); return obj; }; $.tc_maybe_copy_object_values_from_img = function( obj1, img, product_element ) { var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' ); var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ); var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ); var $product_img = img; var $product_link = img.closest( 'a' ); var attrs; var attr; var attrs_product_img = [ 'src', 'srcset', 'sizes', 'title', 'alt', 'data-src', 'data-large_image', 'data-large_image_width', 'data-large_image_height', 'large-image' ]; var attrs_product_img_wrap = [ 'data-thumb' ]; var attrs_gallery_img = [ 'src' ]; var attrs_product_link = [ 'href', 'title' ]; var all = [ $product_img, $product_img_wrap, $gallery_img, $product_link ]; var attrs_all = [ attrs_product_img, attrs_product_img_wrap, attrs_gallery_img, attrs_product_link ]; all.forEach( function( item, index ) { if ( undefined !== item && undefined !== item[ 0 ] ) { attrs = item[ 0 ].attributes; $.each( attrs, function() { if ( this.specified ) { attr = this.name; if ( $.inArray( attr, attrs_all[ index ] ) !== -1 && ( undefined === obj1[ index ] || ( undefined !== obj1[ index ] && undefined === obj1[ index ][ attr ] ) ) ) { if ( undefined === obj1[ index ] ) { obj1[ index ] = {}; } obj1[ index ][ attr ] = this.value; } } } ); } } ); return obj1; }; // Stores a default attribute for an element so it can be reset later $.fn.tc_set_attr = function( attr, value, id ) { if ( undefined === id ) { id = 0; } if ( undefined === $.tc_product_image[ id ] || ( undefined !== $.tc_product_image[ id ] && undefined === $.tc_product_image[ id ][ attr ] ) ) { if ( undefined === $.tc_product_image[ id ] ) { $.tc_product_image[ id ] = {}; } $.tc_product_image[ id ][ attr ] = ''; if ( this.attr( attr ) ) { $.tc_product_image[ id ][ attr ] = this.attr( attr ); } } if ( false === value ) { this.removeAttr( attr ); } else { this.attr( attr, value ); } }; // Reset a default attribute for an element so it can be reset later $.fn.tc_reset_attr = function( attr, id ) { if ( undefined === id ) { id = 0; } if ( undefined === $.tc_product_image[ id ] ) { return; } if ( undefined !== $.tc_product_image[ id ][ attr ] ) { this.attr( attr, $.tc_product_image[ id ][ attr ] ); } delete $.tc_product_image[ id ][ attr ]; }; $.fn.tc_update_attr = function( attr, id ) { if ( undefined === id ) { id = 0; } if ( undefined !== $.tc_product_image[ id ] ) { $.tc_product_image[ id ][ attr ] = this.attr( attr ); } }; $.fn.tc_image_update = function( dom, image ) { var element = $( dom ); var $form = this; var $image = $( image ); var epo_object = $form.data( 'epo_object' ); var image_info; var $product_img; var product_element = epo_object.main_product.closest( '#product-' + epo_object.product_id ); var $product_element = product_element; var $product_link; var use_image_info; if ( product_element.length <= 0 ) { $product_element = epo_object.main_product.closest( '.post-' + epo_object.product_id ); } if ( element.is( 'select' ) ) { element = element.children( 'option:selected' ); } image_info = element.data( 'image-variations' ); if ( TMEPOJS.tm_epo_global_product_image_selector !== '' ) { $product_img = $( TMEPOJS.tm_epo_global_product_image_selector ); } else { $product_img = $product_element.find( 'a.woocommerce-main-image img, img.woocommerce-main-image,a img' ).not( '.thumbnails img,.product_list_widget img,img.emoji,a.woocommerce-product-gallery__trigger img' ).first(); } $product_link = $product_img.closest( 'a' ); if ( $product_img.length > 1 ) { $product_img = $product_img.first(); } if ( element && image_info && $image.length > 0 ) { $image.removeAttr( 'data-o_src' ).removeAttr( 'data-o_title' ).removeAttr( 'data-o_alt' ).removeAttr( 'data-o_srcset' ).removeAttr( 'data-o_sizes' ).removeAttr( 'srcset' ).removeAttr( 'sizes' ); use_image_info = image_info.imagep; if ( ! image_info.imagep.image_link ) { use_image_info = image_info.image; } $image.attr( 'title', use_image_info.image_title ); $image.attr( 'alt', use_image_info.image_alt ); if ( use_image_info.image_srcset ) { $image.attr( 'srcset', use_image_info.image_srcset ); } if ( use_image_info.image_sizes ) { $image.attr( 'sizes', use_image_info.image_sizes ); } $product_img.tc_set_attr( 'title', use_image_info.image_title ); $product_img.tc_set_attr( 'alt', use_image_info.image_alt ); $product_img.tc_set_attr( 'data-large-image', use_image_info.image_link ); if ( $product_img.data.wc27_zoom_target ) { $product_img.data.wc27_zoom_target.tc_set_attr( 'data-thumb', use_image_info.image_link ); $product_element.find( '.flex-control-nav li:eq(0) img' ).tc_set_attr( 'src', use_image_info.image_link ); } $product_link.tc_set_attr( 'href', use_image_info.image_link ); $product_link.tc_set_attr( 'title', use_image_info.image_caption ); } else { $product_img.tc_reset_attr( 'title' ); $product_img.tc_reset_attr( 'alt' ); $product_img.tc_reset_attr( 'data-large-image' ); if ( $product_img.data.wc27_zoom_target ) { $product_img.data.wc27_zoom_target.tc_reset_attr( 'data-thumb' ); $product_element.find( '.flex-control-nav li:eq(0) img' ).tc_reset_attr( 'src' ); } $product_link.tc_reset_attr( 'href' ); $product_link.tc_reset_attr( 'title' ); } }; // variations checker $.fn.tm_find_matching_variations = function( product_variations, settings ) { var matching = []; var i; var variation; if ( product_variations ) { for ( i = 0; i < product_variations.length; i += 1 ) { variation = product_variations[ i ]; if ( $.fn.tm_variations_match( variation.attributes, settings ) ) { matching.push( variation ); } } } return matching; }; $.fn.tm_variations_match = function( attrs1, attrs2 ) { var match = true; var val1; var val2; Object.keys( attrs1 ).forEach( function( x ) { if ( Object.prototype.hasOwnProperty.call( attrs1, x ) ) { val1 = attrs1[ x ]; val2 = attrs2[ x ]; if ( val1 !== undefined && val2 !== undefined && val1.length !== 0 && val2.length !== 0 && val1 !== val2 ) { match = false; } } } ); return match; }; function get_element_from_field( element ) { var $element = $( element ); var data_uniqid; var the_epo_id; var _class; var epoContainer; if ( $element.length === 0 ) { return; } if ( $element.is( '.cpf-section' ) ) { return element.find( '.tm-epo-field' ); } data_uniqid = $element.attr( 'data-uniqid' ); epoContainer = $element.closest( '.tc-extra-product-options' ); the_epo_id = epoContainer.attr( 'data-epo-id' ); if ( ! epoContainer.is( '.reactivate' ) && tcAPI.getElementFromFieldCache && tcAPI.getElementFromFieldCache[ the_epo_id ] && tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] ) { return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; } _class = $element .attr( 'class' ) .split( ' ' ) .map( function( cls ) { if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) { return cls; } return null; } ) .filter( function( v ) { if ( v !== null && v !== undefined ) { return v; } return null; } ); if ( _class.length > 0 ) { _class = _class[ 0 ]; if ( _class === 'cpf-type-product' ) { if ( $element.is( '.cpf-type-product-mode-product' ) || $element.is( '.cpf-type-product-checkbox' ) || $element.is( '.cpf-type-product-thumbnailmultiple' ) ) { _class = 'cpf-type-checkbox'; } else if ( $element.is( '.cpf-type-product-dropdown' ) ) { _class = 'cpf-type-select'; } else { _class = 'cpf-type-radio'; } } switch ( _class ) { case 'cpf-type-radio': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-radio' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-checkbox': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-checkbox' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-select': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-select' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-selectmultiple': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-selectmultiple' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-textarea': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-textarea' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-textfield': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-textfield' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-color': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tm-color-picker' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-range': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-range' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-date': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-date' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-time': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.find( '.tm-epo-field.tmcp-time' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; case 'cpf-type-variations': tcAPI.getElementFromFieldCache[ the_epo_id ] = []; tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ] = $element.closest( '.cpf-section' ).find( '.tm-epo-field.tm-epo-variation-element' ); return tcAPI.getElementFromFieldCache[ the_epo_id ][ data_uniqid ]; } } } // tc-lightbox if ( ! $().tclightbox ) { $.fn.tclightbox = function() { var elements = this; if ( elements.length === 0 ) { return; } return elements.each( function() { var $this = $( this ); var _imgsrc; var _label; var _input; var tclightboxwrap; var _img_button; var preload_img; var addButtonEvent; if ( $this.is( '.tcinit' ) ) { return; } _imgsrc = $this.attr( 'src' ) || $this.attr( 'data-original' ); _label = $this.closest( 'label' ); _input = _label.closest( '.tmcp-field-wrap' ).find( ".tm-epo-field[id='" + _label.attr( 'for' ) + "']" ); _imgsrc = _input.attr( 'data-imagel' ) || _input.attr( 'data-imagep' ) || _input.attr( 'data-image' ) || _imgsrc; if ( ! _imgsrc ) { return; } $this.addClass( 'tcinit' ).before( $.epoAPI.template.html( tcAPI.templateEngine.tc_lightbox, {} ) ); tclightboxwrap = $this.prev(); $this.wrap( "
" ); $this.after( tclightboxwrap ); _img_button = tclightboxwrap.find( '.tc-lightbox-button' ); addButtonEvent = function() { _img_button.addClass( 'tcinit' ).on( 'click.tclightbox', function( buttonevent ) { var size; var _img; if ( $( '.tc-closing.tc-lightbox' ).length > 0 ) { return; } size = $.epoAPI.dom.size(); _img = $( '' ) .addClass( 'tc-lightbox-img' ) .attr( 'src', _imgsrc ) .css( 'maxHeight', size.visibleHeight + 'px' ) .css( 'maxWidth', size.visibleWidth + 'px' ); $.tcFloatBox( { fps: 1, ismodal: false, refresh: 'fixed', width: 'auto', height: 'auto', top: '0%', left: '0%', classname: 'flasho tc-lightbox', animateIn: 'tc-lightbox-zoomin', animateOut: 'tc-lightbox-zoomout', data: $.epoAPI.template.html( tcAPI.templateEngine.tc_lightbox_zoom, { img: _img[ 0 ].outerHTML } ), zIndex: 102001, cancelClass: '.tc-lightbox-img, .tc-lightbox-button-close', unique: true } ); buttonevent.preventDefault(); } ); }; if ( TMEPOJS.tm_epo_preload_lightbox_image === 'yes' ) { preload_img = new Image(); preload_img.src = _imgsrc; preload_img.onload = function() { addButtonEvent(); }; } else { addButtonEvent(); } } ); }; } // Start Section popup if ( ! $().tmsectionpoplink ) { $.fn.tmsectionpoplink = function() { var elements = this; if ( elements.length === 0 ) { return; } return elements.each( function() { var $this = $( this ); var id; var title; var section; var clicked; var _ovl; var cancelfunc; if ( $this.data( 'tmsectionpoplink' ) ) { return; } $this.data( 'tmsectionpoplink', true ); id = $this.attr( 'data-sectionid' ); title = TMEPOJS.i18n_addition_options; section = $this.closest( ".cpf-section[data-uniqid='" + id + "']" ); clicked = false; _ovl = $( '
' ).css( { zIndex: parseInt( $this.zIndex, 10 ) - 1, opacity: 0.8 } ); cancelfunc = function() { var pop = $( '#tm-section-pop-up' ); pop.parents().removeClass( 'noanimated' ); _ovl.unbind().remove(); pop.after( section ); pop.remove(); section.find( '.tm-section-link' ).show(); section.find( '.tm-section-pop' ).hide(); }; if ( $this.attr( 'data-title' ) ) { title = $this.attr( 'data-title' ); } $this.on( 'click.tmsectionpoplink', function( e ) { var pop; e.preventDefault(); clicked = false; _ovl.appendTo( 'body' ).on( 'click', cancelfunc ); section.before( $.epoAPI.template.html( tcAPI.templateEngine.tc_section_pop_link, { title: title, close: TMEPOJS.i18n_close } ) ); pop = $( '#tm-section-pop-up' ); pop.find( '.float-editbox' ).prepend( section ); section.find( '.tm-section-link' ).hide(); section.find( '.tm-section-pop' ).show(); pop.parents().addClass( 'noanimated' ); pop.find( '.floatbox-cancel' ).on( 'click', function() { if ( clicked ) { return; } clicked = true; cancelfunc(); } ); jWindow.trigger( 'tmlazy' ); jWindow.trigger( 'tmsectionpoplink' ); } ); } ); }; } // End Section popup function getVariationIdSelector( currentCart ) { var variationIdSelector = "input[name^='variation_id']"; if ( currentCart.find( 'input.variation_id' ).length > 0 ) { variationIdSelector = 'input.variation_id'; } else { variationIdSelector = 'input.product-variation-id'; } return variationIdSelector; } function getVariationIdElement( currentCart, not ) { var variationIdSelector = getVariationIdSelector( currentCart ); var variationIdElement = currentCart.find( variationIdSelector ); if ( currentCart.is( '.tc-epo-element-product-container-cart' ) ) { variationIdElement = currentCart.closest( '.tc-epo-element-product-li-container' ).find( variationIdSelector ); } else { variationIdElement = currentCart.find( variationIdSelector ); } if ( not ) { variationIdElement = variationIdElement.not( not ); } return variationIdElement; } function getCurrentVariation( currentCart ) { return currentCart.find( getVariationIdSelector( currentCart ) ).val() || 0; } function getQtyElement( currentCart ) { var qty = currentCart.find( tcAPI.qtySelector ).last(); if ( qty.length === 0 ) { qty = currentCart.find( tcAPI.associateQtySelector ).last(); } qty = $.epoAPI.applyFilter( 'tc_getQtyElement', qty, currentCart ); return qty; } function getCurrentQty( currentCart ) { return $.epoAPI.applyFilter( 'tc_getCurrentQty', $.epoAPI.math.toFloat( getQtyElement( currentCart ).val() ), currentCart ); } function add_variation_event( name, selector, func ) { lateVariationEvent[ lateVariationEvent.length ] = { name: name, selector: selector, func: func }; } function field_is_active( field, nochecks, single ) { var ret = true; var insideProductCheck = false; var productElement; field = $( field ); productElement = field.filter( '.tc-epo-field-product' ); if ( productElement.length && productElement.data( 'islogicinit' ) === undefined ) { insideProductCheck = true; } field.each( function( j, element ) { if ( ! ret && field.has( '.tc-epo-field-product' ).length ) { if ( insideProductCheck || productElement.is( '.tcdisabled' ) ) { field_check_active( element, nochecks, single ); } } else { ret = field_check_active( element, nochecks, single ) && ret; } } ); return ret; } function field_check_active( field, nochecks, single ) { var hideElement; var singleField; var ul; var isInsideProductElement; var productElementActive; var productElementSectionActive; var productElementQty; field = $( field ); if ( field.is( '.cpf-element' ) ) { hideElement = field; field = field.find( '.tmcp-field, .tmcp-fee-field' ); } else { hideElement = field.closest( '.cpf-element' ); } if ( single ) { ul = field.closest( '.tmcp-ul-wrap' ); } else { ul = hideElement; } if ( field.is( '.tc-epo-field-product' ) && field.data( 'islogicinit' ) === undefined ) { field.data( 'islogicinit', 1 ); } isInsideProductElement = ! field.is( '.tc-epo-field-product' ) && hideElement.closest( '.cpf-type-product' ); if ( isInsideProductElement.length ) { productElementQty = isInsideProductElement.find( tcAPI.associateQtySelector ); if ( productElementQty.length ) { if ( $.epoAPI.math.toFloat( productElementQty.val() ) > 0 ) { field.removeClass( 'ignore' ); productElementQty.removeClass( 'ignore' ); } else { field.addClass( 'ignore' ); productElementQty.addClass( 'ignore' ); } } productElementActive = isInsideProductElement.data( 'isactive' ); isInsideProductElement = isInsideProductElement.closest( '.cpf-section' ); productElementSectionActive = isInsideProductElement.data( 'isactive' ); } if ( productElementActive !== false && productElementSectionActive !== false && hideElement.data( 'isactive' ) !== false && hideElement.closest( '.cpf-section' ).data( 'isactive' ) !== false ) { singleField = field.first(); field.prop( 'disabled', false ); if ( field.data( 'tc-state' ) !== undefined ) { field.data( 'tc-state', false ); } if ( TMEPOJS.tm_epo_show_only_active_quantities !== 'yes' ) { if ( singleField.is( ':radio, .cpf-type-radio' ) || singleField.is( ':checkbox, .cpf-type-checkbox' ) ) { field.filter( ':checked' ).closest( '.tmcp-field-wrap' ).find( '.tm-qty' ).prop( 'disabled', false ); field.not( ':checked' ).closest( '.tmcp-field-wrap' ).find( '.tm-qty' ).prop( 'disabled', true ); } else if ( singleField.is( 'select, .cpf-type-select, .cpf-type-selectmultiple' ) ) { if ( singleField.val() ) { ul.find( '.tm-qty' ).prop( 'disabled', false ); } else { ul.find( '.tm-qty' ).prop( 'disabled', true ); } } else if ( singleField.val() ) { ul.find( '.tm-qty' ).prop( 'disabled', false ); } else { ul.find( '.tm-qty' ).prop( 'disabled', true ); } } else if ( ! nochecks ) { hideElement.find( '.tm-quantity' ).trigger( 'showhide.cpfcustom' ); } if ( ! singleField.is( '.cpf-element' ) ) { field.removeClass( 'tcdisabled' ).addClass( 'tcenabled' ); if ( field.is( '.tmcp-upload' ) ) { if ( field.next( '.tmcp-upload-hidden' ).length ) { field.next( '.tmcp-upload-hidden' ).removeClass( 'tcdisabled' ).addClass( 'tcenabled' ).prop( 'disabled', false ); } } } hideElement.removeClass( 'tc-container-disabled' ).addClass( 'tc-container-enabled' ); field.trigger( { type: 'tm-field-is-active', field: field, value: true } ); return true; } if ( ! field.is( '.cpf-element' ) ) { field.prop( 'disabled', true ).removeClass( 'tcenabled' ).addClass( 'tcdisabled' ); if ( field.data( 'tc-state' ) !== undefined ) { field.data( 'tc-state', true ); } hideElement.find( '.tm-qty' ).prop( 'disabled', true ); if ( field.is( '.tmcp-upload' ) ) { if ( field.next( '.tmcp-upload-hidden' ).length ) { field.next( '.tmcp-upload-hidden' ).removeClass( 'tcenabled' ).addClass( 'tcdisabled' ).prop( 'disabled', true ); } } } hideElement.removeClass( 'tc-container-enabled' ).addClass( 'tc-container-disabled' ); field.trigger( { type: 'tm-field-is-active', field: field, value: false } ); return false; } function tm_variation_check_match( element, val2, operator ) { var $element = $( element ); var epoId = $element.attr( 'data-epo_id' ); var productId = $element.attr( 'data-product_id' ); var variationsForm = $( ".variations_form[data-epo_id='" + epoId + "'][data-product_id='" + productId + "']" ); var val1; var variationIdSelector = "input[name^='variation_id']"; var $variationId; variationsForm = $.epoAPI.applyFilter( 'tm_variation_check_match_variationsForm', variationsForm, epoId, productId, $element ); if ( variationsForm.length === 0 ) { return false; } $variationId = variationsForm.find( variationIdSelector ); if ( $variationId.length === 0 ) { variationIdSelector = 'input.variation_id'; $variationId = variationsForm.find( variationIdSelector ); if ( $variationId.length === 0 ) { $variationId = variationsForm.closest( '.tc-epo-element-product-li-container' ).find( '.product-variation-id' ); } } if ( element !== null && val2 !== null && element !== undefined && val2 !== undefined && element !== false && val2 !== false ) { if ( val2 ) { val2 = parseInt( val2, 10 ); } else { val2 = -1; } } val1 = parseInt( $variationId.val(), 10 ); if ( ! Number.isFinite( val1 ) ) { val1 = ''; } if ( ! Number.isFinite( val2 ) ) { val2 = ''; } switch ( operator ) { case 'is': return val1 !== '' && val1 === val2; case 'isnot': return val1 !== '' && val1 !== val2; case 'isempty': return val1 === '' || val1 === 0; case 'isnotempty': return val1 !== '' && val1 !== 0; case 'startswith': return val1.toString().startsWith( val2 ); case 'endswith': return val1.toString().endsWith( val2 ); case 'greaterthan': return parseFloat( val1 ) > parseFloat( val2 ); case 'lessthan': return parseFloat( val1 ) < parseFloat( val2 ); case 'greaterthanequal': return parseFloat( val1 ) >= parseFloat( val2 ); case 'lessthanequal': return parseFloat( val1 ) <= parseFloat( val2 ); } return false; } function tm_check_match( val1, val2, operator ) { if ( val1 !== null && val2 !== null ) { val1 = encodeURIComponent( val1 ); if ( $.qtranxj_split ) { //backwards compatible val2 = encodeURIComponent( $.qtranxj_split( decodeURIComponent( val2 ) )[ TMEPOQTRANSLATEXJS.language ] ); } else { //backwards compatible val2 = encodeURIComponent( decodeURIComponent( val2 ) ); } if ( val1 ) { val1 = val1.toLowerCase(); } else { val1 = ''; } if ( val2 ) { val2 = val2.toLowerCase(); } else { val2 = ''; } } else { return false; } val1 = val1.toString(); val2 = val2.toString(); switch ( operator ) { case 'is': return val1 !== null && val1 === val2; case 'isnot': return val1 !== null && val1 !== val2; case 'isempty': return ! ( val1 !== 'undefined' && val1 !== undefined && val1 !== '' ); case 'isnotempty': return val1 !== 'undefined' && val1 !== undefined && val1 !== ''; case 'startswith': return val1.startsWith( val2 ); case 'endswith': return val1.endsWith( val2 ); case 'greaterthan': return parseFloat( val1 ) > parseFloat( val2 ); case 'lessthan': return parseFloat( val1 ) < parseFloat( val2 ); case 'greaterthanequal': return parseFloat( val1 ) >= parseFloat( val2 ); case 'lessthanequal': return parseFloat( val1 ) <= parseFloat( val2 ); } return false; } function tm_check_section_match( elements, operator ) { var all_checked = true; var val; var all_elements = elements.find( '.cpf-element' ); var radio_checked; var checkbox_checked; var noSplit = false; if ( elements.is( '.tc-hidden' ) ) { if ( operator === 'isnotempty' ) { return false; } else if ( operator === 'isempty' ) { return true; } } $( all_elements ).each( function( j, element ) { var _class; var elementToCheck = ''; element = $( element ); if ( element.is( '.cpf-type-product' ) ) { elementToCheck = ':not(.tc-extra-product-options-inline .tm-epo-field)'; } if ( field_is_active( element ) ) { _class = element .attr( 'class' ) .split( ' ' ) .map( function( cls ) { if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) { return cls; } return null; } ) .filter( function( v ) { if ( v !== null && v !== undefined ) { return v; } return null; } ); if ( _class.length > 0 ) { _class = _class[ 0 ]; if ( _class === 'cpf-type-product' ) { noSplit = true; if ( element.is( '.cpf-type-product-mode-product' ) || element.is( '.cpf-type-product-checkbox' ) || element.is( '.cpf-type-product-thumbnailmultiple' ) ) { _class = 'cpf-type-checkbox'; } else if ( element.is( '.cpf-type-product-dropdown' ) ) { _class = 'cpf-type-select'; } else { _class = 'cpf-type-radio'; } } switch ( _class ) { case 'cpf-type-radio': radio_checked = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck ); if ( operator === 'isnotempty' ) { all_checked = all_checked && radio_checked.length > 0; if ( radio_checked.length > 0 ) { val = radio_checked.length; } } else if ( operator === 'isempty' ) { all_checked = all_checked && radio_checked.length === 0; } break; case 'cpf-type-checkbox': checkbox_checked = element.find( 'input.tm-epo-field.tmcp-checkbox:checked' + elementToCheck ); if ( operator === 'isnotempty' ) { all_checked = all_checked && checkbox_checked.length > 0; if ( checkbox_checked.length > 0 ) { val = checkbox_checked.length; } } else if ( operator === 'isempty' ) { all_checked = all_checked && checkbox_checked.length === 0; } break; case 'cpf-type-select': val = element.find( 'select.tm-epo-field.tmcp-select' + elementToCheck ).val(); if ( val && ! noSplit ) { val = val.slice( 0, val.lastIndexOf( '_' ) ); } break; case 'cpf-type-selectmultiple': val = element.find( 'select.tm-epo-field.tmcp-selectmultiple' + elementToCheck ).val(); if ( val && ! noSplit ) { val.forEach( function( option, i ) { val[ i ] = option.slice( 0, option.lastIndexOf( '_' ) ); } ); } break; default: val = element.find( '.tm-epo-field' + elementToCheck ).val(); break; } if ( Array.isArray( val ) ) { all_checked = all_checked && val.some( function( item ) { return tm_check_match( item, '', operator ); } ); } else { all_checked = all_checked && tm_check_match( val, '', operator ); } } else { all_checked = all_checked && false; } } } ); return all_checked; } function tm_check_field_match( f ) { var element = $( f.element ); var operator = f.operator; var value = f.value; var val; var radio_checked; var checkbox_checked; var ret; var _class; var noSplit = false; var elementToCheck = ''; if ( ! element.length ) { return false; } if ( element.is( '.cpf-section' ) ) { return tm_check_section_match( element, operator ); } if ( element.is( '.cpf-type-product' ) ) { elementToCheck = ':not(.tc-extra-product-options-inline .tm-epo-field)'; } _class = element .attr( 'class' ) .split( ' ' ) .map( function( cls ) { if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) { return cls; } return null; } ) .filter( function( v ) { if ( v !== null && v !== undefined ) { return v; } return null; } ); if ( _class.length > 0 ) { _class = _class[ 0 ]; if ( _class === 'cpf-type-product' ) { noSplit = true; if ( element.is( '.cpf-type-product-mode-product' ) || element.is( '.cpf-type-product-checkbox' ) || element.is( '.cpf-type-product-thumbnailmultiple' ) ) { _class = 'cpf-type-checkbox'; } else if ( element.is( '.cpf-type-product-dropdown' ) ) { _class = 'cpf-type-select'; } else { _class = 'cpf-type-radio'; } } switch ( _class ) { case 'cpf-type-radio': radio_checked = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck ); if ( operator === 'is' || operator === 'isnot' ) { if ( radio_checked.length === 0 ) { return false; } val = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck ).val(); if ( val && ! noSplit ) { val = val.slice( 0, val.lastIndexOf( '_' ) ); } } if ( operator === 'isnotempty' ) { return radio_checked.length > 0; } if ( operator === 'isempty' ) { return radio_checked.length === 0; } break; case 'cpf-type-checkbox': checkbox_checked = element.find( 'input.tm-epo-field.tmcp-checkbox:checked' + elementToCheck ); if ( operator === 'is' || operator === 'isnot' ) { if ( checkbox_checked.length === 0 ) { return false; } ret = false; checkbox_checked.each( function( i, el ) { val = $( el ).val(); if ( val && ! noSplit ) { val = val.slice( 0, val.lastIndexOf( '_' ) ); } if ( tm_check_match( val, value, operator ) ) { ret = true; } else if ( operator === 'isnot' ) { ret = false; return false; } } ); return ret; } if ( operator === 'isnotempty' ) { return checkbox_checked.length > 0; } if ( operator === 'isempty' ) { return checkbox_checked.length === 0; } break; case 'cpf-type-select': val = element.find( 'select.tm-epo-field.tmcp-select' + elementToCheck ).val(); if ( val && ! noSplit ) { val = val.slice( 0, val.lastIndexOf( '_' ) ); } break; case 'cpf-type-selectmultiple': val = element.find( 'select.tm-epo-field.tmcp-selectmultiple' + elementToCheck ).val(); if ( val && ! noSplit ) { val.forEach( function( option, i ) { val[ i ] = option.slice( 0, option.lastIndexOf( '_' ) ); } ); } break; case 'cpf-type-variations': return tm_variation_check_match( element, value, operator ); default: val = element.find( '.tm-epo-field' + elementToCheck ).val(); break; } if ( Array.isArray( val ) ) { return val.some( function( item ) { return tm_check_match( item, value, operator ); } ); } return tm_check_match( val, value, operator ); } return false; } function tm_check_rules( o, theevent ) { o.each( function() { var $this = $( this ); var matches = parseInt( $this.data( 'matches' ), 10 ); var toggle = $this.data( 'toggle' ); var what = $this.data( 'what' ); var fields = $this.data( 'fields' ); var checked = 0; var show = false; switch ( toggle ) { case 'show': show = false; break; case 'hide': show = true; break; } $.each( fields, function( i, field ) { var fia = true; if ( theevent === 'cpflogic' ) { fia = field_is_active( $( field.element ) ); } if ( fia && tm_check_field_match( field ) ) { checked = parseInt( checked, 10 ) + 1; } } ); if ( what === 'all' ) { if ( matches === checked ) { show = ! show; } } else if ( checked > 0 ) { show = ! show; } if ( show ) { if ( theevent === 'cpflogic' && ! $this.data( 'did_initial_activation' ) ) { latecpflogicactions.push( function() { var enabledEpos = $this.find( '.tm-epo-field.tcenabled' ); enabledEpos.each( function( i, el ) { el = $( el ); if ( ! el.data( 'initial_activation' ) && ! $this.closest( '.cpf-section' ).is( '.tc-hidden' ) && field_is_active( el ) ) { el.trigger( 'tc_element_epo_rules' ); el.data( 'initial_activation', 1 ); } } ); if ( ( $this.is( '.cpf-element' ) && enabledEpos.length ) || $this.is( '.cpf-section' ) ) { $this.data( 'did_initial_activation', 1 ); } } ); } $this.removeClass( 'tc-hidden' ); } else { $this.addClass( 'tc-hidden' ); } $this.data( 'isactive', show ); $this.trigger( 'tc-logic' ); } ); } function run_cpfdependson( obj ) { var iscpfdependson; var last_activate_field = []; if ( ! $( obj ).length ) { obj = 'body'; } obj = $( obj ); iscpfdependson = obj.find( '.iscpfdependson' ); iscpfdependson.each( function( i, elements ) { $( elements ).each( function( j, el ) { tm_check_rules( $( el ) ); } ); } ); iscpfdependson.each( function( i, elements ) { $( elements ).each( function( j, el ) { tm_check_rules( $( el ), 'cpflogic' ); } ); } ); iscpfdependson.each( function( i, elements ) { $( elements ).each( function( j, o ) { o = $( o ); if ( o.is( '.cpf-section' ) ) { o = o.find( '.cpf-element' ); } o.each( function( theindex, theelement ) { field_is_active( $( theelement ).find( '.tm-epo-field' ) ); } ); } ); } ); latecpflogicactions.forEach( function( func ) { func(); } ); latecpflogicactions = []; if ( $().selectric ) { $( '.tm-extra-product-options select' ).selectric( 'refresh' ); } setTimeout( function() { $( '.tm-owl-slider' ).each( function() { $( this ).trigger( 'refresh.owl.carousel' ); } ); }, 200 ); obj.find( '.tm-product-image:checked,select.tm-product-image' ).each( function() { var t = $( this ); if ( field_is_active( t ) && t.val() !== '' ) { last_activate_field.push( t ); } } ); if ( last_activate_field.length ) { last_activate_field[ last_activate_field.length - 1 ].trigger( 'tm_trigger_product_image' ); } jWindow.trigger( 'cpflogicrun' ); jWindow.trigger( 'tmlazy' ); jWindow.trigger( 'cpflogicdone' ); } // Start Conditional logic if ( ! $().cpfdependson ) { $.fn.cpfdependson = function( fields, toggle, what, refresh ) { var elements = this; var matches = 0; if ( elements.length === 0 || typeof fields !== 'object' ) { return; } if ( ! toggle ) { toggle = 'show'; } if ( ! what ) { what = 'all'; } $.each( fields, function( i, field ) { var get_element; var $this_epo_container; if ( typeof fields !== 'object' ) { return true; } get_element = get_element_from_field( field.element ); if ( get_element && get_element.length > 0 ) { get_element.each( function( ii, element ) { var $element = $( element ); var $pid1; var $epo_id1; var _events = 'change.cpflogic'; // this essentially only works for the plugin so we use // cache and not recalcualte each time if ( ! $this_epo_container || $this_epo_container.closest( '.tc-extra-product-options-inline' ).length ) { $pid1 = '.tm-product-id-' + $element.closest( '.tc-extra-product-options' ).attr( 'data-product-id' ); $epo_id1 = "[data-epo-id='" + $element.closest( '.tc-extra-product-options' ).attr( 'data-epo-id' ) + "']"; $this_epo_container = $( '.tc-extra-product-options' + $pid1 + $epo_id1 ); } if ( element && $element.length > 0 && ( ! $element.data( 'tmhaslogicevents' ) || refresh ) ) { if ( $element.is( '.tm-epo-variation-element' ) ) { // associated product event prefixes are added later add_variation_event( 'found_variation.tmlogic', false, function() { run_cpfdependson( $this_epo_container ); jWindow.trigger( 'tm-do-epo-update' ); } ); add_variation_event( 'hide_variation.tmlogic', false, function() { run_cpfdependson( $this_epo_container ); jWindow.trigger( 'tm-do-epo-update' ); } ); } else { if ( $element.is( ':text' ) || $element.is( 'textarea' ) ) { _events = 'change.cpflogic input.cpflogic'; } $element.off( _events ).on( _events, function() { run_cpfdependson( $this_epo_container ); } ); } $element.data( 'tmhaslogicevents', 1 ); } } ); matches = parseInt( matches, 10 ) + 1; } } ); elements.each( function() { var $this = $( this ); var show = false; $this.data( 'matches', matches ).data( 'toggle', toggle ).data( 'what', what ).data( 'fields', fields ); switch ( toggle ) { case 'show': show = false; break; case 'hide': show = true; break; } if ( show ) { $this.removeClass( 'tc-hidden' ); } else { $this.addClass( 'tc-hidden' ); } $this.data( 'isactive', show ); } ); elements.addClass( 'iscpfdependson is-epo-depend' ).data( 'iscpfdependson', 1 ); return elements; }; $.fn.run_cpfdependson = function() { run_cpfdependson(); }; } $.tcepo = { formSubmitEvents: {}, oneOptionIsSelected: {}, initialActivation: {}, // Holds the active precentage of total current price type fields lateFieldsPrices: {}, errorObject: {} }; function validate_logic( l ) { return typeof l === 'object' && 'toggle' in l && 'what' in l && 'rules' in l && l.rules.length > 0; } // The following loops are required for the logic to work on composite products that have custom variations function cpf_section_logic( obj ) { var root_element = $( obj ); var all_sections = root_element.find( '.cpf-section' ); var search_obj; var cpf_section; var sect; var logic; var haslogic; var fields; var section; var element; var operator; var value; var obj_section; var obj_element; var closestProductElement; if ( root_element.is( '.cpf-section' ) ) { search_obj = false; } else { search_obj = all_sections; } root_element.each( function( j, obj_el ) { if ( $( obj_el ).is( '.cpf-section' ) ) { cpf_section = $( obj_el ); } else { cpf_section = $( obj_el ).find( '.cpf-section' ); } cpf_section.filter( '[data-haslogic="1"]' ).each( function( index, el ) { sect = $( el ); logic = sect.data( 'logic' ); haslogic = parseInt( sect.data( 'haslogic' ), 10 ); fields = []; closestProductElement = sect.parent().closest( '.cpf-type-product' ); if ( haslogic === 1 && validate_logic( logic ) ) { $.each( logic.rules, function( i, rule ) { if ( rule ) { section = rule.section; element = rule.element; operator = rule.operator; value = rule.value; if ( search_obj ) { if ( closestProductElement.length ) { obj_section = closestProductElement.find( '.cpf-section' ).filter( "[data-uniqid='" + section + "']" ); if ( element !== section ) { obj_element = obj_section.find( '.cpf-element' ).eq( element ); } else { obj_element = obj_section; } } else { obj_section = search_obj.filter( "[data-uniqid='" + section + "']" ); if ( element !== section ) { obj_element = obj_section.find( '.cpf-element:not(.cpf-element .cpf-element)' ).eq( element ); } else { obj_element = obj_section; } } } else if ( element !== section ) { obj_element = root_element.find( '.cpf-element' ).eq( element ); } else { obj_element = obj_section; } fields.push( { element: obj_element, operator: operator, value: value } ); } } ); if ( ! sect.data( 'iscpfdependson' ) ) { sect.data( 'cpfdependson-fields', fields ); sect.cpfdependson( fields, logic.toggle, logic.what ); } else { sect.cpfdependson( sect.data( 'cpfdependson-fields' ), logic.toggle, logic.what, true ); } } } ); } ); } function cpf_element_logic( obj ) { var root_element = $( obj ); var all_sections = root_element.find( '.cpf-section' ).not( '.cpf-type-product .cpf-section' ); var search_obj; var current_element; var logic; var haslogic; var section; var element; var operator; var value; var obj_section; var obj_element; var closestProductElement; if ( root_element.is( '.cpf-section' ) ) { search_obj = false; } else { search_obj = all_sections; } root_element.find( '.cpf-element[data-haslogic="1"]' ).each( function( index, el ) { var fields = []; current_element = $( el ); logic = current_element.data( 'logic' ); haslogic = parseInt( current_element.data( 'haslogic' ), 10 ); closestProductElement = current_element.parent().closest( '.cpf-type-product' ); if ( haslogic === 1 && validate_logic( logic ) ) { $.each( logic.rules, function( i, rule ) { if ( rule ) { section = rule.section; element = rule.element; operator = rule.operator; value = rule.value; if ( search_obj ) { if ( closestProductElement.length ) { obj_section = closestProductElement.find( '.cpf-section' ).filter( "[data-uniqid='" + section + "']" ); if ( element !== section ) { obj_element = obj_section.find( '.cpf-element' ).eq( element ); } else { obj_element = obj_section; } } else { obj_section = search_obj.filter( "[data-uniqid='" + section + "']" ); if ( element !== section ) { obj_element = obj_section.find( '.cpf-element:not(.cpf-element .cpf-element)' ).eq( element ); } else { obj_element = obj_section; } } } else if ( element !== section ) { obj_element = root_element.find( '.cpf-element' ).eq( element ); } else { obj_element = obj_section; } fields.push( { element: obj_element, operator: operator, value: value } ); } } ); if ( ! current_element.data( 'iscpfdependson' ) ) { current_element.data( 'cpfdependson-fields', fields ); current_element.cpfdependson( fields, logic.toggle, logic.what ); } else { current_element.cpfdependson( current_element.data( 'cpfdependson-fields' ), logic.toggle, logic.what, true ); } } } ); } // End Conditional logic // Return price value without tax function tm_set_price_without_tax( value, _cart, force ) { var taxable; var tax_rate; var tax_display_mode; var prices_include_tax; if ( _cart ) { taxable = _cart.attr( 'data-taxable' ); tax_rate = _cart.attr( 'data-tax-rate' ); tax_display_mode = _cart.attr( 'data-tax-display-mode' ); prices_include_tax = _cart.attr( 'data-prices-include-tax' ); if ( force || ( taxable && tax_display_mode === 'incl' && prices_include_tax !== '1' ) ) { value = parseFloat( value ) / ( 1 + ( tax_rate / 100 ) ); } } return value; } // Return price with tax function tm_set_price_with_tax( value, _cart, force ) { var taxable; var tax_rate; var tax_display_mode; var prices_include_tax; if ( _cart ) { taxable = _cart.attr( 'data-taxable' ); tax_rate = _cart.attr( 'data-tax-rate' ); tax_display_mode = _cart.attr( 'data-tax-display-mode' ); prices_include_tax = _cart.attr( 'data-prices-include-tax' ); if ( force || ( taxable && tax_display_mode !== 'incl' && prices_include_tax === '1' ) ) { value = parseFloat( value ) * ( 1 + ( tax_rate / 100 ) ); } } return value; } // Return price function tm_set_backend_price( value, _cart, variation ) { var taxable; var tax_display_mode; var prices_include_tax; if ( _cart ) { taxable = _cart.attr( 'data-taxable' ); tax_display_mode = _cart.attr( 'data-tax-display-mode' ); prices_include_tax = _cart.attr( 'data-prices-include-tax' ); if ( taxable ) { if ( variation && variation.tc_tax_rate && String( variation.tc_tax_rate ) === '0' ) { return value; } if ( prices_include_tax === '1' ) { if ( tax_display_mode !== 'incl' ) { value = tm_set_price_with_tax( value, _cart ); } } else if ( prices_include_tax !== '1' && tax_display_mode === 'incl' ) { value = tm_set_price_without_tax( value, _cart ); } } } return value; } // Return a formatted currency value function tm_set_price_totals( value, _cart, notax, taxstring, element ) { var inc_tax_string = ''; var sign = ''; var val; if ( ! notax ) { value = tm_set_tax_price( value, _cart, element, undefined, true ); } val = Math.abs( value ); if ( _cart && taxstring ) { inc_tax_string = _cart.attr( 'data-tax-string' ); } if ( inc_tax_string === undefined ) { inc_tax_string = ''; } if ( value < 0 ) { sign = TMEPOJS.minus_sign + ' '; } return tm_set_price_( val, sign, inc_tax_string ); } function replace_suffixes( value, rawValue, tc_totals_ob, totalsHolder ) { if ( totalsHolder.attr( 'data-tax-display-mode' ) === 'excl' ) { tc_totals_ob[ value ] = tc_totals_ob[ value ].replace( /{price_excluding_tax}/g, tm_set_price_totals( tc_totals_ob[ rawValue ], totalsHolder, true, false ) ); tc_totals_ob[ value ] = tc_totals_ob[ value ].replace( /{price_including_tax}/g, tm_set_price_totals( tm_set_price_with_tax( tc_totals_ob[ rawValue ], totalsHolder, true ), totalsHolder, true, false ) ); } else { tc_totals_ob[ value ] = tc_totals_ob[ value ].replace( /{price_including_tax}/g, tm_set_price_totals( tc_totals_ob[ rawValue ], totalsHolder, true, false ) ); tc_totals_ob[ value ] = tc_totals_ob[ value ].replace( /{price_excluding_tax}/g, tm_set_price_totals( tm_set_price_without_tax( tc_totals_ob[ rawValue ], totalsHolder, true ), totalsHolder, true, false ) ); } return tc_totals_ob; } function tm_force_update_price( obj, price, formated_price, original_price, original_formated_price ) { tm_update_price( obj, price, formated_price, original_price, original_formated_price, true ); } function tm_update_price( obj, price, formated_price, original_price, original_formated_price, force ) { var $obj = $( obj ); var w; var $ba_amount; var priceobj; var f; var pw; if ( $obj.length === 0 ) { return; } w = $obj.closest( '.tmcp-field-wrap' ); pw = $obj.closest( '.tc-price-wrap' ); f = w.find( '.tm-epo-field' ); if ( ! force && f.attr( 'data-no-price-change' ) === '1' && f.data( 'price-changed' ) ) { return; } price = $.epoAPI.applyFilter( 'tc_adjust_update_price_price', price ); //number formated_price = $.epoAPI.applyFilter( 'tc_adjust_update_price_formated_price', formated_price, price ); //formatted original_price = $.epoAPI.applyFilter( 'tc_adjust_update_price_original_price', original_price ); //number original_formated_price = $.epoAPI.applyFilter( 'tc_adjust_update_price_original_formated_price', original_formated_price, original_price ); //formatted if ( ! Number.isFinite( parseFloat( original_price ) ) ) { original_price = 0; } if ( ! Number.isFinite( parseFloat( price ) ) ) { price = 0; } $ba_amount = w.find( '.before-amount,.after-amount' ); priceobj = { price: formated_price, original_price: original_formated_price }; if ( ( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && $.tmempty( price ) === false ) || TMEPOJS.tm_epo_auto_hide_price_if_zero !== 'yes' ) { if ( ( $.tmempty( price ) === true && f.attr( 'data-no-price' ) === '1' ) || ( ! force && f.length > 0 && ( f.attr( 'data-no-price' ) === '1' || ( f.attr( 'data-type' ) === 'variable' && ! f.data( 'price' ) ) || ( f.is( '.tmcp-select' ) && ! f.children( 'option:selected' ).data( 'price' ) ) ) ) ) { pw.addClass( 'tm-hidden' ); $obj.addClass( 'tm-hidden' ); $obj.empty(); $ba_amount.addClass( 'tm-hidden' ); } else { if ( original_price && original_price !== undefined && parseFloat( original_price ) !== parseFloat( price ) ) { $obj.html( $.epoAPI.template.html( tcAPI.templateEngine.sale_price, { price: priceobj } ) ); } else { $obj.html( $.epoAPI.template.html( tcAPI.templateEngine.price, { price: priceobj } ) ); } pw.removeClass( 'tm-hidden' ); $obj.removeClass( 'tm-hidden' ); $ba_amount.removeClass( 'tm-hidden' ); } } else { pw.addClass( 'tm-hidden' ); $obj.addClass( 'tm-hidden' ); $obj.empty(); $ba_amount.addClass( 'tm-hidden' ); } } function get_variation_current_settings( form, epoObject ) { var current_settings = {}; if ( epoObject.thisForm ) { form = epoObject.thisForm; } form.find( '.variations select, .tc-epo-variable-product-selector' ).each( function() { var attribute_name; var value; // Get attribute name from data-attribute_name, or from input name // if it doesn't exist if ( typeof $( this ).data( 'attribute_name' ) !== 'undefined' ) { attribute_name = $( this ).data( 'attribute_name' ); } else { attribute_name = $( this ).attr( 'name' ); } // Encode entities value = $( this ).val(); // Add to settings array current_settings[ attribute_name ] = value; } ); return current_settings; } function do_tm_custom_variations_update( form, all_variations, epoObject ) { var check_if_all_are_not_set = []; var formSettings = get_variation_current_settings( form, epoObject ); var redo_check = true; var variationId = form.find( getVariationIdSelector( form ) ).val(); variationId = ( variationId !== '0' && variationId !== '' ) || form.find( '.cpf-type-variations' ).find( '.tm-epo-variation-element:checked' ).length > 0 || form.find( '.cpf-type-variations' ).find( '.tm-epo-variation-element option[value!=""]:selected' ); if ( ! variationId ) { return; } form.find( '.cpf-type-variations' ).each( function( i, el ) { var t = $( el ).find( '.tm-epo-variation-element' ); var id; var v; var exists = false; check_if_all_are_not_set[ i ] = true; if ( t.is( 'select' ) ) { id = $.epoAPI.dom.id( t.attr( 'data-tm-for-variation' ) ); v = t.val(); if ( v ) { check_if_all_are_not_set[ i ] = false; } t.children( 'option' ).each( function( x, o ) { exists = false; form.find( "[data-attribute_name='attribute_" + id + "']" ) .children( 'option' ) .each( function() { if ( $( this ).attr( 'value' ) === $( o ).attr( 'value' ) ) { exists = true; return false; } } ); if ( ! exists ) { $( o ).prop( 'disabled', true ).hide(); } else { $( o ).prop( 'disabled', false ).show(); } } ); } else { t.each( function( x, oe ) { var o = $( oe ); var li = o.closest( 'li' ); var input = li.find( '.tm-epo-variation-element' ); var this_settings = $.extend( true, {}, formSettings ); var matching_variations; var variation; var is_in_stock; id = o.attr( 'data-tm-for-variation' ); v = o.val(); if ( o.is( ':checked' ) ) { check_if_all_are_not_set[ i ] = false; } this_settings[ 'attribute_' + id ] = v; matching_variations = $.fn.tm_find_matching_variations( all_variations, this_settings ); variation = matching_variations.shift(); is_in_stock = variation && 'is_in_stock' in variation && variation.is_in_stock; if ( ! is_in_stock ) { if ( ! input.is( ':checked' ) && ! is_in_stock ) { li.addClass( 'pointereventsoff' ); } else { li.removeClass( 'pointereventsoff' ); } o.attr( 'disabled', 'disabled' ).addClass( 'tm-disabled' ); input.attr( 'disabled', 'disabled' ); input.attr( 'data-tm-disabled', 'disabled' ); li.addClass( 'tm-attribute-disabled' ).fadeTo( 'fast', 0.5 ); } else { o.prop( 'disabled', false ).removeClass( 'tm-disabled' ); li.removeClass( 'pointereventsoff tm-attribute-disabled' ).fadeTo( 'fast', 1, function() { $( this ).css( 'opacity', '' ); } ); input.prop( 'disabled', false ); input.removeAttr( 'data-tm-disabled' ); } } ); } } ); if ( check_if_all_are_not_set ) { check_if_all_are_not_set.shift(); $.each( check_if_all_are_not_set, function( i, el ) { if ( el === false ) { redo_check = false; return false; } } ); if ( redo_check ) { form.find( '.cpf-type-variations' ) .first() .each( function( i, el ) { var t; var li; var input; t = $( el ).find( '.tm-epo-variation-element' ); if ( ! t.is( 'select' ) ) { t.each( function( x, o ) { o = $( o ); li = o.closest( 'li' ); input = li.find( '.tm-epo-variation-element' ); o.prop( 'disabled', false ).removeClass( 'tm-disabled' ); li.removeClass( 'tm-attribute-disabled' ).stop().css( 'opacity', '' ); input.prop( 'disabled', false ); input.removeAttr( 'data-tm-disabled' ); } ); } } ); } } } function tm_custom_variations_update( form, epoObject ) { var data; var all_variations = form.data( 'product_variations' ); var product_id = parseInt( form.data( 'product_id' ), 10 ); var globalVariationObject = form.data( 'globalVariationObject' ) || false; if ( ! product_id ) { product_id = form.data( 'tc_product_id' ); } if ( ! product_id && form.is( tcAPI.compositeSelector ) ) { data = form.find( '.component_options' ).data( 'options_data' ); product_id = data[ 0 ].option_id; if ( ! all_variations ) { all_variations = form.find( '.details.component_data' ).data( 'product_variations' ); } } if ( ! epoObject.is_associated ) { // Fallback to window property if not set - backwards compat if ( ! all_variations && window.product_variations && window.product_variations.product_id ) { all_variations = window.product_variations.product_id; } if ( ! all_variations && window.product_variations ) { all_variations = window.product_variations; } if ( ! all_variations && window[ 'product_variations_' + product_id ] ) { all_variations = window[ 'product_variations_' + product_id ]; } } if ( ! all_variations ) { if ( ! globalVariationObject ) { data = { action: 'woocommerce_tm_get_variations_array', post_id: product_id }; $.post( TMEPOJS.ajax_url, data, function( response ) { globalVariationObject = response; form.data( 'globalVariationObject', response ); do_tm_custom_variations_update( form, globalVariationObject.variations, epoObject ); }, 'json' ); } else { do_tm_custom_variations_update( form, globalVariationObject.variations, epoObject ); } return; } // may need 2.4 check for woocommerce_ajax_variation_threshold do_tm_custom_variations_update( form, all_variations, epoObject ); } function tm_fix_stock( cart, html ) { var custom_variations; var section; if ( html === undefined ) { return false; } cart = $( cart ); custom_variations = cart.find( '.tm-epo-variation-element' ).first(); section = custom_variations.closest( '.tm-epo-variation-section' ); if ( custom_variations.length ) { section.find( '.tm-stock' ).remove(); section.append( '
' + html + '
' ); return true; } cart.find( '.tm-stock' ).remove(); cart.find( '.variations' ).after( '
' + html + '
' ); return true; } function tm_fix_stock_tmepo( $this, form ) { var stock; if ( TMEPOJS.tm_epo_global_move_out_of_stock === 'no' ) { return; } stock = $this.find( '.woocommerce-variation-availability' ).last(); if ( ! stock.length ) { stock = $this.find( '.stock' ).last(); } if ( stock.length ) { form.find( '.tm-stock' ).remove(); if ( tm_fix_stock( form, stock.prop( 'outerHTML' ) ) ) { stock.remove(); } } else { form.find( '.tm-stock' ).remove(); } } function get_main_input_id( main_product, product, id ) { var selector = ''; var inputid; if ( id ) { selector = selector + "[value='" + id + "']"; } if ( ! product ) { product = main_product; } inputid = product.find( tcAPI.addToCartSelector + selector ); if ( inputid.length === 0 ) { inputid = product.find( tcAPI.tcAddToCartSelector + selector ); } return inputid.last(); } function get_main_form( main_product, product, selector, id ) { if ( ! selector ) { selector = 'form'; } return get_main_input_id( main_product, product, id ).closest( selector ); } function get_main_cart( main_product, product, selector, id ) { return get_main_form( main_product, product, selector, id ); } function tm_get_native_prices_block( obj ) { var selector = $.epoAPI.applyFilter( 'tcGetNativePricesBlockSelector', '.single_variation .price', obj ); return $( obj ).find( selector ).not( '.tc-price' ); } // URL replacement setup function tm_set_url_fields() { jDocument.on( 'click.cpfurl change.cpfurl tmredirect', '.tc-url-container .tmcp-radio, .tc-url-container .tmcp-radio+label', function( e ) { var data_url = $( this ).attr( 'data-url' ); if ( data_url ) { if ( window.location !== data_url ) { e.preventDefault(); window.location = data_url; } } } ); jDocument.on( 'change.cpfurl tmredirect', '.tc-url-container .tmcp-select', function( e ) { var data_url = $( this ).children( 'option:selected' ).attr( 'data-url' ); if ( data_url ) { if ( window.location !== data_url ) { e.preventDefault(); window.location = data_url; } } } ); } function tm_floating_totals( this_epo_totals_container, is_quickview, main_cart ) { $.tcFloatingTotalsBox( this_epo_totals_container, is_quickview, main_cart ); } function tm_show_hide_add_to_cart_button( main_product, epoObject, one_option_is_selected, currentEpoObject ) { var button; var qty; var has_epo; var this_epo_container; var epos; var allElementsAreSelected; var showHide = true; if ( typeof epoObject === 'object' ) { has_epo = epoObject.has_epo; this_epo_container = epoObject.this_epo_container; has_epo = has_epo && ( this_epo_container.find( '.tmcp-fee-field' ).length || this_epo_container.find( '.tmcp-field' ).not( '.cpf-type-variations .tmcp-field' ).length ); } else { has_epo = epoObject; } if ( has_epo && ( TMEPOJS.tm_epo_hide_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_all_add_cart_button === 'yes' || TMEPOJS.tm_epo_hide_required_add_cart_button === 'yes' ) ) { button = main_product.find( tcAPI.addToCartButtonSelector ).first(); qty = main_product.find( tcAPI.qtySelector ).first(); // Hide cart button until an elements is chosen if ( TMEPOJS.tm_epo_hide_add_cart_button === 'yes' ) { showHide = one_option_is_selected; if ( one_option_is_selected ) { button.removeClass( 'tc-hide-add-to-cart-button' ); qty.removeClass( 'tc-hide-add-to-cart-button' ); } else { button.addClass( 'tc-hide-add-to-cart-button' ); qty.addClass( 'tc-hide-add-to-cart-button' ); } } // Hide cart button until all elements are chosen if ( TMEPOJS.tm_epo_hide_required_add_cart_button === 'yes' ) { epos = currentEpoObject.this_epo_container.find( '.cpf-element' ).not( '.cpf-type-variations' ).filter( '.tc-container-enabled.tc-is-required' ); allElementsAreSelected = epos.toArray().every( function( element ) { var elementToCheck = ''; var _class; var noSplit = false; var radio_checked; var checkbox_checked; var val; element = $( element ); if ( element.is( '.cpf-type-product' ) ) { elementToCheck = ':not(.tc-extra-product-options-inline .tm-epo-field)'; } _class = element .attr( 'class' ) .split( ' ' ) .map( function( cls ) { if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) { return cls; } return null; } ) .filter( function( v ) { if ( v !== null && v !== undefined ) { return v; } return null; } ); if ( _class.length > 0 ) { _class = _class[ 0 ]; if ( _class === 'cpf-type-product' ) { noSplit = true; if ( element.is( '.cpf-type-product-mode-product' ) || element.is( '.cpf-type-product-checkbox' ) || element.is( '.cpf-type-product-thumbnailmultiple' ) ) { _class = 'cpf-type-checkbox'; } else if ( element.is( '.cpf-type-product-dropdown' ) ) { _class = 'cpf-type-select'; } else { _class = 'cpf-type-radio'; } } switch ( _class ) { case 'cpf-type-radio': radio_checked = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck ); return radio_checked.length > 0; case 'cpf-type-checkbox': checkbox_checked = element.find( 'input.tm-epo-field.tmcp-checkbox:checked' + elementToCheck ); return checkbox_checked.length > 0; case 'cpf-type-select': val = element.find( 'select.tm-epo-field.tmcp-select' + elementToCheck ).val(); if ( val && ! noSplit ) { val = val.slice( 0, val.lastIndexOf( '_' ) ); } break; case 'cpf-type-selectmultiple': val = element.find( 'select.tm-epo-field.tmcp-selectmultiple' + elementToCheck ).val(); if ( val && ! noSplit ) { val.forEach( function( option, i ) { val[ i ] = option.slice( 0, option.lastIndexOf( '_' ) ); } ); } break; default: val = element.find( '.tm-epo-field' + elementToCheck ).val(); break; } if ( Array.isArray( val ) ) { return val.some( function( item ) { return item !== ''; } ); } return val !== ''; } return false; } ); showHide = allElementsAreSelected; } // Hide cart button until all elements are chosen if ( TMEPOJS.tm_epo_hide_all_add_cart_button === 'yes' ) { epos = currentEpoObject.this_epo_container.find( '.cpf-element' ).not( '.cpf-type-variations' ).filter( '.tc-container-enabled' ); allElementsAreSelected = epos.toArray().every( function( element ) { var elementToCheck = ''; var _class; var noSplit = false; var radio_checked; var checkbox_checked; var val; element = $( element ); if ( element.is( '.cpf-type-product' ) ) { elementToCheck = ':not(.tc-extra-product-options-inline .tm-epo-field)'; } _class = element .attr( 'class' ) .split( ' ' ) .map( function( cls ) { if ( cls.indexOf( 'cpf-type-', 0 ) !== -1 ) { return cls; } return null; } ) .filter( function( v ) { if ( v !== null && v !== undefined ) { return v; } return null; } ); if ( _class.length > 0 ) { _class = _class[ 0 ]; if ( _class === 'cpf-type-product' ) { noSplit = true; if ( element.is( '.cpf-type-product-mode-product' ) || element.is( '.cpf-type-product-checkbox' ) || element.is( '.cpf-type-product-thumbnailmultiple' ) ) { _class = 'cpf-type-checkbox'; } else if ( element.is( '.cpf-type-product-dropdown' ) ) { _class = 'cpf-type-select'; } else { _class = 'cpf-type-radio'; } } switch ( _class ) { case 'cpf-type-radio': radio_checked = element.find( 'input.tm-epo-field.tmcp-radio:checked' + elementToCheck ); return radio_checked.length > 0; case 'cpf-type-checkbox': checkbox_checked = element.find( 'input.tm-epo-field.tmcp-checkbox:checked' + elementToCheck ); return checkbox_checked.length > 0; case 'cpf-type-select': val = element.find( 'select.tm-epo-field.tmcp-select' + elementToCheck ).val(); if ( val && ! noSplit ) { val = val.slice( 0, val.lastIndexOf( '_' ) ); } break; case 'cpf-type-selectmultiple': val = element.find( 'select.tm-epo-field.tmcp-selectmultiple' + elementToCheck ).val(); if ( val && ! noSplit ) { val.forEach( function( option, i ) { val[ i ] = option.slice( 0, option.lastIndexOf( '_' ) ); } ); } break; default: val = element.find( '.tm-epo-field' + elementToCheck ).val(); break; } if ( Array.isArray( val ) ) { return val.some( function( item ) { return item !== ''; } ); } return val !== ''; } return false; } ); showHide = allElementsAreSelected; } if ( showHide ) { button.removeClass( 'tc-hide-add-to-cart-button' ); qty.removeClass( 'tc-hide-add-to-cart-button' ); } else { button.addClass( 'tc-hide-add-to-cart-button' ); qty.addClass( 'tc-hide-add-to-cart-button' ); } } } function goto_error_item( item, epoEventId ) { var el = $.tcepo.errorObject[ epoEventId ] || item; var elsection; var elsectionlink; var cpfElement; var pos; if ( el ) { if ( TMEPOJS.tm_epo_disable_error_scroll !== 'yes' ) { elsection = el.closest( '.cpf-section' ); elsectionlink = elsection.find( '.tm-section-link' ); cpfElement = el.closest( '.cpf-element' ); if ( elsection.find( '.tm-toggle' ).length ) { elsection.find( '.tm-toggle' ).trigger( 'openwrap.tmtoggle' ); } if ( window.tc_validation_offset === undefined ) { window.tc_validation_offset = -100; } if ( elsection.is( '.section_popup' ) ) { errorContainer.tcScrollTo( elsectionlink, 300, window.tc_validation_offset ); elsectionlink.trigger( 'click.tmsectionpoplink' ); } else if ( elsection.is( '.tm-owl-slider-section' ) ) { pos = el.closest( '.owl-item' ).index(); elsection.find( '.tcowl-carousel' ).trigger( 'to.owl.carousel', [ pos, 100 ] ); setTimeout( function() { elsection.find( '.tcowl-carousel' ).trigger( 'refresh.owl.carousel' ); if ( cpfElement.length > 0 ) { errorContainer.tcScrollTo( cpfElement, 300, window.tc_validation_offset ); } }, 200 ); } else if ( cpfElement.length > 0 ) { errorContainer.tcScrollTo( cpfElement, 300, window.tc_validation_offset ); } } if ( ! item ) { $.tcepo.errorObject[ epoEventId ] = false; } } } function tm_limit_c_selection( field, prevent ) { var allowed = parseInt( field.attr( 'data-limit' ), 10 ); var checked = false; var val; var t; var q; if ( allowed > 0 ) { checked = 0; field .closest( '.tm-extra-product-options-checkbox' ) .find( "input.tm-epo-field[type='checkbox']:checked" ) .each( function() { t = $( this ); q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' ); if ( q.length > 0 ) { val = parseInt( q.val(), 10 ); if ( val <= 0 ) { val = 1; } checked = parseInt( checked, 10 ) + val; } else { checked = parseInt( checked, 10 ) + 1; } } ); if ( checked > allowed ) { if ( prevent ) { field.prop( 'checked', '' ).trigger( 'change' ); } return false; } } return true; } function tm_exact_c_selection( field, prevent ) { var allowed = parseInt( field.attr( 'data-exactlimit' ), 10 ); var checked = false; var val; var t; var q; if ( allowed > 0 ) { checked = 0; field .closest( '.tm-extra-product-options-checkbox' ) .find( "input.tm-epo-field[type='checkbox']:checked" ) .each( function() { t = $( this ); q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' ); if ( q.length > 0 ) { val = parseInt( q.val(), 10 ); if ( val <= 0 ) { val = 1; } checked = parseInt( checked, 10 ) + val; } else { checked = parseInt( checked, 10 ) + 1; } } ); if ( checked > allowed ) { if ( prevent ) { field.prop( 'checked', '' ).trigger( 'change' ); } return false; } } return true; } function tm_limit_cont( fields, main_product, epoEventId ) { var checkall = true; var first_error_obj = false; var limit; var eln; var checked; var t; var val; var q; var ew; var em; var message; var field; fields.each( function() { field = $( this ); limit = field.find( "[type='checkbox'][data-limit]" ); if ( limit.length && field_is_active( limit ) ) { eln = parseInt( limit.attr( 'data-limit' ), 10 ); checked = 0; field.find( "input.tm-epo-field[type='checkbox']:checked" ).each( function() { t = $( this ); q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' ); if ( q.length > 0 ) { val = parseInt( q.val(), 10 ); if ( val <= 0 ) { val = 1; } checked = parseInt( checked, 10 ) + val; } else { checked = parseInt( checked, 10 ) + 1; } } ); ew = field.closest( '.cpf-element' ); em = ew.find( 'div.tm-error-min' ); if ( eln < checked ) { checkall = false; first_error_obj = field; if ( eln === 1 ) { message = TMEPOJS.tm_epo_global_validator_messages.epolimitsingle.replace( '{0}', eln ); } else { message = TMEPOJS.tm_epo_global_validator_messages.epolimit.replace( '{0}', eln ); } if ( em.length ) { em.remove(); } if ( TMEPOJS.tm_epo_global_error_label_placement === 'before' ) { field.closest( '.tc-element-container' ).before( '
' + message + '
' ); } else { field.closest( '.tc-element-container' ).after( '
' + message + '
' ); } main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled loading fpd-disabled' ).prop( 'disabled', false ); } else { em.remove(); } } } ); if ( first_error_obj ) { $.tcepo.errorObject[ epoEventId ] = first_error_obj; } return checkall; } function tm_check_limit_cont( limit_cont, main_product, epoEventId ) { $.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = { trigger: function() { return tm_limit_cont( limit_cont, main_product, epoEventId ); }, on_true: function() { return true; }, on_false: function() { goto_error_item( $( limit_cont ).find( '.tm-epo-field' ).first(), epoEventId ); return true; } }; } function tm_exactlimit_cont( fields, main_product, epoEventId ) { var checkall = true; var first_error_obj = false; var exactlimit; var eln; var checked; var t; var val; var q; var ew; var em; var message; var field; fields.each( function() { field = $( this ); exactlimit = field.find( "[type='checkbox'][data-exactlimit]" ); if ( exactlimit.length && field_is_active( exactlimit ) ) { eln = parseInt( exactlimit.attr( 'data-exactlimit' ), 10 ); checked = 0; field.find( "input.tm-epo-field[type='checkbox']:checked" ).each( function() { t = $( this ); q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' ); if ( q.length > 0 ) { val = parseInt( q.val(), 10 ); if ( val <= 0 ) { val = 1; } checked = parseInt( checked, 10 ) + val; } else { checked = parseInt( checked, 10 ) + 1; } } ); ew = field.closest( '.cpf-element' ); em = ew.find( 'div.tm-error-min' ); if ( eln !== checked ) { checkall = false; first_error_obj = field; if ( eln === 1 ) { message = TMEPOJS.tm_epo_global_validator_messages.epoexactsingle.replace( '{0}', eln ); } else { message = TMEPOJS.tm_epo_global_validator_messages.epoexact.replace( '{0}', eln ); } if ( em.length ) { em.remove(); } if ( TMEPOJS.tm_epo_global_error_label_placement === 'before' ) { field.closest( '.tc-element-container' ).before( '
' + message + '
' ); } else { field.closest( '.tc-element-container' ).after( '
' + message + '
' ); } main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled loading fpd-disabled' ).prop( 'disabled', false ); } else { em.remove(); } } } ); if ( first_error_obj ) { $.tcepo.errorObject[ epoEventId ] = first_error_obj; } return checkall; } function tm_check_exactlimit_cont( exactlimit_cont, main_product, epoEventId ) { $.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = { trigger: function() { return tm_exactlimit_cont( exactlimit_cont, main_product, epoEventId ); }, on_true: function() { return true; }, on_false: function() { goto_error_item( $( exactlimit_cont ).find( '.tm-epo-field' ).first(), epoEventId ); return true; } }; } function tm_minimumlimit_cont( fields, epoEventId ) { var checkall = true; var first_error_obj = false; var eln; var checked; var t; var val; var q; var ew; var em; var message; var field; fields.each( function() { var minimumlimit; field = $( this ); minimumlimit = field.find( "[type='checkbox'][data-minimumlimit]" ); if ( minimumlimit.length && field_is_active( minimumlimit ) ) { eln = parseInt( minimumlimit.attr( 'data-minimumlimit' ), 10 ); checked = 0; field.find( "input.tm-epo-field[type='checkbox']:checked" ).each( function() { t = $( this ); q = t.closest( 'li.tmcp-field-wrap' ).find( 'input.tm-qty' ); if ( q.length > 0 ) { val = parseInt( q.val(), 10 ); if ( val <= 0 ) { val = 1; } checked = parseInt( checked, 10 ) + val; } else { checked = parseInt( checked, 10 ) + 1; } } ); ew = field.closest( '.cpf-element' ); em = ew.find( 'div.tm-error-min' ); if ( eln > checked ) { checkall = false; first_error_obj = field; if ( eln === 1 ) { message = TMEPOJS.tm_epo_global_validator_messages.epominsingle.replace( '{0}', eln ); } else { message = TMEPOJS.tm_epo_global_validator_messages.epomin.replace( '{0}', eln ); } if ( em.length ) { em.remove(); } if ( TMEPOJS.tm_epo_global_error_label_placement === 'before' ) { field.closest( '.tc-element-container' ).before( '
' + message + '
' ); } else { field.closest( '.tc-element-container' ).after( '
' + message + '
' ); } } else { em.remove(); } } } ); if ( first_error_obj ) { $.tcepo.errorObject[ epoEventId ] = first_error_obj; } return checkall; } function tm_check_minimumlimit_cont( minimumlimit_cont, epoEventId ) { $.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = { trigger: function() { return tm_minimumlimit_cont( minimumlimit_cont, epoEventId ); }, on_true: function() { return true; }, on_false: function() { goto_error_item( false, epoEventId ); return true; } }; } function cleanPrice( price ) { if ( price === null ) { return 0; } if ( typeof price === 'object' ) { price = price[ 0 ]; } if ( ! Number.isFinite( parseFloat( price ) ) ) { price = 0; } return price; } function tm_apply_dpd( price, totals, apply, force ) { price = cleanPrice( price ); if ( apply ) { price = $.epoAPI.applyFilter( 'tc_apply_dpd', price, totals, apply, force ); } return price; } function tm_calculate_product_regular_price( totals, allowfalse ) { var price = 0; if ( totals.length > 0 ) { price = totals.data( 'regular-price' ); } price = $.epoAPI.applyFilter( 'tc_calculate_product_regular_price', price, totals ); if ( allowfalse && price === false ) { return false; } price = parseFloat( price ); if ( ! Number.isFinite( price ) ) { price = 0; } return price; } function tm_calculate_product_price( totals, allowfalse ) { var price = 0; if ( totals.length > 0 ) { price = totals.data( 'price' ); } price = $.epoAPI.applyFilter( 'tc_calculate_product_price', price, totals ); if ( allowfalse && price === false ) { return false; } price = parseFloat( price ); if ( ! Number.isFinite( price ) ) { price = 0; } return price; } function calculateMathPrice( price, thisElement, epoObject, noevents, useOriginalPrice ) { var formula = price.toString(); var val = 0; var matches; var match; var elementWrap; var element; var reg; var elementPrice = 0; var pos; var type; var id; var thisVal; var thisValForced; var thisElementId = thisElement.closest( '.cpf-element' ).attr( 'data-uniqid' ); var thisElementWrap = thisElement.closest( '.tmcp-ul-wrap' ); var totalsHolder_tc_totals_ob = epoObject.this_epo_totals_container.data( 'totalsHolder_tc_totals_ob' ); var thisElementIndex = thisElementWrap.find( '.tmcp-field, .tmcp-fee-field' ).filter( ':checked' ).index( thisElement ); var thisElementIndexForced = thisElementWrap.find( '.tmcp-field, .tmcp-fee-field' ).index( thisElement ); var this_epo_container = epoObject.is_associated ? epoObject.this_epo_container : epoObject.this_epo_container.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector ); var constants = $.epoAPI.util.parseJSON( TMEPOJS.tm_epo_math ) || {}; if ( thisElementIndex === -1 && ! thisElement.is( '.tmcp-checkbox, .tmcp-radio' ) ) { thisElementIndex = 0; } if ( ! thisElement.is( '.tcdisabled' ) && ! noevents && ! thisElement.data( 'addedtcEpoBeforeOptionPriceCalculation' ) ) { jWindow.on( 'tcEpoBeforeOptionPriceCalculation.math' + thisElementId, function() { tm_element_epo_rules( epoObject, thisElement, undefined, undefined, undefined, true ); } ); jWindow.on( 'tcEpoAfterOptionPriceCalculation.math' + thisElementId, function() { thisElement.data( 'fetchOptionPrices', false ); thisElement.data( 'fetchOptionPrices-forced', false ); thisElement.data( 'fetchOptionPrices-fee', false ); thisElement.data( 'fetchOptionPrices-fee-forced', false ); thisElement.data( 'fetchOptionPrices-sub-fee', false ); thisElement.data( 'fetchOptionPrices-sub-fee-forced', false ); } ); thisElement.data( 'addedtcEpoBeforeOptionPriceCalculation', 1 ); } if ( thisElement.is( '.tmcp-field' ) ) { if ( thisElement.data( 'fetchOptionPrices' ) ) { thisVal = thisElement.data( 'fetchOptionPrices' ); thisValForced = thisElement.data( 'fetchOptionPrices-forced' ); } else { thisVal = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-field', 0, 0, [], true ); thisValForced = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-field', 0, 0, [], true, true ); thisElement.data( 'fetchOptionPrices', thisVal ); thisElement.data( 'fetchOptionPrices-forced', thisValForced ); } } else if ( thisElement.is( '.tmcp-fee-field' ) ) { if ( thisElement.data( 'fetchOptionPrices-fee' ) ) { thisVal = thisElement.data( 'fetchOptionPrices-fee' ); thisValForced = thisElement.data( 'fetchOptionPrices-fee-forced' ); } else { thisVal = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-fee-field', 0, 0, [], true ); thisValForced = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-fee-field', 0, 0, [], true, true ); thisElement.data( 'fetchOptionPrices-fee', thisVal ); thisElement.data( 'fetchOptionPrices-fee-forced', thisValForced ); } } else if ( thisElement.is( '.tmcp-sub-fee-field' ) ) { if ( thisElement.data( 'fetchOptionPrices-sub-fee' ) ) { thisVal = thisElement.data( 'fetchOptionPrices-sub-fee' ); thisValForced = thisElement.data( 'fetchOptionPrices-sub-fee-forced' ); } else { thisVal = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-sub-fee-field', 0, 0, [], true ); thisValForced = fetchOptionPrices( epoObject, thisElementWrap, '.tmcp-sub-fee-field', 0, 0, [], true, true ); thisElement.data( 'fetchOptionPrices-sub-fee', thisVal ); thisElement.data( 'fetchOptionPrices-sub-fee-forced', thisValForced ); } } Object.keys( constants ).forEach( function( key ) { var name; var value; if ( constants[ key ].name !== '' && constants[ key ].value !== '' ) { name = constants[ key ].name; value = constants[ key ].value; if ( constants[ key ].name.isNumeric() ) { formula = formula.replace( '{' + name + '}', value ); } else { name = new RegExp( '{' + name + '}', 'g' ); if ( value.startsWith( '{' ) ) { formula = formula.replace( name, value ); } else { formula = formula.replace( name, $.epoAPI.math.unformat( value.replace( ',', '.' ) ) ); } } } } ); if ( totalsHolder_tc_totals_ob !== undefined ) { // product quantity formula = formula.replace( /{quantity}/g, $.epoAPI.math.unformat( totalsHolder_tc_totals_ob.qty ) ); // original product price if ( useOriginalPrice && totalsHolder_tc_totals_ob.original_product_price !== undefined ) { formula = formula.replace( /{product_price}/g, $.epoAPI.math.unformat( totalsHolder_tc_totals_ob.original_product_price ) ); } else { formula = formula.replace( /{product_price}/g, $.epoAPI.math.unformat( totalsHolder_tc_totals_ob.product_price ) ); } } else { // product quantity formula = formula.replace( /{quantity}/g, 0 ); // original product price formula = formula.replace( /{product_price}/g, 0 ); } if ( thisValForced.floatingBoxData !== undefined && thisValForced.floatingBoxData[ thisElementIndexForced ] !== undefined ) { // the option/element value to float if ( thisValForced.floatingBoxData[ thisElementIndexForced ].input_type === 'number' ) { formula = formula .replace( /{this.value}/g, $.epoAPI.math.toFloat( $.epoAPI.math.unformat( thisValForced.floatingBoxData[ thisElementIndexForced ].valueText ) ) ); } else { formula = formula .replace( /{this.value}/g, $.epoAPI.math.toFloat( $.epoAPI.math.unformat( thisValForced.floatingBoxData[ thisElementIndexForced ].valueText, tcAPI.localDecimalSeparator ) ) ); } // the option/element raw value if ( thisValForced.floatingBoxData[ thisElementIndexForced ].input_type === 'number' ) { formula = formula .replace( /{this.rawvalue}/g, $.epoAPI.math.unformat( thisValForced.floatingBoxData[ thisElementIndexForced ].valueText ) ); } else { formula = formula .replace( /{this.rawvalue}/g, $.epoAPI.math.unformat( thisValForced.floatingBoxData[ thisElementIndexForced ].valueText, tcAPI.localDecimalSeparator ) ); } // the option/element raw value if ( thisValForced.floatingBoxData[ thisElementIndexForced ].input_type === 'number' ) { formula = formula .replace( /{this.text}/g, $.epoAPI.math.unformat( thisValForced.floatingBoxData[ thisElementIndexForced ].valueText ) ); } else { formula = formula .replace( /{this.text}/g, $.epoAPI.math.unformat( thisValForced.floatingBoxData[ thisElementIndexForced ].valueText, tcAPI.localDecimalSeparator ) ); } // the option/element value length formula = formula .replace( /{this.value.length}/g, thisValForced.floatingBoxData[ thisElementIndexForced ].valueText.length ); } else { formula = formula // the option/element value to float .replace( /{this.value}/g, 0 ) // the option/element raw value .replace( /{this.rawvalue}/g, '' ) // the option/element raw value .replace( /{this.text}/g, '' ) // the option/element value length .replace( /{this.value.length}/g, 0 ); } formula = formula // the number of options the user has selected .replace( /{this.count}/g, thisVal.floatingBoxData.length ) // the total option quantity of this element .replace( /{this.count.quantity}/g, thisVal.floatingBoxData .map( function( x ) { return x.quantity; } ) .reduce( function( acc, thisval ) { return $.epoAPI.math.toFloat( acc ) + $.epoAPI.math.toFloat( thisval ); }, 0 ) ) // the option quantity of this element .replace( /{this.quantity}/g, thisElement.data( 'tm-quantity' ) ); if ( formula.match( /\{(\s)*?field\.([^}]*)}/ ) ) { matches = formula.match( /\{(\s)*?field\.([^}]*)}/g ); matches.forEach( function( field ) { match = field.match( /\{(\s)*?field\.([^}]*)}/ ); if ( undefined !== match[ 2 ] && 'string' === typeof match[ 2 ] ) { pos = match[ 2 ].indexOf( '.', match[ 2 ].indexOf( '.' ) + 1 ); if ( pos !== -1 ) { id = match[ 2 ].substring( 0, pos ); type = match[ 2 ].substring( pos + 1 ); if ( $.inArray( type, [ 'price', 'value', 'value.length', 'rawvalue', 'text', 'text.length', 'quantity', 'count', 'count.quantity' ] ) !== -1 ) { elementWrap = this_epo_container.find( "[data-uniqid='" + $.epoAPI.util.escapeSelector( id ) + "']" ); if ( elementWrap.length ) { element = elementWrap.find( '.tmcp-field, .tmcp-fee-field' ); if ( ! thisElement.is( '.tcdisabled' ) && ! noevents && ! thisElement.data( 'addedfieldtcEpoBeforeOptionPriceCalculation' ) ) { jWindow.on( 'tcEpoBeforeOptionPriceCalculation.math' + thisElementId, function() { tm_element_epo_rules( epoObject, thisElement, undefined, undefined, undefined, true ); thisElement.trigger( 'tm-math-select-change-html-all' ); } ); thisElement.data( 'addedfieldtcEpoBeforeOptionPriceCalculation', 1 ); } element = element.first(); val = 0; if ( elementWrap.is( '.tc-container-enabled' ) ) { if ( element.is( '.tmcp-field' ) ) { val = fetchOptionPrices( epoObject, elementWrap, '.tmcp-field', 0, 0, [], true, undefined, undefined, true ); } else if ( element.is( '.tmcp-fee-field' ) ) { val = fetchOptionPrices( epoObject, elementWrap, '.tmcp-fee-field', 0, 0, [], true, undefined, undefined, true ); } switch ( type ) { // element price case 'price': val = val.total; break; // element value case 'value': case 'text': case 'rawvalue': if ( val.floatingBoxData ) { val = val.floatingBoxData .map( function( x ) { if ( x.input_type === 'number' ) { if ( type === 'text' || type === 'rawvalue' ) { return x.valueText; } return $.epoAPI.math.unformat( x.valueText ); } if ( type === 'text' || type === 'rawvalue' ) { return x.valueText; } return $.epoAPI.math.unformat( x.valueText, tcAPI.localInputDecimalSeparator ); } ) .reduce( function( acc, thisval ) { if ( type === 'text' || type === 'rawvalue' ) { return acc + thisval; } return $.epoAPI.math.toFloat( acc ) + $.epoAPI.math.toFloat( thisval ); }, ( type === 'text' || type === 'rawvalue' ) ? '' : 0 ); if ( type === 'text' || type === 'rawvalue' ) { if ( val === '' ) { val = "''"; } else if ( ! val.toString().isNumeric() ) { val = "'" + val + "'"; } } } break; // element value length case 'value.length': case 'text.length': if ( val.floatingBoxData ) { val = val.floatingBoxData .map( function( x ) { return x.valueText; } ) .reduce( function( acc, thisval ) { return $.epoAPI.math.toFloat( acc ) + thisval.length; }, 0 ); } break; // element quantity // the total option quantity of this element case 'quantity': case 'count.quantity': if ( val.floatingBoxData ) { val = val.floatingBoxData .map( function( x ) { return x.quantity; } ) .reduce( function( acc, thisval ) { return $.epoAPI.math.toFloat( acc ) + $.epoAPI.math.toFloat( thisval ); }, 0 ); } break; // number of element options the user has selected case 'count': if ( val.floatingBoxData ) { val = val.floatingBoxData.length; } break; } if ( type !== 'text' && type !== 'rawvalue' ) { val = $.epoAPI.math.toFloat( val ); if ( ! Number.isFinite( val ) ) { val = 0; } } } } else { val = 0; } reg = new RegExp( match[ 0 ] ); if ( type === 'text' || type === 'rawvalue' ) { formula = formula.replace( reg, val ); } else { formula = ! Number.isFinite( val ) ? formula.replace( reg, "'" + val + "'" ) : formula.replace( reg, val ); } } } } } ); } try { elementPrice = tcmexp.evaluate( formula ); } catch ( e ) { elementPrice = 0; } return elementPrice; } // Set field price rules function get_price_type( epoObject, obj ) { var element = $( obj ); var setter = element; var cart; var current_variation; var rules; var rulestype; var _rulestype; var pricetype; var variation_id_selector; var _tmcpulwrap; cart = epoObject.main_cart; variation_id_selector = "input[name^='variation_id']"; if ( cart.find( 'input.variation_id' ).length > 0 ) { variation_id_selector = 'input.variation_id'; } current_variation = cart.find( variation_id_selector ).val(); // Get current woocommerce variation if ( ! current_variation ) { current_variation = 0; } if ( element.is( 'select' ) ) { setter = element.find( 'option:selected' ); } rules = $.epoAPI.util.parseJSON( setter.attr( 'data-rules' ) ); rulestype = $.epoAPI.util.parseJSON( setter.attr( 'data-rulestype' ) ); pricetype = ''; if ( typeof rules === 'object' ) { if ( typeof rulestype === 'object' ) { if ( current_variation in rulestype ) { pricetype = rulestype[ current_variation ]; } else { _rulestype = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-rulestype' ) ); if ( typeof _rulestype === 'object' ) { if ( current_variation in _rulestype ) { pricetype = _rulestype[ current_variation ]; } else { pricetype = rulestype[ 0 ]; } } else { pricetype = rulestype[ 0 ]; } } } else { rulestype = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-ulestype' ) ); if ( typeof rulestype === 'object' ) { if ( current_variation in rulestype ) { pricetype = rulestype[ current_variation ]; } else { pricetype = rulestype[ 0 ]; } } } } else { _tmcpulwrap = element.closest( '.tmcp-ul-wrap' ); rules = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rules' ) ); if ( typeof rules === 'object' ) { if ( typeof rulestype === 'object' ) { if ( current_variation in rulestype ) { pricetype = rulestype[ current_variation ]; } else { _rulestype = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rulestype' ) ); if ( typeof _rulestype === 'object' ) { if ( current_variation in _rulestype ) { pricetype = _rulestype[ current_variation ]; } else { pricetype = rulestype[ 0 ]; } } else { pricetype = rulestype[ 0 ]; } } } else { rulestype = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rulestype' ) ); if ( typeof rulestype === 'object' ) { if ( current_variation in rulestype ) { pricetype = rulestype[ current_variation ]; } else { pricetype = rulestype[ 0 ]; } } } } } if ( typeof pricetype === 'object' ) { pricetype = pricetype[ 0 ]; } if ( element.is( '.tmcp-fee-field' ) ) { if ( $.inArray( pricetype, [ 'fee', 'stepfee', 'currentstepfee' ] ) !== -1 ) { pricetype = ''; } } return pricetype; } function wordLength( str ) { var regex = new RegExp( /[\p{L}\d!@#$%^&*()_+=\{[\}\]|\\"':;?/>.<,-]+/, 'gu' ); var m; var len = 0; while ( ( m = regex.exec( str ) ) !== null ) { // This is necessary to avoid infinite loops with zero-width matches if ( m.index === regex.lastIndex ) { regex.lastIndex++; } len = len + m.length; } return len; } // Set field price rules function tm_element_epo_rules( epoObject, obj, args, setter_override, noremove, manthnoevent ) { var element = $( obj ); var setterall = element; var cart; var current_variation; var bundleid; var epoTotalsContainer; var apply_dpd; var product_price; var product_original_price; var is_range_field = element.is( '.tmcp-range' ); var rules; var rulestype; var original_rules; var _rules; var _rulestype; var _original_rules; var pricetype; var price; var original_price; var raw_price; var raw_original_price; var formatted_price; var original_formatted_price; var textlength; var freechars; var min_value; var main_product = epoObject.main_product; var epoEventId = epoObject.epoEventId; var variation_id_selector; var _tmcpulwrap; var cart_total; var per_product_pricing = true; var addedPrice = 0; var originalAddedPrice = 0; var undiscounted_raw_price; var undiscounted_raw_original_price; var undiscounted_price; var undiscounted_original_price; var isFilled; if ( element.data( 'associated_price_set' ) ) { return; } if ( ! args ) { cart = epoObject.main_cart; if ( cart.data( 'per_product_pricing' ) !== undefined ) { per_product_pricing = cart.data( 'per_product_pricing' ); } variation_id_selector = "input[name^='variation_id']"; if ( cart.find( 'input.variation_id' ).length > 0 ) { variation_id_selector = 'input.variation_id'; } current_variation = cart.find( variation_id_selector ).val(); bundleid = $.epoAPI.applyFilter( 'tc_get_bundleid', cart.attr( 'data-product_id' ), cart, epoObject ); // Get current woocommerce variation if ( ! current_variation ) { current_variation = 0; } epoTotalsContainer = $.epoAPI.applyFilter( 'tc_get_totals_container', epoObject.this_epo_totals_container, element, main_product, bundleid ); product_price = tm_calculate_product_price( epoTotalsContainer ); product_original_price = tm_calculate_product_regular_price( epoTotalsContainer ); apply_dpd = epoTotalsContainer.data( 'fields-price-rules' ); } else { cart = args.cart; current_variation = args.current_variation; bundleid = args.bundleid; epoTotalsContainer = args.epoTotalsContainer; product_price = args.product_price; product_original_price = args.product_original_price; apply_dpd = args.apply_dpd; per_product_pricing = args.per_product_pricing; } product_price = $.epoAPI.applyFilter( 'tc_alter_product_price', product_price, element, cart, epoTotalsContainer, bundleid ); product_original_price = $.epoAPI.applyFilter( 'tc_alter_product_original_price', product_original_price, element, cart, epoTotalsContainer ); if ( product_price === false || ! per_product_pricing ) { return; } if ( element.is( 'select' ) ) { setterall = element.find( 'option:selected' ); } if ( setter_override ) { setterall = setter_override; } setterall.toArray().forEach( function( setter ) { setter = $( setter ); rules = $.epoAPI.util.parseJSON( setter.attr( 'data-rules' ) ); rulestype = $.epoAPI.util.parseJSON( setter.attr( 'data-rulestype' ) ); original_rules = $.epoAPI.util.parseJSON( setter.attr( 'data-original-rules' ) ); if ( original_rules === undefined ) { original_rules = rules; } pricetype = ''; if ( typeof rules === 'object' ) { if ( current_variation in rules ) { price = rules[ current_variation ]; original_price = original_rules[ current_variation ]; } else { _rules = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-rules' ) ); _original_rules = element.closest( '.tmcp-ul-wrap' ).data( 'original-rules' ); if ( typeof _rules === 'object' ) { if ( current_variation in _rules ) { price = _rules[ current_variation ]; } else { price = rules[ 0 ]; } } else { price = rules[ 0 ]; } if ( typeof _original_rules === 'object' ) { if ( current_variation in _original_rules ) { original_price = _original_rules[ current_variation ]; } else { original_price = original_rules[ 0 ]; } } else { original_price = original_rules[ 0 ]; } } if ( typeof rulestype === 'object' ) { if ( current_variation in rulestype ) { pricetype = rulestype[ current_variation ]; } else { _rulestype = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-rulestype' ) ); if ( typeof _rulestype === 'object' ) { if ( current_variation in _rulestype ) { pricetype = _rulestype[ current_variation ]; } else { pricetype = rulestype[ 0 ]; } } else { pricetype = rulestype[ 0 ]; } } } else { rulestype = $.epoAPI.util.parseJSON( element.closest( '.tmcp-ul-wrap' ).attr( 'data-ulestype' ) ); if ( typeof rulestype === 'object' ) { if ( current_variation in rulestype ) { pricetype = rulestype[ current_variation ]; } else { pricetype = rulestype[ 0 ]; } } } } else { _tmcpulwrap = element.closest( '.tmcp-ul-wrap' ); rules = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rules' ) ); original_rules = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-original-rules' ) ); if ( typeof rules === 'object' ) { if ( current_variation in rules ) { price = rules[ current_variation ]; } else { price = rules[ 0 ]; } if ( typeof original_rules === 'object' ) { if ( current_variation in original_rules ) { original_price = original_rules[ current_variation ]; } else { original_price = original_rules[ 0 ]; } } else { original_price = price; } if ( typeof rulestype === 'object' ) { if ( current_variation in rulestype ) { pricetype = rulestype[ current_variation ]; } else { _rulestype = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rulestype' ) ); if ( typeof _rulestype === 'object' ) { if ( current_variation in _rulestype ) { pricetype = _rulestype[ current_variation ]; } else { pricetype = rulestype[ 0 ]; } } else { pricetype = rulestype[ 0 ]; } } } else { rulestype = $.epoAPI.util.parseJSON( _tmcpulwrap.attr( 'data-rulestype' ) ); if ( typeof rulestype === 'object' ) { if ( current_variation in rulestype ) { pricetype = rulestype[ current_variation ]; } else { pricetype = rulestype[ 0 ]; } } } } } if ( typeof pricetype === 'object' ) { pricetype = pricetype[ 0 ]; } if ( element.is( '.tmcp-fee-field' ) ) { if ( $.inArray( pricetype, [ 'fee', 'stepfee', 'currentstepfee' ] ) !== -1 ) { pricetype = ''; } apply_dpd = 0; } if ( noremove === undefined ) { if ( element.is( 'select' ) ) { element.find( 'option' ).removeClass( 'tm-epo-late-field' ).removeData( 'tm-price-for-late islate' ); } else { setter.removeClass( 'tm-epo-late-field' ).removeData( 'tm-price-for-late islate' ); } } if ( pricetype !== 'math' ) { price = cleanPrice( price ); original_price = cleanPrice( original_price ); } undiscounted_raw_price = price; undiscounted_raw_original_price = original_price; switch ( pricetype ) { case '': undiscounted_price = price; price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ); // original_price No change break; case 'math': price = calculateMathPrice( price, element, epoObject, manthnoevent, $.epoAPI.applyFilter( 'tc_use_undiscounted_price', undefined, element, cart, epoTotalsContainer ) ); undiscounted_price = price; price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ); original_price = calculateMathPrice( original_price, element, epoObject, true, true ); // original_price No other change break; case 'percent_cart_total': cart_total = parseFloat( TMEPOJS.cart_total ); if ( ! Number.isFinite( cart_total ) ) { cart_total = 0; } undiscounted_price = ( price / 100 ) * cart_total; price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * cart_total; original_price = ( tm_apply_dpd( original_price, epoTotalsContainer, apply_dpd ) / 100 ) * cart_total; break; case 'percent': undiscounted_price = ( price / 100 ) * product_price; price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price; original_price = ( original_price / 100 ) * product_original_price; break; case 'percentcurrenttotal': $.tcepo.lateFieldsPrices[ epoEventId ].push( { setter: setter, price: price, original_price: original_price, bundleid: bundleid, pricetype: pricetype } ); setter.data( 'tm-price-for-late', price ).data( 'tm-original-price-for-late', original_price ).data( 'islate', 1 ).addClass( 'tm-epo-late-field' ); undiscounted_price = 0; price = 0; original_price = 0; break; case 'fixedcurrenttotal': price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ); $.tcepo.lateFieldsPrices[ epoEventId ].push( { setter: setter, price: price, original_price: original_price, bundleid: bundleid, pricetype: pricetype } ); setter.data( 'tm-price-for-late', price ).data( 'tm-original-price-for-late', original_price ).data( 'islate', 1 ).addClass( 'tm-epo-late-field' ); undiscounted_price = 0; price = 0; original_price = 0; break; case 'word': undiscounted_price = price * wordLength( setter.val() ); price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * wordLength( setter.val() ); original_price = original_price * wordLength( setter.val() ); break; case 'wordpercent': undiscounted_price = ( price / 100 ) * product_price * wordLength( setter.val() ); price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * wordLength( setter.val() ); original_price = ( original_price / 100 ) * product_original_price * wordLength( setter.val() ); break; case 'wordnon': freechars = parseInt( setter.attr( 'data-freechars' ), 10 ); if ( ! Number.isFinite( freechars ) ) { freechars = 0; } textlength = wordLength( setter.val() ) - freechars; if ( textlength < 0 ) { textlength = 0; } undiscounted_price = price * textlength; price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * textlength; original_price = original_price * textlength; break; case 'wordpercentnon': freechars = parseInt( setter.attr( 'data-freechars' ), 10 ); if ( ! Number.isFinite( freechars ) ) { freechars = 0; } textlength = wordLength( setter.val() ) - freechars; if ( textlength < 0 ) { textlength = 0; } undiscounted_price = ( price / 100 ) * product_price * textlength; price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * textlength; original_price = ( original_price / 100 ) * product_original_price * textlength; break; case 'char': undiscounted_price = price * setter.val().length; price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * setter.val().length; original_price = original_price * setter.val().length; break; case 'charpercent': undiscounted_price = ( price / 100 ) * product_price * setter.val().length; price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * setter.val().length; original_price = ( original_price / 100 ) * product_original_price * setter.val().length; break; case 'charnospaces': undiscounted_price = price * setter.val().replace( /\s/g, '' ).length; price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * setter.val().replace( /\s/g, '' ).length; original_price = original_price * setter.val().replace( /\s/g, '' ).length; break; case 'charnofirst': textlength = setter.val().length - 1; if ( textlength < 0 ) { textlength = 0; } undiscounted_price = price * textlength; price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * textlength; original_price = original_price * textlength; break; case 'charnon': freechars = parseInt( setter.attr( 'data-freechars' ), 10 ); if ( ! Number.isFinite( freechars ) ) { freechars = 0; } textlength = setter.val().length - freechars; if ( textlength < 0 ) { textlength = 0; } undiscounted_price = price * textlength; price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * textlength; original_price = original_price * textlength; break; case 'charpercentnon': freechars = parseInt( setter.attr( 'data-freechars' ), 10 ); if ( ! Number.isFinite( freechars ) ) { freechars = 0; } textlength = setter.val().length - freechars; if ( textlength < 0 ) { textlength = 0; } undiscounted_price = ( price / 100 ) * product_price * textlength; price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * textlength; original_price = ( original_price / 100 ) * product_original_price * textlength; break; case 'charnonnospaces': freechars = parseInt( setter.attr( 'data-freechars' ), 10 ); if ( ! Number.isFinite( freechars ) ) { freechars = 0; } textlength = setter.val().replace( /\s/g, '' ).length - freechars; if ( textlength < 0 ) { textlength = 0; } undiscounted_price = price * textlength; price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * textlength; original_price = original_price * textlength; break; case 'charpercentnonnospaces': freechars = parseInt( setter.attr( 'data-freechars' ), 10 ); if ( ! Number.isFinite( freechars ) ) { freechars = 0; } textlength = setter.val().replace( /\s/g, '' ).length - freechars; if ( textlength < 0 ) { textlength = 0; } undiscounted_price = ( price / 100 ) * product_price * textlength; price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * textlength; original_price = ( original_price / 100 ) * product_original_price * textlength; break; case 'charpercentnofirst': textlength = setter.val().length - 1; if ( textlength < 0 ) { textlength = 0; } undiscounted_price = ( price / 100 ) * product_price * textlength; price = ( tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) / 100 ) * product_price * textlength; original_price = ( original_price / 100 ) * product_original_price * textlength; break; case 'step': if ( is_range_field ) { undiscounted_price = price * setter.val(); price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * setter.val(); original_price = original_price * $.epoAPI.math.toFloat( setter.val() ); } else { undiscounted_price = price * $.epoAPI.math.toFloat( setter.val() ); price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * $.epoAPI.math.toFloat( setter.val() ); original_price = original_price * $.epoAPI.math.toFloat( setter.val() ); } break; case 'currentstep': if ( is_range_field ) { undiscounted_price = setter.val(); price = tm_apply_dpd( setter.val(), epoTotalsContainer, apply_dpd ); original_price = tm_apply_dpd( setter.val(), epoTotalsContainer, apply_dpd ); } else { undiscounted_price = $.epoAPI.math.toFloat( setter.val() ); price = tm_apply_dpd( $.epoAPI.math.toFloat( setter.val() ), epoTotalsContainer, apply_dpd ); original_price = tm_apply_dpd( $.epoAPI.math.toFloat( setter.val() ), epoTotalsContainer, apply_dpd ); } break; case 'intervalstep': if ( is_range_field ) { min_value = parseFloat( $( '.tm-range-picker[data-field-id="' + setter.attr( 'id' ) + '"]' ).attr( 'data-min' ) ); undiscounted_price = price * ( setter.val() - min_value ); price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * ( setter.val() - min_value ); original_price = original_price * ( setter.val() - min_value ); } break; case 'row': undiscounted_price = price * ( ( setter.val().match( /(\r\n|\n|\r)/gm ) || [] ).length + 1 ); price = tm_apply_dpd( price, epoTotalsContainer, apply_dpd ) * ( ( setter.val().match( /(\r\n|\n|\r)/gm ) || [] ).length + 1 ); original_price = original_price * ( ( setter.val().match( /(\r\n|\n|\r)/gm ) || [] ).length + 1 ); break; } raw_price = price; raw_original_price = original_price; undiscounted_original_price = original_price; undiscounted_raw_price = undiscounted_price; undiscounted_raw_original_price = undiscounted_original_price; if ( element.data( 'tm-quantity' ) ) { undiscounted_price = undiscounted_price * parseFloat( element.data( 'tm-quantity' ) ); undiscounted_original_price = undiscounted_original_price * parseFloat( element.data( 'tm-quantity' ) ); undiscounted_raw_price = undiscounted_raw_price * parseFloat( element.data( 'tm-quantity' ) ); undiscounted_raw_original_price = undiscounted_raw_original_price * parseFloat( element.data( 'tm-quantity' ) ); price = price * parseFloat( element.data( 'tm-quantity' ) ); original_price = original_price * parseFloat( element.data( 'tm-quantity' ) ); raw_price = raw_price * parseFloat( element.data( 'tm-quantity' ) ); raw_original_price = raw_original_price * parseFloat( element.data( 'tm-quantity' ) ); } addedPrice = addedPrice + parseFloat( price ); originalAddedPrice = originalAddedPrice + parseFloat( original_price ); formatted_price = tm_set_price( addedPrice, epoTotalsContainer, false, false, setter, pricetype ); original_formatted_price = tm_set_price( originalAddedPrice, epoTotalsContainer, false, false, setter, pricetype ); element.data( 'price_set', 1 ); setter.data( 'price_set', 1 ); setter.data( 'undiscounted_raw_price', undiscounted_raw_price ); setter.data( 'undiscounted_raw_original_price', undiscounted_raw_original_price ); setter.data( 'undiscounted_price', tm_set_tax_price( undiscounted_price, epoTotalsContainer, setter, pricetype ) ); setter.data( 'undiscounted_original_price', tm_set_tax_price( undiscounted_original_price, epoTotalsContainer, setter, pricetype ) ); setter.data( 'raw_price', raw_price ); setter.data( 'raw_original_price', raw_original_price ); setter.data( 'price', tm_set_tax_price( price, epoTotalsContainer, setter, pricetype ) ); setter.data( 'original_price', tm_set_tax_price( original_price, epoTotalsContainer, setter, pricetype ) ); if ( ! setter_override ) { if ( element.is( '.tc-epo-field-product' ) ) { isFilled = false; if ( element.is( 'select' ) ) { if ( element.val() !== '' ) { isFilled = true; } } else if ( ( element.is( ':checkbox' ) || element.is( ':radio' ) ) ) { if ( element.is( ':checked' ) ) { isFilled = true; } } else if ( element.val() !== '' ) { isFilled = true; } if ( ! isFilled ) { formatted_price = setter.data( 'price-html' ); original_formatted_price = ''; } } tm_update_price( setter.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), addedPrice, formatted_price, originalAddedPrice, original_formatted_price ); element.data( 'price-changed', 1 ); } } ); } function tm_epo_rules( epoObject, theCart ) { var all_carts; var variation_id_selector; var per_product_pricing = true; var current_variation; var bundleid; var epoContainer; var epoTotalsContainer; var apply_dpd; var rules; var original_rules; var price; var formatted_price; var original_price; var original_formatted_price; var product_price; var product_original_price; var all_fields; var active_fields; var args; var main_product = epoObject.main_product; var epoEventId = epoObject.epoEventId; var this_epo_container = epoObject.this_epo_container; var this_epo_totals_container = epoObject.this_epo_totals_container; if ( ! theCart ) { all_carts = main_product.find( '.cart' ); } else { all_carts = theCart; } if ( all_carts.length <= 0 ) { return; } $.tcepo.lateFieldsPrices[ epoEventId ] = []; all_carts.toArray().forEach( function( cart ) { cart = $( cart ); variation_id_selector = "input[name^='variation_id']"; if ( cart.find( 'input.variation_id' ).length > 0 ) { variation_id_selector = 'input.variation_id'; } if ( cart.data( 'per_product_pricing' ) !== undefined ) { per_product_pricing = cart.data( 'per_product_pricing' ); } current_variation = cart.find( variation_id_selector ).val(); bundleid = $.epoAPI.applyFilter( 'tc_get_bundleid', cart.attr( 'data-product_id' ), cart, epoObject ); // get current woocommerce variation if ( ! current_variation ) { current_variation = 0; } epoContainer = $.epoAPI.applyFilter( 'tc_get_epo_container', this_epo_container, cart, main_product, bundleid ); epoTotalsContainer = $.epoAPI.applyFilter( 'tc_get_totals_container', this_epo_totals_container, cart, main_product, bundleid ); // WooCommerce Dynamic Pricing & Discounts apply_dpd = epoTotalsContainer.data( 'fields-price-rules' ); // set initial prices for all fields if ( ! epoContainer.data( 'tm_rules_init_done' ) ) { if ( epoTotalsContainer.data( 'force-quantity' ) ) { cart.find( tcAPI.qtySelector ).val( epoTotalsContainer.data( 'force-quantity' ) ); } epoContainer.toArray().forEach( function( el ) { $( el ).closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' ).data( 'tm-quantity', $( el ).val() ); } ); epoContainer .find( '.tmcp-attributes, .tmcp-elements' ) .toArray() .forEach( function( element ) { element = $( element ); rules = $.epoAPI.util.parseJSON( element.attr( 'data-rules' ) ); original_rules = $.epoAPI.util.parseJSON( element.attr( 'data-original-rules' ) ); // if rule doesn't exit then init an empty rule if ( typeof rules !== 'object' ) { rules = { 0: '0' }; } if ( typeof original_rules !== 'object' ) { original_rules = { 0: '0' }; } if ( typeof rules === 'object' ) { // we skip price validation test so that every field has at least a price of 0 price = tm_apply_dpd( rules[ $.epoAPI.math.toFloat( current_variation ) ], epoTotalsContainer, apply_dpd ); formatted_price = tm_set_price( price, epoTotalsContainer ); original_price = tm_apply_dpd( original_rules[ $.epoAPI.math.toFloat( current_variation ) ], epoTotalsContainer, apply_dpd ); original_formatted_price = tm_set_price( original_price, epoTotalsContainer ); element .find( '.tmcp-field, .tmcp-fee-field ' ) .toArray() .forEach( function( el ) { el = $( el ); if ( per_product_pricing ) { if ( el.attr( 'data-no-price' ) === '1' ) { price = 0; original_price = 0; } el.data( 'raw_price', price ); el.data( 'raw_original_price', original_price ); el.data( 'price', tm_set_tax_price( price, epoTotalsContainer, el ) ); el.data( 'original_price', tm_set_tax_price( original_price, epoTotalsContainer, el ) ); tm_update_price( el.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), price, formatted_price, original_price, original_formatted_price ); } else { el.data( 'price', 0 ); el.data( 'original_price', 0 ); el.closest( '.tmcp-field-wrap' ).find( '.amount' ).empty(); } } ); } } ); epoContainer.data( 'tm_rules_init_done', 1 ); } // skip specific field rules if per_product_pricing is false if ( ! per_product_pricing ) { return true; } product_price = tm_calculate_product_price( epoTotalsContainer ); product_original_price = tm_calculate_product_regular_price( epoTotalsContainer ); args = { cart: cart, current_variation: current_variation, bundleid: bundleid, epoTotalsContainer: epoTotalsContainer, product_price: product_price, product_original_price: product_original_price, apply_dpd: apply_dpd, per_product_pricing: per_product_pricing }; all_fields = epoContainer.find( '.tmcp-field,.tmcp-sub-fee-field,.tmcp-fee-field' ); if ( ! epoObject.is_associated ) { all_fields = all_fields.not( tcAPI.associatedEpoSelector + ' ' + '.tmcp-field,' + tcAPI.associatedEpoSelector + ' ' + '.tmcp-sub-fee-field,' + tcAPI.associatedEpoSelector + ' ' + '.tmcp-fee-field' ); } active_fields = all_fields.filter( '.tcenabled' ); // note: find a better way if any if ( ! $.tcepo.initialActivation[ epoEventId ] || ( active_fields.length === 0 && all_fields.length > 0 ) ) { all_fields.each( function() { field_is_active( $( this ) ); } ); $.tcepo.initialActivation[ epoEventId ] = true; } // apply specific field rules all_fields.filter( '.tcenabled' ).each( function( index, element ) { tm_element_epo_rules( epoObject, element, args ); } ); all_fields.each( function( index, element ) { $( element ).on( 'tc_element_epo_rules', function() { tm_element_epo_rules( epoObject, element, args ); } ); } ); } ); } function add_late_fields_prices( epoObject, currentProductPrice, originalProductPrice, options_total, original_options_total, bid, _cart, applydpd ) { var total = 0; var originalTotal = 0; var price; var originalPrice; var priceType; var setter; var id; var hidden; var bundleid; var realSetter; var productId; var epoId; var formattedPrice; var originalFormattedPrice; var epoEventId = epoObject.epoEventId; var taxPrice; var taxOriginalPrice; var hiddenName; var productPrice; var oProductPrice; var apply_dpd; if ( applydpd !== undefined ) { apply_dpd = applydpd; } else { apply_dpd = epoObject.this_epo_totals_container.data( 'fields-price-rules' ); } productPrice = currentProductPrice; oProductPrice = originalProductPrice; $.tcepo.lateFieldsPrices[ epoEventId ].forEach( function( field ) { price = field.price; originalPrice = field.original_price; priceType = field.pricetype; setter = field.setter; bundleid = field.bundleid; realSetter = setter; if ( priceType === 'percentcurrenttotal' ) { hiddenName = '_hidden'; } else { hiddenName = '_hiddenfixed'; } if ( setter.is( 'option' ) ) { realSetter = setter.closest( 'select' ); } productPrice = parseFloat( $.epoAPI.applyFilter( 'tc_alter_product_price', productPrice, realSetter, _cart, epoObject.this_epo_totals_container, bid ) ); oProductPrice = parseFloat( $.epoAPI.applyFilter( 'tc_alter_original_product_price', oProductPrice, realSetter, _cart, epoObject.this_epo_totals_container, bid ) ); id = $.epoAPI.dom.id( realSetter.attr( 'name' ) ); productId = $( '.tc-totals-form.tm-totals-form-' + _cart.attr( 'data-cart-id' ) ).attr( 'data-product-id' ); epoId = $( '.tc-totals-form.tm-totals-form-' + _cart.attr( 'data-cart-id' ) ).attr( 'data-epo-id' ); //workaround to support composite products hidden = $( '.tc-extra-product-options.tm-product-id-' + productId + "[data-epo-id='" + epoId + "']" ).find( '#' + id + hiddenName ); if ( bundleid === bid ) { if ( priceType === 'percentcurrenttotal' ) { price = ( parseFloat( price ) / 100 ) * ( tm_apply_dpd( parseFloat( productPrice ), epoObject.this_epo_totals_container, apply_dpd ) + parseFloat( options_total ) ); originalPrice = ( parseFloat( originalPrice ) / 100 ) * ( parseFloat( oProductPrice ) + parseFloat( original_options_total ) ); } else if ( priceType === 'fixedcurrenttotal' ) { price = parseFloat( price ) + parseFloat( options_total ); originalPrice = parseFloat( originalPrice ) + parseFloat( original_options_total ); } if ( realSetter.data( 'tm-quantity' ) ) { price = price * parseFloat( realSetter.data( 'tm-quantity' ) ); originalPrice = originalPrice * parseFloat( realSetter.data( 'tm-quantity' ) ); } if ( setter.data( 'isset' ) === 1 && field_is_active( setter ) ) { total = total + price; originalTotal = originalTotal + originalPrice; } taxPrice = tm_set_tax_price( price, _cart, setter ); taxOriginalPrice = tm_set_tax_price( originalPrice, _cart, setter ); formattedPrice = tm_set_price( price, _cart, false, false, setter ); originalFormattedPrice = tm_set_price( originalPrice, _cart, false, false, setter ); setter.data( 'price', taxPrice ); setter.data( 'pricew', taxPrice ); setter.data( 'original_price', taxOriginalPrice ); setter.data( 'original_pricew', taxOriginalPrice ); tm_update_price( setter.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), taxPrice, formattedPrice, taxOriginalPrice, originalFormattedPrice ); if ( hidden.length === 0 ) { realSetter.before( '' ); } if ( setter.is( '.tm-epo-field.tmcp-radio' ) ) { if ( setter.is( ':checked' ) ) { hidden.val( tm_set_price_without_tax( price, _cart ) ); } } else { hidden.val( tm_set_price_without_tax( price, _cart ) ); } } else if ( setter.data( 'pricew' ) !== undefined ) { formattedPrice = tm_set_price( setter.data( 'pricew' ), _cart, true, false, setter ); originalFormattedPrice = ''; if ( setter.data( 'original_pricew' ) !== undefined ) { originalFormattedPrice = tm_set_price( setter.data( 'original_pricew' ), _cart, true, false, setter ); } tm_update_price( setter.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), setter.data( 'pricew' ), formattedPrice, setter.data( 'original_pricew' ), originalFormattedPrice ); } } ); return [ total, originalTotal ]; } function tm_lazyload() { var container; if ( TMEPOJS.tm_epo_no_lazy_load === 'yes' ) { return; } if ( tmLazyloadContainer ) { container = $( tmLazyloadContainer ).find( 'img.tmlazy' ); } else { container = $( '.tc-extra-product-options img.tmlazy' ); } container.lazyLoadXT(); container.on( 'lazyshow', function() { jWindow.trigger( 'lazyLoadXToncomplete' ); } ); } function tm_css_styles( obj ) { var slider; var display; if ( ! obj ) { return; } obj.find( '.tm-owl-slider-section' ).each( function() { slider = $( this ); slider.find( '.tc-slider-content' ).addClass( 'tm-owl-slider tc-container' ); slider = slider.find( '.tm-owl-slider' ); display = slider.css( 'display' ); slider .show() .addClass( 'tcowl-carousel' ) .tmowlCarousel( { rtl: TMEPOJS.isRTL === '1', dots: false, nav: true, items: 1, autoHeight: true, mouseDrag: false, touchDrag: true, //navigation:true, navText: [ TMEPOJS.i18n_prev_text, TMEPOJS.i18n_next_text ], navClass: [ 'owl-prev button', 'owl-next button' ], navElement: 'a', loop: false, navRewind: false } ); slider.css( 'display', display ); } ); if ( $.fn.tcTabs ) { obj.find( '.tc-tabs' ).tcTabs( { headers: 'tc-tab-headers', header: 'tab-header', dataopenattribute: 'data-tab', sortabletabs: false } ); } } function repeaterAdd( el, elementInnerWrap ) { var cpf = elementInnerWrap.closest( '.cpf-element' ); var maxRows = cpf.data( 'repeater-max-rows' ); var repeater = elementInnerWrap.find( '.tc-repeater-element' ); var rows = repeater.length; var repeaterLast = repeater.last(); var repeaterLastUL = repeater.last().find( '.tmcp-ul-wrap' ); var clone; var cloneUl; var originalId = el.data( 'tc-repeater-id' ); var index = el.data( 'tc-repeater-init' ); if ( maxRows ) { if ( rows >= maxRows ) { return false; } } if ( rows + 1 >= maxRows && el.is( '.tc-repeater-add' ) ) { el.closest( '.tc-repeater-wrap' ).addClass( 'tc-hidden' ); } if ( repeaterLastUL.is( '.tm-element-ul-date, .tm-element-ul-time' ) ) { repeaterLastUL.find( '.tm-epo-field' ).tm_datepicker( 'destroy' ); repeaterLastUL.find( '.tmcp-date-select' ).off(); } if ( repeaterLastUL.is( '.tm-element-ul-color' ) ) { repeaterLastUL.find( '.tm-epo-field' ).spectrum( 'destroy' ); } clone = repeaterLast.tcClone( true ); clone.find( '.tm-epo-field' ).attr( 'id', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + '_' + index; } ); clone.find( '[data-for]' ).attr( 'data-for', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + '_' + index; } ); clone.find( '[for]' ).attr( 'for', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + '_' + index; } ); clone.find( '[data-field-id]' ).attr( 'data-field-id', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + '_' + index; } ); clone.find( '[data-tm-date]' ).attr( 'data-tm-date', function() { return originalId + '_' + index; } ); clone.find( '.tm-epo-field' ).attr( 'name', function( i, value ) { return value.replace( /\[\d+\]/g, '[' + index + ']' ); } ); clone.find( '.tm-qty' ).attr( 'name', function( i, value ) { return value.replace( /\[\d+\]/g, '[' + index + ']' ); } ); clone.find( '.tmcp-date-select' ).attr( 'name', function( i, value ) { return value.replace( /\[\d+\]/g, '[' + index + ']' ); } ); clone.find( '.tmcp-date-select' ).attr( 'id', function( i, value ) { return originalId + '_' + index + '_' + value.substring( value.lastIndexOf( '_' ) + 1 ); } ); cloneUl = clone.find( '.tmcp-ul-wrap' ); if ( elementInnerWrap.find( '.tc-repeater-element' ).length > 0 ) { elementInnerWrap.find( '.tc-repeater-delete' ).removeClass( 'tc-hidden' ); clone.find( '.tc-repeater-delete' ).removeClass( 'tc-hidden' ); } if ( cloneUl.is( '.tm-element-ul-checkbox' ) ) { clone.find( 'li.tmcp-field-wrap' ).removeClass( 'tc-active' ); clone .find( '.tm-epo-field.tmcp-checkbox' ) .prop( 'checked', false ); clone .find( '.tm-epo-field.tmcp-checkbox' ) .filter( function( i, x ) { return $.inArray( $( x ).val(), el.data( 'repeater-init-value' ) ) !== -1; } ) .prop( 'checked', true ) .closest( 'li.tmcp-field-wrap' ).addClass( 'tc-active' ); } else if ( cloneUl.is( '.tm-element-ul-radio' ) ) { clone.find( 'li.tmcp-field-wrap' ).removeClass( 'tc-active' ); clone .find( '.tm-epo-field.tmcp-radio' ) .filter( function( i, x ) { return $( x ).val() === el.data( 'repeater-init-value' ); } ) .prop( 'checked', true ) .closest( 'li.tmcp-field-wrap' ).addClass( 'tc-active' ); } else { clone.find( '.tm-epo-field' ).val( el.data( 'repeater-init-value' ) ); } if ( ! cloneUl.is( '.tm-element-ul-checkbox' ) && ! cloneUl.is( '.tm-element-ul-radio' ) ) { clone.find( '.tm-epo-field' ).val( el.data( 'repeater-init-value' ) ); } el.data( 'tc-repeater-init', el.data( 'tc-repeater-init' ) + 1 ); return [ clone, repeaterLast, repeaterLastUL ]; } function repeaterAddAfter( epoObject, clone, repeaterLast, repeaterLastUL, doevents ) { var cloneUl = clone.find( '.tmcp-ul-wrap' ); if ( cloneUl.is( '.tm-element-ul-range' ) ) { clone.find( '.tm-range-picker' ).removeData( 'tc-picker-init' ).attr( 'class', 'tm-range-picker' ).html( '' ); setRangePickers( clone ); } if ( cloneUl.is( '.tm-element-ul-date, .tm-element-ul-time' ) ) { tm_set_datepicker( repeaterLastUL ); tm_set_datepicker( cloneUl ); } if ( cloneUl.is( '.tm-element-ul-color' ) ) { tm_set_color_pickers( repeaterLastUL ); tm_set_color_pickers( cloneUl ); } clone.find( '.tm-tooltip' ).removeData( 'tctooltip' ).removeData( 'tm-has-tm-tip' ); $.tcToolTip( clone.find( '.tm-tooltip' ) ); // apply specific field rules clone.find( '.tm-epo-field' ) .removeData( 'addedtcEpoBeforeOptionPriceCalculation' ) .each( function( y, elc ) { var element = $( elc ); field_is_active( element, false, true ); if ( element.is( '.tcenabled' ) ) { tm_element_epo_rules( epoObject, element ); } element.on( 'tc_element_epo_rules', function() { tm_element_epo_rules( epoObject, element ); } ); } ); if ( ! doevents ) { return; } if ( cloneUl.is( '.tm-element-ul-checkbox' ) ) { clone .find( '.tm-epo-field.tmcp-checkbox' ) .filter( ':checked' ) .trigger( 'change.cpf' ); } else if ( cloneUl.is( '.tm-element-ul-radio' ) ) { clone .find( '.tm-epo-field.tmcp-radio' ) .filter( ':checked' ) .trigger( 'change.cpf' ); } else { clone.find( '.tm-epo-field' ).trigger( 'change.cpf' ); } } function repeaterDelete( elementInnerWrap, repeaterElement, repeaterObj, $this ) { var cpf = elementInnerWrap.closest( '.cpf-element' ); var minRows = cpf.data( 'repeater-min-rows' ); var rows = elementInnerWrap.find( '.tc-repeater-element' ).length; var repeaterElementIndex = repeaterElement.index(); var message; if ( minRows ) { if ( rows <= minRows ) { if ( $this ) { message = '
' + $.tc_validator.messages.repeaterminrows( minRows ) + '
'; $this.tcToolTip( { tip: message, onetime: true, trigger: true, tipclass: 'tc-error' } ); } return false; } } if ( rows === 1 ) { return; } if ( rows === 2 ) { elementInnerWrap.find( '.tc-repeater-delete' ).addClass( 'tc-hidden' ); } if ( repeaterObj.is( '.tc-repeater-add' ) ) { repeaterObj.closest( '.tc-repeater-wrap' ).removeClass( 'tc-hidden' ); } repeaterElement.remove(); repeaterObj.data( 'tc-repeater-init', repeaterObj.data( 'tc-repeater-init' ) - 1 ); if ( repeaterElementIndex + 1 === rows ) { return; } elementInnerWrap.find( '.tc-repeater-element' ) .toArray() .forEach( function( clone, index ) { clone = $( clone ); clone.find( '.tm-epo-field' ).attr( 'id', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' ); } ); clone.find( '[data-for]' ).attr( 'data-for', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' ); } ); clone.find( '[for]' ).attr( 'for', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' ); } ); clone.find( '[data-field-id]' ).attr( 'data-field-id', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' ); } ); clone.find( '[data-tm-date]' ).attr( 'data-tm-date', function( i, value ) { return value.replace( /\_\d+$/g, '' ) + ( ( index !== 0 ) ? '_' + index : '' ); } ); clone.find( '.tm-epo-field' ).attr( 'name', function( i, value ) { return value.replace( /\[\d+\]/g, '[' + index + ']' ); } ); clone.find( '.tm-qty' ).attr( 'name', function( i, value ) { return value.replace( /\[\d+\]/g, '[' + index + ']' ); } ); clone.find( '.tmcp-date-select' ).attr( 'name', function( i, value ) { return value.replace( /\[\d+\]/g, '[' + index + ']' ); } ); } ); } function tm_set_repeaters( obj, epoObject ) { var currentCart; var qtyElement; if ( ! obj ) { return; } obj = $( obj ); if ( obj.length ) { currentCart = epoObject.main_cart; qtyElement = getQtyElement( currentCart ); qtyElement = $.epoAPI.applyFilter( 'qtyElementForRepeaterQuantity', qtyElement, { epo: epoObject, currentCart: currentCart, obj: obj, qtyElement: qtyElement } ); obj.find( '.tc-repeater-quantity' ) .toArray() .forEach( function( repeater, qx ) { var el = $( repeater ); var tmEpoField; var repeaterElement; var length; if ( el.data( 'tc-repeater-init' ) ) { return; } repeaterElement = el.find( '.tc-repeater-element' ); length = repeaterElement.length; tmEpoField = repeaterElement.first().find( '.tm-epo-field' ); if ( tmEpoField.is( ':checkbox' ) ) { el.data( 'repeater-init-value', tmEpoField.filter( ':checked' ).toArray().map( function( x ) { return $( x ).val(); } ) ); } else if ( tmEpoField.is( ':radio' ) ) { el.data( 'repeater-init-value', tmEpoField.filter( ':checked' ).val() ); } else { el.data( 'repeater-init-value', tmEpoField.val() ); } el.data( 'tc-repeater-init', length ); el.data( 'tc-repeater-id', tmEpoField.attr( 'id' ) ); el.data( 'tc-repeater-name', tmEpoField.attr( 'name' ) ); if ( qtyElement.length ) { qtyElement .off( 'change.r' + qx + 'cpf input.r' + qx + 'cpf' ) .on( 'change.r' + qx + 'cpf input.r' + qx + 'cpf', function( event ) { var field = $( this ); var prevValue = field.data( 'tm-prev-value' ); var value = $.epoAPI.applyFilter( 'qtyElementForRepeaterQuantityValue', field.val(), { epo: epoObject, currentCart: currentCart, obj: obj, qtyElement: qtyElement, field: field } ); var difference = value - prevValue; var elementInnerWrap; var thisRepeaterElement; var i; var ele; var cloned; var repeaterLast; var repeaterLastUL; if ( prevValue === undefined ) { prevValue = value - 1; difference = value - prevValue; } if ( event.isTrigger !== undefined ) { prevValue = el.find( '.tc-element-inner-wrap' ).find( '.tc-repeater-element' ).length; difference = value - prevValue; } if ( difference === 0 ) { return; } elementInnerWrap = el.find( '.tc-element-inner-wrap' ); field.data( 'tm-prev-value', $.epoAPI.applyFilter( 'qtyElementForRepeaterQuantity_tm-prev-value', field.val(), { epo: epoObject, currentCart: currentCart, obj: obj, qtyElement: qtyElement, field: field } ) ); if ( difference > 0 ) { thisRepeaterElement = elementInnerWrap.find( '.tc-repeater-element' ).eq( value - 1 ); if ( thisRepeaterElement.length ) { return; } for ( i = 0; i < difference; i++ ) { cloned = repeaterAdd( el, elementInnerWrap ); if ( cloned ) { if ( ele ) { ele = ele.add( cloned[ 0 ] ); } else { ele = cloned[ 0 ]; } if ( i === 0 ) { repeaterLast = cloned[ 1 ]; repeaterLastUL = cloned[ 2 ]; } } } if ( ele ) { ele.appendTo( elementInnerWrap.find( '.tc-element-container' ) ); repeaterAddAfter( epoObject, ele, repeaterLast, repeaterLastUL ); } } else { for ( i = value - difference; i > value; i -= 1 ) { thisRepeaterElement = elementInnerWrap.find( '.tc-repeater-element' ).eq( i - 1 ); repeaterDelete( elementInnerWrap, thisRepeaterElement, el ); } } currentCart.trigger( { type: 'tm-epo-update', norules: 2 } ); } ); } } ); obj.find( '.tc-repeater-add' ) .toArray() .forEach( function( repeater ) { var el = $( repeater ); var tmEpoField; var elementInnerWrap; var repeaterElement; var length; if ( el.data( 'tc-repeater-init' ) ) { return; } elementInnerWrap = el.closest( '.tc-element-inner-wrap' ); repeaterElement = elementInnerWrap.find( '.tc-repeater-element' ); length = repeaterElement.length; tmEpoField = repeaterElement.first().find( '.tm-epo-field' ); if ( elementInnerWrap.find( '.tc-repeater-element' ).length > 1 ) { elementInnerWrap.find( '.tc-repeater-delete' ).removeClass( 'tc-hidden' ); } if ( tmEpoField.is( ':checkbox' ) ) { el.data( 'repeater-init-value', tmEpoField.filter( ':checked' ).toArray().map( function( x ) { return $( x ).val(); } ) ); } else if ( tmEpoField.is( ':radio' ) ) { el.data( 'repeater-init-value', tmEpoField.filter( ':checked' ).val() ); } else { el.data( 'repeater-init-value', tmEpoField.val() ); } el.data( 'tc-repeater-init', length ); el.data( 'tc-repeater-id', tmEpoField.attr( 'id' ) ); el.data( 'tc-repeater-name', tmEpoField.attr( 'name' ) ); el.on( 'click.repeater', function() { var ele = repeaterAdd( el, elementInnerWrap ); if ( ele ) { ele[ 0 ].appendTo( elementInnerWrap.find( '.tc-element-container' ) ); repeaterAddAfter( epoObject, ele[ 0 ], ele[ 1 ], ele[ 2 ], true ); } } ); } ); obj.find( '.tc-repeater-delete .delete' ).on( 'click', function() { var $this = $( this ); var elementInnerWrap = $this.closest( '.tc-element-inner-wrap' ); var repeaterElement = $this.closest( '.tc-repeater-element' ); repeaterDelete( elementInnerWrap, repeaterElement, elementInnerWrap.find( '.tc-repeater-add' ), $this ); } ); } } function tm_set_color_pickers( obj ) { if ( ! obj ) { return; } obj = $( obj ).find( '.tm-color-picker' ); if ( obj.length ) { obj.spectrum( { type: 'color', theme: 'epo', showButtons: true, allowEmpty: true, showInitial: true, showInput: true, clickoutFiresChange: false, chooseText: TMEPOJS.closeText, cancelText: TMEPOJS.i18n_cancel } ); obj.spectrum( 'enable' ); } } function tm_set_lightbox( obj ) { if ( ! obj ) { return; } if ( $( obj ).length ) { // document ready $( function() { $( obj ).tclightbox(); } ); } } function has_active_changes_product_image( field ) { var uic = field.closest( '.tmcp-field-wrap' ).find( 'label img' ); var src = $( uic ).first().attr( 'data-original' ); if ( field.is( 'select.tm-product-image' ) ) { field = field.children( 'option:selected' ); } if ( ! src ) { src = $( uic ).first().attr( 'src' ); } if ( ! src ) { src = field.attr( 'data-image' ); } if ( field.attr( 'data-imagep' ) ) { src = field.attr( 'data-imagep' ); } if ( src ) { return true; } return false; } function tm_set_upload_fields( epoObject ) { var field; var dT; var name; var file; var selector = epoObject.is_associated ? epoObject.this_epo_container.find( '.tm-epo-field.tmcp-upload' ) : epoObject.this_epo_container.find( '.tm-epo-field.tmcp-upload' ).not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field.tmcp-upload' ); try { selector .not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field.tmcp-upload' ) .toArray() .forEach( function( el ) { var dataFiles; var dataFilename; file = []; field = $( el ); if ( field.attr( 'data-file' ) === '' ) { return false; } dataFiles = field.attr( 'data-file' ).split( '|' ); if ( dataFiles.length === 0 ) { return false; } if ( ClipboardEvent || DataTransfer ) { dT = new ClipboardEvent( '' ).clipboardData || new DataTransfer(); } dataFiles.forEach( function( dataFile ) { dataFilename = $.epoAPI.util.basename( dataFile ); if ( ClipboardEvent || DataTransfer ) { dT.items.add( new File( [ dataFile ], dataFilename ) ); } file.push( dataFile ); } ); if ( dT ) { el.files = dT.files; } file = file.join( '|' ); name = field.attr( 'name' ); field.trigger( 'tcupload' ); field.after( '' ); field.removeAttr( 'data-file' ); } ); } catch ( err ) { window.console.log( err ); $( '.tm-epo-field.tmcp-upload' ).not( '.tm-multiple-file-upload' ).addClass( 'tc-nodt' ); errorObject = err; } } function tm_set_upload_rules( epoObject ) { var epoEventId = epoObject.epoEventId; var this_epo_container = epoObject.this_epo_container; if ( TMEPOJS.tm_epo_upload_popup === 'yes' ) { $.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = { trigger: function() { return true; }, on_true: function() { var upload_fields = this_epo_container.data( 'num_uploads' ); var thisPopup; var ajaxSuccessFunc; if ( upload_fields && Object.keys( upload_fields ).length ) { thisPopup = $.tcFloatBox( { fps: 1, ismodal: true, refresh: 'fixed', width: '50%', height: '300px', classname: 'flasho tc-wrapper', data: $.epoAPI.template.html( tcAPI.templateEngine.tc_upload_messages, { files: upload_fields, title: TMEPOJS.i18n_uploading_files, message: TMEPOJS.i18n_uploading_message } ) } ); ajaxSuccessFunc = function() { thisPopup.destroy(); jDocument.off( 'ajaxSuccess', ajaxSuccessFunc ); }; jDocument.on( 'ajaxSuccess', ajaxSuccessFunc ); } return true; }, on_false: function() { return true; } }; } } function tm_set_checkboxes_rules( epoObject ) { var this_epo_container = epoObject.this_epo_container; var main_product = epoObject.main_product; var epoEventId = epoObject.epoEventId; var limit_cont = this_epo_container.find( '.tm-limit' ); var exactlimit_cont = this_epo_container.find( '.tm-exactlimit' ); var minimumlimit_cont = this_epo_container.find( '.tm-minimumlimit' ); // Limit checkbox selection this_epo_container.on( 'change.cpflimit', 'input.tm-epo-field.tmcp-checkbox', function() { var $this = $( this ); tm_limit_c_selection( $this, true ); tm_exact_c_selection( $this, true ); } ); if ( limit_cont.length ) { tm_check_limit_cont( limit_cont, main_product, epoEventId ); } // Exact value checkbox check (Todo:check for isvisible) if ( exactlimit_cont.length ) { tm_check_exactlimit_cont( exactlimit_cont, main_product, epoEventId ); } // Minimum number checkbox check (Todo:check for isvisible) if ( minimumlimit_cont.length ) { tm_check_minimumlimit_cont( minimumlimit_cont, epoEventId ); } } function tm_theme_specific_actions( epoObject ) { var this_epo_container = epoObject.this_epo_container; var theme_name = TMEPOJS.theme_name; var all_epo_selects; var blaszok_selects; if ( theme_name ) { theme_name = theme_name.toLowerCase(); all_epo_selects = this_epo_container.find( 'select' ); switch ( theme_name ) { case 'flatsome': case 'flatsome-child': case 'flatsome child': all_epo_selects.wrap( '
' ); break; case 'avada': case 'avada-child': case 'avada child': all_epo_selects.wrap( '
' ); $( '
' ).appendTo( this_epo_container.find( '.tm-select-parent' ) ); if ( window.calc_select_arrow_dimensions ) { window.calc_select_arrow_dimensions(); jWindow.on( 'tmsectionpoplink cpflogicdone', function() { window.calc_select_arrow_dimensions(); } ); } else if ( window.calcSelectArrowDimensions ) { window.calcSelectArrowDimensions(); jWindow.on( 'tmsectionpoplink cpflogicdone', function() { window.calcSelectArrowDimensions(); } ); } break; case 'bazar': case 'bazar-child': case 'bazar child': all_epo_selects.wrap( '
' ); break; case 'blaszok': case 'blaszok-child': case 'blaszok child': blaszok_selects = function() { setTimeout( function() { $( '.tm-extra-product-options select' ) .not( '.hasCustomSelect' ) .filter( ':visible' ) .each( function() { if ( ! $( this ).is( '.mpcthSelect' ) ) { $( this ).width( $( this ).outerWidth() ); $( this ).customSelect( { customClass: 'mpcthSelect' } ); } } ); }, 100 ); }; jWindow.on( 'cpflogicrun', function() { blaszok_selects(); } ); jWindow.on( 'epo_options_visible', function() { blaszok_selects(); } ); break; case 'handmade': case 'handmade child theme': $( '.tm-owl-slider.tcowl-carousel' ).addClass( 'manual' ); break; } jWindow.trigger( 'tm-theme-specific-actions', { epo: { theme_name: theme_name, all_epo_selects: all_epo_selects } } ); } // Fix added +/- quantity button on most themes. jDocument.off( 'click.cpf', '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus' ).on( 'click.cpf', '.quantity:not(.buttons_added) .minus, .quantity:not(.buttons_added) .plus', function() { $( this ).closest( '.quantity' ).find( tcAPI.qtySelector ).trigger( 'change.cpf' ); } ); } function tm_custom_variations( epoObject, form, item_id, $main_product, $epo_holder ) { var epoEventId = epoObject.epoEventId; var variation_id_selector = "input[name^='variation_id']"; var tm_epo_variation_section; var li_variations; var composite_load_test; var form_event; var type; var name; var selector; var func; var i; var eventName = epoObject.is_associated ? 'tc_variation_form.tmlogic' : 'wc_variation_form.tmlogic'; var eventNamePrefix = epoObject.is_associated ? 'tc_' : ''; var variationsForm = epoObject.variations_form; var variationsTable = epoObject.is_associated ? variationsForm.find( '.tc-epo-element-variations' ) : variationsForm.find( '.variations' ); var resetSelector = epoObject.is_associated ? '.tc-epo-element-variable-reset-variations' : '.reset_variations'; variationsForm.attr( 'data-epo_id', epoObject.epo_id ); if ( form.find( 'input.variation_id' ).length > 0 ) { variation_id_selector = 'input.variation_id'; } if ( $epo_holder.find( '.tm-epo-variation-element' ).length || $epo_holder.data( 'tm-epo-variation-element' ) ) { tm_epo_variation_section = $epo_holder.find( '.tm-epo-variation-section' ).first(); tm_epo_variation_section.find( '.cpf-type-variations' ).attr( 'data-epo_id', epoObject.epo_id ).attr( 'data-product_id', variationsForm.attr( 'data-product_id' ) ); $epo_holder.data( 'tm-epo-variation-element', tm_epo_variation_section.find( '.tm-epo-variation-element' ) ); if ( item_id && item_id !== 'main' && ! epoObject.is_associated ) { // on composite variationsForm = epoObject.form; variationsTable = variationsForm.find( '.composite_component[data-item_id="' + item_id + '"]' ).find( '.variations' ); variationsForm.attr( 'data-epo_id', epoObject.epo_id ); if ( variationsTable.length === 0 ) { return; } li_variations = tm_epo_variation_section.closest( 'li.tm-extra-product-options-field' ); if ( ! tm_epo_variation_section.is( '.tm-hidden' ) ) { variationsTable.hide(); } variationsTable.after( tm_epo_variation_section.addClass( 'tm-extra-product-options nopadding' ) ); if ( li_variations.is( ':empty' ) ) { li_variations.hide(); } if ( ! tm_epo_variation_section.is( '.section_popup' ) ) { tm_epo_variation_section.removeClass( 'tc-cell' ); tm_epo_variation_section.wrap( "
" ); } else { tm_epo_variation_section.wrap( "
" ); } composite_load_test = false; form.off( eventName ).on( eventName, function() { composite_load_test = true; variationsForm.on( 'click.tmlogic', '.reset_variations', function() { tm_epo_variation_section.find( 'select.tm-epo-variation-element' ).val( '' ).children( 'option' ).prop( 'disabled', false ).show(); tm_epo_variation_section.find( '.tm-epo-variation-element' ).prop( 'disabled', false ).removeClass( 'tm-disabled' ).prop( 'checked', false ).closest( 'li' ).show(); jWindow.trigger( 'tmlazy' ); tm_epo_variation_section.find( '.tm-epo-variation-element' ).trigger( 'tm_trigger_product_image' ); tm_epo_variation_section.find( 'li' ).removeClass( 'tc-active tm-attribute-disabled' ).css( 'opacity', '' ); } ); // Disable option fields that are unavaiable for current set of attributes form.off( 'woocommerce_update_variation_values_tmlogic' ).on( 'woocommerce_update_variation_values_tmlogic', function() { tm_custom_variations_update( form, epoObject ); } ); for ( i = 0; i < lateVariationEvent.length; i += 1 ) { form_event = lateVariationEvent[ i ]; type = typeof form_event; if ( type === 'object' ) { name = typeof form_event.name === 'string' || false; selector = typeof form_event.selector === 'string' || false; func = typeof form_event.func === 'function' || false; if ( name && func ) { if ( selector === "input[name='variation_id']" ) { selector = variation_id_selector; } if ( form_event.selector ) { form.data( 'tm-styled-variations', 1 ) .off( eventNamePrefix + form_event.name + i, selector ) .on( eventNamePrefix + form_event.name + i, selector, form_event.func ); } else { form.data( 'tm-styled-variations', 1 ) .off( eventNamePrefix + form_event.name + i ) .on( eventNamePrefix + form_event.name + i, form_event.func ); } } } } lateVariationEvent = []; tm_epo_variation_section.find( '.tm-epo-variation-element:not(.tm-hidden .tm-epo-variation-element)' ).last().trigger( 'tm_epo_variation_element_change' ); } ); // document ready $( function() { if ( composite_load_test === false ) { form.trigger( eventName ); } } ); } else { if ( tm_epo_variation_section.length ) { if ( ! tm_epo_variation_section.is( '.tm-hidden' ) ) { variationsTable.hide(); } li_variations = tm_epo_variation_section.closest( 'li.tm-extra-product-options-field' ); variationsTable.after( tm_epo_variation_section.addClass( 'tm-extra-product-options nopadding' ) ); if ( li_variations.is( ':empty' ) ) { li_variations.hide(); } if ( ! tm_epo_variation_section.is( '.section_popup' ) ) { tm_epo_variation_section.removeClass( 'tc-cell' ); tm_epo_variation_section.wrap( "
" ); } else { tm_epo_variation_section.wrap( "
" ); } variationsForm.off( 'click.tmlogic', resetSelector ).on( 'click.tmlogic', resetSelector, function() { tm_epo_variation_section.find( 'select.tm-epo-variation-element' ).val( '' ).children( 'option' ).prop( 'disabled', false ).show(); tm_epo_variation_section.find( '.tm-epo-variation-element' ).prop( 'disabled', false ).removeClass( 'tm-disabled' ).prop( 'checked', false ).closest( 'li' ).show(); jWindow.trigger( 'tmlazy' ); tm_epo_variation_section.find( '.tm-epo-variation-element' ).trigger( 'tm_trigger_product_image' ); tm_epo_variation_section.find( 'li' ).removeClass( 'tc-active tm-attribute-disabled' ).css( 'opacity', '' ); } ); } // Disable option fields that are unavaiable for current set of attributes variationsForm.off( 'woocommerce_update_variation_values_tmlogic' ).on( 'woocommerce_update_variation_values_tmlogic', function() { tm_custom_variations_update( variationsForm, epoObject ); } ); for ( i = 0; i < lateVariationEvent.length; i += 1 ) { form_event = lateVariationEvent[ i ]; type = typeof form_event; if ( type === 'object' ) { name = typeof form_event.name === 'string' || false; selector = typeof form_event.selector === 'string' || false; func = typeof form_event.func === 'function' || false; if ( name && func ) { if ( selector === "input[name='variation_id']" ) { selector = variation_id_selector; } if ( form_event.selector ) { variationsForm .data( 'tm-styled-variations', 1 ) .off( eventNamePrefix + form_event.name + i, selector ) .on( eventNamePrefix + form_event.name + i, selector, form_event.func ); } else { variationsForm .data( 'tm-styled-variations', 1 ) .off( eventNamePrefix + form_event.name + i ) .on( eventNamePrefix + form_event.name + i, form_event.func ); } } } } lateVariationEvent = []; tm_epo_variation_section.find( '.tm-epo-variation-element:not(.tm-hidden .tm-epo-variation-element)' ).last().trigger( 'tm_epo_variation_element_change' ); } // global event for custom variations $.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = { trigger: function() { return true; }, on_true: function() { tm_epo_variation_section.find( '.tm-epo-variation-element' ).attr( 'disabled', 'disabled' ); return true; }, on_false: function() { tm_epo_variation_section.find( '.tm-epo-variation-element' ).prop( 'disabled', false ); } }; $( document.body ).on( 'added_to_cart', function() { tm_epo_variation_section.find( '.tm-epo-variation-element' ).prop( 'disabled', false ); } ); } } function repopulate_backup_image_atts( img, product_element ) { var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' ); var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ); var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ); var $product_img = img; var $product_link = img.closest( 'a' ); $product_img.attr( 'data-o_' + 'src', $.tc_product_image_store[ 0 ].src ); $product_img.attr( 'data-o_' + 'srcset', $.tc_product_image_store[ 0 ].srcset ); $product_img.attr( 'data-o_' + 'sizes', $.tc_product_image_store[ 0 ].sizes ); $product_img.attr( 'data-o_' + 'title', $.tc_product_image_store[ 0 ].title ); $product_img.attr( 'data-o_' + 'alt', $.tc_product_image_store[ 0 ].alt ); $product_img.attr( 'data-o_' + 'data-src', $.tc_product_image_store[ 0 ][ 'data-src' ] ); $product_img.attr( 'data-o_' + 'data-large_image', $.tc_product_image_store[ 0 ][ 'data-large_image' ] ); $product_img.attr( 'data-o_' + 'data-large_image_width', $.tc_product_image_store[ 0 ][ 'data-large_image_width' ] ); $product_img.attr( 'data-o_' + 'data-large_image_height', $.tc_product_image_store[ 0 ][ 'data-large_image_height' ] ); $product_img_wrap.attr( 'data-o_' + 'data-thumb', $.tc_product_image_store[ 1 ][ 'data-thumb' ] ); if ( $.tc_product_image_store[ 2 ] ) { $gallery_img.attr( 'data-o_' + 'src', $.tc_product_image_store[ 2 ].src ); } $product_link.attr( 'data-o_' + 'href', $.tc_product_image_store[ 3 ].href ); $product_link.attr( 'data-o_' + 'title', $.tc_product_image_store[ 3 ].title ); } function reset_saved_image( img, product_element ) { var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' ); var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ); var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ); var $product_img = img; var $product_link = img.closest( 'a' ); // backup current product image attributes if ( ! $.isEmptyObject( $.tc_product_image ) ) { $.tc_product_image_store = $.tc_pre_populate_store(); $.tc_product_image_store = $.tc_maybe_copy_object_values( $.tc_product_image_store, $.tc_product_image ); } else { $.tc_product_image_store = $.tc_populate_store( img, product_element ); } $product_img.tc_update_attr( 'src', 0 ); $product_img.tc_update_attr( 'srcset', 0 ); $product_img.tc_update_attr( 'sizes', 0 ); $product_img.tc_update_attr( 'title', 0 ); $product_img.tc_update_attr( 'alt', 0 ); $product_img.tc_update_attr( 'data-src', 0 ); $product_img.tc_update_attr( 'data-large_image', 0 ); $product_img.tc_update_attr( 'data-large_image_width', 0 ); $product_img.tc_update_attr( 'data-large_image_height', 0 ); $product_img_wrap.tc_update_attr( 'data-thumb', 1 ); $gallery_img.tc_update_attr( 'src', 2 ); $product_link.tc_update_attr( 'href', 3 ); $product_link.tc_update_attr( 'title', 3 ); } function image_update( data, img, product_element ) { var $gallery_img = product_element.find( '.flex-control-nav li:eq(0) img' ); var $gallery_wrapper = product_element.find( '.woocommerce-product-gallery__wrapper ' ); var $product_img_wrap = $gallery_wrapper.find( '.woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder' ).eq( 0 ); var $product_img = img; var $product_link = img.closest( 'a' ); if ( data && data.image_link && data.image_link && data.image_link.length > 1 ) { if ( data.full_src === null || data.full_src === '' ) { data.full_src = data.image_link; } if ( data.full_src_w === null || data.full_src_w === '' ) { data.full_src_w = $product_img.attr( 'data-large_image_width' ); } if ( data.full_src_h === null || data.full_src_h === '' ) { data.full_src_h = $product_img.attr( 'data-large_image_height' ); } if ( $product_img.length ) { if ( ! data.image_srcset ) { data.image_sizes = false; } if ( ! data.image_sizes ) { data.image_srcset = false; } $product_img.tc_set_attr( 'src', data.image_link, 0 ); $product_img.tc_set_attr( 'srcset', data.image_srcset, 0 ); $product_img.tc_set_attr( 'sizes', data.image_sizes, 0 ); $product_img.tc_set_attr( 'title', data.image_title, 0 ); $product_img.tc_set_attr( 'alt', data.image_alt, 0 ); $product_img.tc_set_attr( 'data-src', data.full_src, 0 ); $product_img.tc_set_attr( 'data-large_image', data.full_src, 0 ); $product_img.tc_set_attr( 'data-large_image_width', data.full_src_w, 0 ); $product_img.tc_set_attr( 'data-large_image_height', data.full_src_h, 0 ); $product_img_wrap.tc_set_attr( 'data-thumb', data.image_link, 1 ); } if ( $gallery_img.length ) { $gallery_img.tc_set_attr( 'src', data.image_link, 2 ); } if ( $product_link.length ) { $product_link.tc_set_attr( 'href', data.full_src, 3 ); $product_link.tc_set_attr( 'title', data.image_caption, 3 ); } } else { if ( $product_img.length ) { $product_img.tc_reset_attr( 'src', 0 ); $product_img.tc_reset_attr( 'srcset', 0 ); $product_img.tc_reset_attr( 'sizes', 0 ); $product_img.tc_reset_attr( 'title', 0 ); $product_img.tc_reset_attr( 'alt', 0 ); $product_img.tc_reset_attr( 'data-src', 0 ); $product_img.tc_reset_attr( 'data-large_image', 0 ); $product_img.tc_reset_attr( 'data-large_image_width', 0 ); $product_img.tc_reset_attr( 'data-large_image_height', 0 ); $product_img_wrap.tc_reset_attr( 'data-thumb', 1 ); } if ( $gallery_img.length ) { $gallery_img.tc_reset_attr( 'src', 2 ); } if ( $product_link.length ) { $product_link.tc_reset_attr( 'href', 3 ); $product_link.tc_reset_attr( 'title', 3 ); } } } function get_main_product_image( epoObject, product_element ) { var img; if ( epoObject.is_associated ) { img = product_element.find( '.tc-product-image .wp-post-image' ).first(); } else if ( TMEPOJS.tm_epo_global_product_image_selector !== '' ) { img = $( TMEPOJS.tm_epo_global_product_image_selector ); } else { img = product_element.find( '.woocommerce-product-gallery__image:not(.clone), .woocommerce-product-gallery__image--placeholder:not(.clone)' ).eq( 0 ).find( '.wp-post-image' ).first(); if ( img.length === 0 ) { img = product_element.find( 'a.woocommerce-main-image img, img.woocommerce-main-image,a img' ).not( '.thumbnails img,.product_list_widget img' ).first(); } if ( img.length === 0 ) { img = product_element.find( 'img.wp-post-image' ).not( '.thumbnails img,.product_list_widget img' ).first(); } if ( img.length === 0 ) { img = product_element.find( '.elementor-widget-wd_single_product_gallery img.wp-post-image' ).first(); } if ( img.length === 0 ) { img = product_element.find( '.elementor-widget-ae-post-image .wp-post-image' ).first(); } if ( img.length === 0 ) { img = $( '.woocommerce div.product div.images' ).not( '.thumbnails img,.product_list_widget img' ).first(); } } if ( $( img ).length > 1 ) { img = $( img ).first(); } return img; } function get_product_element( epoObject ) { var main_product; var product_id; var product_element; if ( epoObject.is_associated ) { return epoObject.main_product.closest( '.tc-epo-element-product-container' ); } main_product = epoObject.main_product; product_id = epoObject.product_id; product_element = main_product.closest( '#product-' + product_id ); if ( product_element.length <= 0 ) { product_element = main_product.closest( '.post-' + product_id ); } return product_element; } function gallery_compatibility_actions( gallery_type, clone_image, preload_img, visible, event_data, $form, product_element ) { var gallery; var _elements; var ge; var galleryWidth; var zoomEnabled; var image; var zoom_options; for ( gallery in gallery_type ) { if ( Object.prototype.hasOwnProperty.call( gallery_type, gallery ) ) { gallery = gallery_type[ gallery ]; if ( gallery.enabled ) { switch ( gallery.type ) { case 'yith': if ( ! clone_image ) { if ( ! visible ) { gallery.yith_wcmg_zoom.attr( 'href', gallery._yith_wcmg_default_zoom ); } else { gallery.yith_wcmg_zoom.attr( 'href', gallery.yith_wcmg_default_zoom ); } if ( gallery.element.data( 'yith_magnifier' ) ) { gallery.element.yith_magnifier( 'destroy' ); } gallery.element.yith_magnifier( window.yith_magnifier_options ); } else { clone_image.attr( 'srcset', preload_img ).attr( 'src-orig', preload_img ); if ( gallery.element.data( 'yith_magnifier' ) ) { gallery.element.yith_magnifier( 'destroy' ); } _elements = { elements: { zoom: $( '.yith_magnifier_zoom' ), zoomImage: clone_image, gallery: $( '.yith_magnifier_gallery li a' ) } }; gallery.element.yith_magnifier( $.extend( true, {}, window.yith_magnifier_options, _elements ) ); } break; case 'iosslider': setTimeout( function( g ) { g.element.iosSlider( 'update' ); }.bind( null, gallery ), 150 ); break; case 'flexslider': jWindow.trigger( 'resize' ); break; case 'elevatezoom': gallery.element.each( function( g, j ) { var elevateZoom = j( this ).data( 'elevateZoom' ); if ( typeof elevateZoom !== 'undefined' ) { elevateZoom.swaptheimage( g, g ); } }.bind( null, preload_img, $ ) ); break; case 'easyzoom': gallery.element.swap( null, preload_img ); break; case 'easyzoom-flatsome': gallery.element.swap( preload_img, preload_img ); break; case 'woocommerce': gallery.element.flexslider( 0 ); ge = gallery.element; window.setTimeout( function( g, w ) { g.trigger( 'woocommerce_gallery_init_zoom' ); w.trigger( 'resize' ); }.bind( null, ge, jWindow ), 10 ); break; case 'zoom': if ( product_element ) { galleryWidth = product_element.find( '.woocommerce-product-gallery--with-images' ).width(); zoomEnabled = false; image = gallery.element.find( 'img.wp-post-image' ); if ( image.attr( 'data-large_image_width' ) > galleryWidth ) { zoomEnabled = true; } if ( zoomEnabled ) { zoom_options = { touch: false }; if ( 'ontouchstart' in window ) { zoom_options.on = 'click'; } gallery.element.trigger( 'zoom.destroy' ); gallery.element.zoom( zoom_options ); } else { gallery.element.trigger( 'zoom.destroy' ); } } break; } } } } jWindow.trigger( 'tm_gallery_compatibility_actions', { event_data: event_data, product_element: product_element, form: $form } ); } function get_gallery_type( epoObject, img, product_element ) { // YITH WooCommerce Zoom Magnifier var is_yith_wcmg; var yith_wcmg; var yith_wcmg_zoom; var yith_wcmg_default_zoom; var _yith_wcmg_default_zoom; var yith_wcmg_default_image; // iosslider - Touch Enabled, Responsive jQuery Horizontal Content // Slider/Carousel/Image Gallery Plugin var is_iosSlider; var is_iosSlider_element; // ThemeFusion flexslider var is_flexslider; var is_flexslider_element; // elevateZoom A Jquery Image Zoom Plugin var is_elevateZoom; var is_elevateZoom_obj; // EasyZoom jQuery image zoom plugin var is_easyzoom; var is_easyzoom_element; // new flatsome easyzoom var is_easyzoom_flatsome; var is_easyzoom_flatsome_element; // WooCommerce 2.7x gallery var is_wc27_gallery; var is_wc27_gallery_element; var wc27_zoom_target; var wc_single_product_params; var zoom_target_temp; // fn.zoom var is_zoom_enabled; var zoom_images; var gallery; if ( epoObject.is_associated ) { return {}; } // YITH WooCommerce Zoom Magnifier is_yith_wcmg = false; yith_wcmg = $( '.images' ); yith_wcmg_zoom = $( '.yith_magnifier_zoom' ); yith_wcmg_default_zoom = yith_wcmg.find( '.yith_magnifier_zoom' ).first().attr( 'href' ); _yith_wcmg_default_zoom = yith_wcmg_default_zoom; yith_wcmg_default_image = yith_wcmg.find( '.yith_magnifier_zoom img' ).first().attr( 'src' ); // iosslider - Touch Enabled, Responsive jQuery Horizontal Content // Slider/Carousel/Image Gallery Plugin is_iosSlider = false; is_iosSlider_element = $( '.iosSlider.product-gallery-slider,.iosSlider.product-slider' ); // ThemeFusion flexslider is_flexslider = false; is_flexslider_element = product_element.find( '.images .fusion-flexslider' ); // elevateZoom A Jquery Image Zoom Plugin is_elevateZoom = img.data( 'elevateZoom' ) || false; is_elevateZoom_obj = product_element.find( 'div.product-images .woocommerce-main-image' ); // EasyZoom jQuery image zoom plugin is_easyzoom = false; is_easyzoom_element = product_element.find( '.images .easyzoom' ); // new flatsome easyzoom is_easyzoom_flatsome = false; is_easyzoom_flatsome_element = product_element.find( '.images .easyzoom' ); // WooCommerce 2.7x gallery is_wc27_gallery = false; is_wc27_gallery_element = product_element.find( '.woocommerce-product-gallery' ); wc27_zoom_target = false; wc_single_product_params = window.wc_single_product_params; // fn.zoom is_zoom_enabled = typeof $.fn.zoom === 'function' && wc_single_product_params && wc_single_product_params.zoom_enabled; zoom_images = false; if ( window.yith_magnifier_options && yith_wcmg.data( 'yith_magnifier' ) ) { is_yith_wcmg = true; } if ( is_iosSlider_element.length && is_iosSlider_element.iosSlider ) { is_iosSlider = true; } if ( is_flexslider_element.length && is_flexslider_element.flexslider ) { is_flexslider = true; } if ( is_easyzoom_element.length && is_easyzoom_element.filter( '.images .easyzoom.first' ).data( 'easyZoom' ) ) { is_easyzoom_element = is_easyzoom_element.filter( '.images .easyzoom.first' ).data( 'easyZoom' ); is_easyzoom = true; } if ( ! is_easyzoom ) { is_easyzoom_flatsome_element = product_element.find( '.images .has-image-zoom .slide' ); if ( is_easyzoom_flatsome_element.length && is_easyzoom_flatsome_element.filter( '.images .has-image-zoom .slide.first' ).data( 'easyZoom' ) ) { is_easyzoom_flatsome_element = is_easyzoom_flatsome_element.filter( '.images .has-image-zoom .slide.first' ).data( 'easyZoom' ); is_easyzoom_flatsome = true; } } if ( document.readyState === 'complete' ) { setTimeout( function() { if ( is_easyzoom_element.length && is_easyzoom_element.data( 'easyZoom' ) ) { is_easyzoom_element = is_easyzoom_element.data( 'easyZoom' ); is_easyzoom = true; } if ( is_easyzoom_flatsome_element.length && is_easyzoom_flatsome_element.data( 'easyZoom' ) ) { is_easyzoom_flatsome_element = is_easyzoom_flatsome_element.data( 'easyZoom' ); is_easyzoom_flatsome = true; } }, 150 ); } else { jWindow.on( 'load', function() { setTimeout( function() { if ( is_easyzoom_element.length && is_easyzoom_element.data( 'easyZoom' ) ) { is_easyzoom_element = is_easyzoom_element.data( 'easyZoom' ); is_easyzoom = true; } if ( is_easyzoom_flatsome_element.length && is_easyzoom_flatsome_element.data( 'easyZoom' ) ) { is_easyzoom_flatsome_element = is_easyzoom_flatsome_element.data( 'easyZoom' ); is_easyzoom_flatsome = true; } }, 150 ); } ); } if ( is_wc27_gallery_element.length && is_wc27_gallery_element.data( 'flexslider' ) ) { is_wc27_gallery = true; if ( typeof $.fn.zoom === 'function' && wc_single_product_params && wc_single_product_params.zoom_enabled ) { zoom_target_temp = img.closest( '.woocommerce-product-gallery__image' ); if ( zoom_target_temp.length > 0 && img.width() > $( '.woocommerce-product-gallery' ).width() ) { wc27_zoom_target = zoom_target_temp; img.data.wc27_zoom_target = wc27_zoom_target; } } } if ( ! is_wc27_gallery && is_zoom_enabled ) { zoom_images = product_element.find( '.woocommerce-product-gallery__image' ); } gallery = { is_yith_wcmg: { type: 'yith', enabled: is_yith_wcmg, element: yith_wcmg, yith_wcmg_zoom: yith_wcmg_zoom, _yith_wcmg_default_zoom: _yith_wcmg_default_zoom, yith_wcmg_default_image: yith_wcmg_default_image }, is_iosSlider: { type: 'iosslider', enabled: is_iosSlider, element: is_iosSlider_element }, is_flexslider: { type: 'flexslider', enabled: is_flexslider, element: is_flexslider_element }, is_elevateZoom: { type: 'elevatezoom', enabled: is_elevateZoom, element: is_elevateZoom_obj }, is_easyzoom: { type: 'easyzoom', enabled: is_easyzoom, element: is_easyzoom_element }, is_easyzoom_flatsome: { type: 'easyzoom-flatsome', enabled: is_easyzoom_flatsome, element: is_easyzoom_flatsome_element }, is_wc27_gallery: { type: 'woocommerce', enabled: is_wc27_gallery, element: is_wc27_gallery_element }, is_zoom_enabled: { type: 'zoom', enabled: ! is_wc27_gallery && is_zoom_enabled, element: zoom_images } }; return gallery; } function tm_product_image_self( epoObject ) { var this_epo_container = epoObject.is_associated ? epoObject.this_epo_container : epoObject.this_epo_container.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector ); var variationsForm = epoObject.variations_form; var main_product = epoObject.main_product; var $form = epoObject.form; var img; var gallery_type; var product_element = get_product_element( epoObject ); var last_active_field = []; var t; var el; var el_current; var imp; var selector; var data; var eventNamePrefix = epoObject.is_associated ? 'tc_' : ''; img = get_main_product_image( epoObject, product_element ); gallery_type = get_gallery_type( epoObject, img, product_element ); if ( $( img ).length > 0 ) { $form.on( eventNamePrefix + 'reset_image.tcpi', function() { // restore product image atts from backup $.tc_product_image = $.tc_replace_object_values( $.tc_product_image, $.tc_product_image_store ); last_active_field = []; $( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) ) .add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) ) .each( function() { t = $( this ); if ( field_is_active( t ) && t.val() !== '' ) { last_active_field.push( t ); } } ); if ( last_active_field.length ) { last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' ); } else { $.tc_product_image_store = $.tc_populate_store( img, product_element ); } } ); $form.on( eventNamePrefix + 'found_variation.tcpi', function() { reset_saved_image( img, product_element ); last_active_field = []; $( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) ) .add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) ) .each( function() { t = $( this ); if ( field_is_active( t ) && t.val() !== '' ) { last_active_field.push( t ); } } ); if ( last_active_field.length ) { repopulate_backup_image_atts( img, product_element ); last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' ); } } ); $.tc_product_image_store = $.tc_maybe_copy_object_values_from_img( $.tc_product_image_store, img, product_element ); main_product.off( 'tm_change_product_image' ).on( 'tm_change_product_image', function( evt, event_data ) { evt.stopImmediatePropagation(); el = event_data.element; el_current = event_data.element_current; if ( el && el_current ) { imp = el.data( 'imagep' ); selector = ''; if ( imp !== '' ) { selector = 'imagep'; } else if ( el.data( 'changes-product-image' ) === 'images' ) { selector = 'image'; } data = event_data.element_current.data( 'image-variations' ); if ( data ) { data = data[ selector ]; } if ( data === undefined ) { // Enter the following if you want to restore the original product image // main_product.trigger( 'tm_restore_product_image', event_data ); return; } last_active_field = []; $( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) ) .add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) ) .each( function() { t = $( this ); if ( t.is( 'option' ) ) { t = t.closest( 'select' ); } if ( field_is_active( t ) && t.val() !== '' ) { last_active_field.push( t ); } } ); if ( last_active_field.length ) { if ( ! last_active_field[ last_active_field.length - 1 ].is( el ) ) { return; } } image_update( data, img, product_element ); gallery_compatibility_actions( gallery_type, img, data.image_link, false, event_data, $form, product_element ); } } ); main_product.off( 'tm_restore_product_image' ).on( 'tm_restore_product_image', function( evt, event_data ) { evt.stopImmediatePropagation(); el = event_data.element; last_active_field = []; if ( el ) { $( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) ) .add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) ) .each( function() { t = $( this ); if ( field_is_active( t ) && t.val() !== '' ) { last_active_field.push( t ); } } ); if ( last_active_field.length ) { if ( ! last_active_field[ last_active_field.length - 1 ].is( el ) ) { last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' ); return; } } } image_update( false, img, product_element ); gallery_compatibility_actions( gallery_type, false, img.attr( 'src' ), false, event_data, $form, product_element ); } ); last_active_field = []; $( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) ) .add( variationsForm.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) ) .each( function() { t = $( this ); if ( field_is_active( t ) && t.val() !== '' ) { last_active_field.push( t ); } } ); if ( last_active_field.length ) { last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' ); } } jWindow.trigger( 'tm_product_image_loaded' ); } function tm_product_image_inline( epoObject ) { var this_epo_container = epoObject.is_associated ? epoObject.this_epo_container : epoObject.this_epo_container.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector ); var main_product = epoObject.main_product; var product_id = epoObject.product_id; var $form = epoObject.form; var img; var product_element = get_product_element( epoObject ); var gallery_type; var a; var img_src_original; var img_width; var img_height; var last_active_field = []; var t; img = get_main_product_image( epoObject, product_element ); gallery_type = get_gallery_type( epoObject, img, product_element ); if ( $( img ).length > 0 ) { img.data( 'tm-current-image', false ); a = img.closest( 'a' ); img_src_original = img.attr( 'src' ); img_width = img.width(); img_height = img.height(); main_product.off( 'tm_change_product_image' ).on( 'tm_change_product_image', function( evt, e ) { var variation_element_section; var is_variation_element; var $this_epo_container; var tm_last_visible_image_element; var last_activate_field = []; var tm_current_image_element_id; var can_show_image; var $main_product; var $current_product_element; var preload_width; var preload_height; var current_cloned_image; var preloader; var clone_image; var preload_img; var preload_img_onerror; variation_element_section = e.element.closest( '.cpf-section' ); is_variation_element = variation_element_section.is( '.tm-epo-variation-section' ); $this_epo_container = e.epo_holder; if ( is_variation_element ) { $this_epo_container = variation_element_section; } tm_last_visible_image_element = $this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ); last_activate_field = []; tm_current_image_element_id = e.element.attr( 'id' ); can_show_image = true; $main_product = e.main_product; $current_product_element = $main_product.closest( '#product-' + product_id ); preload_width = img_width; preload_height = img_height; preloader = $( "
" ); if ( $current_product_element.length <= 0 ) { $current_product_element = $main_product.closest( '.post-' + product_id ); } current_cloned_image = $current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ); if ( current_cloned_image.length === 0 ) { current_cloned_image = img; } preload_img_onerror = function() { preloader.remove(); $form.tc_image_update( false ); img.data( 'tm-current-image', false ); $current_product_element.find( '.tm-clone-product-image' ).hide(); img.show(); }; if ( e.src === current_cloned_image.attr( 'src' ) && current_cloned_image.is( ':visible' ) ) { return; } if ( e.src === false ) { preload_img_onerror(); return; } preloader.css( { width: preload_width, height: preload_height } ); // Get last active field tm_last_visible_image_element.each( function() { t = $( this ); if ( field_is_active( t ) && has_active_changes_product_image( t ) && tm_check_field_match( { element: t.closest( '.cpf-element' ), operator: 'isnotempty', value: '' } ) ) { last_activate_field.push( t ); } } ); // Get last active image if ( last_activate_field.length ) { tm_last_visible_image_element = last_activate_field[ last_activate_field.length - 1 ]; } if ( tm_last_visible_image_element.attr( 'id' ) !== e.element.attr( 'id' ) ) { can_show_image = false; } clone_image = img.tcClone(); preload_img = new Image(); clone_image.removeAttr( 'data-o_src' ).removeAttr( 'data-o_title' ).removeAttr( 'data-o_alt' ).removeAttr( 'data-o_srcset' ).removeAttr( 'data-o_sizes' ).removeAttr( 'srcset' ).removeAttr( 'sizes' ); if ( can_show_image ) { img.before( preloader ); } gallery_type.is_yith_wcmg.yith_wcmg_default_zoom = gallery_type.is_yith_wcmg.element.find( '.yith_magnifier_zoom' ).first().attr( 'href' ); gallery_type.is_yith_wcmg.yith_wcmg_default_image = gallery_type.is_yith_wcmg.element.find( '.yith_magnifier_zoom img' ).first().attr( 'src' ); preload_img.onerror = function() { preload_img_onerror(); }; preload_img.onload = function() { if ( 'naturalHeight' in this ) { if ( this.naturalHeight + this.naturalWidth === 0 ) { this.onerror(); return; } } else if ( this.width + this.height === 0 ) { this.onerror(); return; } $current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).remove(); $current_product_element.find( '.tm-clone-product-image' ).hide(); clone_image.prop( 'src', preload_img.src ).hide(); img.hide().after( clone_image ); clone_image.css( 'opacity', 0 ).show(); gallery_compatibility_actions( gallery_type, clone_image, preload_img.src ); preloader.animate( { opacity: 0 }, 750, 'easeOutExpo', function() { preloader.remove(); } ); clone_image.animate( { opacity: 1 }, window.tc_epo_image_animation_delay || 1500, 'easeOutExpo', function() {} ); jWindow.trigger( 'tm_change_product_image_loaded', { src: e.src, element: e.element, main_product: e.main_product, epo_holder: e.epo_holder } ); }; clone_image .attr( 'id', tm_current_image_element_id + '_tmimage' ) .addClass( 'tm-clone-product-image' ) .hide(); if ( clone_image.attr( 'src-orig' ) ) { clone_image.attr( 'src-orig', e.src ); } if ( can_show_image ) { preload_img.src = e.src; $form.tc_image_update( e.element, clone_image ); img.data( 'tm-current-image', tm_current_image_element_id ); jWindow.trigger( 'tm_change_product_image_show', { src: e.src, element: e.element, main_product: e.main_product, epo_holder: e.epo_holder } ); } else { clone_image.prop( 'src', e.src ).hide(); img.after( clone_image ); } jWindow.trigger( 'tm_change_product_image_end', { src: e.src, element: e.element, main_product: e.main_product, epo_holder: e.epo_holder } ); } ); main_product.off( 'tm_restore_product_image' ).on( 'tm_restore_product_image', function( evt, e ) { var tm_current_image_element_id; var $main_product; var $current_product_element; var variation_element_section; var is_variation_element; var current_element; var current_image_replacement; var found; var is_it_visible; var len; var el_to_check; var imgSrc; var $this_epo_container; var i; jWindow.trigger( 'tm_restore_product_image_pre', { element: e.element, main_product: e.main_product, epo_holder: e.epo_holder } ); tm_current_image_element_id = e.element.attr( 'id' ); $main_product = e.main_product; $current_product_element = $main_product.closest( '#product-' + product_id ); variation_element_section = e.element.closest( '.cpf-section' ); is_variation_element = variation_element_section.is( '.tm-epo-variation-section' ); found = false; imgSrc = img_src_original; $this_epo_container = e.epo_holder; if ( is_variation_element ) { $this_epo_container = variation_element_section; } if ( $current_product_element.length <= 0 ) { $current_product_element = $main_product.closest( '.post-' + product_id ); } is_it_visible = $current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).is( ':visible' ); $current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).remove(); if ( $current_product_element.find( '.tm-clone-product-image' ).length === 0 ) { img.show(); img.data( 'tm-current-image', false ); $form.tc_image_update( false ); } else { if ( ! is_it_visible ) { jWindow.trigger( 'tm_restore_product_image_loaded_exit', { element: e.element, main_product: e.main_product, epo_holder: e.epo_holder } ); return; } len = $current_product_element.find( '.tm-clone-product-image' ).length; tm_current_image_element_id = img.data( 'tm-current-image' ); for ( i = len - 1; i >= 0; i -= 1 ) { current_image_replacement = $current_product_element.find( '.tm-clone-product-image' ).eq( i ); current_element = current_image_replacement.attr( 'id' ).replace( '_tmimage', '' ); el_to_check = $this_epo_container.find( "[id='" + current_element + "']" ); if ( el_to_check.is( ':checked' ) && el_to_check.closest( '.cpf-element' ).is( ':visible' ) ) { $current_product_element.find( '.tm-clone-product-image' ).eq( i ).show(); a.attr( 'href', $current_product_element.find( '.tm-clone-product-image' ).eq( i ).prop( 'src' ) ); img.data( 'tm-current-image', current_element ); found = true; break; } else { $current_product_element.find( '.tm-clone-product-image' ).eq( i ).hide(); } } if ( ! found ) { img.show(); img.data( 'tm-current-image', false ); $form.tc_image_update( false ); } else { $current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).remove(); } } if ( found ) { imgSrc = current_image_replacement.attr( 'src' ); } gallery_compatibility_actions( gallery_type, false, imgSrc, $current_product_element.find( '.tm-clone-product-image' ).filter( ':visible' ).length ); jWindow.trigger( 'tm_restore_product_image_loaded', { element: e.element, main_product: e.main_product, epo_holder: e.epo_holder } ); } ); main_product.off( 'tm_attempt_product_image' ).on( 'tm_attempt_product_image', function( evt, e ) { var $main_product; var $current_product_element; var variation_element_section; var is_variation_element; var $this_epo_container; var tm_last_visible_image_element; var last_activate_field; var tm_last_visible_image_element_id; var current_image_replacement; var current_element; var found; var tm_current_image_element_id; var len; var imgSrc; var el_to_check; var tmcie_id; var i; $main_product = e.main_product; $current_product_element = $main_product.closest( '#product-' + product_id ); if ( e.element ) { variation_element_section = e.element.closest( '.cpf-section' ); } else { variation_element_section = $( $main_product.find( '.tm-epo-variation-section' ).first(), e.epo_holder ); } is_variation_element = variation_element_section.is( '.tm-epo-variation-section' ); $this_epo_container = e.epo_holder; if ( is_variation_element ) { $this_epo_container = variation_element_section; } tm_last_visible_image_element = $this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ); last_activate_field = []; tm_last_visible_image_element_id = ''; found = false; tm_current_image_element_id = img.data( 'tm-current-image' ); imgSrc = img_src_original; if ( $current_product_element.length <= 0 ) { $current_product_element = $main_product.closest( '.post-' + product_id ); } $this_epo_container = $main_product.find( '.tm-epo-variation-section' ).first().add( e.epo_holder ); tm_last_visible_image_element = $this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ); tm_last_visible_image_element.each( function() { t = $( this ); if ( field_is_active( t ) && has_active_changes_product_image( t ) && tm_check_field_match( { element: t.closest( '.cpf-element' ), operator: 'isnotempty', value: '' } ) ) { last_activate_field.push( t ); } } ); if ( last_activate_field.length ) { tm_last_visible_image_element = last_activate_field[ last_activate_field.length - 1 ]; tm_last_visible_image_element_id = tm_last_visible_image_element.attr( 'id' ); } if ( last_activate_field.length && tm_last_visible_image_element.length && ( ! tm_current_image_element_id || tm_last_visible_image_element_id !== tm_current_image_element_id ) ) { tm_last_visible_image_element.last().trigger( 'tm_trigger_product_image' ); return; } tmcie_id = $this_epo_container.find( "[id='" + tm_current_image_element_id + "']" ).closest( '.cpf-element' ); if ( ! tm_current_image_element_id || ( tmcie_id.data( 'isactive' ) !== false && tmcie_id.closest( '.cpf-section' ).data( 'isactive' ) !== false ) ) { return; } $current_product_element.find( '#' + tm_current_image_element_id + '_tmimage' ).remove(); len = $current_product_element.find( '.tm-clone-product-image' ).length; if ( len === 0 ) { img.show(); img.data( 'tm-current-image', false ); $form.tc_image_update( false ); } else { for ( i = len - 1; i >= 0; i -= 1 ) { current_image_replacement = $current_product_element.find( '.tm-clone-product-image' ).eq( i ); current_element = current_image_replacement.attr( 'id' ).replace( '_tmimage', '' ); el_to_check = $this_epo_container.find( "[id='" + current_element + "']" ); if ( el_to_check.is( ':checked' ) && el_to_check.closest( '.cpf-element' ).is( ':visible' ) ) { $current_product_element.find( '.tm-clone-product-image' ).eq( i ).show(); a.attr( 'href', $current_product_element.find( '.tm-clone-product-image' ).eq( i ).prop( 'src' ) ); img.data( 'tm-current-image', current_element ); found = true; break; } else { $current_product_element.find( '.tm-clone-product-image' ).eq( i ).hide(); } } if ( ! found ) { img.show(); img.data( 'tm-current-image', false ); $form.tc_image_update( false ); } } if ( found ) { imgSrc = current_image_replacement.attr( 'src' ); } gallery_compatibility_actions( gallery_type, false, imgSrc, $current_product_element.find( '.tm-clone-product-image' ).filter( ':visible' ).length ); } ); $( this_epo_container.find( '.tm-product-image:checked,select.tm-product-image' ) ) .add( main_product.find( '.tm-epo-variation-section' ).first().find( '.tm-product-image:checked,select.tm-product-image' ) ) .each( function() { t = $( this ); if ( field_is_active( t ) && t.val() !== '' ) { last_active_field.push( t ); } } ); if ( last_active_field.length ) { last_active_field[ last_active_field.length - 1 ].trigger( 'tm_trigger_product_image' ); } } jWindow.trigger( 'tm_product_image_loaded' ); } function tm_product_image( epoObject ) { setTimeout( function() { if ( TMEPOJS.tm_epo_global_product_image_mode === 'inline' ) { tm_product_image_inline( epoObject ); } else { tm_product_image_self( epoObject ); } }, window.tc_epo_product_image_setup_delay || 0 ); } function tc_compatibility( epoObject ) { jWindow.trigger( 'tm-epo-compatibility', { epo: epoObject } ); } // Range picker setup function setRangePickers( obj ) { if ( ! noUiSlider ) { return; } obj.find( '.tm-range-picker' ) .toArray() .forEach( function( picker ) { var el = $( picker ); var $decimals = el.attr( 'data-step' ).split( '.' ); var $tmfid = obj.find( '#' + $.epoAPI.dom.id( el.attr( 'data-field-id' ) ) ); var $min = parseFloat( el.attr( 'data-min' ) ); var $max = parseFloat( el.attr( 'data-max' ) ); var $start = parseFloat( el.attr( 'data-start' ) ); var $step = parseFloat( el.attr( 'data-step' ) ); var $show_picker_value = el.attr( 'data-show-picker-value' ); var $show_label = el.closest( 'li' ).find( '.tm-show-picker-value' ); var $noofpips = parseFloat( el.attr( 'data-noofpips' ) ); var $pips = null; var $tmh; if ( el.data( 'tc-picker-init' ) ) { return; } el.data( 'tc-picker-init', 1 ); if ( $decimals.length === 1 ) { $decimals = 0; } else { $decimals = $decimals[ 1 ].length; } if ( ! Number.isFinite( $min ) ) { $min = 0; } if ( ! Number.isFinite( $max ) ) { $max = 0; } if ( $max <= $min ) { $max = parseFloat( $max ) + 1; } $start = $.epoAPI.math.unformat( $start, tcAPI.localDecimalSeparator ); if ( ! Number.isFinite( $start ) ) { $start = 0; } $start = formatPrice( $start, { precision: $decimals } ); if ( ! Number.isFinite( $step ) ) { $step = 0; } if ( ! Number.isFinite( $noofpips ) ) { $noofpips = 10; } if ( $noofpips < 2 ) { $noofpips = 2; } if ( el.attr( 'data-pips' ) === 'yes' ) { $pips = { mode: 'count', values: $noofpips, filter: function( value, type ) { value = parseFloat( $.epoAPI.math.toFixed( value, $decimals ) ); if ( $step <= 0 ) { return 0; } if ( type === 1 ) { if ( ! Number.isInteger( value ) ) { return 2; } } return type; }, format: { from: function( value ) { return $.epoAPI.math.unformat( value, tcAPI.localInputDecimalSeparator ); }, to: function( value ) { return formatPrice( value, { precision: $decimals } ); } }, density: 2 }; } noUiSlider.create( el.get( 0 ), { direction: TMEPOJS.text_direction, start: $start, step: $step, connect: 'lower', // Configure tapping, or make the selected range dragable. behaviour: 'tap', // Full number format support. format: { from: function( value ) { return $.epoAPI.math.unformat( value, tcAPI.localDecimalSeparator ); }, to: function( value ) { return formatPrice( value, { precision: $decimals } ); } }, // Support for non-linear ranges by adding intervals. range: { min: [ $min ], max: [ $max ] }, pips: $pips, tooltips: { from: function( value ) { return $.epoAPI.math.unformat( value, tcAPI.localInputDecimalSeparator ); }, to: function( value ) { return formatPrice( value, { precision: $decimals } ); } } } ); $tmh = el.find( '.noui-handle-lower' ); el.get( 0 ).noUiSlider.on( 'slide', function() { $tmh.trigger( 'tmmovetooltip' ); $tmfid.trigger( 'change.cpf' ); } ); el.get( 0 ).noUiSlider.on( 'update', function( values, handle ) { values[ handle ] = $.epoAPI.math.unformat( values[ handle ], tcAPI.localDecimalSeparator ); handle = 0; //fixes rtl issue. if ( $show_picker_value !== 'left' && $show_picker_value !== 'right' ) { $tmh.attr( 'title', formatPrice( values[ handle ], { precision: $decimals } ) ); } $tmfid.val( values[ handle ] ).trigger( 'change' ); if ( $show_picker_value !== '' ) { $show_label.html( formatPrice( values[ handle ], { precision: $decimals } ) ); } } ); if ( $show_picker_value !== '' ) { $show_label.html( $start ); } if ( $show_picker_value !== 'left' && $show_picker_value !== 'right' ) { $tmh.attr( 'title', $start ); el.addClass( 'noui-show-tooltip' ); } } ); } // Range picker event setup function setRangePickersEvents() { if ( ! noUiSlider || jDocument.data( 'setRangePickersEvents' ) ) { return; } jDocument.on( 'click', '.tm-show-picker-value', function() { var $this = $( this ); var li = $this.closest( '.tmcp-field-wrap' ); var value = li.find( '.tmcp-range' ).val(); var edit; var html5Slider = $this.closest( '.tmcp-field-wrap' ).find( '.tm-range-picker' ); $this.addClass( 'tc-hidden' ).after( $( '' ) ); edit = li.find( '.tm-show-picker-value-edit' ); edit.focus().val( value ).wrap( '
' ); edit.attr( 'step', html5Slider.attr( 'data-step' ) ); edit.attr( 'min', html5Slider.attr( 'data-min' ) ); edit.attr( 'max', html5Slider.attr( 'data-max' ) ); jDocument.data( 'range-picker-edit', li.find( '.tm-show-picker-value-edit' ) ); } ); jDocument.on( 'change input', '.tm-show-picker-value-edit', function() { var $this = $( this ); var html5Slider = $this.closest( '.tmcp-field-wrap' ).find( '.tm-range-picker' ); var $decimals = html5Slider.attr( 'data-step' ).split( '.' ); var value = $this.val(); if ( $decimals.length === 1 ) { $decimals = 0; } else { $decimals = $decimals[ 1 ].length; } html5Slider.get( 0 ).noUiSlider.set( [ formatPrice( value, { precision: $decimals } ), null ] ); } ); jDocument.on( 'keydown', '.tm-show-picker-value-edit', function( event ) { var key; if ( window.event ) { key = window.event.keyCode; } else { key = event.which; } if ( key === 13 ) { event.preventDefault(); } } ); jDocument.on( 'click', function( event ) { var $this; if ( ! jDocument.data( 'range-picker-edit' ) || $( event.target ).is( '.tm-show-picker-value' ) ) { return; } if ( $( event.target ).closest( '.tm-show-picker-value-edit-wrap' ).length === 0 ) { $this = jDocument.data( 'range-picker-edit' ); $this.closest( '.tmcp-field-wrap' ).find( '.tm-show-picker-value' ).data( 'has-edit', 0 ).removeClass( 'tc-hidden' ); $this.closest( '.tm-show-picker-value-edit-wrap' ).remove(); jDocument.removeData( 'range-picker-edit' ); } } ); jDocument.data( 'setRangePickersEvents', 1 ); } function validate_date_with_options( date, inputElement ) { var input = $( inputElement ); var inst = $.tm_datepicker._getInst( input[ 0 ] ); var enabled_only_dates = input.data( 'tc-enabled_only_dates' ); var disabled_weekdays = input.data( 'tc-disabled_weekdays' ); var disabled_months = input.data( 'tc-disabled_months' ); var disabled_dates = input.data( 'tc-disabled_dates' ); var format = input.data( 'tc-format' ); var day = date.getDay(); var month = date.getDay() + 1; var string; if ( ! $.tm_datepicker._isInRange( inst, date ) ) { return false; } if ( enabled_only_dates !== '' ) { string = $.tm_datepicker.formatDate( format, date ); return enabled_only_dates.indexOf( string ) !== -1; } if ( disabled_weekdays.indexOf( day.toString() ) !== -1 ) { return false; } if ( disabled_months.indexOf( month.toString() ) !== -1 ) { return false; } if ( disabled_dates !== '' ) { string = $.tm_datepicker.formatDate( format, date ); return disabled_dates.indexOf( string ) === -1; } return true; } function correctDate( days ) { var sign, testDate, count, added, noOfDaysToAdd; if ( days.toString().isNumeric() ) { sign = days === 0 ? days : ( days > 0 ? 1 : -1 ); if ( sign !== 0 ) { testDate = new Date(); count = 1; added = false; noOfDaysToAdd = Math.abs( days ); while ( count <= noOfDaysToAdd ) { if ( added === false ) { added = 0; } testDate.setDate( testDate.getDate() + ( 1 * sign ) ); added++; if ( testDate.getDay() !== 0 && testDate.getDay() !== 6 ) { count++; } } if ( added !== false ) { days = added * sign; } } } return days; } // Date and time picker setup function tm_set_datepicker( obj ) { var inputIds; var elem; var timepickerSelector = '.tm-epo-timepicker'; if ( ! $.tm_datepicker ) { return; } inputIds = $( 'input' ) .map( function() { return this.id; } ) .get() .join( ' ' ); elem = document.createElement( 'input' ); elem.setAttribute( 'type', 'date' ); if ( elem.type === 'text' ) { timepickerSelector = '.tm-epo-system-timepicker'; } obj.find( timepickerSelector ) .toArray() .forEach( function( el ) { var field = $( el ); var _mintime = null; var _maxtime = null; var format = field.attr( 'data-time-format' ).trim(); var date_theme = field.attr( 'data-time-theme' ).trim(); var date_theme_size = field.attr( 'data-time-theme-size' ).trim(); var date_theme_position = field.attr( 'data-time-theme-position' ).trim(); var data_tranlation_hour = field.attr( 'data-tranlation-hour' ).trim(); var data_tranlation_minute = field.attr( 'data-tranlation-minute' ).trim(); var data_tranlation_second = field.attr( 'data-tranlation-second' ).trim(); field.attr( 'type', 'text' ); if ( field.attr( 'data-min-time' ).trim() !== '' ) { _mintime = field.attr( 'data-min-time' ).trim(); } if ( field.attr( 'data-max-time' ).trim() !== '' ) { _maxtime = field.attr( 'data-max-time' ).trim(); } if ( field.attr( 'data-custom-time-format' ).trim() !== '' ) { format = field.attr( 'data-custom-time-format' ).trim(); } if ( ! data_tranlation_hour ) { data_tranlation_hour = TMEPOJS.hourText; } if ( ! data_tranlation_minute ) { data_tranlation_minute = TMEPOJS.minuteText; } if ( ! data_tranlation_second ) { data_tranlation_second = TMEPOJS.secondText; } field.tm_timepicker( Object.assign( { isRTL: TMEPOJS.isRTL, hourText: data_tranlation_hour, minuteText: data_tranlation_minute, secondText: data_tranlation_second, timeFormat: format, minTime: _mintime, maxTime: _maxtime, closeText: TMEPOJS.closeText, showOn: 'both', buttonText: '', beforeShow: function( input, inst ) { $( inst.dpDiv ) .removeClass( inputIds ) .removeClass( 'tm-ui-skin-epo tm-ui-skin-epo-black tm-datepicker-medium tm-datepicker-small tm-datepicker-large tm-datepicker-normal tm-datepicker-top tm-datepicker-bottom' ) .addClass( this.id + ' tm-bsbb-all tm-ui-skin-' + date_theme + ' tm-timepicker tm-datepicker tm-datepicker-' + date_theme_position + ' tm-datepicker-' + date_theme_size ) .appendTo( 'body' ); jDocument.off( 'click', '.tm-ui-dp-overlay' ).on( 'click', '.tm-ui-dp-overlay', function() { field.tm_timepicker( 'hide' ); } ); jBody.addClass( 'tm-static' ); field.prop( 'readonly', true ); jWindow.trigger( { type: 'tm-timepicker-beforeShow', input: input, inst: inst } ); }, onClose: function() { jBody.removeClass( 'tm-static' ); field.prop( 'readonly', false ); field.trigger( 'change' ); } }, window.timepicker_settings || {} ) ); $( '#ui-tm-datepicker-div' ).hide(); } ); obj.find( '.tm-epo-datepicker' ) .toArray() .forEach( function( el ) { var field = $( el ); var startDate = parseInt( field.attr( 'data-start-year' ).trim(), 10 ); var endDate = parseInt( field.attr( 'data-end-year' ).trim(), 10 ); var minDate = field.attr( 'data-min-date' ).trim(); var maxDate = field.attr( 'data-max-date' ).trim(); var disabled_dates = field.attr( 'data-disabled-dates' ).trim(); var enabled_only_dates = field.attr( 'data-enabled-only-dates' ).trim(); var exlude_disabled = field.attr( 'data-exlude-disabled' ).trim(); var disabled_weekdays = field.attr( 'data-disabled-weekdays' ).trim().split( ',' ); var disabled_months = field.attr( 'data-disabled-months' ).trim().split( ',' ); var format = field.attr( 'data-date-format' ).trim(); var show = field.attr( 'data-date-showon' ).trim(); var default_date = field.attr( 'data-date-defaultdate' ).trim(); var date_theme = field.attr( 'data-date-theme' ).trim(); var date_theme_size = field.attr( 'data-date-theme-size' ).trim(); var date_theme_position = field.attr( 'data-date-theme-position' ).trim(); var $split; var $index; var $split2; var $index2; if ( disabled_dates !== '' ) { $split = disabled_dates.split( ',' ); $index = disabled_dates.indexOf( ',' ); if ( $index !== -1 && $split.length > 0 ) { disabled_dates = $split; } } if ( enabled_only_dates !== '' ) { $split2 = enabled_only_dates.split( ',' ); $index2 = enabled_only_dates.indexOf( ',' ); if ( $index2 !== -1 && $split2.length > 0 ) { enabled_only_dates = $split2; } } if ( minDate === '' ) { if ( startDate === '' ) { minDate = null; } else { minDate = new Date( startDate, 1 - 1, 1 ); } } else if ( exlude_disabled ) { minDate = correctDate( minDate ); } if ( maxDate === '' ) { if ( endDate === '' ) { maxDate = null; } else { maxDate = new Date( endDate, 12 - 1, 31 ); } } else if ( exlude_disabled ) { maxDate = correctDate( maxDate ); } field.data( 'tc-enabled_only_dates', enabled_only_dates ); field.data( 'tc-disabled_weekdays', disabled_weekdays ); field.data( 'tc-disabled_months', disabled_months ); field.data( 'tc-disabled_dates', disabled_dates ); field.data( 'tc-format', format ); field.tm_datepicker( { monthNames: TMEPOJS.monthNames, monthNamesShort: TMEPOJS.monthNamesShort, dayNames: TMEPOJS.dayNames, dayNamesShort: TMEPOJS.dayNamesShort, dayNamesMin: TMEPOJS.dayNamesMin, isRTL: TMEPOJS.isRTL, showOtherMonths: true, selectOtherMonths: true, showOn: show, defaultDate: default_date, buttonText: '', showButtonPanel: true, firstDay: TMEPOJS.first_day, closeText: TMEPOJS.closeText, currentText: TMEPOJS.currentText, dateFormat: format, minDate: minDate, maxDate: maxDate, onSelect: function() { var input = $( this ); var id = '#' + $.epoAPI.dom.id( input.attr( 'id' ) ); var date = input.tm_datepicker( 'getDate' ); var day = ''; var month = ''; var year = ''; var day_field = obj.find( id + '_day' ); var month_field = obj.find( id + '_month' ); var year_field = obj.find( id + '_year' ); var string; var ld; if ( date ) { day = date.getDate(); month = date.getMonth() + 1; year = date.getFullYear(); string = $.tm_datepicker.formatDate( format, date ); if ( disabled_months.indexOf( month.toString() ) !== -1 || disabled_weekdays.indexOf( date.getDay().toString() ) !== -1 || disabled_dates.indexOf( string ) !== -1 || ( enabled_only_dates !== '' && enabled_only_dates.indexOf( string ) === -1 ) ) { ld = input.data( 'tm-last-date' ); if ( input.data( 'tm-last-date' ) ) { ld = input.data( 'tm-last-date' ); } else { ld = ''; } input.val( ld ); input.tm_datepicker( 'setDate', ld ); if ( ld ) { date = input.tm_datepicker( 'getDate' ); day = date.getDate(); month = date.getMonth() + 1; year = date.getFullYear(); } else { day = ''; month = ''; year = ''; } } } day_field.val( day ); month_field.val( month ); year_field.val( year ); input.data( 'tm-last-date', input.val() ); }, beforeShow: function( input, inst ) { $( inst.dpDiv ) .removeClass( inputIds ) .removeClass( 'tm-datepicker-normal tm-datepicker-top tm-datepicker-bottom' ) .addClass( this.id + ' tm-bsbb-all tm-ui-skin-' + date_theme + ' tm-datepicker tm-datepicker-' + date_theme_position + ' tm-datepicker-' + date_theme_size ) .appendTo( 'body' ); jDocument.off( 'click', '.tm-ui-dp-overlay' ).on( 'click', '.tm-ui-dp-overlay', function() { field.tm_datepicker( 'hide' ); } ); jDocument.off( 'click', '.ui-tm-datepicker-current' ).on( 'click', '.ui-tm-datepicker-current', function() { var tempDate = new Date(), today = $.tm_datepicker._daylightSavingAdjust( new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ); var day = today.getDay(); var month = today.getMonth() + 1; var id = '#' + inst.id.replace( /\\\\/g, '\\' ); var check = false; var string; var date = field.tm_datepicker( 'getDate' ); if ( enabled_only_dates !== '' ) { string = $.tm_datepicker.formatDate( format, date ); check = enabled_only_dates.indexOf( string ) !== -1; } else if ( disabled_months.indexOf( month.toString() ) !== -1 || disabled_weekdays.indexOf( day.toString() ) !== -1 ) { check = false; } else { if ( disabled_dates !== '' ) { string = $.tm_datepicker.formatDate( format, date ); return [ disabled_dates.indexOf( string ) === -1, '' ]; } check = true; } if ( check ) { $.tm_datepicker._setDate( inst, today ); $.tm_datepicker._gotoToday( id ); } } ); jBody.addClass( 'tm-static' ); field.prop( 'readonly', true ); jWindow.trigger( { type: 'tm-datepicker-beforeShow', input: input, inst: inst } ); }, onClose: function() { jBody.removeClass( 'tm-static' ); field.prop( 'readonly', false ); field.trigger( 'change' ); }, beforeShowDay: function( date ) { var day = date.getDay(); var month = date.getMonth() + 1; var string; if ( enabled_only_dates !== '' ) { string = $.tm_datepicker.formatDate( format, date ); return [ enabled_only_dates.indexOf( string ) !== -1, '' ]; } if ( disabled_months.indexOf( month.toString() ) !== -1 || disabled_weekdays.indexOf( day.toString() ) !== -1 ) { return [ false, '' ]; } if ( disabled_dates !== '' ) { string = $.tm_datepicker.formatDate( format, date ); return [ disabled_dates.indexOf( string ) === -1, '' ]; } return [ true, '' ]; } } ); $( '#ui-tm-datepicker-div' ).hide(); } ); obj.find( '.tmcp-date-select' ) .on( 'change.cpf', function() { var id = '#' + $.epoAPI.dom.id( $( this ).attr( 'data-tm-date' ) ); var input = obj.find( id ); var format = input.attr( 'data-date-format' ); var day = obj.find( id + '_day' ).val(); var month = obj.find( id + '_month' ).val(); var year = obj.find( id + '_year' ).val(); var dateFormat = $.tm_datepicker.formatDate( format, new Date( year, parseInt( month, 10 ) - 1, day ) ); if ( day > 0 && month > 0 && year > 0 ) { input.tm_datepicker( 'setDate', dateFormat ); input.trigger( 'change' ); } else { input.val( '' ); input.trigger( 'change.cpf' ); } } ) .on( 'focus.cpf', function() { var id = '#' + $.epoAPI.dom.id( $( this ).attr( 'data-tm-date' ) ); var input = obj.find( id ); var day_select = obj.find( id + '_day' ); var month_select = obj.find( id + '_month' ); var year_select = obj.find( id + '_year' ); var day = day_select.val(); var month = month_select.val(); var year = year_select.val(); var _select = $( this ); if ( ( year !== '' && month !== '' && day !== '' ) || ( year !== '' && month !== '' && day === '' ) || ( day !== '' && year !== '' && month === '' ) || ( day !== '' && month !== '' && year === '' ) ) { _select .find( 'option' ) .toArray() .forEach( function( element ) { var option = $( element ); var val = option.val(); var date_string = year + '-' + month + '-' + day; var d; if ( _select.is( '.tmcp-date-day' ) ) { if ( year === '' || month === '' ) { return; } date_string = year + '-' + month + '-' + val; } else if ( _select.is( '.tmcp-date-month' ) ) { if ( year === '' || day === '' ) { return; } date_string = year + '-' + val + '-' + day; } else if ( _select.is( '.tmcp-date-year' ) ) { if ( day === '' || month === '' ) { return; } date_string = val + '-' + month + '-' + day; } if ( val !== '' ) { try { d = $.tm_datepicker.parseDate( 'yy-mm-dd', date_string ); if ( d ) { if ( validate_date_with_options( d, input ) ) { option.prop( 'disabled', false ); } else { option.prop( 'disabled', true ); } } } catch ( err ) { window.console.log( err ); option.prop( 'disabled', true ); errorObject = err; } } } ); } else { day_select.find( 'option' ).prop( 'disabled', false ); month_select.find( 'option' ).prop( 'disabled', false ); year_select.find( 'option' ).prop( 'disabled', false ); } } ); jWindow.on( 'resizestart', function() { var activeElement = $( document.activeElement ); if ( activeElement.is( '.hasDatepicker' ) ) { activeElement.data( 'resizestarted', true ); // we don't use jWindow here because we want the current window width if ( $( window ).width() < 768 ) { activeElement.data( 'resizewidth', true ); return; } activeElement.tm_datepicker( 'hide' ); } } ); jWindow.on( 'resizestop', function() { var activeElement = $( document.activeElement ); if ( activeElement.is( '.hasDatepicker' ) && activeElement.data( 'resizestarted' ) ) { if ( activeElement.data( 'resizewidth' ) ) { activeElement.tm_datepicker( 'hide' ); } activeElement.tm_datepicker( 'show' ); } activeElement.data( 'resizestarted', false ); activeElement.data( 'resizewidth', false ); } ); } function apply_submit_events( epoObject ) { var epoEventId = epoObject.epoEventId; var main_product = epoObject.main_product; var type; var form_is_submit = ! $.tcepo.formSubmitEvents[ epoEventId ].some( function( form_event ) { return typeof form_event && ( typeof form_event.trigger === 'function' || false ) && ! form_event.trigger(); } ); $.tcepo.formSubmitEvents[ epoEventId ].forEach( function( form_event ) { type = typeof form_event; if ( type === 'object' ) { if ( form_is_submit ) { form_event.on_true(); } else { form_event.on_false(); } } } ); if ( ! form_is_submit ) { setTimeout( function() { main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled' ).removeClass( 'loading' ).prop( 'disabled', false ).removeClass( 'fpd-disabled' ); }, 100 ); } jWindow.trigger( 'tm-apply-submit-events', { epo: { form_is_submit: form_is_submit } } ); return form_is_submit; } function tm_apply_validation( epoObject ) { var form = epoObject.form; var this_epo_container = epoObject.this_epo_container; var main_product = epoObject.main_product; var epoEventId = epoObject.epoEventId; var validation_rules; var has_rules; if ( TMEPOJS.tm_epo_global_enable_validation === 'yes' ) { validation_rules = {}; this_epo_container .find( '.tmcp-ul-wrap' ) .toArray() .forEach( function( tmcpulwrap ) { var field; var field_name; var subFieldName; var subRule; var productField; tmcpulwrap = $( tmcpulwrap ); has_rules = tmcpulwrap.data( 'tm-validation' ); if ( has_rules && $.tmType( has_rules ) === 'object' ) { field = tmcpulwrap.find( '.tm-epo-field' ); field_name = field.first().attr( 'name' ); if ( tmcpulwrap.is( '.tm-extra-product-options-radio.tm-element-ul-radio' ) ) { field_name = field.last().attr( 'name' ); validation_rules[ field_name ] = has_rules; } else if ( tmcpulwrap.is( '.tm-extra-product-options-checkbox.tm-element-ul-checkbox' ) ) { field.each( function( f, fname ) { if ( 'required' in has_rules ) { has_rules.required = function( elem ) { var len = tmcpulwrap.find( 'input.tm-epo-field.tmcp-checkbox:checked' ).length; if ( len === 0 ) { if ( field.last().attr( 'name' ) === $( elem ).attr( 'name' ) ) { return true; } return false; } return len <= 0; }; } validation_rules[ $( fname ).attr( 'name' ) ] = has_rules; } ); } else if ( tmcpulwrap.is( '.tm-extra-product-options-product.tm-element-ul-product' ) ) { if ( field.is( ':checkbox' ) ) { field.each( function( f, fname ) { if ( 'required' in has_rules ) { productField = $( fname ); if ( productField.is( ':checkbox' ) ) { has_rules.required = function( elem ) { var checkedFields = tmcpulwrap.find( 'input.tm-epo-field.tmcp-checkbox:checked' ); var len = checkedFields.length; var qtyCheck; if ( len === 0 ) { if ( field.last().attr( 'name' ) === $( elem ).attr( 'name' ) ) { return true; } return false; } qtyCheck = checkedFields.map( function() { return $( this ); } ).get().some( function( element ) { return element.closest( '.tc-epo-element-product-holder' ).find( '.tm-qty' ).first().val() <= 0; } ); if ( len > 0 ) { return qtyCheck; } return len <= 0; }; if ( productField.attr( 'data-type' ) === 'variable' ) { subFieldName = productField.closest( '.tc-epo-element-product-holder' ).find( '.product-variation-id' ).first().attr( 'name' ); subRule = { required: function( elem ) { var element = $( elem ); var holder = element.closest( '.tc-epo-element-product-holder' ); var checkbox = holder.find( '.tc-epo-field-product' ); if ( field_is_active( checkbox, true ) && checkbox.is( ':checked' ) ) { return true; } return false; } }; validation_rules[ subFieldName ] = subRule; } } } validation_rules[ productField.attr( 'name' ) ] = has_rules; } ); } else if ( field.is( ':radio' ) ) { has_rules.product_element_radio_qty = true; validation_rules[ field.attr( 'name' ) ] = has_rules; subFieldName = field.closest( '.tc-element-container' ).find( '.product-variation-id' ).first().attr( 'name' ); subRule = { required: function( elem ) { var element = $( elem ); var holder = element.closest( '.tc-element-container' ); var radiobutton = holder.find( '.tc-epo-field-product:checked' ); if ( radiobutton.length && radiobutton.attr( 'data-type' ) === 'variable' && field_is_active( radiobutton, true ) && radiobutton.is( ':checked' ) ) { return true; } return false; } }; validation_rules[ subFieldName ] = subRule; } else if ( field.is( 'select' ) ) { has_rules.product_element_select_qty = true; validation_rules[ field.attr( 'name' ) ] = has_rules; subFieldName = field.closest( '.tc-element-container' ).find( '.product-variation-id' ).first().attr( 'name' ); subRule = { required: function( elem ) { var element = $( elem ); var holder = element.closest( '.tc-element-container' ); var select = holder.find( '.tc-epo-field-product' ); if ( select.length && select.children( ':selected' ).attr( 'data-type' ) === 'variable' && field_is_active( select, true ) ) { return true; } return false; } }; validation_rules[ subFieldName ] = subRule; } } else { validation_rules[ field_name ] = has_rules; } } } ); form.removeData( 'tc_validator' ); form.tc_validate( { focusInvalid: false, ignore: tcAPI.qtySelector + ",.tcdisabled,.tmcp-upload-hidden,#wc_bookings_field_duration,input.tm-qty:hidden[type='number'],input.input-text.qty,.ignore,.variations select,.tc-epo-variable-product-selector,.tm-extra-product-options-variations input,.tm-extra-product-options-variations select,input:not(.tc-extra-product-options input),select:not(.tc-extra-product-options select)", rules: validation_rules, errorClass: 'tm-error', validClass: 'tm-valid', errorElement: 'label', errorPlacement: function( error, element ) { error.addClass( 'tc-cell tcwidth-100' ); if ( TMEPOJS.tm_epo_global_error_label_placement === 'before' ) { element.closest( '.tc-element-container' ).before( error ); } else { element.closest( '.tc-element-container' ).after( error ); } return false; }, invalidHandler: function( event, validator ) { jWindow.trigger( 'tm-invalidHandler', { epo: { validator: validator } } ); setTimeout( function() { if ( ! main_product.find( tcAPI.addToCartButtonSelector ).first().is( '.disabled' ) ) { main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'loading' ).prop( 'disabled', false ).removeClass( 'fpd-disabled' ); main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled' ).removeClass( 'loading' ).prop( 'disabled', false ).removeClass( 'fpd-disabled' ); } }, 100 ); if ( validator.errorList && validator.errorList[ 0 ] && validator.errorList[ 0 ].element ) { goto_error_item( $( validator.errorList[ 0 ].element ), epoEventId ); } }, submitHandler: function() { var ajaxSuccessFunc; if ( ! epoObject.is_quickview ) { main_product.find( tcAPI.addToCartButtonSelector ).first().addClass( 'disabled' ); ajaxSuccessFunc = function() { main_product.find( tcAPI.addToCartButtonSelector ).first().removeClass( 'disabled' ); jDocument.off( 'ajaxSuccess', ajaxSuccessFunc ); }; jDocument.on( 'ajaxSuccess', ajaxSuccessFunc ); } return apply_submit_events( epoObject ); } } ); // This should handle most ajax based add to cart solutions form.find( tcAPI.addToCartButtonSelector ).on( 'click', function( e ) { if ( ! form.tc_validate().form() ) { e.preventDefault(); e.stopImmediatePropagation(); } } ); return true; } return false; } function tm_form_submit_event( epoObject ) { var form = epoObject.form; var epoEventId = epoObject.epoEventId; jWindow.trigger( 'tm-from-submit', { epo: epoObject, functions: { tm_apply_validation: tm_apply_validation, apply_submit_events: apply_submit_events } } ); if ( ! tm_apply_validation( epoObject ) && $.tcepo.formSubmitEvents[ epoEventId ].length ) { form.on( 'submit', function() { apply_submit_events( epoObject ); } ); } } function found_variation_tmepo( dataObject ) { var epoHolder = dataObject.epoHolder; var totalsHolder = dataObject.totalsHolder; var totalsHolderContainer = dataObject.totalsHolderContainer; var currentCart = dataObject.currentCart; var variationForm = dataObject.variationForm; var variation = dataObject.variation; var variations = totalsHolder.data( 'variations' ); var product_price; totalsHolder.data( 'current_variation', variation ); /** * Currency converters that don't allow multi currency checkout will fail the following if statement * * if (variation.display_price!=undefined) { * product_price = variation.display_price; * totalsHolder.data('price', product_price); * } else ... * */ // This needs to be the first check as the next one // fails for taxed products as it displays the backend price only. if ( variation && 'display_price' in variation && ! totalsHolder.data( 'tm-epo-is-woocs' ) ) { product_price = variation.display_price; totalsHolder.data( 'priceIsWithDiscount', '1' ); // Fancy product Designer totalsHolder.removeData( 'tcprice' ); } else if ( variations && variation && variation.variation_id && variations[ variation.variation_id ] !== undefined ) { product_price = variations[ variation.variation_id ]; // Fancy product Designer totalsHolder.removeData( 'tcprice' ); } else if ( variation && $( variation.price_html ).find( '.amount:last' ).length ) { product_price = $( variation.price_html ).find( '.amount:last' ).text(); product_price = product_price.replace( TMEPOJS.currency_format_thousand_sep, '' ); product_price = product_price.replace( TMEPOJS.currency_format_decimal_sep, '.' ); product_price = product_price.replace( /[^0-9.]/g, '' ); product_price = parseFloat( product_price ); // Fancy product Designer totalsHolder.removeData( 'tcprice' ); } product_price = tm_set_backend_price( product_price, totalsHolder, variation ); totalsHolder.data( 'price', product_price ); totalsHolderContainer.find( '.cpf-product-price' ).val( product_price ); setTimeout( function() { epoHolder.find( 'select.tm-epo-field' ).trigger( 'tm-select-change-html-all-math' ); }, 100 ); // This must be run every time to get correct results for percent price types // if set norules then discount will not auto work upon chosing a variation if ( ! variationForm.data( 'tm-styled-variations' ) ) { currentCart.trigger( { type: 'tm-epo-update' } ); } } function fetchOptionPrices( epoObject, epoHolder, selector, total, original_total, floatingBoxData, showTotal, forced, setPriceTax, useUndiscountedPrice ) { var obj; var noDpd; var priceArray; var priceCacheSelector = epoHolder.attr( 'class' ) + epoHolder.attr( 'data-uniqid' ) + selector + epoObject.is_associated + setPriceTax + forced + setPriceTax + useUndiscountedPrice || 'none'; if ( priceCacheSelector !== 'none' && priceCache !== true && priceCache !== false && priceCache[ priceCacheSelector ] !== undefined ) { return priceCache[ priceCacheSelector ]; } noDpd = useUndiscountedPrice ? 'undiscounted_' : ''; obj = epoHolder.find( selector ); if ( epoObject.is_associated === false ) { obj = obj.not( tcAPI.associatedEpoSelector + ' ' + selector ); } if ( ! forced ) { obj = obj.filter( '.tcenabled' ); } if ( ! total ) { total = 0; } if ( ! original_total ) { original_total = 0; } if ( ! floatingBoxData ) { floatingBoxData = []; } obj.toArray().forEach( function( tmcpfield ) { var field = $( tmcpfield ); var _value = ''; var fieldval; var field_div = field.closest( '.cpf-element' ); var field_wrap = field.closest( '.tmcp-field-wrap' ); var field_label_show = field_div.attr( 'data-fblabelshow' ); var field_value_show = field_div.attr( 'data-fbvalueshow' ); var field_title = ''; var option_quantity = field_wrap.find( '.tm-qty' ).val(); var option_price; var option_price_taxed; var option_original_price; var option_original_price_taxed; var liw; var cri; var tl; var options; var forrangepicker; var $decimals; var _valueText = ''; var setter; var dofloatingBoxData = false; if ( field_label_show === '' ) { field_title = field_div.find( '.tc-epo-label' ).html(); } if ( option_quantity === undefined ) { option_quantity = ''; } if ( field.is( ':checkbox, :radio, :input' ) ) { option_price = 0; option_price_taxed = 0; option_original_price = 0; option_original_price_taxed = 0; if ( field.is( '.tmcp-checkbox, .tmcp-radio' ) ) { if ( forced || field.is( ':checked' ) ) { option_price = field.data( noDpd + 'raw_price' ); option_price_taxed = field.data( noDpd + 'price' ); option_original_price = field.data( noDpd + 'raw_original_price' ); option_original_price_taxed = field.data( noDpd + 'original_price' ); showTotal = true; field.data( 'isset', 1 ); liw = field.closest( 'li.tmcp-field-wrap' ); cri = liw.find( '.checkbox-image,.radio-image' ); _value = ''; _valueText = ''; tl = field.closest( 'li.tmcp-field-wrap' ).find( '.tm-label' ); if ( tl.length ) { _value = tl.html(); _valueText = _value; } if ( cri.length ) { if ( field.closest( '.tmcp-ul-wrap' ).is( '.tc-colors-container' ) ) { _value = _value + cri.closest( '.tc-label-wrap' ).clone().addClass( 'tc-img-floating' )[ 0 ].outerHTML; } else { _value = _value + cri.clone().addClass( 'tc-img-floating' )[ 0 ].outerHTML; } } if ( field.closest( '.tmcp-ul-wrap' ).is( '.tc-images-container' ) ) { _value = liw.find( '.tc-label' ).first().html(); _valueText = _value; if ( cri.length ) { _value = _value + ''; } } dofloatingBoxData = true; } else { field.data( 'isset', 0 ); } } else if ( field.is( '.tmcp-select' ) ) { setter = field.find( 'option:selected' ); option_price = setter.data( noDpd + 'raw_price' ); option_price_taxed = setter.data( noDpd + 'price' ); option_original_price = setter.data( noDpd + 'raw_original_price' ); option_original_price_taxed = setter.data( noDpd + 'original_price' ); options = field.children( 'option:selected' ); if ( ! ( options.val() === '' && options.attr( 'data-rulestype' ) === '' ) ) { showTotal = true; } field.find( 'option' ).data( 'isset', 0 ); setter.data( 'isset', 1 ); if ( ! ( setter.val() === '' && setter.attr( 'data-rulestype' ) === '' ) ) { _value = setter.attr( 'data-text' ); dofloatingBoxData = true; _valueText = _value; } } else if ( field.is( '.tmcp-selectmultiple' ) ) { setter = field.find( 'option:selected' ); setter.toArray().forEach( function( setterel ) { setterel = $( setterel ); option_price = option_price + $.epoAPI.math.toFloat( setterel.data( noDpd + 'raw_price' ) ); option_price_taxed = option_price_taxed + $.epoAPI.math.toFloat( setterel.data( noDpd + 'price' ) ); option_original_price = option_original_price + $.epoAPI.math.toFloat( setterel.data( noDpd + 'raw_original_price' ) ); option_original_price_taxed = option_original_price_taxed + $.epoAPI.math.toFloat( setterel.data( noDpd + 'original_price' ) ); options = field.children( 'option:selected' ); if ( ! ( options.val() === '' && options.attr( 'data-rulestype' ) === '' ) ) { showTotal = true; } field.find( 'option' ).data( 'isset', 0 ); setterel.data( 'isset', 1 ); if ( ! ( setterel.val() === '' && setterel.attr( 'data-rulestype' ) === '' ) ) { _value = setterel.attr( 'data-text' ); dofloatingBoxData = true; _valueText = _value; } } ); } else { fieldval = field.val(); if ( field.is( "[type='file']" ) ) { fieldval = fieldval.replace( 'C:\\fakepath\\', '' ); } if ( fieldval ) { if ( field.is( '.tmcp-range' ) && fieldval === '0' ) { field.data( 'isset', 0 ); } else { option_price = field.data( noDpd + 'raw_price' ); option_price_taxed = field.data( noDpd + 'price' ); option_original_price = field.data( noDpd + 'raw_original_price' ); option_original_price_taxed = field.data( noDpd + 'original_price' ); showTotal = true; field.data( 'isset', 1 ); _value = fieldval; if ( field.is( '.tmcp-range' ) ) { forrangepicker = field.closest( '.tmcp-field-wrap' ).find( '.tm-range-picker' ); $decimals = forrangepicker.attr( 'data-step' ).split( '.' ); if ( $decimals.length === 1 ) { $decimals = 0; } else { $decimals = $decimals[ 1 ].length; } _value = formatPrice( _value, { precision: $decimals } ); } dofloatingBoxData = true; _valueText = fieldval; } } else { field.data( 'isset', 0 ); } } if ( ! option_price ) { option_price = 0; } if ( ! option_original_price ) { option_original_price = 0; } if ( ! option_price_taxed ) { option_price_taxed = 0; } if ( ! option_original_price_taxed ) { option_original_price_taxed = 0; } if ( dofloatingBoxData ) { floatingBoxData.push( { title: field_title, value: _value, valueText: _valueText, price: option_price_taxed, original_price: option_original_price_taxed, quantity: option_quantity, label_show: field_label_show, value_show: field_value_show, input_type: field.attr( 'type' ) } ); } if ( setPriceTax ) { option_price = tm_set_tax_price( option_price, epoObject.this_epo_totals_container, field, undefined, undefined, undefined, true ); option_original_price = tm_set_tax_price( option_original_price, epoObject.this_epo_totals_container, field, undefined, undefined, undefined, true ); } total = $.epoAPI.math.toFloat( total ) + $.epoAPI.math.toFloat( option_price ); total = $.epoAPI.math.toFloat( $.epoAPI.math.round( total, 10 ) ); original_total = $.epoAPI.math.toFloat( original_total ) + $.epoAPI.math.toFloat( option_original_price ); original_total = $.epoAPI.math.toFloat( $.epoAPI.math.round( original_total, 10 ) ); } } ); priceArray = { total: total, original_total: original_total, floatingBoxData: floatingBoxData, showTotal: showTotal, elementsLength: obj.length }; if ( priceCache === true ) { priceCache = {}; priceCache[ priceCacheSelector ] = priceArray; } else if ( priceCache !== true && priceCache !== false ) { priceCache[ priceCacheSelector ] = priceArray; } return priceArray; } function show_product_html( thisEpoObject, thisMainProduct, thisVariableProductContainer, type, $this, currentCart, variableProductContainers, isTrigger, qtyalt ) { var epoObjectCopy = $.extend( true, {}, thisEpoObject ); var item_tm_extra_product_options = thisVariableProductContainer.find( tcAPI.associatedEpoSelector ); var item = thisVariableProductContainer; var newEpoObject; var showOnly = true; if ( item.closest( '.cpf-element' ).is( '.tc-hidden' ) ) { return; } variableProductContainers.addClass( 'tm-hidden' ); if ( variableProductContainers.length ) { toggleState( variableProductContainers, true ); } if ( type === 'variable' ) { if ( ! thisVariableProductContainer.is( '.tc-init-variations' ) ) { thisVariableProductContainer.addClass( 'variations_form' ); setTimeout( function() { newEpoObject = tm_init_epo( item, false, item_tm_extra_product_options.attr( 'data-product-id' ), item_tm_extra_product_options.attr( 'data-epo-id' ), $this, epoObjectCopy ); thisVariableProductContainer.addClass( 'tc-init-variations' ); thisVariableProductContainer.tc_product_variation_form( $this, currentCart, variableProductContainers, newEpoObject ); }, 40 ); showOnly = false; } else { thisVariableProductContainer.trigger( 'refresh.tc-variation-form' ); } } else if ( ! thisVariableProductContainer.is( '.tc-init-product' ) ) { thisVariableProductContainer.addClass( 'tc-init-product' ); variableProductContainers.find( '.tc-epo-element-variable-product' ).removeClass( 'variations_form' ); variableProductContainers.find( '.tc-epo-element-variations' ).removeClass( 'variations' ); setTimeout( function() { tm_init_epo( item, false, item_tm_extra_product_options.attr( 'data-product-id' ), item_tm_extra_product_options.attr( 'data-epo-id' ), $this, epoObjectCopy ); }, 20 ); showOnly = false; } setTimeout( function() { if ( variableProductContainers.length ) { toggleState( thisVariableProductContainer, false ); } }, 200 ); setTimeout( function() { if ( qtyalt.length ) { qtyalt.trigger( 'change' ); } thisVariableProductContainer.removeClass( 'tm-hidden' ); if ( showOnly ) { jWindow.trigger( 'cpflogicdone' ); thisVariableProductContainer.find( '.tm-quantity' ).trigger( 'showhide.cpfcustom' ); } if ( isTrigger === undefined && TMEPOJS.tm_epo_global_product_element_scroll === 'yes' ) { jWindow.tcScrollTo( thisVariableProductContainer, 200, $.epoAPI.math.toFloat( TMEPOJS.tm_epo_global_product_element_scroll_offset ) ); } }, 210 ); } function epoEventHandlers( epoObject, cartContainer, alternativeCart ) { // if cartContainer & alternativeCart is defined we are on a non default product (eg. composite product) var product_id = epoObject.product_id; var main_product = epoObject.main_product; var main_cart = epoObject.main_cart; var this_epo_container = epoObject.this_epo_container; var this_totals_container = epoObject.this_totals_container; var this_epo_totals_container = epoObject.this_epo_totals_container; var epoEventId = epoObject.epoEventId; var main_epo_inside_form = epoObject.main_epo_inside_form; var epo_id_selector = epoObject.epo_id_selector; var epo_id = epoObject.epo_id; var product_id_selector = epoObject.product_id_selector; var itemId = 'main'; var epoHolder; var totalsHolderContainer; var totalsHolder; var currentCart; var variation_id_selector; var this_product_type; var variationForm; var qtyElement; var finalTotalBoxMode; var eventName = epoObject.is_associated ? 'tc-variation-form' : 'wc-variation-form'; var eventNamePrefix = epoObject.is_associated ? 'tc_' : ''; var epoVariationSection; var thismaxlength; var epoFieldAll; var selectSelector; var epoFieldText; var epoResetRadio; var epoFieldUpload; var epoFieldHasClearButton; var tmQty; var tmQuantity; // Non default product (eg. composite product) if ( alternativeCart && cartContainer ) { itemId = $.epoAPI.applyFilter( 'tc_get_item_id', cartContainer.attr( 'data-item_id' ), cartContainer ); epoHolder = main_product.find( '.tm-extra-product-options.tm-cart-' + itemId ); totalsHolderContainer = main_product.find( '.tm-totals-form-' + itemId ); totalsHolder = main_product.find( '.tm-epo-totals.tm-cart-' + itemId ); variationForm = cartContainer.find( '.variations_form' ).first(); // Default product } else { if ( ! main_cart || main_cart.length === 0 ) { if ( this_epo_container.is( '.tc-shortcode' ) ) { main_cart = main_product; } else { main_cart = get_main_cart( main_product, main_product, 'form', product_id ); } } cartContainer = main_cart.parent(); epoHolder = this_epo_container; totalsHolderContainer = this_totals_container; totalsHolder = this_epo_totals_container; variationForm = epoObject.variations_form; } if ( epoObject.is_associated ) { itemId = epoHolder.attr( 'data-cart-id' ); } currentCart = alternativeCart || main_cart; totalsHolder.data( 'tm_for_cart', currentCart ); variation_id_selector = getVariationIdSelector( currentCart ); qtyElement = getQtyElement( currentCart ); totalsHolder.data( 'variationIdElement', getVariationIdElement( currentCart, '.wceb_picker_wrap ' + variation_id_selector ) ); totalsHolder.data( 'qty_element', qtyElement ); this_product_type = totalsHolder.data( 'type' ); variationForm.data( 'tc_product_id', product_id ); finalTotalBoxMode = totalsHolder.attr( 'data-tm-epo-final-total-box' ); jWindow.on( 'epoCalculateRules', function( event, dataObject ) { if ( event && dataObject && dataObject.currentCart ) { tm_epo_rules( epoObject, dataObject.currentCart ); } } ); if ( currentCart.is( 'form' ) ) { currentCart.on( 'reset', function() { var form = $( this ); setTimeout( function() { $( form.data( 'epo_id_selector' ) ).find( '.tm-epo-field' ).trigger( 'change' ); }, 1 ); } ); } tm_epo_rules( epoObject, currentCart ); epoFieldAll = epoHolder.find( '.tm-epo-field' ); if ( ! epoObject.is_associated ) { epoFieldAll = epoFieldAll.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field' ); } epoFieldText = epoHolder.find( '.tm-epo-field.tmcp-textarea,.tm-epo-field.tmcp-textfield' ); if ( ! epoObject.is_associated ) { epoFieldText = epoFieldText.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field' ); } epoResetRadio = epoHolder.find( '.tm-epo-reset-radio' ); if ( ! epoObject.is_associated ) { epoResetRadio = epoResetRadio.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-reset-radio' ); } epoFieldUpload = epoHolder.find( '.tm-epo-field.tmcp-upload' ); if ( ! epoObject.is_associated ) { epoFieldUpload = epoFieldUpload.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field.tmcp-upload' ); } epoFieldHasClearButton = epoHolder.find( '.tm-has-clearbutton .tm-epo-field' ); if ( ! epoObject.is_associated ) { epoFieldHasClearButton = epoFieldHasClearButton.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-has-clearbutton .tm-epo-field' ); } tmQty = epoHolder.find( '.tm-quantity .tm-qty' ); if ( ! epoObject.is_associated ) { tmQty = tmQty.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-quantity .tm-qty' ); } tmQuantity = epoHolder.find( '.tm-quantity' ); if ( ! epoObject.is_associated ) { tmQuantity = tmQuantity.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-quantity' ); } selectSelector = epoHolder.find( 'select.tm-epo-field' ); if ( ! epoObject.is_associated ) { selectSelector = selectSelector.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' select.tm-epo-field' ); } // update price amount for select elements selectSelector .off( 'tm-select-change-html' ) .on( 'tm-select-change-html', function() { var field = $( this ); var formatted_price; var original_formatted_price; var e_tip; var e_description; var sign; if ( field.is( '.tc-epo-field-product' ) || field.is( '.tmcp-selectmultiple' ) ) { return; } if ( main_cart && main_cart.data( 'per_product_pricing' ) !== undefined && ! main_cart.data( 'per_product_pricing' ) ) { return; } formatted_price = tm_set_price( field.find( 'option:selected' ).data( 'price' ), totalsHolder, true, false, field ); original_formatted_price = tm_set_price( field.find( 'option:selected' ).data( 'original_price' ), totalsHolder, true, false, field ); e_tip = field.closest( '.tmcp-field-wrap' ).find( '.tc-tooltip' ); e_description = field.closest( '.tmcp-field-wrap' ).find( '.tc-inline-description' ); tm_update_price( field.closest( '.tmcp-field-wrap' ).find( '.tc-price' ), field.find( 'option:selected' ).data( 'price' ), formatted_price, field.find( 'option:selected' ).data( 'original_price' ), original_formatted_price ); if ( e_tip.length > 0 ) { e_tip.attr( 'data-tm-tooltip-html', field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ).trigger( 'tc-tooltip-html-changed' ); } if ( e_description.length > 0 ) { if ( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ) { e_description.html( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ); } else { e_description.html( '' ); } } if ( ( field.find( 'option:selected' ).attr( 'data-hide-amount' ) === '0' || TMEPOJS.tm_epo_show_price_inside_option_hidden_even === 'yes' ) && TMEPOJS.tm_epo_show_price_inside_option === 'yes' && field.find( 'option:selected' ).attr( 'data-text' ) ) { if ( ( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && $.tmempty( field.find( 'option:selected' ).data( 'price' ) ) === false ) || ( TMEPOJS.tm_epo_auto_hide_price_if_zero !== 'yes' && field.find( 'option:selected' ).attr( 'data-price' ) !== '' ) ) { sign = ''; field.find( 'option:selected' ).html( field.find( 'option:selected' ).attr( 'data-text' ) + ' (' + sign + formatted_price + ')' ); } } if ( field.val() === '' ) { e_tip.addClass( 'tm-hidden' ); } else if ( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ) { e_tip.removeClass( 'tm-hidden' ); } else { e_tip.addClass( 'tm-hidden' ); } } ) .off( 'tm-math-select-change-html-all tm-select-change-html-all tm-select-change-html-all-math' ) .on( 'tm-math-select-change-html-all tm-select-change-html-all tm-select-change-html-all-math', function( event ) { var field = $( this ); var e_tip; var e_description; var thisoption; var divider; var thisformatted_price; if ( field.is( '.tc-epo-field-product' ) ) { return; } e_tip = field.closest( '.tmcp-field-wrap' ).find( '.tc-tooltip' ); e_description = field.closest( '.tmcp-field-wrap' ).find( '.tc-inline-description' ); if ( e_tip.length > 0 ) { e_tip.attr( 'data-tm-tooltip-html', field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ).trigger( 'tc-tooltip-html-changed' ); } if ( field.val() === '' ) { e_tip.addClass( 'tm-hidden' ); } else if ( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ) { e_tip.removeClass( 'tm-hidden' ); } else { e_tip.addClass( 'tm-hidden' ); } if ( e_description.length > 0 ) { if ( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ) { e_description.html( field.find( 'option:selected' ).attr( 'data-tm-tooltip-html' ) ); } else { e_description.html( '' ); } } if ( main_cart && main_cart.data( 'per_product_pricing' ) !== undefined && ! main_cart.data( 'per_product_pricing' ) ) { return; } if ( TMEPOJS.tm_epo_show_price_inside_option === 'yes' ) { field.find( 'option' ).each( function() { thisoption = $( this ); if ( ! thisoption.val() ) { return true; } if ( event.type === 'tm-select-change-html-all' ) { thisoption.removeClass( 'tm-epo-late-field' ).removeData( 'tm-price-for-late islate' ); tm_element_epo_rules( epoObject, field, undefined, thisoption, 1 ); } else if ( event.type === 'tm-math-select-change-html-all' ) { tm_element_epo_rules( epoObject, field, undefined, thisoption, 1, true ); } else if ( event.type === 'tm-select-change-html-all-math' ) { thisoption.removeClass( 'tm-epo-late-field' ).removeData( 'tm-price-for-late islate' ); tm_element_epo_rules( epoObject, field, undefined, thisoption, 1, true ); } divider = 1; if ( TMEPOJS.tm_epo_multiply_price_inside_option !== 'yes' ) { divider = field.data( 'tm-quantity' ); } if ( ! divider ) { divider = 1; } thisformatted_price = tm_set_price( thisoption.data( 'price' ) / divider, totalsHolder, true, false, field ); if ( ( thisoption.attr( 'data-hide-amount' ) === '0' || TMEPOJS.tm_epo_show_price_inside_option_hidden_even === 'yes' ) && thisoption.attr( 'data-text' ) ) { if ( ( TMEPOJS.tm_epo_auto_hide_price_if_zero === 'yes' && $.tmempty( thisoption.data( 'price' ) ) === false ) || ( TMEPOJS.tm_epo_auto_hide_price_if_zero !== 'yes' && thisoption.attr( 'data-price' ) !== '' ) ) { thisoption.html( thisoption.attr( 'data-text' ) + ' (' + thisformatted_price + ')' ); } } } ); } } ) .off( 'tm-select-change' ) .on( 'tm-select-change', function() { var field = $( this ); var thisElementId = field.closest( '.cpf-element' ).attr( 'data-uniqid' ); if ( field.is( '.tc-epo-field-product' ) ) { return; } if ( main_cart && main_cart.data( 'per_product_pricing' ) !== undefined && ! main_cart.data( 'per_product_pricing' ) ) { return; } field.removeData( 'addedtcEpoBeforeOptionPriceCalculation' ); field.removeData( 'addedfieldtcEpoBeforeOptionPriceCalculation' ); jWindow.off( 'tcEpoBeforeOptionPriceCalculation.math' + thisElementId ); jWindow.off( 'tcEpoAfterOptionPriceCalculation.math' + thisElementId ); field.trigger( 'tm-select-change-html' ); field.trigger( 'tm-select-change-html-all' ); currentCart.trigger( { type: 'tm-epo-update', norules: 1, element: field } ); } ).trigger( 'tm-select-change-html-all' ); // Element quantity selector tmQty .off( 'focus.cpf' ) .on( 'focus.cpf', function() { var qtyField = $( this ); var field = qtyField.closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' ); var currentVal = parseFloat( qtyField.val() ); var max = parseFloat( qtyField.attr( 'max' ) ); var min = parseFloat( qtyField.attr( 'min' ) ); var step = qtyField.attr( 'step' ); var check1 = tm_limit_c_selection( field, false ); var check2 = tm_exact_c_selection( field, false ); var check3 = true; // Format values if ( ! currentVal || currentVal === '' || currentVal === 'NaN' ) { currentVal = 0; } if ( max === '' || max === 'NaN' ) { max = ''; } if ( min === '' || min === 'NaN' ) { min = 0; } if ( step === 'any' || step === '' || step === undefined || parseFloat( step ) === 'NaN' ) { step = 1; } if ( currentVal < min || currentVal > max ) { check3 = false; } if ( check1 && check2 && check3 ) { qtyField.data( 'tm-prev-value', currentVal ); } else { qtyField.data( 'tm-prev-value', min ); } } ) .off( 'change.cpf' ) .on( 'change.cpf', function( event, data ) { var qtyField = $( this ); var field = qtyField.closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' ); var currentVal = parseFloat( qtyField.val() ); var max = parseFloat( qtyField.attr( 'max' ) ); var min = parseFloat( qtyField.attr( 'min' ) ); var step = qtyField.attr( 'step' ); var check1 = tm_limit_c_selection( field, false ); var check2 = tm_exact_c_selection( field, false ); var check3 = true; // Format values if ( ! currentVal || currentVal === '' || currentVal === 'NaN' ) { currentVal = 0; } if ( max === '' || max === 'NaN' ) { max = ''; } if ( min === '' || min === 'NaN' ) { min = 0; } if ( step === 'any' || step === '' || step === undefined || parseFloat( step ) === 'NaN' ) { step = 1; } if ( currentVal < min || currentVal > max ) { check3 = false; } if ( check1 && check2 && check3 ) { if ( ! epoObject.noEpoUpdate ) { field.data( 'tm-quantity', qtyField.val() ).trigger( 'change', data ); } else { field.data( 'tm-quantity', qtyField.val() ).trigger( 'change.cpf', data ).trigger( 'change.cpfproduct', data ); } field.trigger( 'tm-select-change-html-all' ); } else if ( qtyField.data( 'tm-prev-value' ) ) { qtyField.val( qtyField.data( 'tm-prev-value' ) ); } else { qtyField.val( min ); } qtyField.trigger( 'cpf-changed' ); } ) .off( 'tmaddquantity' ) .on( 'tmaddquantity', function() { var qtyField = $( this ); var field = qtyField.closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' ); field.data( 'tm-quantity', qtyField.val() ); } ); // Insert characters remaining for text-areas and text-fields thismaxlength = epoHolder.find( '.tmcp-textfield.tm-epo-field[maxlength],textarea.tm-epo-field[maxlength]' ); if ( ! epoObject.is_associated ) { thismaxlength = thismaxlength.not( tcAPI.epoSelector + ' ' + tcAPI.associatedEpoSelector + ' .tm-epo-field' ); } thismaxlength.each( function() { var field = $( this ); var html = $.epoAPI.template.html( tcAPI.templateEngine.tc_chars_remanining, { maxlength: field.attr( 'maxlength' ), characters_remaining: TMEPOJS.i18n_characters_remaining } ); field.after( $( html ) ); } ); thismaxlength .off( 'change.tc_maxlen input.tc_maxlen' ) .on( 'change.tc_maxlen input.tc_maxlen', function() { var field = $( this ); field .closest( '.tmcp-field-wrap' ) .find( '.tc-chars-remanining' ) .html( parseInt( field.attr( 'maxlength' ), 10 ) - parseInt( field.val().length, 10 ) ); } ); // Change product image event epoFieldAll .off( 'tm_trigger_product_image' ) .on( 'tm_trigger_product_image', function() { var field = $( this ); var currentElement; var uic; var variation_element_section; var is_variation_element; var src; if ( field.is( '.tm-product-image:checkbox, .tm-product-image:radio, select.tm-product-image' ) ) { uic = field.closest( '.tmcp-field-wrap' ).find( 'label img' ); variation_element_section = field.closest( '.cpf-section' ); is_variation_element = variation_element_section.is( '.tm-epo-variation-section' ); currentElement = field; if ( field.is( 'select.tm-product-image' ) ) { currentElement = field.children( 'option:selected' ); } if ( $( uic ).length > 0 || ( is_variation_element && currentElement.attr( 'data-image' ) !== undefined ) || ( currentElement.attr( 'data-image' ) !== undefined && currentElement.attr( 'data-image' ) !== '' ) || ( currentElement.attr( 'data-imagep' ) !== undefined && currentElement.attr( 'data-imagep' ) !== '' ) ) { if ( field.is( ':checked' ) || ( field.is( 'select.tm-product-image' ) && field.val() !== '' && ( field.find( 'option:selected' ).attr( 'data-rules' ) !== '' || field.is( '.tm-epo-variation-element' ) ) ) ) { src = $( uic ).first().attr( 'data-original' ); if ( ! src && ! is_variation_element ) { src = $( uic ).first().attr( 'src' ); } if ( ! src ) { src = currentElement.attr( 'data-image' ); } if ( currentElement.attr( 'data-imagep' ) ) { src = currentElement.attr( 'data-imagep' ); } if ( src ) { main_product.trigger( 'tm_change_product_image', { src: src, element: field, element_current: currentElement, main_product: main_product, epo_holder: epoHolder } ); } else { main_product.trigger( 'tm_change_product_image', { src: false, element: field, element_current: currentElement, main_product: main_product, epo_holder: epoHolder } ); } } else { main_product.trigger( 'tm_restore_product_image', { element: field, element_current: currentElement, main_product: main_product, epo_holder: epoHolder } ); } } else { main_product.trigger( 'tm_restore_product_image', { element: field, element_current: currentElement, main_product: main_product, epo_holder: epoHolder } ); } } else { main_product.trigger( 'tm_attempt_product_image', { element: field, element_current: currentElement, main_product: main_product, epo_holder: epoHolder } ); } } ); tmQuantity .off( 'showhide.cpfcustom' ) .on( 'showhide.cpfcustom', function() { var quantity_selector = $( this ); var field = quantity_selector.closest( '.tmcp-field-wrap' ).find( '.tm-epo-field' ); var show = false; var tmqty; var tmqtyval; var tmqtymin; var radios; if ( ! field.is( '.tm-epo-variation-element' ) ) { if ( field.is( 'select' ) ) { if ( field.val() !== '' ) { show = true; } } else if ( field.is( ':checkbox' ) ) { if ( field.is( ':checked' ) ) { show = true; } } else if ( field.is( ':radio' ) ) { if ( field.is( ':checked' ) ) { show = true; if ( TMEPOJS.tm_epo_show_only_active_quantities === 'yes' ) { radios = field.closest( '.tc-element-inner-wrap' ).find( '.tm-epo-field.tmcp-radio' ); radios.each( function() { $( this ).closest( '.tmcp-field-wrap' ).find( '.tm-quantity' ).hide(); } ); } } } else if ( field.val() ) { show = true; } tmqty = quantity_selector.find( '.tm-qty' ); tmqtyval = tmqty.val(); tmqtymin = tmqty.attr( 'min' ) || ''; if ( show ) { if ( TMEPOJS.tm_epo_show_only_active_quantities === 'yes' ) { quantity_selector.show(); } tmqty.removeClass( 'ignore' ).prop( 'disabled', false ); } else { if ( TMEPOJS.tm_epo_show_only_active_quantities === 'yes' ) { quantity_selector.hide(); if ( ! tmqtyval ) { tmqty.val( tmqtymin ); } } tmqty.addClass( 'ignore' ).prop( 'disabled', true ); } setTimeout( function() { quantity_selector.closest( '.tcowl-carousel' ).trigger( 'refresh.owl.carousel' ); }, 200 ); } } ); epoFieldAll .off( 'change.cpfcustom' ) .on( 'change.cpfcustom', function() { $( this ).closest( '.tmcp-field-wrap' ).find( '.tm-quantity' ).trigger( 'showhide.cpfcustom' ); } ); epoFieldAll .off( 'change.cpf' ) .on( 'change.cpf', function( event, data ) { var field = $( this ); var is_li = field.closest( '.tmcp-field-wrap' ); var is_ul = field.closest( '.tmcp-ul-wrap' ); var is_replace; var connector = is_ul.attr( 'data-tm-connector' ); if ( field.is( ':checkbox, :radio' ) ) { if ( field.is( ':radio' ) ) { if ( ! data ) { if ( connector !== undefined ) { $( '[data-tm-connector="' + connector + '"]' ).find( '.tmcp-field-wrap' ).removeClass( 'tc-active' ); } else { is_ul.find( '.tmcp-field-wrap' ).removeClass( 'tc-active' ); } } if ( connector !== undefined ) { $( '[data-tm-connector="' + connector + '"]' ).find( '.tmcp-field-wrap' ).removeClass( 'tc-active' ); } } if ( field.is( ':checked' ) ) { is_li.addClass( 'tc-active' ); } else { is_li.removeClass( 'tc-active' ); } } if ( ! field.is( '.tm-epo-variation-element' ) ) { if ( field.is( '.use_images:checkbox, .use_images:radio' ) && field.attr( 'data-imagec' ) ) { is_replace = is_li.find( '.radio-image,.checkbox-image' ).first(); if ( is_replace.length > 0 ) { if ( field.is( ':checked' ) ) { is_replace.prop( 'src', field.attr( 'data-imagec' ) ); } else { is_replace.prop( 'src', field.attr( 'data-image' ) ); } } } if ( field.is( '.use_images:radio' ) ) { field .closest( '.cpf-type-radio' ) .find( '.use_images:radio' ) .not( field ) .each( function() { var r = $( this ); r.closest( '.tmcp-field-wrap' ).find( '.radio-image' ).first().prop( 'src', r.attr( 'data-image' ) ); } ); } if ( field.is( '.tmcp-range' ) ) { field.trigger( 'change.cpflogic' ); } if ( field.is( 'select' ) ) { field.trigger( 'tm-select-change' ); } else { if ( field.is( '.tmcp-radio' ) ) { field .closest( '.cpf-element' ) .find( '.tm-quantity .tm-qty' ) .each( function() { if ( ! $( this ).closest( 'li.tmcp-field-wrap' ).find( '.tmcp-radio' ).is( ':checked' ) ) { $( this ).attr( 'disabled', 'disabled' ); } else { $( this ).prop( 'disabled', false ); } } ); } priceCache = true; currentCart.trigger( { type: 'tm-epo-update', norules: 1, element: field } ); priceCache = false; } } field.trigger( 'tm_trigger_product_image' ); setTimeout( function() { $( '.tm-owl-slider' ).each( function() { $( this ).trigger( 'refresh.owl.carousel' ); } ); }, 200 ); main_product.trigger( 'tm_attempt_product_image', { element: field, main_product: main_product, epo_holder: epoHolder } ); } ); epoFieldAll .filter( ':checkbox:checked, :radio:checked' ) .each( function() { $( this ).closest( '.tmcp-field-wrap' ).addClass( 'tc-active' ); $( this ).trigger( 'change.cpf' ); } ); epoFieldHasClearButton .off( 'change.cpfclearbutton' ) .on( 'change.cpfclearbutton cpfclearbutton', function() { var field = $( this ); var radioResetElement; var fieldWrap = field.closest( '.tmcp-field-wrap' ); var fieldSearch; if ( field.is( ':checked' ) ) { fieldSearch = field.closest( '.tc-element-inner-wrap' ); if ( fieldSearch.find( '.tc-epo-element-product-li-container' ).length ) { fieldSearch = fieldSearch.find( '.tmcp-ul-wrap' ).first().children( '.tmcp-field-wrap' ).not( '.tc-epo-element-product-li-container' ); } radioResetElement = fieldSearch.find( '.tm-epo-reset-radio' ); if ( ! radioResetElement.length ) { radioResetElement = field.closest( '.tc-element-inner-wrap' ).find( '.tm-epo-reset-radio' ).first(); } radioResetElement.removeClass( 'tm-hidden' ); fieldWrap.append( radioResetElement ); } } ); epoResetRadio .off( 'click.cpf' ) .on( 'click.cpf', function() { var radioResetElement = $( this ); var fieldContainer = radioResetElement.closest( '.tc-element-inner-wrap' ); var checkedRadios = fieldContainer.find( '.tm-epo-field.tmcp-radio:checked' ); if ( checkedRadios.length ) { checkedRadios.prop( 'checked', false ); checkedRadios.trigger( 'change', { forced: 1 } ); } radioResetElement.addClass( 'tm-hidden' ); } ); if ( _ && _.debounce ) { epoFieldText.on( 'keyup', _.debounce( function() { var $this = $( this ); if ( TMEPOJS.tm_epo_global_enable_validation === 'yes' && $.tc_validator && $this.closest( '.tmcp-ul-wrap' ).data( 'tm-validation' ) && $this.tc_rules() ) { currentCart.tc_validate().element( $this ); } $this.trigger( 'change.cpf' ); $this.closest( '.tmcp-field-wrap' ).find( '.tm-quantity' ).trigger( 'showhide.cpfcustom' ); }, 10 ) ); } epoFieldUpload .off( 'change.cpfv tcupload' ) .on( 'change.cpfv tcupload', function() { var field = $( this ); var label = field.closest( 'label' ); var li = field.closest( '.tmcp-field-wrap' ); var cpfUploadContainer = li.find( '.cpf-upload-container' ); var name = li.find( '.tm-filename' ); var val = field.val().replace( 'C:\\fakepath\\', '' ); var valHidden = []; var num_uploads; var windowURL = window.URL || window.webkitURL; var files; var image; var uploadPreview = li.find( '.tc-upload-preview' ); var addImage; var uniqid; if ( cpfUploadContainer.length && name.length <= 0 ) { name = $( '' ); label.after( name ); } if ( val === undefined || val === 'undefined' ) { val = ''; } field.next( '.tmcp-upload-hidden' ).remove(); valHidden = field.attr( 'data-file' ); valHidden = valHidden ? valHidden.split( '|' ) : []; if ( this.files ) { files = Array.from( this.files ); } else if ( valHidden.length > 0 ) { files = valHidden; } if ( files.length > 1 ) { name.html( '' + files.length + ' ' + ( files.length === 1 ? TMEPOJS.i18n_file : TMEPOJS.i18n_files ) ); } else if ( files.length === 1 ) { name.html( val ); } else { name.empty(); } if ( ! uploadPreview.length ) { uploadPreview = $( '
' ); li.append( uploadPreview ); } uploadPreview.empty(); num_uploads = epoHolder.data( 'num_uploads' ); if ( ! num_uploads ) { num_uploads = []; } uniqid = field.closest( '.cpf-element' ).attr( 'data-uniqid' ); if ( ! num_uploads[ uniqid ] ) { num_uploads[ uniqid ] = []; } if ( ( val || files.length > 0 ) && windowURL && windowURL.createObjectURL ) { if ( TMEPOJS.tm_epo_upload_inline_image_preview === 'yes' ) { if ( files.length > 1 ) { uploadPreview.addClass( 'multiple' ); } else { uploadPreview.removeClass( 'multiple' ); } uploadPreview.removeClass( 'tc-hidden' ); } addImage = function( dataFile, src, i, fileHolder, ext ) { var size = field[ 0 ].files && field[ 0 ].files[ i ] && field[ 0 ].files[ i ].size ? field[ 0 ].files[ i ].size : 0; var imageHTML = '
'; if ( src ) { imageHTML = imageHTML + ''; } else { imageHTML = imageHTML + '
'; } imageHTML = imageHTML + '
' + dataFile.name + '
'; if ( ClipboardEvent || DataTransfer ) { imageHTML = imageHTML + ''; } if ( ext ) { imageHTML = imageHTML + '
' + ext + '
'; } imageHTML = imageHTML + '
' + readableFileSize( size ) + '
'; imageHTML = imageHTML + '
'; fileHolder.append( imageHTML ); }; files.forEach( function( dataFile, i ) { var fileHolder; if ( TMEPOJS.tm_epo_upload_inline_image_preview === 'yes' ) { fileHolder = $( '
' ); uploadPreview.append( fileHolder ); image = new Image(); image.onload = function() { addImage( dataFile, this.src, i, fileHolder ); }; image.onerror = function() { addImage( dataFile, false, i, fileHolder, dataFile.name.split( '.' ).pop() ); }; if ( valHidden.length > 0 ) { image.src = valHidden[ i ]; } else { image.src = windowURL.createObjectURL( dataFile ); windowURL.revokeObjectURL( dataFile ); } } num_uploads[ uniqid ].push( dataFile.name ); } ); epoHolder.data( 'num_uploads', num_uploads ); } else { delete num_uploads[ uniqid ]; } if ( num_uploads[ uniqid ] && num_uploads[ uniqid ].length === 0 ) { delete num_uploads[ uniqid ]; } } ); jDocument.on( 'click', '.tc-upload-remove', function() { var $this = $( this ); var val; var cpfElement; var input; var fileWrap; var li; var uploadPreview; var name; var index; var files; var dT; var num_uploads; var uniqid; var uploadHidden; var dataFiles; if ( ClipboardEvent || DataTransfer ) { cpfElement = $this.closest( '.cpf-element' ); input = cpfElement.find( '.tm-epo-field' ); fileWrap = $this.closest( '.tc-upload-file' ); li = $this.closest( '.tmcp-field-wrap' ); uploadPreview = li.find( '.tc-upload-preview' ); name = li.find( '.tm-filename' ); index = fileWrap.index(); val = input.val().replace( 'C:\\fakepath\\', '' ); if ( val === undefined || val === 'undefined' ) { val = ''; } files = Array.from( input[ 0 ].files ); files.splice( index, 1 ); dT = new ClipboardEvent( '' ).clipboardData || new DataTransfer(); files.forEach( function( dataFile ) { dT.items.add( dataFile ); } ); if ( files.length > 1 ) { uploadPreview.addClass( 'multiple' ); } else { uploadPreview.removeClass( 'multiple' ); } input[ 0 ].files = dT.files; fileWrap.remove(); if ( dT.files.length > 1 ) { name.html( '' + dT.files.length + ' ' + ( dT.files.length === 1 ? TMEPOJS.i18n_file : TMEPOJS.i18n_files ) ); } else if ( dT.files.length === 1 ) { name.html( val ); } else { name.empty(); } num_uploads = epoHolder.data( 'num_uploads' ); if ( ! num_uploads ) { num_uploads = []; } uniqid = cpfElement.closest( '.cpf-element' ).attr( 'data-uniqid' ); if ( ! num_uploads[ uniqid ] ) { num_uploads[ uniqid ] = []; } num_uploads[ uniqid ].splice( index, 1 ); if ( num_uploads[ uniqid ].length === 0 ) { delete num_uploads[ uniqid ]; input.val( '' ); } uploadHidden = input.next( '.tmcp-upload-hidden' ); if ( uploadHidden.length ) { dataFiles = uploadHidden.val().split( '|' ); if ( dataFiles.length > 0 ) { dataFiles.splice( index, 1 ); } if ( dataFiles.length === 0 ) { uploadHidden.remove(); } else { uploadHidden.val( dataFiles.join( '|' ) ); } } epoHolder.data( 'num_uploads', num_uploads ); } } ); qtyElement .off( 'change.cpf input.cpf' ) .on( 'change.cpf input.cpf', function() { var field = $( this ); currentCart.trigger( 'tm-epo-check-dpd' ); field.data( 'tm-prev-value', field.val() ); // It is required than when you update the product quantity // to recalculate the option price to accommodate price types // that depend on quantity currentCart.trigger( { type: 'tm-epo-update', norules: 2 } ); } ) .data( 'tm-prev-value', qtyElement.val() ); // Support math formula on associated product when they are initially hidden epoHolder .find( '.cpf-type-product' ) .off( 'tc-logic' ) .on( 'tc-logic', function() { var $this = $( this ); if ( $this.find( '.tc-init' ).lengh ) { return; } if ( $this.data( 'isactive' ) && ! $this.data( 'donetclogic' ) ) { $this.data( 'donetclogic', true ); $this.find( '.tc-epo-field-product' ).trigger( 'change.cpfproduct', { forced: 1 } ); } } ); // Product element checkbox requires status fix epoHolder .find( '.cpf-type-product .tc-epo-field-product.tc-epo-field-product-checkbox' ) .off( 'change.cpfrequired' ) .on( 'change.cpfrequired', function() { var $this = $( this ); var cpfElement = $this.closest( '.cpf-element' ); var checkboxes; var checkboxesChecked; var checkboxesNotChecked; if ( cpfElement.is( '.tc-is-required' ) ) { checkboxes = cpfElement.find( '.tmcp-field.tc-epo-field-product-checkbox' ); checkboxesNotChecked = checkboxes.not( ':checked' ); checkboxesChecked = cpfElement.find( '.tmcp-field.tc-epo-field-product-checkbox:checked' ); if ( checkboxesChecked.length > 0 ) { checkboxesNotChecked.removeAttr( 'required' ); checkboxesNotChecked.prop( 'required', false ); checkboxesChecked.attr( 'required', true ); checkboxesChecked.prop( 'required', true ); } else { checkboxes.attr( 'required', true ); checkboxes.prop( 'required', true ); } } } ); // Product element variable product support epoHolder .find( '.cpf-type-product .tc-epo-field-product' ) .off( 'change.cpfproduct' ) .on( 'change.cpfproduct', function( e, data ) { var $this = $( this ); var value; var type; var selected; var variableProductContainers; var thisVariableProductContainer; var elementContainer = $this.closest( '.cpf-element' ); var productContainerWraps = elementContainer.find( '.tc-epo-element-product-container-wrap' ); var thisProductContainerWrap = $this.closest( '.tmcp-field-wrap' ).find( '.tc-epo-element-product-container-wrap' ); var hasProductContainerWrap = thisProductContainerWrap.length > 0; var postData; var skip = false; var isTrigger = 1000; var qtyalt; var associatedSetter = $this; var associatedElement; var isFilled; var productPrice; var originalProductPrice; var epoField = elementContainer.find( '.tm-epo-field' ).not( '.tc-epo-element-product-li-container .tm-epo-field' ); var checked = epoField.filter( ':checked' ); var qty; var counter = $this.attr( 'data-counter' ); if ( false === elementContainer.data( 'isactive' ) ) { return; } if ( data && data.forced === 2 ) { return; } if ( e.isTrigger !== undefined && $this.data( 'triggeredonce' ) && ! ( data && data.forced ) ) { return; } $this.data( 'triggeredonce', 1 ); if ( ! $this.is( ':checkbox' ) ) { isTrigger = e.isTrigger; } if ( epoField.is( ':radio' ) || epoField.is( ':checkbox' ) ) { if ( checked.length > 0 ) { qty = checked.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' ); } } else { qty = epoField.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' ); } if ( $this.is( ':checkbox' ) ) { if ( $this.is( '.tc-epo-field-product-hidden' ) ) { if ( $this.is( ':checked' ) ) { productContainerWraps.addClass( 'tc-active-product' ); } else { productContainerWraps.removeClass( 'tc-active-product' ); } value = $this.val(); type = $this.attr( 'data-type' ); elementContainer.find( '.tc-epo-element-product-li-container' ).removeClass( 'tm-hidden' ); } else { if ( ! $this.is( ':checked' ) ) { if ( hasProductContainerWrap ) { thisProductContainerWrap.addClass( 'tm-hidden' ); } if ( ! ( data && data.forced ) ) { return; } skip = true; } else if ( hasProductContainerWrap ) { thisProductContainerWrap.removeClass( 'tm-hidden' ); } if ( ! skip ) { value = $this.val(); type = $this.attr( 'data-type' ); elementContainer.find( '.tc-epo-element-product-li-container' ).removeClass( 'tm-hidden' ); } } } else if ( $this.is( ':radio' ) ) { if ( ! $this.is( ':checked' ) ) { if ( hasProductContainerWrap ) { thisProductContainerWrap.addClass( 'tm-hidden' ); } if ( ! ( data && data.forced ) ) { return; } skip = true; } else if ( hasProductContainerWrap ) { productContainerWraps.addClass( 'tm-hidden' ); thisProductContainerWrap.removeClass( 'tm-hidden' ); } if ( ! skip ) { value = $this.val(); type = $this.attr( 'data-type' ); elementContainer.find( '.tc-epo-element-product-li-container' ).removeClass( 'tm-hidden' ); } } else if ( $this.is( 'select' ) ) { selected = $this.children( ':selected' ); associatedSetter = selected; counter = selected.index(); if ( $this.children( ':first' ).val() === '' ) { counter--; } value = $this.val(); type = selected.attr( 'data-type' ); elementContainer.find( '.tc-epo-element-product-li-container' ).removeClass( 'tm-hidden' ); } if ( $this.is( '.tc-epo-field-product-checkbox' ) ) { variableProductContainers = thisProductContainerWrap.find( '.tc-epo-element-product-container' ); } else { variableProductContainers = elementContainer.find( '.tc-epo-element-product-container' ); } thisVariableProductContainer = variableProductContainers.filter( '[data-product_id="' + value + '"]' ); qtyalt = thisVariableProductContainer.find( tcAPI.associateQtySelector ); if ( productContainerWraps.html() !== '' && qty && qty.length > 0 && qtyalt.length === 0 ) { qty.val( 0 ); } if ( $this.is( ':checkbox' ) ) { if ( $this.is( '.tc-epo-field-product-hidden' ) ) { if ( $this.is( ':checked' ) ) { if ( qtyalt.val() === '0' ) { if ( qtyalt.attr( 'min' ) === '0' ) { qtyalt.val( 1 ).trigger( 'change' ); } else { qtyalt.val( qtyalt.attr( 'min' ) ).trigger( 'change' ); } } } else { qtyalt.val( 0 ); qtyalt.closest( '.tm-quantity-alt' ).removeClass( 'tm-hidden' ); if ( data.forced !== 1 ) { qtyalt.closest( '.tm-quantity-alt' ).find( '.single_add_to_cart_product' ).trigger( 'cpfqtybutton' ); } productContainerWraps.find( tcAPI.associatedEpoCart ).trigger( 'tm-epo-update' ); } } } else if ( $this.is( ':radio' ) ) { if ( $this.val() && ! $this.data( 'set_initial' ) ) { if ( qtyalt.val() === '0' ) { if ( qtyalt.attr( 'min' ) === '0' ) { qtyalt.val( 1 ).trigger( 'change' ); } else { qtyalt.val( qtyalt.attr( 'min' ) ).trigger( 'change' ); } $this.data( 'set_initial', 1 ); } } } else if ( $this.is( 'select' ) ) { if ( $this.val() && ! $this.data( 'set_initial' ) ) { if ( qtyalt.val() === '0' ) { if ( qtyalt.attr( 'min' ) === '0' ) { // qtyalt.val( 1 ).trigger( 'change' ); } else { qtyalt.val( qtyalt.attr( 'min' ) ).trigger( 'change' ); } $this.data( 'set_initial', 1 ); } } } else { return; } if ( ! value ) { variableProductContainers.addClass( 'tm-hidden' ); productPrice = $.epoAPI.util.parseJSON( associatedSetter.attr( 'data-rules' ) ); productPrice = productPrice[ 0 ] || 0; originalProductPrice = $.epoAPI.util.parseJSON( associatedSetter.attr( 'data-original-rules' ) ); originalProductPrice = originalProductPrice || 0; if ( associatedSetter.is( '.tcenabled' ) ) { associatedSetter.data( 'associated_price_set', 1 ); } associatedSetter.data( 'price_set', 1 ); associatedSetter.data( 'raw_price', productPrice ); associatedSetter.data( 'raw_original_price', originalProductPrice ); associatedSetter.data( 'price', productPrice ); associatedSetter.data( 'original_price', originalProductPrice ); associatedElement = associatedSetter; if ( associatedElement.is( 'option' ) ) { associatedElement = associatedSetter.closest( 'select' ); } isFilled = false; if ( associatedElement.is( '.tc-epo-field-product' ) ) { if ( associatedElement.is( 'select' ) ) { if ( associatedElement.val() !== '' ) { isFilled = true; } } else if ( ( associatedElement.is( ':checkbox' ) || associatedElement.is( ':radio' ) ) ) { if ( associatedElement.is( ':checked' ) ) { isFilled = true; } } else if ( associatedElement.val() !== '' ) { isFilled = true; } } tm_force_update_price( associatedSetter .closest( '.tmcp-field-wrap' ) .find( '.tc-price' ) .not( tcAPI.associatedEpoSelector + ' .tc-price' ), productPrice, isFilled ? tm_set_price_totals( productPrice ) : associatedSetter.data( 'price-html' ), originalProductPrice, isFilled ? tm_set_price_totals( originalProductPrice ) : '' ); qtyElement.trigger( 'change.cpf' ); return; } if ( thisVariableProductContainer.length === 0 ) { // parent_id is used for customization purposes. postData = { action: 'wc_epo_get_associated_product_html', product_id: value, parent_id: epoHolder.attr( 'data-product-id' ), mode: elementContainer.attr( 'data-mode' ), layout_mode: elementContainer.attr( 'data-product-layout-mode' ), uniqid: elementContainer.attr( 'data-uniqid' ), name: $this.attr( 'name' ), counter: counter, quantity_min: elementContainer.attr( 'data-quantity-min' ), quantity_max: elementContainer.attr( 'data-quantity-max' ), priced_individually: elementContainer.attr( 'data-priced-individually' ), discount: elementContainer.attr( 'data-discount' ), discount_type: elementContainer.attr( 'data-discount-type' ), discount_exclude_addons: elementContainer.attr( 'data-discount-exclude-addons' ), show_image: elementContainer.attr( 'data-show-image' ), show_title: elementContainer.attr( 'data-show-title' ), show_price: elementContainer.attr( 'data-show-price' ), show_description: elementContainer.attr( 'data-show-description' ), show_meta: elementContainer.attr( 'data-show-meta' ), disable_epo: elementContainer.attr( 'data-disable-epo' ) }; elementContainer.block( { message: null, overlayCSS: { background: '#fff', opacity: 0.6 } } ); $.ajax( { url: TMEPOJS.ajax_url, type: 'POST', data: postData, dataType: 'json', success: function( response ) { if ( response.result === 200 ) { thisVariableProductContainer = $( response.html ); if ( hasProductContainerWrap ) { $this.closest( '.tmcp-field-wrap' ).find( '.tc-epo-element-product-container-wrap' ).empty().append( thisVariableProductContainer ); } else { elementContainer.find( '.tc-epo-element-product-container-wrap' ).append( thisVariableProductContainer ); } show_product_html( epoObject, main_product, thisVariableProductContainer, type, $this, currentCart, variableProductContainers, isTrigger, qtyalt ); thisVariableProductContainer.find( tcAPI.associateQtySelector ).trigger( 'change' ); } }, complete: function() { elementContainer.unblock(); } } ); } else { show_product_html( epoObject, main_product, thisVariableProductContainer, type, $this, currentCart, variableProductContainers, isTrigger, qtyalt ); thisVariableProductContainer.find( tcAPI.associateQtySelector ).trigger( 'change' ); } } ); jDocument .off( 'click.cpfqtybutton cpfqtybutton', '.cpf-type-product .single_add_to_cart_product' ) .on( 'click.cpfqtybutton cpfqtybutton', '.cpf-type-product .single_add_to_cart_product', function() { var $this = $( this ); var qtyalt = $this.closest( '.tm-quantity-alt' ).find( tcAPI.associateQtySelector ); var isAdd = $this.is( '.alt' ); var productContainerWraps = $this.closest( '.cpf-element' ).find( '.tc-epo-element-product-container-wrap' ); var qtyMin; var qtyMax; if ( $this.data( 'inittriggeredonce' ) ) { qtyMin = $.epoAPI.math.toInt( qtyalt.attr( 'data-min' ) ); qtyMax = $.epoAPI.math.toInt( qtyalt.attr( 'data-max' ) ); if ( isAdd ) { productContainerWraps.addClass( 'tc-active-product' ); qtyalt.attr( 'min', qtyMin ); if ( qtyMax ) { qtyalt.attr( 'max', qtyMax ); } if ( qtyalt.val() === '0' ) { if ( qtyalt.attr( 'min' ) === '0' ) { qtyalt.val( 1 ).trigger( 'change' ); } else { qtyalt.val( qtyalt.attr( 'min' ) ).trigger( 'change' ); } } $this.removeClass( 'alt' ).text( $this.attr( 'data-remove' ) ); } else { productContainerWraps.removeClass( 'tc-active-product' ); qtyalt.val( 0 ).trigger( 'change' ); qtyalt.closest( '.tm-quantity-alt' ).removeClass( 'tm-hidden' ); $this.addClass( 'alt' ).text( $this.attr( 'data-add' ) ); } } $this.data( 'inittriggeredonce', 1 ); productContainerWraps.find( tcAPI.associatedEpoCart ).trigger( 'tm-epo-update' ); } ); jDocument .off( 'change.cpfqtyalt', '.cpf-type-product ' + tcAPI.associateQtySelector ) .on( 'change.cpfqtyalt', '.cpf-type-product ' + tcAPI.associateQtySelector, function() { var $this = $( this ); var epoField = $this.closest( '.cpf-element' ).find( '.tm-epo-field' ).not( '.tc-epo-element-product-li-container .tm-epo-field' ); var addButton = $this.closest( '.tm-quantity-alt' ).find( '.single_add_to_cart_product' ); var checked = epoField.filter( ':checked' ); var qty; var qtyMin; var qtyMax; var associatedEpoCart; qtyMin = $.epoAPI.math.toInt( $this.attr( 'min' ) ); qtyMax = $.epoAPI.math.toInt( $this.attr( 'max' ) ); if ( epoField.is( '.tc-epo-field-product-hidden' ) && epoField.is( ':checkbox' ) ) { if ( checked.length === 0 && $this.val() !== '0' ) { epoField.prop( 'checked', true ).trigger( 'change' ); checked = epoField.filter( ':checked' ); } else if ( $this.val() === '0' && checked.length ) { epoField.prop( 'checked', false ).trigger( 'change' ); } } if ( epoField.is( ':radio' ) || epoField.is( ':checkbox' ) ) { if ( checked.length === 0 ) { return; } qty = checked.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' ).not( '.tc-element-qty' ); } else { qty = epoField.closest( '.tmcp-field-wrap' ).find( 'input.tm-qty' ).not( '.tc-element-qty' ); } if ( qty.length === 0 ) { return; } qty.attr( 'min', qtyMin ); if ( qtyMax ) { qty.attr( 'max', qtyMax ); } associatedEpoCart = $this.closest( '.tc-epo-element-product-container' ).find( tcAPI.associatedEpoCart ); associatedEpoCart.trigger( 'tm-epo-update' ); qty.val( $this.val() ); if ( $.epoAPI.math.toFloat( $this.val() ) > 0 ) { associatedEpoCart.find( '.tm-epo-field.tcenabled' ).removeClass( 'ignore' ); $this.removeClass( 'ignore' ); } else { associatedEpoCart.find( '.tm-epo-field.tcenabled' ).addClass( 'ignore' ); $this.addClass( 'ignore' ); } epoField.trigger( 'change.cpfproduct', { forced: 2 } ); if ( addButton.data( 'inittriggeredonce' ) ) { if ( $this.val() === '0' ) { addButton.removeClass( 'alt' ); } else { addButton.addClass( 'alt' ); } } addButton.trigger( 'cpfqtybutton' ); } ); // Global update event currentCart.off( 'tm-epo-update' ).on( 'tm-epo-update', function( event ) { var cart = $( this ); var bundleid; var productPrice = false; var rawProductPrice = 0; var productRegularPrice = false; var rawProductRegularPrice = 0; var total = 0; var original_total = 0; var showTotal = false; var cartQty; var elementQty = 1; var priceOverrideMode; var perProductPricing = true; var floatingBoxData = []; var currentVariation; var cart_fee_options_total = 0; var cart_fee_options_original_total = 0; var _total; var _original_total; var late_total_price; var tc_totals_ob = {}; var formatted_options_total; var formatted_options_original_total; var formatted_fees_total; var formatted_fees_original_total; var formatted_final_total; var formatted_final_original_total; var extraFee = 0; var product_total_price; var product_total_original_price; var calculateFinalProductPrice; var total_plus_fee; var original_total_plus_fee; var product_total_price_without_options; var unit_price; var unit_original_price; var formatted_unit_price; var formatted_unit_original_price; var html; var show_options_total = false; var show_vat_options_total = false; var show_fees_total = false; var formatted_extra_fee = ''; var show_extra_fee = false; var show_final_total = false; var hide_native_price; var update_native_html; var _fprice; var _f_regular_price; var customerPriceFormat; var currentEpoObject; var raw_total; var raw__total; var raw_original_total; var raw__original_total; var raw_cart_fee_options_total; var raw_cart_fee_options_original_total; var raw_total_plus_fee; var raw_original_total_plus_fee; var raw_product_total_price_without_options; var raw_product_total_price; var raw_product_total_original_price; var fetch; var customer_price_format_wrap_start = ''; var customer_price_format_wrap_end = ''; var associatedSetter; var associatedPrice; var associatedRawPrice; var associatedOriginalPrice; var associatedRawOriginalPrice; var associatedFormattedPrice; var associatedFormattedOriginalPrice; var nativeProductPriceSelector; var elementsLength; var noSyncTotal = 0; var noSyncOriginalTotal = 0; var _ftotal; var _foriginal_total; var totalsHolder_tc_totals_ob; var temp; var vat_options_total; var vat_options_total_plus_fee; var formatted_vat_options_total; var formatted_vat_options_total_plus_fee; var vat_total; var formatted_vat_total; var vat_product_base; var formatted_vat_product_base; var pricesIncludeTax; if ( event.epoObject ) { currentEpoObject = $.extend( true, {}, event.epoObject ); } else { currentEpoObject = $.extend( true, {}, epoObject ); } if ( ! currentEpoObject ) { return; } if ( currentEpoObject.noEpoUpdate ) { return; } jWindow.trigger( 'tcEpoUpdateStart', { epo: currentEpoObject, alternativeCart: currentEpoObject, this_product_type: this_product_type, cart: cart, totalsHolder: totalsHolder, fetchOptionPrices: fetchOptionPrices, epoHolder: epoHolder } ); bundleid = $.epoAPI.applyFilter( 'tc_get_bundleid', cart.attr( 'data-product_id' ), cart, currentEpoObject ); priceOverrideMode = totalsHolder.attr( 'data-price-override' ); cartQty = getCurrentQty( cart ); currentVariation = getCurrentVariation( cart ); if ( currentEpoObject.associated_connect && currentEpoObject.associated_connect.length === 1 ) { cartQty = parseFloat( currentEpoObject.main_product .find( tcAPI.associateQtySelector ) .not( tcAPI.associatedEpoSelector + ' ' + tcAPI.qtySelector ) .last() .val() ); } event.stopImmediatePropagation(); productPrice = $.epoAPI.applyFilter( 'tcGetCurrentProductPrice', tm_calculate_product_price( totalsHolder, true ), currentCart, totalsHolder ); rawProductPrice = productPrice; productRegularPrice = $.epoAPI.applyFilter( 'tcGetCurrentProductRegularPrice', tm_calculate_product_regular_price( totalsHolder, true ), currentCart, totalsHolder ); rawProductRegularPrice = productRegularPrice; productPrice = $.epoAPI.applyFilter( 'tcCalculateCurrentProductPrice', productPrice, { epo: currentEpoObject, alternativeCart: alternativeCart, cart: cart, main_product: main_product } ); if ( ! Number.isFinite( cartQty ) ) { if ( totalsHolder.attr( 'data-is-sold-individually' ) || getQtyElement( cart ).length === 0 ) { cartQty = 1; } } // needed for inital math calculation totalsHolder_tc_totals_ob = { qty: cartQty, product_price: rawProductPrice, original_product_price: rawProductRegularPrice }; totalsHolder.data( 'totalsHolder_tc_totals_ob', totalsHolder_tc_totals_ob ); if ( ! event.norules ) { tm_epo_rules( currentEpoObject, cart ); } else if ( event.norules ) { if ( event.norules === 1 ) { tm_element_epo_rules( currentEpoObject, event.element ); } $.tcepo.lateFieldsPrices[ epoEventId ] = []; epoHolder .find( '.tm-epo-late-field' ) .toArray() .forEach( function( setter ) { setter = $( setter ); setter.data( 'price', 0 ); $.tcepo.lateFieldsPrices[ epoEventId ].push( { setter: setter, price: setter.data( 'tm-price-for-late' ), original_price: setter.data( 'tm-original-price-for-late' ), bundleid: bundleid, pricetype: get_price_type( currentEpoObject, setter ) } ); } ); } if ( currentEpoObject.associated_connect && currentEpoObject.associated_connect.length === 1 ) { associatedSetter = currentEpoObject.associated_connect; if ( currentEpoObject.associated_connect.is( 'select' ) ) { associatedSetter = currentEpoObject.associated_connect.find( 'option:selected' ); } } // No reason to continue if the product price is invalid if ( productPrice === false ) { totalsHolder.empty(); if ( currentEpoObject.associated_connect && currentEpoObject.associated_connect.length === 1 ) { tm_force_update_price( associatedSetter .closest( '.tmcp-field-wrap' ) .find( '.tc-price' ) .not( tcAPI.associatedEpoSelector + ' .tc-price' ), 0, '', 0, '' ); } return; } elementQty = $.epoAPI.applyFilter( 'tcAlterElementQty', elementQty, { epo: currentEpoObject, alternativeCart: alternativeCart, currentCart: currentCart, main_product: main_product } ); if ( currentCart.data( 'per_product_pricing' ) !== undefined ) { perProductPricing = currentCart.data( 'per_product_pricing' ); } perProductPricing = $.epoAPI.applyFilter( 'tcCalculatePerProductPricing', perProductPricing, { epo: currentEpoObject, alternativeCart: alternativeCart, cart: cart, main_product: main_product } ); if ( main_epo_inside_form && TMEPOJS.tm_epo_totals_box_placement === 'woocommerce_before_add_to_cart_button' ) { if ( ( this_product_type === 'variable' || this_product_type === 'variable-subscription' ) && ! totalsHolder.data( 'moved_inside' ) ) { totalsHolder.data( 'moved_inside', 1 ); } } jWindow.trigger( 'tcEpoBeforeOptionPriceCalculation', { epo: currentEpoObject, alternativeCart: currentEpoObject, this_product_type: this_product_type, cart: cart, totalsHolder: totalsHolder, fetchOptionPrices: fetchOptionPrices, epoHolder: epoHolder, total: total, original_total: original_total, floatingBoxData: floatingBoxData, showTotal: showTotal, cart_fee_options_total: cart_fee_options_total, cart_fee_options_original_total: cart_fee_options_original_total } ); if ( ! currentEpoObject.associated_connect && ! event.noassociated ) { if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'yes' && ! cart.is( $.tcAPI().associatedEpoCart ) ) { cart.find( $.tcAPI().associatedEpoCart ).filter( ':visible' ).toArray().forEach( function( acart ) { $( acart ).trigger( { type: 'tm-epo-update', noassociated: 1 } ); } ); } } if ( TMEPOJS.tm_epo_global_product_element_quantity_sync === 'no' ) { fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field:not(.tc-epo-field-product)', total, original_total, floatingBoxData, showTotal ); total = fetch.total; original_total = fetch.original_total; floatingBoxData = fetch.floatingBoxData; showTotal = fetch.showTotal; elementsLength = fetch.elementsLength; fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tc-epo-field-product', noSyncTotal, 0, floatingBoxData, showTotal ); noSyncTotal = fetch.total; noSyncOriginalTotal = fetch.original_total; floatingBoxData = fetch.floatingBoxData; showTotal = showTotal && fetch.showTotal; elementsLength = elementsLength + fetch.elementsLength; totalsHolder.data( 'tm-floating-box-data', floatingBoxData ); } else { fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-field', total, original_total, floatingBoxData, showTotal ); total = fetch.total; original_total = fetch.original_total; floatingBoxData = fetch.floatingBoxData; showTotal = fetch.showTotal; elementsLength = fetch.elementsLength; totalsHolder.data( 'tm-floating-box-data', floatingBoxData ); } fetch = fetchOptionPrices( currentEpoObject, epoHolder, '.tmcp-fee-field', cart_fee_options_total, cart_fee_options_original_total, floatingBoxData, showTotal, false, true ); cart_fee_options_total = fetch.total; cart_fee_options_original_total = fetch.original_total; floatingBoxData = fetch.floatingBoxData; showTotal = fetch.showTotal; elementsLength = elementsLength + fetch.elementsLength; jWindow.trigger( 'tcEpoAfterOptionPriceCalculation', { epo: currentEpoObject, alternativeCart: currentEpoObject, this_product_type: this_product_type, cart: cart, totalsHolder: totalsHolder, fetchOptionPrices: fetchOptionPrices, epoHolder: epoHolder, total: total, original_total: original_total, floatingBoxData: floatingBoxData, showTotal: showTotal, cart_fee_options_total: cart_fee_options_total, cart_fee_options_original_total: cart_fee_options_original_total } ); $.tcepo.oneOptionIsSelected[ epoEventId ] = showTotal; tm_show_hide_add_to_cart_button( main_product, elementsLength, $.tcepo.oneOptionIsSelected[ epoEventId ], currentEpoObject ); showTotal = $.epoAPI.applyFilter( 'tcFinalTotalsBoxVisibility', showTotal, { epo: currentEpoObject, alternativeCart: alternativeCart, cart: cart, main_product: main_product, totalsHolder: totalsHolder, this_epo_totals_container: this_epo_totals_container } ); if ( cart_fee_options_total > 0 ) { showTotal = true; } if ( alternativeCart && ! perProductPricing ) { showTotal = false; } if ( finalTotalBoxMode === 'pxq' || finalTotalBoxMode === 'hide' || finalTotalBoxMode === 'normal' || finalTotalBoxMode === 'options' || finalTotalBoxMode === 'final' || finalTotalBoxMode === 'hideoptionsifzero' || finalTotalBoxMode === 'hideiftotaliszero' || finalTotalBoxMode === 'optionsiftotalnotzero' ) { showTotal = true; } if ( cartQty > 1 ) { showTotal = true; } if ( ( this_product_type === 'variable' || this_product_type === 'variable-subscription' ) && ! $.epoAPI.math.toFloat( currentVariation ) ) { showTotal = false; } // Original price + options price type requires this here. _total = total; _original_total = original_total; late_total_price = add_late_fields_prices( currentEpoObject, parseFloat( productPrice ), parseFloat( rawProductRegularPrice ), parseFloat( _total + noSyncTotal ), parseFloat( _original_total + noSyncOriginalTotal ), bundleid, totalsHolder ); if ( finalTotalBoxMode === 'disable' ) { showTotal = false; } if ( finalTotalBoxMode === 'disable_change' || TMEPOJS.tm_epo_change_variation_price === 'yes' || TMEPOJS.tm_epo_change_original_price === 'yes' ) { showTotal = true; } if ( currentEpoObject.is_associated && ! perProductPricing ) { showTotal = false; } if ( TMEPOJS.tm_epo_total_price_as_unit_price === 'yes' ) { cartQty = 1; } product_total_price = parseFloat( productPrice * cartQty ); if ( TMEPOJS.extraFee ) { extraFee = parseFloat( TMEPOJS.extraFee ); if ( ! Number.isFinite( extraFee ) ) { extraFee = 0; } } calculateFinalProductPrice = $.epoAPI.applyFilter( 'tcCalculateFinalProductPrice', false, { alternativeCart: alternativeCart, product_price: productPrice, product_total_price: product_total_price, v_product_price: rawProductPrice, tm_set_tax_price: tm_set_tax_price, main_product: main_product, totalsHolder: totalsHolder, cartQty: cartQty } ); if ( calculateFinalProductPrice !== false && typeof calculateFinalProductPrice === 'object' && Object.prototype.hasOwnProperty.call( calculateFinalProductPrice, 'productPrice' ) && Object.prototype.hasOwnProperty.call( calculateFinalProductPrice, 'productTotalPrice' ) ) { productPrice = calculateFinalProductPrice.productPrice; product_total_price = calculateFinalProductPrice.productTotalPrice; } _total = _total + late_total_price[ 0 ]; _total = $.epoAPI.applyFilter( 'tc_adjust_options_price_per_unit', _total, product_total_price ); total = parseFloat( _total * cartQty * elementQty ); total = total + noSyncTotal; total = $.epoAPI.applyFilter( 'tc_adjust_options_total_price', total, cartQty, elementQty, _total, noSyncTotal, totalsHolder ); _original_total = _original_total + late_total_price[ 1 ]; _original_total = $.epoAPI.applyFilter( 'tc_adjust_options_price_per_unit', _original_total, product_total_price ); original_total = parseFloat( _original_total * cartQty * elementQty ); original_total = original_total + noSyncOriginalTotal; original_total = $.epoAPI.applyFilter( 'tc_adjust_options_original_total_price', original_total, cartQty, elementQty, _original_total, noSyncOriginalTotal, totalsHolder ); if ( priceOverrideMode === '1' && parseFloat( total ) > 0 ) { productPrice = 0; rawProductPrice = 0; product_total_price = 0; } product_total_price = $.epoAPI.applyFilter( 'tc_adjust_product_total_price_without_options', product_total_price ); total = $.epoAPI.applyFilter( 'tcAdjustTotal', total, { epo: currentEpoObject, totalsHolder: totalsHolder, cart: cart, main_product: main_product } ); original_total = $.epoAPI.applyFilter( 'tcAdjustOriginalTotal', original_total, { epo: currentEpoObject, totalsHolder: totalsHolder, cart: cart, main_product: main_product } ); total = parseFloat( $.epoAPI.applyFilter( 'tc_adjust_total', total, totalsHolder ) ); cart_fee_options_total = parseFloat( $.epoAPI.applyFilter( 'tc_adjust_totals_fee', cart_fee_options_total, totalsHolder ) ); original_total = parseFloat( $.epoAPI.applyFilter( 'tc_adjust_total', original_total, totalsHolder ) ); cart_fee_options_original_total = parseFloat( $.epoAPI.applyFilter( 'tc_adjust_totals_fee', cart_fee_options_original_total, totalsHolder ) ); total_plus_fee = total + cart_fee_options_total; original_total_plus_fee = original_total + cart_fee_options_original_total; raw_total = total; raw__total = _total; raw_cart_fee_options_total = cart_fee_options_total; raw_total_plus_fee = total_plus_fee; raw_original_total = original_total; raw__original_total = _original_total; raw_cart_fee_options_original_total = cart_fee_options_original_total; raw_original_total_plus_fee = original_total_plus_fee; raw_product_total_price_without_options = product_total_price; raw_product_total_price = parseFloat( product_total_price + total_plus_fee + extraFee ); raw_product_total_original_price = parseFloat( rawProductRegularPrice + original_total_plus_fee + extraFee ); productPrice = tm_set_tax_price( productPrice, totalsHolder, undefined, undefined, undefined, undefined, true ); productRegularPrice = tm_set_tax_price( productRegularPrice, totalsHolder, undefined, undefined, undefined, undefined, true ); product_total_price = tm_set_tax_price( product_total_price, totalsHolder, undefined, undefined, undefined, undefined, true ); total = tm_set_tax_price( total, totalsHolder, undefined, undefined, undefined, undefined, true ); _total = tm_set_tax_price( _total, totalsHolder, undefined, undefined, undefined, undefined, true ); total_plus_fee = parseFloat( cart_fee_options_total ) + parseFloat( tm_set_tax_price( raw_total, totalsHolder, undefined, undefined, undefined, undefined, true ) ); original_total = tm_set_tax_price( original_total, totalsHolder, undefined, undefined, undefined, undefined, true ); _original_total = tm_set_tax_price( _original_total, totalsHolder, undefined, undefined, undefined, undefined, true ); cart_fee_options_original_total = tm_set_tax_price( cart_fee_options_original_total, totalsHolder, undefined, undefined, undefined, undefined, true ); original_total_plus_fee = parseFloat( cart_fee_options_original_total ) + parseFloat( original_total ); extraFee = tm_set_tax_price( extraFee, totalsHolder, undefined, undefined, undefined, undefined, true ); formatted_options_total = tm_set_price_totals( total, totalsHolder, true, true ); formatted_fees_total = tm_set_price_totals( cart_fee_options_total, totalsHolder, true, true ); formatted_options_original_total = tm_set_price_totals( original_total, totalsHolder, true, true ); formatted_fees_original_total = tm_set_price_totals( cart_fee_options_original_total, totalsHolder, true, true ); product_total_price_without_options = product_total_price; product_total_price = $.epoAPI.applyFilter( 'tc_adjust_product_total_price', parseFloat( product_total_price + total_plus_fee + extraFee ), product_total_price_without_options, total_plus_fee, extraFee, total, cart_fee_options_total, totalsHolder ); product_total_original_price = $.epoAPI.applyFilter( 'tc_adjust_product_total_original_price', parseFloat( product_total_price_without_options + original_total_plus_fee + extraFee ), product_total_price_without_options, original_total_plus_fee, extraFee, original_total, cart_fee_options_original_total, totalsHolder ); formatted_final_total = tm_set_price_totals( product_total_price, totalsHolder, true, true ); formatted_final_original_total = tm_set_price_totals( product_total_original_price, totalsHolder, true, true ); unit_price = parseFloat( productPrice + parseFloat( _total ) ); unit_original_price = parseFloat( productPrice + parseFloat( _original_total ) ); if ( TMEPOJS.tm_epo_fees_on_unit_price === 'yes' ) { unit_price = parseFloat( productPrice + parseFloat( _total ) + parseFloat( parseFloat( cart_fee_options_total ) / cartQty ) ); unit_original_price = parseFloat( productPrice + parseFloat( _original_total ) + parseFloat( parseFloat( cart_fee_options_original_total ) / cartQty ) ); } formatted_unit_price = tm_set_price_totals( parseFloat( productPrice + parseFloat( _total ) + parseFloat( parseFloat( cart_fee_options_total ) / cartQty ) ), totalsHolder, true, true ); formatted_unit_original_price = tm_set_price_totals( parseFloat( productPrice + parseFloat( _original_total ) + parseFloat( parseFloat( cart_fee_options_original_total ) / cartQty ) ), totalsHolder, true, true ); if ( finalTotalBoxMode !== 'pxq' && finalTotalBoxMode !== 'final' && finalTotalBoxMode !== 'hide' && ! ( total_plus_fee === 0 && finalTotalBoxMode === 'hideoptionsifzero' ) ) { if ( ! ( total === 0 && finalTotalBoxMode === 'hideoptionsifzero' ) || finalTotalBoxMode === 'options' ) { show_options_total = true; if ( TMEPOJS.tm_epo_enable_vat_options_total === 'yes' ) { show_vat_options_total = true; } } if ( cart_fee_options_total !== 0 ) { show_fees_total = true; } } if ( extraFee ) { show_extra_fee = true; formatted_extra_fee = tm_set_price_totals( extraFee, totalsHolder, true, true ); } if ( formatted_final_total && finalTotalBoxMode !== 'options' && finalTotalBoxMode !== 'optionsiftotalnotzero' ) { show_final_total = true; } pricesIncludeTax = totalsHolder.attr( 'data-prices-include-tax' ) || TMEPOJS.prices_include_tax; if ( pricesIncludeTax === '1' ) { vat_options_total = parseFloat( get_price_including_tax( total, totalsHolder, undefined, true, undefined, undefined, true ) - raw_total ); vat_options_total_plus_fee = parseFloat( get_price_including_tax( original_total_plus_fee, totalsHolder, undefined, true, undefined, undefined, true ) - raw_total_plus_fee ); vat_total = parseFloat( get_price_including_tax( product_total_price, totalsHolder, undefined, true, undefined, undefined, true ) - raw_product_total_price ); vat_product_base = parseFloat( get_price_including_tax( product_total_price_without_options, totalsHolder, undefined, true, undefined, undefined, true ) - raw_product_total_price_without_options ); } else { vat_options_total = parseFloat( total - raw_total ); vat_options_total_plus_fee = parseFloat( original_total_plus_fee - raw_total_plus_fee ); vat_total = parseFloat( product_total_price - raw_product_total_price ); vat_product_base = parseFloat( product_total_price_without_options - raw_product_total_price_without_options ); } formatted_vat_options_total = tm_set_price_totals( vat_options_total ); formatted_vat_options_total_plus_fee = tm_set_price_totals( vat_options_total_plus_fee ); formatted_vat_total = tm_set_price_totals( vat_total ); formatted_vat_product_base = tm_set_price_totals( vat_product_base ); // Backwards compatibility formatted_unit_price = $.epoAPI.applyFilter( 'tc_adjust_formatted_unit_price', formatted_unit_price, productPrice, _total, cart_fee_options_total, cartQty ); formatted_options_total = $.epoAPI.applyFilter( 'tc_adjust_formatted_options_total', formatted_options_total, total, _total, cartQty ); formatted_fees_total = $.epoAPI.applyFilter( 'tc_adjust_formatted_fees_total', formatted_fees_total, cart_fee_options_total ); formatted_final_total = $.epoAPI.applyFilter( 'tc_adjust_formatted_final_total', formatted_final_total, product_total_price, product_total_price_without_options, total_plus_fee, extraFee, cartQty ); formatted_unit_price = $.epoAPI.applyFilter( 'tcAdjustFormattedUnitPrice', formatted_unit_price, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, unit_price: unit_price, productPrice: productPrice, _total: _total, total_plcart_fee_options_totals_fee: cart_fee_options_total, cartQty: cartQty } ); formatted_unit_original_price = $.epoAPI.applyFilter( 'tcAdjustFormattedUnitOriginalPrice', formatted_unit_original_price, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, unit_original_price: unit_original_price, productPrice: productPrice, _original_total: _original_total, total_plcart_fee_options_totals_fee: cart_fee_options_total, cartQty: cartQty } ); formatted_options_total = $.epoAPI.applyFilter( 'tcAdjustFormattedOptionsTotal', formatted_options_total, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, total: total, _total: _total, total_plus_fee: total_plus_fee, extraFee: extraFee, cartQty: cartQty } ); formatted_options_original_total = $.epoAPI.applyFilter( 'tcAdjustFormattedOptionsOriginalTotal', formatted_options_original_total, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, original_total: original_total, _original_total: _original_total, original_total_plus_fee: original_total_plus_fee, extraFee: extraFee, cartQty: cartQty } ); formatted_fees_total = $.epoAPI.applyFilter( 'tcAdjustFormattedFeesTotal', formatted_fees_total, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, cart_fee_options_total: cart_fee_options_total, extraFee: extraFee, cartQty: cartQty } ); formatted_fees_original_total = $.epoAPI.applyFilter( 'tcAdjustFormattedFeesOriginalTotal', formatted_fees_original_total, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, cart_fee_options_original_total: cart_fee_options_original_total, extraFee: extraFee, cartQty: cartQty } ); formatted_final_total = $.epoAPI.applyFilter( 'tcAdjustFormattedFinalTotal', formatted_final_total, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, product_total_price: product_total_price, product_total_price_without_options: product_total_price_without_options, total_plus_fee: total_plus_fee, extraFee: extraFee, cartQty: cartQty } ); formatted_final_original_total = $.epoAPI.applyFilter( 'tcAdjustFormattedFinalOriginalTotal', formatted_final_original_total, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, product_total_original_price: product_total_original_price, product_total_price_without_options: product_total_price_without_options, original_total_plus_fee: original_total_plus_fee, extraFee: extraFee, cartQty: cartQty } ); tc_totals_ob = { qty: cartQty, product_price: productPrice, raw_product_price: rawProductPrice, product_regular_price: productRegularPrice, raw_product_regular_price: rawProductRegularPrice, late_total_prices: late_total_price, late_total_price: tm_set_tax_price( late_total_price[ 0 ], totalsHolder ), late_total_original_price: tm_set_tax_price( late_total_price[ 1 ], totalsHolder ), raw_options_price_per_unit: raw__total, raw_options_total_price: raw_total, raw_cart_fee_options_total_price: raw_cart_fee_options_total, raw_total_plus_fee: raw_total_plus_fee, raw_options_original_price_per_unit: raw__original_total, raw_options_original_total_price: raw_original_total, raw_cart_fee_options_original_total_price: raw_cart_fee_options_original_total, raw_original_total_plus_fee: raw_original_total_plus_fee, raw_product_total_price: raw_product_total_price, raw_product_total_original_price: raw_product_total_original_price, raw_product_total_price_without_options: raw_product_total_price_without_options, options_price_per_unit: _total, options_total_price: total, cart_fee_options_total_price: cart_fee_options_total, total_plus_fee: total_plus_fee, options_original_price_per_unit: _original_total, options_original_total_price: original_total, cart_fee_options_total_original_price: cart_fee_options_original_total, original_total_plus_fee: original_total_plus_fee, vat_options_total: vat_options_total, vat_options_total_plus_fee: vat_options_total_plus_fee, formatted_vat_options_total: formatted_vat_options_total, formatted_vat_options_total_plus_fee: formatted_vat_options_total_plus_fee, vat_total: vat_total, formatted_vat_total: formatted_vat_total, vat_product_base: vat_product_base, formatted_vat_product_base: formatted_vat_product_base, product_total_price: product_total_price, product_total_original_price: product_total_original_price, product_total_price_without_options: product_total_price_without_options, product_unit_price: unit_price, product_unit_original_price: unit_original_price, formatted_unit_price: formatted_unit_price, formatted_options_total: formatted_options_total, formatted_fees_total: formatted_fees_total, formatted_final_total: formatted_final_total, formatted_unit_original_price: formatted_unit_original_price, formatted_options_original_total: formatted_options_original_total, formatted_fees_original_total: formatted_fees_original_total, formatted_final_original_total: formatted_final_original_total, formatted_extra_fee: formatted_extra_fee, show_options_total: show_options_total, show_fees_total: show_fees_total, show_extra_fee: show_extra_fee, show_final_total: show_final_total, show_options_vat: show_vat_options_total, unit_price: TMEPOJS.i18n_unit_price, show_unit_price: TMEPOJS.tm_epo_show_unit_price === 'yes', options_total: TMEPOJS.i18n_options_total, fees_total: TMEPOJS.i18n_fees_total, extra_fee: TMEPOJS.i18n_extra_fee, final_total: TMEPOJS.i18n_final_total, options_vat_total: TMEPOJS.i18n_vat_options_total }; if ( formatted_options_total && total > 0 ) { _ftotal = formatPrice( total ); _foriginal_total = formatPrice( original_total ); _ftotal = $.epoAPI.applyFilter( 'tcFilterFormattedFTotal', _ftotal, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, total: total, _total: _total, total_plus_fee: total_plus_fee, extraFee: extraFee, cartQty: cartQty } ); _foriginal_total = $.epoAPI.applyFilter( 'tcFilterFormattedFOriginalTotal', _foriginal_total, { epo: currentEpoObject, totalsHolder: totalsHolder, event: event, original_total: original_total, total: original_total, _total: _total, total_plus_fee: total_plus_fee, extraFee: extraFee, cartQty: cartQty } ); if ( TMEPOJS.tm_epo_enable_original_final_total === 'yes' && total !== original_total ) { tc_totals_ob.formatted_options_total = $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_sale_price, { price: _foriginal_total, sale_price: _ftotal, customer_price_format_wrap_start: customer_price_format_wrap_start, customer_price_format_wrap_end: customer_price_format_wrap_end } ) ); tc_totals_ob._foriginal_total = _foriginal_total; tc_totals_ob._ftotal = _ftotal; } else { tc_totals_ob.formatted_options_total = $.epoAPI.util.decodeHTML( $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, { price: _ftotal, customer_price_format_wrap_start: customer_price_format_wrap_start, customer_price_format_wrap_end: customer_price_format_wrap_end } ) ) ); } } if ( formatted_final_total && product_total_price >= 0 ) { _fprice = formatPrice( product_total_price ); if ( priceOverrideMode === '1' && parseFloat( raw_original_total_plus_fee + extraFee ) > 0 ) { _f_regular_price = parseFloat( raw_original_total_plus_fee + extraFee ); } else { _f_regular_price = parseFloat( parseFloat( rawProductRegularPrice * cartQty ) + raw_original_total_plus_fee + extraFee ); } if ( TMEPOJS.customer_price_format ) { customer_price_format_wrap_start = TMEPOJS.customer_price_format_wrap_start; customer_price_format_wrap_end = TMEPOJS.customer_price_format_wrap_end; customerPriceFormat = TMEPOJS.customer_price_format; _fprice = customerPriceFormat.replace( '__PRICE__', _fprice ).replace( '__CODE__', TMEPOJS.current_currency ); if ( ! totalsHolder.data( 'is-on-sale' ) ) { _f_regular_price = customerPriceFormat.replace( '__PRICE__', _f_regular_price ).replace( '__CODE__', TMEPOJS.current_currency ); } } _fprice = $.epoAPI.applyFilter( 'tc_adjust_native_price', _fprice, product_total_price ); _f_regular_price = tm_set_tax_price( _f_regular_price, totalsHolder, undefined, undefined, undefined, undefined, true ); _f_regular_price = formatPrice( _f_regular_price ); _f_regular_price = $.epoAPI.applyFilter( 'tc_adjust_native_regular_price', _f_regular_price, product_total_price ); if ( TMEPOJS.tm_epo_enable_original_final_total === 'yes' && ( totalsHolder.data( 'is-on-sale' ) || _f_regular_price !== _fprice ) ) { tc_totals_ob.formatted_final_total = $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_sale_price, { price: _f_regular_price, sale_price: _fprice, customer_price_format_wrap_start: customer_price_format_wrap_start, customer_price_format_wrap_end: customer_price_format_wrap_end } ) ); } else { tc_totals_ob.formatted_final_total = $.epoAPI.util.decodeHTML( $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, { price: _fprice, customer_price_format_wrap_start: customer_price_format_wrap_start, customer_price_format_wrap_end: customer_price_format_wrap_end } ) ) ); } tc_totals_ob._f_regular_price = _f_regular_price; tc_totals_ob._fprice = _fprice; } tc_totals_ob = $.epoAPI.applyFilter( 'tc_adjust_tc_totals_ob', tc_totals_ob, { epo_object: currentEpoObject, showTotal: showTotal, epoHolder: epoHolder, totalsHolder: totalsHolder, tm_set_price: tm_set_price, tm_set_price_totals: tm_set_price_totals, product_total_price: product_total_price, product_price: productPrice, qty: cartQty } ); tc_totals_ob = replace_suffixes( 'formatted_fees_original_total', 'cart_fee_options_total_original_price', tc_totals_ob, totalsHolder ); tc_totals_ob = replace_suffixes( 'formatted_fees_total', 'cart_fee_options_total_price', tc_totals_ob, totalsHolder ); tc_totals_ob = replace_suffixes( 'formatted_final_original_total', 'product_total_original_price', tc_totals_ob, totalsHolder ); tc_totals_ob = replace_suffixes( 'formatted_final_total', 'product_total_price', tc_totals_ob, totalsHolder ); tc_totals_ob = replace_suffixes( 'formatted_options_original_total', 'options_original_total_price', tc_totals_ob, totalsHolder ); tc_totals_ob = replace_suffixes( 'formatted_options_total', 'options_total_price', tc_totals_ob, totalsHolder ); tc_totals_ob = replace_suffixes( 'formatted_unit_original_price', 'product_unit_original_price', tc_totals_ob, totalsHolder ); tc_totals_ob = replace_suffixes( 'formatted_unit_price', 'product_unit_price', tc_totals_ob, totalsHolder ); currentEpoObject.tc_totals_ob = tc_totals_ob; if ( tc_totals_ob.showTotal !== undefined ) { showTotal = tc_totals_ob.showTotal; } html = $.epoAPI.template.html( tcAPI.templateEngine.tc_final_totals, tc_totals_ob ); totalsHolder.data( 'tm-html', html ); totalsHolder.data( 'tc_totals_ob', tc_totals_ob ); if ( currentEpoObject.associated_connect && currentEpoObject.associated_connect.length === 1 ) { if ( currentEpoObject.associated_connect.attr( 'data-no-price' ) === '1' ) { associatedPrice = 0; associatedRawPrice = 0; associatedOriginalPrice = 0; associatedRawOriginalPrice = 0; associatedFormattedPrice = ''; associatedFormattedOriginalPrice = ''; tm_force_update_price( associatedSetter .closest( '.tmcp-field-wrap' ) .find( '.tc-price' ) .not( tcAPI.associatedEpoSelector + ' .tc-price' ), associatedPrice, associatedFormattedPrice, associatedOriginalPrice, associatedFormattedOriginalPrice ); } else { associatedPrice = tc_totals_ob.product_price + tc_totals_ob.options_price_per_unit + ( tc_totals_ob.cart_fee_options_total_price / tc_totals_ob.qty ); associatedRawPrice = tc_totals_ob.raw_product_price + tc_totals_ob.raw_options_price_per_unit + ( tc_totals_ob.raw_cart_fee_options_total_price / tc_totals_ob.qty ); associatedOriginalPrice = tc_totals_ob.product_regular_price + tc_totals_ob.options_original_price_per_unit + ( tc_totals_ob.cart_fee_options_total_original_price / tc_totals_ob.qty ); associatedRawOriginalPrice = tc_totals_ob.raw_product_regular_price + tc_totals_ob.raw_options_original_price_per_unit + ( tc_totals_ob.raw_cart_fee_options_original_total_price / tc_totals_ob.qty ); associatedFormattedPrice = tm_set_price( associatedPrice, currentEpoObject.this_epo_totals_containe, false, false, associatedSetter ); associatedFormattedOriginalPrice = tm_set_price( associatedOriginalPrice, currentEpoObject.this_epo_totals_containe, false, false, associatedSetter ); // Mainly used to update the price of the associated element when the associated product is variable. tm_force_update_price( associatedSetter .closest( '.tmcp-field-wrap' ) .find( '.tc-price' ) .not( tcAPI.associatedEpoSelector + ' .tc-price' ), associatedPrice, associatedFormattedPrice, associatedOriginalPrice, associatedFormattedOriginalPrice ); currentEpoObject.associated_connect.data( 'tm-quantity', tc_totals_ob.qty ); if ( currentEpoObject.associated_connect.data( 'tm-quantity' ) ) { associatedPrice = associatedPrice * parseFloat( currentEpoObject.associated_connect.data( 'tm-quantity' ) ); associatedRawPrice = associatedRawPrice * parseFloat( currentEpoObject.associated_connect.data( 'tm-quantity' ) ); associatedOriginalPrice = associatedOriginalPrice * parseFloat( currentEpoObject.associated_connect.data( 'tm-quantity' ) ); associatedRawOriginalPrice = associatedRawOriginalPrice * parseFloat( currentEpoObject.associated_connect.data( 'tm-quantity' ) ); } associatedFormattedPrice = tm_set_price( associatedPrice, currentEpoObject.this_epo_totals_containe, false, false, associatedSetter ); associatedFormattedOriginalPrice = tm_set_price( associatedOriginalPrice, currentEpoObject.this_epo_totals_containe, false, false, associatedSetter ); } currentEpoObject.associated_connect.data( 'price_set', 1 ); if ( associatedSetter.is( '.tcenabled' ) ) { associatedSetter.data( 'associated_price_set', 1 ); } associatedSetter.data( 'price_set', 1 ); associatedSetter.data( 'raw_price', associatedRawPrice ); associatedSetter.data( 'raw_original_price', associatedRawOriginalPrice ); associatedSetter.data( 'price', tm_set_tax_price( associatedPrice, currentEpoObject.this_epo_totals_containe, associatedSetter ) ); associatedSetter.data( 'original_price', tm_set_tax_price( associatedOriginalPrice, currentEpoObject.this_epo_totals_containe, associatedSetter ) ); currentEpoObject.associated_connect.data( 'price-changed', 1 ); setTimeout( function() { if ( ! ( currentEpoObject.associated_connect && event.noassociated ) ) { currentEpoObject.mainEpoObject.main_cart.trigger( { type: 'tm-epo-update', norules: 2 } ); } }, 20 ); } jWindow.trigger( 'tcEpoAfterCalculateTotals', { epo: currentEpoObject, alternativeCart: alternativeCart, this_product_type: this_product_type, cart: cart, bundleid: bundleid, totalsObject: tc_totals_ob, main_product: main_product, per_product_pricing: perProductPricing } ); hide_native_price = $.epoAPI.applyFilter( 'hide_native_price', true ); if ( showTotal && cartQty > 0 ) { // hide native prices if ( finalTotalBoxMode === 'disable_change' || TMEPOJS.tm_epo_change_variation_price === 'yes' ) { if ( hide_native_price === true && finalTotalBoxMode !== 'disable' && finalTotalBoxMode !== 'disable_change' ) { tm_get_native_prices_block( cart ).hide(); } else { tm_get_native_prices_block( cart ).show(); } } if ( finalTotalBoxMode === 'disable' || finalTotalBoxMode === 'disable_change' || ( finalTotalBoxMode === 'hideiftotaliszero' && product_total_price === 0 ) || ( ( finalTotalBoxMode === 'hideifoptionsiszero' || finalTotalBoxMode === 'optionsiftotalnotzero' ) && total_plus_fee === 0 ) || finalTotalBoxMode === 'hide' ) { html = ''; totalsHolder.html( html ); } else { totalsHolder.html( html ); jWindow.trigger( 'tc-totals-container', { epo: tc_totals_ob, totals_holder: totalsHolder, data: { epo_object: currentEpoObject, tm_set_price: tm_set_price, tm_set_price_totals: tm_set_price_totals, product_total_price: product_total_price, product_price: productPrice, qty: cartQty }, tm_epo_js: TMEPOJS } ); } if ( formatted_final_total && product_total_price >= 0 ) { update_native_html = tm_get_native_prices_block( cart ); if ( finalTotalBoxMode === 'disable_change' || TMEPOJS.tm_epo_change_variation_price === 'yes' ) { if ( totalsHolder.data( 'is-on-sale' ) ) { temp = $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_sale_price, { price: _f_regular_price, sale_price: _fprice, customer_price_format_wrap_start: customer_price_format_wrap_start, customer_price_format_wrap_end: customer_price_format_wrap_end } ) ); temp = { formatted: temp, raw: tc_totals_ob.product_total_price }; temp = replace_suffixes( 'formatted', 'raw', temp, totalsHolder ); temp = temp.formatted; update_native_html .html( temp ) .show(); } else { temp = $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, { price: _fprice, customer_price_format_wrap_start: customer_price_format_wrap_start, customer_price_format_wrap_end: customer_price_format_wrap_end } ) ); temp = { formatted: temp, raw: tc_totals_ob.product_total_price }; temp = replace_suffixes( 'formatted', 'raw', temp, totalsHolder ); temp = temp.formatted; update_native_html .html( temp ) .show(); } } if ( finalTotalBoxMode === 'disable_change' || TMEPOJS.tm_epo_change_original_price === 'yes' ) { if ( ! alternativeCart || main_product.find( '.cpf-bto-price' ).length === 0 ) { if ( currentEpoObject.associated_connect ) { nativeProductPriceSelector = currentEpoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector ); } else { nativeProductPriceSelector = $( tcAPI.nativeProductPriceSelector ); } if ( nativeProductPriceSelector.length === 0 && main_product.is( '.tc-after-shop-loop' ) ) { nativeProductPriceSelector = main_product.closest( '.product' ).find( '.price' ); } if ( nativeProductPriceSelector.data( 'tc-original-html' ) === undefined ) { nativeProductPriceSelector.data( 'tc-original-html', nativeProductPriceSelector.html() ); } if ( product_total_price > 0 ) { if ( totalsHolder.data( 'is-on-sale' ) ) { temp = $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_sale_price, { price: _f_regular_price, sale_price: _fprice, customer_price_format_wrap_start: customer_price_format_wrap_start, customer_price_format_wrap_end: customer_price_format_wrap_end } ) ); temp = { formatted: temp, raw: tc_totals_ob.product_total_price }; temp = replace_suffixes( 'formatted', 'raw', temp, totalsHolder ); temp = temp.formatted; nativeProductPriceSelector .html( temp ) .show(); } else { temp = $.epoAPI.util.decodeHTML( $.epoAPI.template.html( tcAPI.templateEngine.tc_formatted_price, { price: _fprice, customer_price_format_wrap_start: customer_price_format_wrap_start, customer_price_format_wrap_end: customer_price_format_wrap_end } ) ); temp = { formatted: temp, raw: tc_totals_ob.product_total_price }; temp = replace_suffixes( 'formatted', 'raw', temp, totalsHolder ); temp = temp.formatted; nativeProductPriceSelector .html( temp ) .show(); } } else if ( this_product_type && this_product_type !== 'composite' ) { if ( currentEpoObject.associated_connect ) { if ( currentEpoObject.variations_form.length ) { temp = currentEpoObject.this_epo_totals_container.data( 'variationIdElement' ); if ( temp.length > 0 ) { temp = parseFloat( temp.val() ); if ( ! ( ! temp || temp === 0 ) ) { nativeProductPriceSelector.html( $.epoAPI.util.decodeHTML( TMEPOJS.assoc_current_free_text ) ); } } } else { nativeProductPriceSelector.html( $.epoAPI.util.decodeHTML( TMEPOJS.assoc_current_free_text ) ); } } else { nativeProductPriceSelector.html( $.epoAPI.util.decodeHTML( TMEPOJS.current_free_text ) ); } } } jWindow.trigger( 'tcEpoMaybeChangePriceHtml', { epo: currentEpoObject, alternativeCart: alternativeCart, this_product_type: this_product_type, cart: cart, bundleid: bundleid, totalsObject: tc_totals_ob, main_product: main_product, nativePrice: _fprice } ); } } if ( alternativeCart ) { main_cart.trigger( { type: 'tm-epo-update', norules: 1 } ); } else { this_epo_totals_container.data( 'is_active', true ); } } else { if ( currentEpoObject.associated_connect ) { nativeProductPriceSelector = currentEpoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector ); nativeProductPriceSelector.html( nativeProductPriceSelector.data( 'tc-original-html' ) ); } tm_get_native_prices_block( cart ).each( function() { var $npb = $( this ); if ( ! $npb.data( 'tm-original-html' ) ) { $npb.data( 'tm-original-html', $npb.html() ); } else { $npb.html( $npb.data( 'tm-original-html' ) ); } } ); if ( rawProductPrice === 0 && TMEPOJS.tm_epo_remove_free_price_label === 'yes' ) { tm_get_native_prices_block( cart ).hide(); } else if ( ( finalTotalBoxMode === 'disable_change' || TMEPOJS.tm_epo_change_variation_price === 'yes' ) && ! ( hide_native_price === true && finalTotalBoxMode !== 'disable' && finalTotalBoxMode !== 'disable_change' ) ) { tm_get_native_prices_block( cart ).show(); } totalsHolder.empty(); if ( alternativeCart ) { main_cart.trigger( { type: 'tm-epo-update', norules: 1 } ); } } main_cart.trigger( 'tm-epo-after-update', { container: cartContainer } ); jWindow.trigger( 'tc-epo-after-update', { epo: tc_totals_ob, totals_holder: totalsHolder, data: { epo_object: currentEpoObject, add_late_fields_prices: add_late_fields_prices, tm_set_price: tm_set_price, tm_set_price_totals: tm_set_price_totals, product_total_price: product_total_price, product_price: productPrice, qty: cartQty, bundleid: bundleid, currentCart: currentCart }, tm_epo_js: TMEPOJS } ); } ); if ( this_product_type === 'variable' || this_product_type === 'variable-subscription' ) { epoVariationSection = epoHolder.find( '.tm-epo-variation-section' ).first(); // Custom variation events epoVariationSection .find( '.tm-epo-reset-variation' ) .off( 'click.cpfv' ) .on( 'click.cpfv', function() { var field = $( this ); var id = $.epoAPI.dom.id( field.attr( 'data-tm-for-variation' ) ); var section = field.closest( '.cpf-type-variations' ); var inputs = field.closest( '.cpf-element' ).find( '.tm-epo-variation-element' ); var lis = field.closest( '.cpf-element' ).find( '.tmcp-field-wrap' ); inputs.prop( 'checked', false ); lis.removeClass( 'tc-active' ); variationForm .find( "[data-attribute_name='attribute_" + id + "']" ) .val( '' ) .trigger( 'change' ); variationForm.find( "[data-attribute_name='attribute_" + id + "']" ).trigger( 'focusin' ); main_product .find( '.cpf-type-variations' ) .not( section ) .each( function( i, el ) { variationForm.find( "[data-attribute_name='attribute_" + $.epoAPI.dom.id( $( el ).find( '.tm-epo-variation-element' ).first().attr( 'data-tm-for-variation' ) ) + "']" ).trigger( 'focusin' ); } ); field.trigger( 'blur' ); variationForm.trigger( 'woocommerce_update_variation_values_tmlogic' ); } ); epoVariationSection .find( 'input.tm-epo-variation-element,input.tm-epo-variation-element + span' ) .off( 'mouseup.cpfv' ) .on( 'mouseup.cpfv', function() { var field = $( this ); var id; if ( field.is( 'span' ) ) { field = field.prev( 'input' ); } if ( field.attr( 'disabled' ) ) { variationForm.find( '.reset_variations' ).trigger( 'click' ); } id = $.epoAPI.dom.id( field.attr( 'data-tm-for-variation' ) ); variationForm.find( "[data-attribute_name='attribute_" + id + "']" ).trigger( 'focusin' ); } ); epoVariationSection .off( 'click.' + eventName + '.tmepo', '.reset_variations, .tc-epo-element-variable-reset-variations' ) .on( 'click.' + eventName + '.tmepo', '.reset_variations, .tc-epo-element-variable-reset-variations', { _epoObject: epoObject }, function( event ) { var _nativeProductPriceSelector; if ( finalTotalBoxMode === 'disable_change' || TMEPOJS.tm_epo_change_original_price === 'yes' ) { if ( ! alternativeCart || main_product.find( '.cpf-bto-price' ).length === 0 ) { if ( event.data._epoObject.associated_connect ) { _nativeProductPriceSelector = event.data._epoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector ); } else { _nativeProductPriceSelector = $( tcAPI.nativeProductPriceSelector ); } if ( _nativeProductPriceSelector.data( 'tc-original-html' ) ) { _nativeProductPriceSelector.html( _nativeProductPriceSelector.data( 'tc-original-html' ) ); } } } variationForm.find( '.variations .reset_variations, .tc-epo-element-variable-reset-variations' ).first().trigger( 'click' ); } ); epoVariationSection .find( '.tm-epo-variation-element' ) .off( 'change.cpfv tm_epo_variation_element_change' ) .on( 'change.cpfv tm_epo_variation_element_change', function( e ) { var field = $( this ); var id = $.epoAPI.dom.id( field.attr( 'data-tm-for-variation' ) ); var value = field.val(); var section = field.closest( '.cpf-type-variations' ); var nativeSelect = variationForm.find( "[data-attribute_name='attribute_" + id + "']" ); var exists; if ( field.closest( '.tm-epo-variation-section' ).is( '.tm-hidden' ) ) { return; } if ( ! ( e && e.type && e.type === 'tm_epo_variation_element_change' ) ) { exists = false; nativeSelect.each( function() { if ( this.value === value ) { exists = true; return false; } } ); if ( ! exists ) { nativeSelect.trigger( 'focusin' ); } nativeSelect.val( value ).trigger( 'change' ); } if ( ! value ) { nativeSelect.trigger( 'focusin' ); } main_product .find( '.cpf-type-variations' ) .not( section ) .each( function() { variationForm.find( '#' + $.epoAPI.dom.id( $( this ).find( '.tm-epo-variation-element' ).first().attr( 'data-tm-for-variation' ) ) ).trigger( 'focusin' ); } ); field.trigger( 'blur' ); variationForm.trigger( 'woocommerce_update_variation_values_tmlogic' ); } ) .off( 'focusin.cpfv' ) .on( 'focusin.cpfv', function() { var field = $( this ); var id; if ( ! field.is( 'select' ) ) { return; } id = $.epoAPI.dom.id( field.attr( 'data-tm-for-variation' ) ); variationForm.find( "[data-attribute_name='attribute_" + id + "']" ).trigger( 'focusin' ); variationForm.trigger( 'woocommerce_update_variation_values_tmlogic' ); } ); variationForm.off( eventNamePrefix + 'found_variation.tmepo tm_fix_stock', '.single_variation_wrap' ).on( eventNamePrefix + 'found_variation.tmepo tm_fix_stock', '.single_variation_wrap', function() { tm_fix_stock_tmepo( $( this ), cartContainer ); } ); // update prices when a variation is found variationForm .off( eventNamePrefix + 'found_variation.tmepo' ) .on( eventNamePrefix + 'found_variation.tmepo', function( event, variation ) { var form = $( this ); totalsHolder.data( 'is-on-sale', variation.tc_is_on_sale ); totalsHolder.data( 'regular-price', tm_set_backend_price( variation.display_regular_price, totalsHolder, variation ) ); jWindow.trigger( 'tm-epo-found-variation', { epo: epoObject, totalsHolder: totalsHolder, totalsHolderContainer: totalsHolderContainer, currentCart: currentCart, variationForm: form, variation: variation } ); found_variation_tmepo( { epoHolder: epoHolder, totalsHolder: totalsHolder, totalsHolderContainer: totalsHolderContainer, currentCart: currentCart, variationForm: form, variation: variation } ); tm_fix_stock_tmepo( form, cartContainer ); } ) .off( eventNamePrefix + 'hide_variation.tmepo' ) .on( eventNamePrefix + 'hide_variation.tmepo', { _epoObject: epoObject }, function( event ) { var _nativeProductPriceSelector; if ( finalTotalBoxMode === 'disable_change' || TMEPOJS.tm_epo_change_original_price === 'yes' ) { if ( ! alternativeCart || main_product.find( '.cpf-bto-price' ).length === 0 ) { if ( event.data._epoObject.associated_connect ) { _nativeProductPriceSelector = event.data._epoObject.main_product.find( tcAPI.associatedNativeProductPriceSelector ); } else { _nativeProductPriceSelector = $( tcAPI.nativeProductPriceSelector ); } if ( _nativeProductPriceSelector.data( 'tc-original-html' ) ) { _nativeProductPriceSelector.html( _nativeProductPriceSelector.data( 'tc-original-html' ) ); } } } totalsHolder.data( 'price', false ); // Fancy product Designer totalsHolder.removeData( 'tcprice' ); currentCart.trigger( { type: 'tm-epo-update', norules: 2 } ); } ) .off( eventNamePrefix + 'check_variations.tmepo' ) .on( eventNamePrefix + 'check_variations.tmepo', function() { var data = {}; var chosen = 0; var reset = epoVariationSection.find( '.reset_variations' ); variationForm.find( '.variations select, .tc-epo-variable-product-selector' ).each( function() { var attribute_name = $( this ).data( 'attribute_name' ) || $( this ).attr( 'name' ); var value = $( this ).val() || ''; if ( value.length > 0 ) { chosen++; } data[ attribute_name ] = value; } ); if ( chosen > 0 ) { if ( reset.css( 'visibility' ) === 'hidden' ) { reset.css( 'visibility', 'visible' ).hide().fadeIn(); } } else { reset.css( 'visibility', 'hidden' ); } } ) .trigger( eventNamePrefix + 'check_variations' ); tm_custom_variations( epoObject, cartContainer, itemId, main_product, epoHolder ); } selectSelector.trigger( 'tm-select-change-html' ); tmQty.trigger( 'change.cpf', { init: 1 } ); tmQuantity.trigger( 'showhide.cpfcustom' ); epoFieldHasClearButton.filter( ':checked' ).trigger( 'cpfclearbutton' ); jWindow.on( 'tm-do-epo-update', function() { // This must be run every time to get correct results for percent price types // if set norules then discount will not auto work upon chosing a variation currentCart.trigger( { type: 'tm-epo-update' //"norules": 2 } ); } ); jWindow.trigger( 'tm-epo-init-events', { epo: { epo_id: epo_id, form: epoObject.form, currentCart: currentCart, cart_container: cartContainer, epo_holder: epoHolder, totals_holder_container: totalsHolderContainer, totals_holder: totalsHolder, main_cart: main_cart, main_epo_inside_form: main_epo_inside_form, product_id_selector: product_id_selector, epo_id_selector: epo_id_selector, product_id: product_id, this_epo_container: this_epo_container, this_totals_container: this_totals_container, this_epo_totals_container: this_epo_totals_container } } ); jWindow.trigger( 'epoEventHandlers', { epo: epoObject, currentCart: currentCart, cartContainer: cartContainer, qtyElement: qtyElement, epoHolder: epoHolder, totalsHolderContainer: totalsHolderContainer, totalsHolder: totalsHolder, variationForm: variationForm, variation_id_selector: variation_id_selector, main_epo_inside_form: main_epo_inside_form, this_product_type: this_product_type, get_price_excluding_tax: get_price_excluding_tax, get_price_including_tax: get_price_including_tax } ); // show final totals if ( finalTotalBoxMode !== 'disable' && finalTotalBoxMode !== 'disable_change' && finalTotalBoxMode !== 'hide' ) { totalsHolderContainer.addClass( 'tc-show' ); } // show extra options jWindow.trigger( 'epo_options_before_visible' ); if ( TMEPOJS.tm_epo_progressive_display === 'yes' ) { setTimeout( function() { epoHolder .css( 'opacity', 0 ) .addClass( 'tc-show' ) .animate( { opacity: 1 }, tcAPI.epoAnimationDelay, 'easeOutExpo', function() { jWindow.trigger( 'epo_options_visible' ); jWindow.trigger( 'tmlazy' ); } ); }, tcAPI.epoDelay ); } else { epoHolder.addClass( 'tc-show' ); jWindow.trigger( 'epo_options_visible' ); jWindow.trigger( 'tmlazy' ); } main_product.addClass( 'tc-init' ); } function run_wc_variation_form_cpf( epoObject ) { var form = epoObject.variations_form; var cart = epoObject.main_cart; var this_epo_container = epoObject.this_epo_container; var eventName = epoObject.is_associated ? 'tc_variation_form.cpf' : 'wc_variation_form.cpf'; form.off( eventName ).on( eventName, function() { if ( form.data( 'epo_loaded' ) ) { return; } // Start Condition Logic cpf_section_logic( this_epo_container ); cpf_element_logic( this_epo_container ); // Init field price rules $.tcepo.lateFieldsPrices[ epoObject.epoEventId ] = []; epoEventHandlers( epoObject ); tm_set_upload_fields( epoObject ); tm_product_image( epoObject ); epoObject.noEpoUpdate = false; setTimeout( function() { run_cpfdependson( this_epo_container ); cart.trigger( { type: 'tm-epo-update', rules: 'init' } ); }, 10 ); form.data( 'epo_loaded', true ); } ); if ( variationsFormIsLoaded ) { form.trigger( eventName ); } jWindow.trigger( 'epo-after-init', { epo: epoObject } ); } function detect_variation_swatches_interval( epoObject ) { var $id = requestAnimationFrame( function() { detect_variation_swatches_interval( epoObject ); } ); var obj = epoObject.variations_form; var bound = obj.data( 'bound' ); var eventName = epoObject.is_associated ? 'tc_variation_form.cpf' : 'wc_variation_form.cpf'; if ( bound ) { cancelAnimationFrame( $id ); run_wc_variation_form_cpf( epoObject ); obj.trigger( eventName ); } } function manualInitEPO( epoObject, item, itemCart, itemEpoContainer, main_product ) { var epoObjectOriginal = $.extend( true, {}, epoObject ); var product_id = itemEpoContainer.attr( 'data-product-id' ); var epo_id = itemEpoContainer.attr( 'data-epo-id' ); var product_id_selector = '.tm-product-id-' + product_id; var epo_id_selector = "[data-epo-id='" + epo_id + "']"; var epoEventId = 'p' + product_id + 'e' + epo_id; var this_epo_container = $( '.tc-extra-product-options' + product_id_selector + epo_id_selector ); var this_totals_container = $( '.tc-totals-form' + product_id_selector + epo_id_selector ); var this_epo_totals_container = $( '.tc-epo-totals' + product_id_selector + epo_id_selector ); epoObject.isManual = true; $.tcepo.formSubmitEvents[ epoEventId ] = []; $.tcepo.errorObject[ epoEventId ] = false; $.tcepo.initialActivation[ epoEventId ] = false; epoObject.product_id = product_id; epoObject.product_id_selector = product_id_selector; epoObject.epo_id = epo_id; epoObject.epo_id_selector = epo_id_selector; epoObject.epoEventId = epoEventId; epoObject.noEpoUpdate = true; epoObject.thisForm = item; epoObject.this_epo_container = this_epo_container; epoObject.this_totals_container = this_totals_container; epoObject.this_epo_totals_container = this_epo_totals_container; tm_lazyload(); main_product.find( '.tm-collapse' ).tmtoggle(); main_product.find( '.tm-section-link' ).tmsectionpoplink(); tm_set_datepicker( item ); setRangePickers( item ); setRangePickersEvents(); tm_set_repeaters( item, epoObject ); tm_css_styles( item ); tm_set_color_pickers( itemEpoContainer ); tm_set_lightbox( itemEpoContainer.find( '.tc-lightbox-image' ).not( '.tm-extra-product-options-variations .radio-image' ) ); // Start Condition Logic cpf_section_logic( itemEpoContainer ); cpf_element_logic( itemEpoContainer ); run_cpfdependson( itemEpoContainer ); $.tcToolTip( item.find( '.tm-tooltip' ) ); epoEventHandlers( epoObject, item, itemCart ); epoObject.noEpoUpdate = false; itemCart.trigger( { type: 'tm-epo-update', norules: 2 } ); setTimeout( function() { epoObject.main_cart.trigger( { type: 'tm-epo-update', epoObject: epoObjectOriginal, norules: 1 } ); }, 200 ); tm_fix_stock_tmepo( itemCart, item ); } function tm_init_epo( main_product, is_quickview, product_id, epo_id, associated_connect, mainEpoObject, reactivate ) { // Holds the main cart when using Composite Products var main_cart = false; var main_epo_inside_form = false; var main_totals_inside_form = false; var epoEventId; var has_epo = typeof product_id !== 'undefined'; var not_has_epo = false; var add_to_cart_field; var product_id_selector; var epo_id_selector; var this_epo_container; var this_totals_container; var this_epo_totals_container; var epo_object; var variations_form; var detect_variation_swatches = $( '.variation_form_section .variations-table' ).length > 0; var is_associated = false; main_product = $( main_product ); if ( main_product.is( '.tc-init' ) && ! reactivate ) { return true; } if ( is_quickview ) { errorContainer = main_product; } else { errorContainer = $( window ); } jWindow.trigger( 'tm-epo-init-start' ); if ( ! has_epo ) { if ( main_product.is( '.product' ) ) { not_has_epo = true; has_epo = jBody.find( tcAPI.epoSelector ).length; } } // return if product has no extra options and the totals box is not enabled for all products if ( ! has_epo && TMEPOJS.tm_epo_enable_final_total_box_all === 'no' && ! main_product.is( '.tm-no-options-composite' ) ) { jWindow.trigger( 'tm-epo-init-end-no-options' ); return; } // set the main_product variable again for products that have no extra options if ( not_has_epo ) { jWindow.trigger( 'tm-epo-init-no-options' ); if ( main_product.is( '.product' ) && ! ( main_product.is( '.tm-no-options-pxq' ) || main_product.is( '.tm-no-options-composite' ) ) ) { main_product = jBody; } } if ( ! product_id ) { add_to_cart_field = main_product.find( tcAPI.addToCartSelector ).last(); if ( add_to_cart_field.length > 0 ) { product_id = add_to_cart_field.val(); } else { add_to_cart_field = $( '.tc-totals-form.tm-totals-form-main' ); product_id = add_to_cart_field.attr( 'data-product-id' ); } if ( ! product_id ) { product_id = ''; } } if ( ! epo_id ) { epo_id = parseInt( main_product.find( 'input.tm-epo-counter' ).last().val(), 10 ); if ( ! Number.isFinite( epo_id ) ) { epo_id = ''; } } product_id_selector = '.tm-product-id-' + product_id; epo_id_selector = "[data-epo-id='" + epo_id + "']"; this_epo_container = $( '.tc-extra-product-options' + product_id_selector + epo_id_selector ); this_totals_container = $( '.tc-totals-form' + product_id_selector + epo_id_selector ); this_epo_totals_container = $( '.tc-epo-totals' + product_id_selector + epo_id_selector ); variations_form = main_product.find( '.variations_form' ).not( '.composite_component .variations_form' ).first(); epoEventId = 'p' + product_id + 'e' + epo_id; if ( variations_form && variations_form.attr( 'data-product_id' ) ) { if ( variations_form.attr( 'data-product_id' ) !== product_id ) { variations_form = main_product.find( ".variations_form[data-product_id='" + product_id + "']" ); } } main_cart = get_main_cart( main_product, main_product, 'form', product_id ); if ( main_cart.length === 0 ) { if ( main_product.is( '.tc-shortcode-wrap' ) ) { main_cart = get_main_cart( this_totals_container, this_totals_container, '.tc-totals-form', product_id ); } else if ( main_product.is( '.tc-epo-element-product-container' ) ) { main_cart = main_product.find( tcAPI.associatedEpoCart ); // should never be 0 if ( main_cart.length === 0 ) { main_cart = this_epo_container.parent( tcAPI.associatedEpoSelector ); if ( main_cart.length === 0 ) { main_cart = main_product.find( '.tc-epo-element-product-container-right' ); } } is_associated = true; } } if ( is_associated && variations_form.length === 0 && main_product.is( '.variations_form' ) ) { variations_form = main_product; } $.tcepo.formSubmitEvents[ epoEventId ] = []; $.tcepo.errorObject[ epoEventId ] = false; $.tcepo.initialActivation[ epoEventId ] = false; if ( main_cart.find( tcAPI.epoSelector ).length > 0 ) { main_epo_inside_form = true; } if ( main_cart.find( '.tc-totals-form' ).length > 0 ) { main_totals_inside_form = true; } if ( ! main_totals_inside_form ) { $.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = { trigger: function() { return true; }, on_true: function() { // hidden fields see totals.php var epos_hidden = $( '.tc-totals-form.tm-product-id-' + product_id + "[data-epo-id='" + epo_id + "']" ).tcClone(); var formepo = $( '
' ); main_cart.find( '.tm-formepo-normal' ).remove(); formepo.append( epos_hidden ); main_cart.append( formepo ); return true; }, on_false: function() { setTimeout( function() { $( '.tm-formepo-normal' ).remove(); }, 100 ); } }; } if ( ! main_epo_inside_form ) { $.tcepo.formSubmitEvents[ epoEventId ][ $.tcepo.formSubmitEvents[ epoEventId ].length ] = { trigger: function() { return true; }, on_true: function() { // visible fields var epos = $( tcAPI.epoSelector + '.tm-product-id-' + product_id + "[data-epo-id='" + epo_id + "']" ) .tcClone() .addClass( 'formepo' ); var formepo = $( '
' ); main_cart.find( '.tm-formepo' ).remove(); formepo.append( epos ); main_cart.append( formepo ); return true; }, on_false: function() { setTimeout( function() { $( '.tm-formepo' ).remove(); }, 100 ); } }; } epo_object = { main_product: main_product, main_cart: main_cart, epo_id: epo_id, form: get_main_form( main_product ), main_epo_inside_form: main_epo_inside_form, product_id_selector: product_id_selector, epo_id_selector: epo_id_selector, product_id: product_id, this_epo_container: this_epo_container, this_totals_container: this_totals_container, this_epo_totals_container: this_epo_totals_container, qtySelector: tcAPI.qtySelector, manualInitEPO: manualInitEPO, epoEventId: epoEventId, variations_form: variations_form, has_epo: has_epo, is_quickview: is_quickview, is_associated: is_associated, is_epo_shortcode: this_epo_container.is( '.tc-shortcode' ), mainEpoObject: mainEpoObject, associated_connect: associated_connect, noEpoUpdate: true }; $( epo_object.form ).data( 'epo_object', epo_object ); main_cart.data( 'product_id', product_id ).data( 'epo_id', epo_id ).data( 'product_id_selector', product_id_selector ).data( 'epo_id_selector', epo_id_selector ); tm_set_checkboxes_rules( epo_object ); tm_set_upload_rules( epo_object ); tm_set_datepicker( this_epo_container ); setRangePickers( this_epo_container ); setRangePickersEvents(); tm_set_repeaters( this_epo_container, epo_object ); tm_set_url_fields(); $.tcToolTip( this_epo_container.find( '.tm-tooltip' ) ); this_epo_container.find( '.tm-collapse' ).tmtoggle(); this_epo_container.find( '.tm-section-link' ).tmsectionpoplink(); if ( reactivate ) { this_epo_container.addClass( 'reactivate' ); } if ( variations_form.length > 0 ) { if ( reactivate ) { variations_form.data( 'epo_loaded', false ); } this_epo_totals_container.data( 'price', false ); if ( detect_variation_swatches ) { detect_variation_swatches_interval( epo_object ); } else { run_wc_variation_form_cpf( epo_object ); } } else { setTimeout( function() { // Start Condition Logic cpf_section_logic( this_epo_container ); cpf_element_logic( this_epo_container ); run_cpfdependson( this_epo_container ); // Init field price rules $.tcepo.lateFieldsPrices[ epoEventId ] = []; epoEventHandlers( epo_object ); tm_set_upload_fields( epo_object ); tm_product_image( epo_object ); jWindow.trigger( 'epo-after-init-in-timeout', { epo: epo_object } ); main_cart.trigger( 'tm-epo-check-dpd' ); epo_object.noEpoUpdate = false; main_cart.trigger( { type: 'tm-epo-update', rules: 'init' } ); }, 20 ); jWindow.trigger( 'epo-after-init', { epo: epo_object } ); } tm_lazyload(); tm_css_styles( this_epo_container ); tm_set_color_pickers( this_epo_container ); tm_set_lightbox( this_epo_container.find( '.tc-lightbox-image' ).not( '.tm-extra-product-options-variations .radio-image' ) ); tm_theme_specific_actions( epo_object ); tc_compatibility( epo_object ); if ( ! is_associated ) { tm_floating_totals( this_epo_totals_container, is_quickview, main_cart ); tm_form_submit_event( epo_object ); tm_show_hide_add_to_cart_button( main_product, epo_object, $.tcepo.oneOptionIsSelected[ epoEventId ], epo_object ); } jWindow.trigger( 'tm-epo-init-end', { epo: epo_object } ); return epo_object; } function manual_init( container, reactivate ) { var $this = $( container ); var product_id = $this.attr( 'data-product-id' ); var epo_id = $this.attr( 'data-epo-id' ); var quickview_floating = false; var testForm = $this.parent(); if ( ! testForm.is( 'form' ) ) { testForm = $this.closest( 'form' ); if ( ! testForm.is( 'form' ) ) { testForm = $this.parent(); } } testForm = testForm.parent(); tm_init_epo( testForm, quickview_floating, product_id, epo_id, undefined, undefined, reactivate ); } function init_epo_plugin() { var epo_container; var epo_options_container; if ( TMEPOJS.tm_epo_no_lazy_load === 'no' ) { $.extend( $.lazyLoadXT, { autoInit: false, selector: 'img.tmlazy', srcAttr: 'data-original', visibleOnly: false, updateEvent: $.lazyLoadXT.updateEvent + ' tmlazy' } ); } /* * tm-no-options-pxq = product has not options but the "Enable Final total box for all products" is on * tm-no-options-composite = product is a composite product with no options but at least one of its bundles have options */ epo_container = $( '.tm-no-options-pxq, .tm-no-options-composite' ); if ( epo_container.length > 0 ) { // Special cases // ------------- // Price x Quantity display (.tm-no-options-pxq) & composite // without option but a component has extra options // (.tm-no-options-composite) epo_container.each( function( loop_index, product_wrap ) { tm_init_epo( $( product_wrap ), false ); } ); } // The setTimeout is used for compatibility with // skeleton screen mode that some themes have setTimeout( function() { try { // new main way of calling tm_init_epo // ----------------------------------- // Normal product pages epo_options_container = $( tcAPI.epoSelector ).not( tcAPI.associatedEpoSelector + ' ' + tcAPI.epoSelector + ', .tm-no-options-pxq, .tm-no-options-composite, .wc-product-table ' + tcAPI.epoSelector ); if ( epo_options_container.length > 0 ) { epo_options_container.each( function() { var $this = $( this ); var product_id = $this.attr( 'data-product-id' ); var epo_id = $this.attr( 'data-epo-id' ); var quickview_floating = false; var jProductWrap; var addInputs = false; // First check if we are in a loop. jProductWrap = $this.closest( '.tc-after-shop-loop.tm-has-options' ); if ( jProductWrap.length === 0 ) { // Check based on plugin add to cart selector. jProductWrap = $( tcAPI.tcAddToCartSelector + "[data-epo-id='" + epo_id + "'][value='" + product_id + "']" ) .closest( 'form,.cart' ) .first() .parent(); // Check based on native add to cart selector. if ( jProductWrap.length === 0 ) { jProductWrap = $( tcAPI.addToCartSelector + "[value='" + product_id + "']" ) .closest( 'form,.cart' ) .first() .parent(); if ( jProductWrap.length === 0 ) { // Check if we are in a shortcode jProductWrap = $this.closest( 'form,.cart' ).first().parent( '.tm-has-options' ); if ( jProductWrap.length === 0 ) { if ( $this.is( '.tc-shortcode' ) ) { jProductWrap = $this.wrap( '
' ); jProductWrap = $this.parent(); } if ( jProductWrap.length > 0 ) { addInputs = true; } } } } } else { addInputs = true; } if ( jProductWrap.length > 0 ) { if ( addInputs ) { // in shop (variation logic will not work here) quickview_floating = true; $this .closest( 'form,.cart' ) .first() .append( $( '' ) ); $this.closest( 'form,.cart' ).first().append( $( '' ) ); } if ( jProductWrap.is( 'form' ) ) { jProductWrap = jProductWrap.parent(); } tm_init_epo( jProductWrap, quickview_floating, product_id, epo_id ); } } ); } } catch ( err ) { window.console.log( err ); errorObject = err; } }, 1 ); } $.tcepo.tm_init_epo = function( main_product, is_quickview, product_id, epo_id ) { tm_init_epo( main_product, is_quickview, product_id, epo_id ); }; $.tcepo.tmLazyloadContainer = function( container ) { tmLazyloadContainer = container; }; jWindow.on( 'tc_manual_init', function( evt, container ) { var reactivate; if ( 'container' in container && 'reactivate' in container ) { reactivate = container.reactivate; container = container.container; } manual_init( container, reactivate ); } ); // document ready $( function() { tcAPI = $.epoAPI.applyFilter( 'tc_api', tcAPI ); jWindow.on( 'lazyLoadXToncomplete', function() { $( '.tm-owl-slider' ).each( function() { $( this ).trigger( 'refresh.owl.carousel' ); } ); } ); jWindow.on( 'tc_init_epo_plugin', function( evt ) { init_epo_plugin( evt ); } ); jWindow.on( 'tcShowLastError', function() { window.console.log( errorObject ); } ); jBody.on( 'adding_to_cart', function( e, button, data ) { window.console.log( data ); } ); jBody.on( 'click.tcajax', '.ajax_add_to_cart', function() { var _pid; var epos; var _cpf_product_price; var form_prefix; var epoid; var obj; var data; currentAjaxButton = $( this ); if ( undefined !== currentAjaxButton.attr( 'data-product_id' ) ) { epoid = currentAjaxButton.closest( '.cart' ).find( '.tm-epo-counter' ).val(); if ( ! epoid ) { return; } if ( currentAjaxButton.closest( '.tm-has-options' ).length !== 1 ) { return; } _pid = currentAjaxButton.attr( 'data-product_id' ); obj = {}; epos = $( '.tc-extra-product-options.tm-product-id-' + _pid + '[data-epo-id="' + epoid + '"]' ); if ( epos.length > 1 ) { if ( epos.filter( '.formepo' ) ) { epos = epos.filter( '.formepo' ); } else { epos = epos.first(); } } if ( epos.length === 1 ) { _cpf_product_price = $( '.tc-totals-form.tm-product-id-' + _pid + '[data-epo-id="' + epoid + '"]' ) .find( '.cpf-product-price' ) .val(); form_prefix = $( '.tc-totals-form.tm-product-id-' + _pid + '[data-epo-id="' + epoid + '"]' ) .find( '.tc_form_prefix' ) .val(); obj = $.extend( obj, { tcajax: 1, tcaddtocart: _pid, cpf_product_price: _cpf_product_price } ); if ( form_prefix ) { obj.tc_form_prefix = form_prefix; } } data = currentAjaxButton.data(); data = $.extend( data, epos.tcSerializeObject(), obj ); currentAjaxButton.removeData(); currentAjaxButton.data( data ); } } ); $.ajaxPrefilter( function( options, originalOptions ) { var found = false; var hashes; var hash; var i; var params; var $thisbutton; var _data; var _urldata; var _pid; var epos; var _cpf_product_price; var form_prefix; var obj; var oldData; var formData; if ( TMEPOJS.tm_epo_enable_in_shop === 'yes' ) { hashes = options.url.split( '?' ); if ( hashes && hashes.length >= 1 ) { hashes = hashes[ 1 ]; if ( hashes ) { hash = hashes.split( '&' ); for ( i = 0; i < hash.length; i += 1 ) { params = hash[ i ].split( '=' ); if ( params.length >= 1 ) { if ( params[ 0 ] && params[ 1 ] && params[ 0 ] === 'wc-ajax' && params[ 1 ] === 'add_to_cart' ) { found = true; } } } if ( found ) { options.originalsuccess = options.success; options.success = function( response ) { if ( response && response.error && response.product_url ) { if ( currentAjaxButton && currentAjaxButton.length === 1 ) { $thisbutton = currentAjaxButton; } $thisbutton = $( ".ajax_add_to_cart[data-product_id='" + originalOptions.data.product_id + "']" ); $thisbutton.removeClass( 'added' ); $thisbutton.removeClass( 'loading' ); } else { options.originalsuccess.call( null, response ); } }; } } } } if ( FormData && originalOptions.data ) { _data = originalOptions.data; if ( typeof originalOptions.data === 'string' ) { _data = $.epoAPI.util.parseParams( originalOptions.data ); } _urldata = []; if ( originalOptions.url && originalOptions.url.indexOf ) { _urldata = $.epoAPI.util.parseParams( originalOptions.url.slice( originalOptions.url.indexOf( '?' ) + 1 ) ); } if ( 'quantity' in _data && ( _data.product_id || _data[ 'add-to-cart' ] || _urldata.product_id || _urldata[ 'add-to-cart' ] || _data.tcaddtocart ) ) { _pid = _data.product_id || _data[ 'add-to-cart' ] || _urldata.product_id || _urldata[ 'add-to-cart' ] || _data.tcaddtocart; if ( currentAjaxButton && currentAjaxButton.length === 1 && currentAjaxButton.closest( '.tm-has-options' ).length === 1 ) { epos = currentAjaxButton.closest( '.tm-has-options' ).find( '.tc-extra-product-options.tm-product-id-' + _pid ); } else { epos = $( '.tc-extra-product-options.tm-product-id-' + _pid ); } if ( epos.length > 1 ) { if ( epos.filter( '.formepo' ) ) { epos = epos.filter( '.formepo' ); } else { epos = epos.first(); } } if ( epos.length === 1 ) { _cpf_product_price = $( '.tc-totals-form.tm-product-id-' + _pid ) .find( '.cpf-product-price' ) .val(); form_prefix = $( '.tc-totals-form.tm-product-id-' + _pid ) .find( '.tc_form_prefix' ) .val(); obj = { tcajax: 1, tcaddtocart: _pid, cpf_product_price: _cpf_product_price }; if ( form_prefix ) { obj.tc_form_prefix = form_prefix; } options.data = $.epoAPI.util.parseParams( options.data, true ); options.data = $.extend( options.data, epos.tcSerializeObject(), obj ); oldData = options.data; formData = new FormData(); Object.keys( oldData ).forEach( function( key ) { formData.append( key, oldData[ key ] ); } ); epos.find( ':file' ) .toArray() .forEach( function( el ) { for ( i = 0; i < $( el )[ 0 ].files.length; i++ ) { formData.append( $( el ).attr( 'name' ), $( el )[ 0 ].files[ i ] ); } } ); options.data = formData; options.contentType = false; options.cache = false; options.processData = false; } } } } ); jDocument.ajaxSuccess( function( event, request, settings ) { // quickview plugins var qv_container = TMEPOJS.quickview_array || 'null'; var fromaddons = TMEPOJS.quickview_container || 'null'; var added = {}; var selectors; var container; var product_id; var epo_id; var noProductCheck; var testContainer; var parsedUrl; var time = 1; var detectContainer; var requestContainer; parsedUrl = $.epoAPI.util.parseParams( settings.data ); if ( parsedUrl.action === 'wc_epo_get_associated_product_html' ) { return; } $( '.tm-formepo-normal' ).remove(); $( '.tm-formepo' ).remove(); //fix for menu cart pop up $( '.tm-cart-link' ).tmpoplink(); qv_container = $.epoAPI.util.parseJSON( qv_container ); fromaddons = $.epoAPI.util.parseJSON( fromaddons ); for ( selectors in fromaddons ) { if ( Object.prototype.hasOwnProperty.call( fromaddons, selectors ) ) { added[ fromaddons[ selectors ][ 0 ] ] = $( fromaddons[ selectors ][ 1 ] ); } } $.extend( qv_container, added ); detectContainer = function() { var keyfound = false; Object.keys( qv_container ).forEach( function( key ) { if ( $( qv_container[ key ] ).length ) { keyfound = key; } } ); return keyfound; }; requestContainer = function( times ) { var id = requestAnimationFrame( function() { setTimeout( function() { requestContainer( times - 1 ); }, 200 ); } ); var key = detectContainer(); var epoContainer; if ( key || 0 === times ) { cancelAnimationFrame( id ); if ( key ) { noProductCheck = false; container = $( qv_container[ key ] ); if ( key === 'woothemes_quick_view' && container.is( '.fusion-woocommerce-quick-view-container' ) ) { return true; } if ( key === 'fusion_quick_view_load' && container.find( tcAPI.epoSelector ).length === 0 ) { return true; } if ( key === 'woodmart_quick_shop' ) { parsedUrl = $.epoAPI.util.parseParams( settings.url ); if ( parsedUrl.action === 'woodmart_quick_shop' ) { testContainer = $( $.epoAPI.util.escapeSelector( qv_container[ key ] + '.post-' + parsedUrl.id ) ); if ( testContainer.length ) { container = testContainer; noProductCheck = true; } } } if ( key === 'woodmart_quick_view' ) { parsedUrl = $.epoAPI.util.parseParams( settings.url ); if ( parsedUrl.action === 'woodmart_quick_view' ) { testContainer = $( $.epoAPI.util.escapeSelector( qv_container[ key ] + '.post-' + parsedUrl.id ) ); if ( testContainer.length ) { container = testContainer; noProductCheck = true; } } } if ( key === 'quickview_pro' ) { parsedUrl = settings.url.split( '/' ); if ( parsedUrl.length ) { testContainer = $( $.epoAPI.util.escapeSelector( qv_container[ key ] + ' .post-' + parsedUrl[ parsedUrl.length - 1 ] ) ); if ( testContainer.length ) { container = testContainer; noProductCheck = true; } } } if ( key === 'exwoofood_booking_info' || key === 'wqv_popup_content' || key === 'wp_food' || key === 'jet_popup_get_content' ) { noProductCheck = true; } if ( key === 'woofood' && settings.data ) { parsedUrl = $.epoAPI.util.parseParams( settings.data ); if ( parsedUrl.action === 'woofood_quickview_ajax' ) { testContainer = testContainer = container.find( 'form' ).parent(); if ( testContainer.length ) { container = testContainer; noProductCheck = true; } } } if ( container.find( '.product' ).length === 0 && container.is( '.product' ) ) { noProductCheck = true; } if ( ( container.find( '.product' ).length > 0 || noProductCheck ) ) { container.removeClass( 'tc-init' ); if ( key === 'fusion_quick_view_load' || key === 'jet_popup_get_content' || key === 'wp_food' || key === 'woodmart_quick_shop' || key === 'woodmart_quick_view' || key === 'lightboxpro' || key === 'jckqv_quick_view' || key === 'yith_quick_view' || key === 'theme_flatsome' ) { variationsFormIsLoaded = true; } tmLazyloadContainer = container; epoContainer = tmLazyloadContainer.find( tcAPI.epoSelector ); if ( epoContainer.length === 0 ) { delete qv_container[ key ]; requestContainer( 10 ); return true; } if ( key === 'fusion_quick_view_load' ) { time = 1400; } setTimeout( function() { product_id = epoContainer.attr( 'data-product-id' ); epo_id = epoContainer.attr( 'data-epo-id' ); if ( key === 'woodmart_quick_shop' ) { container.addClass( 'has-options' ); } // Reset element cache tcAPI.getElementFromFieldCache = []; tm_init_epo( tmLazyloadContainer, true, product_id, epo_id ); jWindow.trigger( 'tmlazy' ); jWindow.trigger( 'tm_epo_loaded_quickview' ); if ( $.jMaskGlobals ) { tmLazyloadContainer.find( $.jMaskGlobals.maskElements ).each( function() { var t = $( this ); if ( t.attr( 'data-mask' ) ) { t.mask( t.attr( 'data-mask' ) ); } } ); } }, time ); } } } }; requestContainer( 10 ); } ); init_epo_plugin(); $( '.tm-cart-link' ).tmpoplink(); jBody.on( 'updated_checkout', function() { $( '.tm-cart-link' ).tmpoplink(); } ); jWindow.trigger( 'tmlazy' ); jWindow.trigger( 'tm_epo_loaded' ); } ); // document ready $( function() { // Remove accept attribute from upload buttons when in Facebook or Instagram internral browser var ua = navigator.userAgent || navigator.vendor || window.opera; ua = ( ua.indexOf( 'FBAN' ) > -1 ) || ( ua.indexOf( 'FBAV' ) > -1 ) || ( ua.indexOf( 'Instagram' ) > -1 ); if ( ua ) { $( '.tmcp-upload' ).removeAttr( 'accept' ); } // Fix several custom quantity buttons on themes jDocument.on( 'click', '.quantity .jckqv-qty-spinner, .quantity .ui-spinner-button', function() { $( this ).closest( '.quantity' ).find( tcAPI.qtySelector ).trigger( 'change' ); } ); // bulk variations forms plugin $( '#wholesale_form' ).on( 'submit', function() { var _product_id = $( 'form.cart' ).find( tcAPI.addToCartSelector ).val(); // visible fields var epos = $( tcAPI.epoSelector + ".tm-cart-main[data-product-id='" + _product_id + "']" ).tcClone(); // hidden fields see totals.php var epos_hidden = $( ".tm-totals-form-main[data-product-id='" + _product_id + "']" ).tcClone(); var formepo = $( "
" ); formepo.append( epos ); formepo.append( epos_hidden ); $( this ).append( formepo ); return true; } ); // Disable quote button if option validation fails jDocument.on( 'click', '#add_to_quote', function( e ) { var form; var epo_id; var epos; if ( TMEPOJS && TMEPOJS.tm_epo_global_enable_validation === 'yes' ) { form = $( this ).parents( 'form' ); epo_id = parseInt( form.find( '.tm-epo-counter' ).val(), 10 ); epos = $( tcAPI.epoSelector + "[data-epo-id='" + epo_id + "']" ); //not validated if ( TMEPOJS.tm_epo_global_enable_validation === 'yes' && $.tc_validator && form.length > 0 && epos.length > 0 && ! form.tc_validate().form() ) { e.stopImmediatePropagation(); } } } ); // PayPal for WooCommerce (PayPal Express Checkout button fix) $( '.single_add_to_cart_button.paypal_checkout_button' ).on( 'click', function( event ) { // this is the selector used by the paypal checkout plugin var form = $( '.cart' ); var validator; if ( form.data( 'tc_validator' ) ) { validator = form.data( 'tc_validator' ); if ( validator.errorList ) { event.stopImmediatePropagation(); } } } ); $( '.wc-product-table' ).on( 'init.wcpt', function( event, table ) { table.$table.find( tcAPI.epoSelector ).addClass( 'hidden' ); table.$table.find( 'thead tr' ).append( ' ' ); setTimeout( function() { table.$table.find( '.cart:not(.cart_group)' ).each( function() { var epo = $( this ).find( tcAPI.epoSelector ); var tr = epo.closest( 'tr' ); $( "" ).appendTo( tr ).append( epo ); $( window ).trigger( 'tc_manual_init', epo ); epo.removeClass( 'hidden' ); } ); }, 500 ); } ); } ); }( window, document, window.jQuery ) );