(function( $j ) { 'use strict'; var alopeyk = alopeyk || { wcshm : {} }; alopeyk.wcshm.admin = {}; /*========================================== = Defining Variables = ==========================================*/ alopeyk.wcshm.admin.vars = { common : { info : window.awcshm, time : Date.now(), activeClass : 'active', loadingClass : 'loading', disabledClass : 'disabled', alopeykPrefix : 'awcshm-', checkboxToggleIdDataAttr : 'checkbox-toggle-id', checkboxToggleTargetDataAttr : 'checkbox-toggle-target', knownImageExtensions : [ 'jpg', 'jpeg', 'gif', 'tiff', 'png', 'apng', 'bmp', 'svg' ], modalContentClass : 'modal-content' }, maps : { selector : '.map-canvas', storeLatInputName : 'store_lat', storeLngInputName : 'store_lng', storeCityInputName : 'store_city', storeAddressInputName : 'store_address', storeLocatorMapClass : 'map-canvas store-locator-map', storeLocatorInputWrapperClass : 'store-locator-input-wrapper', storeLocatorAutocompleteResultsClass : 'store-locator-autocomplete-results', storeLocatorAutocompleteResultClass : 'store-locator-autocomplete-result', storeLocatorHiddenableInput : '.hide-parent-row', autocompletePlaceholderDataAttr : 'autocomplete-placeholder', autocompleteKeyupTimeout : null, positionKeyupTimeout : null, autoCompleteKeyupDelay : 500, positionKeyupDelay : 500, defaultZoom : 15, defaultCenter : { lat : 35.732466, lng : 51.413811 } }, cost : { costTypeInputName : 'cost_type', staticCostTypeInputName : 'static_cost_type', fixedCostInputName : 'static_cost_fixed', percentageCostInputName : 'static_cost_percentage', costTypeDynamicVal : 'dynamic', costTypeStaticVal : 'static', staticCostTypeFixedVal : 'fixed', staticCostTypePercentageVal : 'percentage', }, upload : { inputSelector : '.input-upload', assetsContainerClass : 'upload-assets-container', previewContainerClass : 'preview-container', previewTypePrefix : 'preview-type-', uploadButtonClass : 'button-primary upload-button', removeButtonClass : 'button button-small remove-button', filenameLabelClass : 'filename-label', uploadLabelDataAttr : 'upload-label', removeLabelDataAttr : 'remove-label', uploadOptionsDataAttr : 'upload-options', isEmptyClass : 'is-empty', isFilledClass : 'is-filled', }, prompts : { headingElement : 'h2', headingContainer : '#mainform', belowHeadingElements : '.below-heading', }, bulkAction : { actionValue : 'alopeyk_cumulative_shipping', formElement : '.post-type-shop_order #posts-filter', submitElement : '#doaction, #doaction2', actionInputs : '[name="post[]"]:checked', dropdownElement : '#bulk-action-selector-bottom, #bulk-action-selector-top', }, forms : { priceInputsClass : 'price-input', dateDropdownElement : '[name="ship_date"]', hourDropdownElement : '[name="ship_hour"]', minuteDropdownElement : '[name="ship_minute"]', shipNowTogglerElement : '[name="ship_now"]', createOrderFormClass : 'create-order-form', creditButtonElementClass : 'amount-button', creditButtonAmountDataAttr : 'credit-amount', creditButtonTargetDataAttr : 'credit-target', addCouponFormClass : 'add-coupon-form', cancelOrderFormClass : 'cancel-order-form', rateOrderFormClass : 'rate-order-form', }, modals : { creditModalTogglerClass : 'credit-modal-toggler', creditModalAmountDataAttr : 'credit-amount', orderModalTogglerClass : 'order-modal-toggler', orderModalTypeDataAttr : 'order-types', orderModalOrdersDataAttr : 'order-ids', orderModalDescriptionDataAttr : 'order-description', orderModalOrdersDelimiter : ',', couponModalTogglerClass : 'coupon-modal-toggler', cancelModalTogglerClass : 'cancel-modal-toggler', cancelModalOrderDataAttr : 'order-id', rateModalTogglerClass : 'rate-modal-toggler', rateModalOrderDataAttr : 'order-id', }, chat : { togglerInput : '#awcshm-support-chat-toggler' } }; /*================================== = Prototypes = ==================================*/ /*========================================== = Defining Functions = ==========================================*/ alopeyk.wcshm.admin.fn = { addPrefix : function ( classes ) { var prefixedClasses = [], classesArray = classes.split ( ' ' ); for ( var i = 0; i < classesArray.length; i++ ) { prefixedClasses.push ( alopeyk.wcshm.admin.vars.common.alopeykPrefix + classesArray[ i ] ) } return prefixedClasses.join ( ' ' ); }, translate : function ( term ) { var translation = alopeyk.wcshm.admin.vars.common.info.translations[ term ]; return translation ? translation : term; }, getUrlVars : function ( url ) { url = url ? url : window.location.href; var hash, vars = [], index = url.indexOf ( '?' ), query = index != -1 ? decodeURIComponent ( url ).slice ( index + 1 ) : null, vars = query ? query.split ( '&' ) : [], query_string = []; for ( var i = 0; i < vars.length; i++ ) { var pair = vars[ i ].split ( '=' ); pair[ 0 ] = pair[ 0 ].replace ( '[]', '' ); if ( typeof pair[ 1 ] === 'undefined' ) { pair[ 1 ] = ''; } if ( typeof query_string[ pair[ 0 ] ] === 'undefined' ) { query_string[ pair[ 0 ] ] = pair[ 1 ]; } else if ( typeof query_string[ pair[ 0 ] ] === 'string' ) { var arr = [ query_string[ pair[ 0 ] ], pair[ 1 ] ]; query_string[ pair[ 0 ] ] = arr; } else { query_string[ pair[ 0 ] ].push ( pair[ 1 ] ); } } return ( typeof query_string === 'object' ? query_string : null ); }, openTab : function ( url ) { var form = $j( '
' ), params = alopeyk.wcshm.admin.fn.getUrlVars ( url ); if ( params && Object.keys ( params ).length ) { for ( var param in params ) { if ( ! params.hasOwnProperty ( param ) ) continue; form.append ( $j( '' ).attr ({ type : 'hidden', name : param, value : params[ param ] })); } } form.attr ({ 'action' : url, 'method' : 'GET', 'target' : '_blank', }) .appendTo ( 'body' ) .trigger ( 'submit' ) .remove(); }, decodeToHtml : function ( string ) { var txt = document.createElement ( 'textarea' ); txt.innerHTML = string; return txt.value; }, injectScript : function ( src ) { if ( ! $j( '[src="' + src + '"]' ).length ) { var s, t; s = document.createElement ( 'script' ); s.type = 'text/javascript'; s.async = true; s.src = src; t = document.getElementsByTagName ( 'script' )[ 0 ]; t.parentNode.insertBefore ( s, t ); } }, loadGoogleMaps : function () { window[ 'alopeykHandleMapsAdmin' ] = alopeyk.wcshm.admin.fn.handleMaps; if ( typeof alopeykHandleMapsAdmin === 'function' ) { if ( typeof window.google != 'undefined' && window.google.maps ) { window.googleMapIsLoading = false; alopeyk.wcshm.admin.fn.handleMaps(); } else if ( window.googleMapIsLoading ) { alopeyk.wcshm.admin.vars.loadingMapInterval = setInterval ( function () { if ( window.google && window.google.maps ) { window.googleMapIsLoading = false; clearInterval ( alopeyk.wcshm.admin.vars.loadingMapInterval ); alopeyk.wcshm.admin.fn.handleMaps(); } }, 500 ); } else { window.googleMapIsLoading = true; alopeyk.wcshm.admin.fn.injectScript ( 'https://maps.googleapis.com/maps/api/js?key=' + alopeyk.wcshm.admin.vars.common.info.alopeyk.wcshm.map.api_key + '&language=fa®ion=IR&callback=alopeykHandleMapsAdmin' ); } } }, handleMaps : function () { $j( document ).trigger ( 'alopeyk:admin:map:loaded' ); }, initMaps : function () { $j( document ).on ( 'alopeyk:admin:map:loaded', function () { var inputIdPrefix = alopeyk.wcshm.admin.vars.common.info.alopeyk.wcshm.id + '_', storeLatInput = $j( "[id$='" + inputIdPrefix + alopeyk.wcshm.admin.vars.maps.storeLatInputName + "']" ), storeLngInput = $j( "[id$='" + inputIdPrefix + alopeyk.wcshm.admin.vars.maps.storeLngInputName + "']" ), storeCityInput = $j( "[id$='" + inputIdPrefix + alopeyk.wcshm.admin.vars.maps.storeCityInputName + "']" ), storeAddressInput = $j( "[id$='" + inputIdPrefix + alopeyk.wcshm.admin.vars.maps.storeAddressInputName + "']" ); if ( storeLatInput.length && storeLngInput.length && storeCityInput.length && storeAddressInput.length ) { alopeyk.wcshm.admin.fn.initStoreLocator( storeLatInput.first(), storeLngInput.first(), storeCityInput.first(), storeAddressInput.first() ); } }); alopeyk.wcshm.admin.fn.loadGoogleMaps(); }, initStoreLocator : function ( storeLatInput, storeLngInput, storeCityInput, storeAddressInput ) { var mapCanvas = $j( '
' ).attr ({ id : 'store-locator-map', class : alopeyk.wcshm.admin.vars.maps.storeLocatorMapClass, }), storeAutocompleteInput = storeAddressInput.clone().attr ({ id : storeAddressInput.attr ( 'id' ) + '_autocomplete', class : storeAddressInput.attr ( 'class' ), placeholder : storeAddressInput.data ( alopeyk.wcshm.admin.vars.maps.autocompletePlaceholderDataAttr ), name : '', style : '', value : '', type : 'text', spellcheck : 'false', autocapitalize : 'off', autocorrect : 'off', autocomplete : 'off' }).removeClass ( alopeyk.wcshm.admin.vars.common.disabledClass ), storeAutocompleteInputWrapper = $j( '
' ).attr ({ id : 'store-locator-input-wrapper', class : alopeyk.wcshm.admin.vars.maps.storeLocatorInputWrapperClass, }), autoCompleteList = $j( '
    ' ).attr ({ id : 'store-locator-autocomplete-results', class : alopeyk.wcshm.admin.vars.maps.storeLocatorAutocompleteResultsClass, }); storeAutocompleteInputWrapper .insertAfter ( storeAddressInput ) .append ( storeAutocompleteInput ) .append ( autoCompleteList ); mapCanvas.insertAfter( storeAutocompleteInputWrapper ); var mapOptions = { zoom : alopeyk.wcshm.admin.vars.maps.defaultZoom, center : { lat : storeLatInput.val().length ? parseFloat( storeLatInput.val() ) : alopeyk.wcshm.admin.vars.maps.defaultCenter.lat, lng : storeLngInput.val().length ? parseFloat( storeLngInput.val() ) : alopeyk.wcshm.admin.vars.maps.defaultCenter.lng, }, mapTypeControl : false, streetViewControl : false, fullscreenControl : false, }, map = new google.maps.Map ( mapCanvas.get ( 0 ), mapOptions ), marker = new google.maps.Marker ({ map : map, draggable : true, position : mapOptions.center, anchorPoint : new google.maps.Point ( 0, -29 ), }), setActiveAutocompleteItem = function ( index ) { var results = autoCompleteList.children(), activeIndex = index == results.length ? 0 : ( index < 0 ? results.length - 1 : index ), activeClass = alopeyk.wcshm.admin.vars.common.activeClass; results.removeClass ( activeClass ).eq ( activeIndex ).addClass ( activeClass ); }, fetchAddressFromLocation = function () { if ( alopeyk.wcshm.admin.vars.maps.fetchAddressConnection ) { alopeyk.wcshm.admin.vars.maps.fetchAddressConnection.abort(); } storeAddressInput.parents ( 'form' ) .find ( 'button, input[type="button"], input[type="submit"]' ) .filter ( function () { return ! $j( this ).is ( ':disabled' ); }) .prop ( 'disabled', true ) .data ( 'alopeyk-disable', true ); storeAutocompleteInputWrapper.addClass ( alopeyk.wcshm.admin.vars.common.loadingClass ); alopeyk.wcshm.admin.vars.maps.fetchAddressConnection = $j.post ( alopeyk.wcshm.admin.vars.common.info.ajaxOptions.url, { nonce : alopeyk.wcshm.admin.vars.common.info.ajaxOptions.nonce, action : alopeyk.wcshm.admin.vars.common.info.alopeyk.wcshm.id, request : 'get_address', authenticate : true, ask_google : false, lat : marker.getPosition().lat(), lng : marker.getPosition().lng(), }, function ( response ) { if ( response ) { autoCompleteList.empty(); storeCityInput.val ( response.success && response.data.city ? response.data.city : '' ); storeAutocompleteInput.val ( response.data.address ); storeAddressInput.val ( response.success ? response.data.address : '' ); if ( response.success ) { storeAddressInput.parents ( 'form' ) .find ( 'button, input[type="button"], input[type="submit"]' ) .filter ( function () { return $j( this ).data ( 'alopeyk-disable' ); }) .prop ( 'disabled', false ); } else { storeLatInput.val ( '' ); storeLngInput.val ( '' ); } } }).always ( function () { storeAutocompleteInputWrapper.removeClass ( alopeyk.wcshm.admin.vars.common.loadingClass ); }); }; marker.addListener ( 'drag', function() { storeLatInput.val ( marker.getPosition().lat() ); storeLngInput.val ( marker.getPosition().lng() ); }); marker.addListener ( 'dragend', function () { fetchAddressFromLocation(); }); $j.merge ( storeLatInput, storeLngInput ).on ( 'change paste keyup input propertychange', function () { if ( alopeyk.wcshm.admin.vars.maps.latitudeValue != storeLatInput.val() || alopeyk.wcshm.admin.vars.maps.longitudeValue != storeLngInput.val() ) { alopeyk.wcshm.admin.vars.maps.latitudeValue = storeLatInput.val(); alopeyk.wcshm.admin.vars.maps.longitudeValue = storeLngInput.val(); if ( alopeyk.wcshm.admin.vars.maps.positionKeyupTimeout ) { clearTimeout( alopeyk.wcshm.admin.vars.maps.positionKeyupTimeout ); } alopeyk.wcshm.admin.vars.maps.positionKeyupTimeout = setTimeout ( function () { var location = { lat : parseFloat ( storeLatInput.val() ), lng : parseFloat ( storeLngInput.val() ) }; map.setCenter ( location ); marker.setPosition ( location ); fetchAddressFromLocation(); }, alopeyk.wcshm.admin.vars.maps.positionKeyupDelay ); } }); storeAutocompleteInput.on ({ 'keydown' : function ( e ) { var activeItem = autoCompleteList.children ( '.' + alopeyk.wcshm.admin.vars.common.activeClass ), activeIndex = activeItem.length ? activeItem.index() : -1; switch ( e.which ) { case 13: e.preventDefault(); if ( activeItem ) { activeItem.trigger ( 'click' ); } break; case 27: storeAutocompleteInput.blur(); break; case 38: e.preventDefault(); setActiveAutocompleteItem( activeIndex - 1 ); break; case 40: e.preventDefault(); setActiveAutocompleteItem( activeIndex + 1 ); break; } }, 'change paste keyup input propertychange' : function ( e ) { if ( alopeyk.wcshm.admin.vars.maps.autocompleteInputValue != storeAutocompleteInput.val() ) { autoCompleteList.empty(); alopeyk.wcshm.admin.vars.maps.autocompleteInputValue = storeAutocompleteInput.val(); if ( alopeyk.wcshm.admin.vars.maps.autocompleteKeyupTimeout ) { clearTimeout( alopeyk.wcshm.admin.vars.maps.autocompleteKeyupTimeout ); } alopeyk.wcshm.admin.vars.maps.autocompleteKeyupTimeout = setTimeout ( function () { if ( alopeyk.wcshm.admin.vars.maps.autocompleteConnection ) { alopeyk.wcshm.admin.vars.maps.autocompleteConnection.abort(); } storeAutocompleteInputWrapper.addClass ( alopeyk.wcshm.admin.vars.common.loadingClass ); alopeyk.wcshm.admin.vars.maps.autocompleteConnection = $j.post ( alopeyk.wcshm.admin.vars.common.info.ajaxOptions.url, { nonce : alopeyk.wcshm.admin.vars.common.info.ajaxOptions.nonce, action : alopeyk.wcshm.admin.vars.common.info.alopeyk.wcshm.id, request : 'suggest_address', authenticate : true, ask_google : false, input : storeAutocompleteInput.val(), }, function ( response ) { if ( response && response.success && response.data.length ) { for ( var i = 0; i < response.data.length; i++ ) { var itemLat = parseFloat( response.data[i].lat ), itemLng = parseFloat( response.data[i].lng ), itemLocation = { lat : itemLat, lng : itemLng }, itemAddress = response.data[i].address, itemCity = response.data[i].city, resultItem = $j( '
  • ' ) .addClass( alopeyk.wcshm.admin.vars.maps.storeLocatorAutocompleteResultClass ) .attr ( 'title', itemAddress ) .data ({ city : itemCity, address : itemAddress, location : itemLocation }) .text ( itemAddress ) .on ({ 'click' : function () { var city = $j( this ).data ( 'city' ), address = $j( this ).data ( 'address' ), location = $j( this ).data ( 'location' ); storeAutocompleteInput.blur(); storeAutocompleteInput.val ( address ); storeAddressInput.val ( address ); storeCityInput.val ( city ); map.setCenter ( location ); map.setZoom ( 17 ); marker.setPosition ( location ); marker.setVisible ( true ); storeLatInput.val ( location.lat ); storeLngInput.val ( location.lng ); alopeyk.wcshm.admin.vars.maps.autocompleteInputValue = address; fetchAddressFromLocation(); }, 'hover' : function () { setActiveAutocompleteItem ( $j( this ).index() ); } }); autoCompleteList.append ( resultItem ); } } }).always ( function () { storeAutocompleteInputWrapper.removeClass ( alopeyk.wcshm.admin.vars.common.loadingClass ); }); }, alopeyk.wcshm.admin.vars.maps.autoCompleteKeyupDelay ); } } }); google.maps.event.addListenerOnce ( map, 'idle', function () { storeAutocompleteInputWrapper.css ({ zIndex : 2, position : 'absolute' }); }); google.maps.event.addDomListener ( window, 'resize', function () { if ( alopeyk.wcshm.admin.vars.maps.centerTimeout ) clearTimeout ( alopeyk.wcshm.admin.vars.maps.centerTimeout ); alopeyk.wcshm.admin.vars.maps.centerTimeout = setTimeout ( function () { map.setCenter ( marker.getPosition() ); }, 100 ); }); }, handleSettingFields : function () { var inputIdPrefix = alopeyk.wcshm.admin.vars.common.info.alopeyk.wcshm.id + '_', costTypeInput = $j( "[id$='" + inputIdPrefix + alopeyk.wcshm.admin.vars.cost.costTypeInputName + "']" ), staticCostTypeInput = $j( "[id$='" + inputIdPrefix + alopeyk.wcshm.admin.vars.cost.staticCostTypeInputName + "']" ), fixedCostInput = $j( "[id$='" + inputIdPrefix + alopeyk.wcshm.admin.vars.cost.fixedCostInputName + "']" ), percentageCostInput = $j( "[id$='" + inputIdPrefix + alopeyk.wcshm.admin.vars.cost.percentageCostInputName + "']" ), checkboxTargetDataAttr = alopeyk.wcshm.admin.vars.common.checkboxToggleTargetDataAttr, checkboxIdDataAttr = alopeyk.wcshm.admin.vars.common.checkboxToggleIdDataAttr, uploadInputs = alopeyk.wcshm.admin.vars.upload.inputSelector, setCostInputVisibility = function () { if ( costTypeInput.val() == alopeyk.wcshm.admin.vars.cost.costTypeDynamicVal ) { staticCostTypeInput.parents ( 'tr' ).css ( 'display', 'none' ); fixedCostInput.parents ( 'tr' ).css ( 'display', 'none' ); percentageCostInput.parents ( 'tr' ).css ( 'display', 'none' ); } else if ( costTypeInput.val() == alopeyk.wcshm.admin.vars.cost.costTypeStaticVal ) { staticCostTypeInput.parents ( 'tr' ).css ( 'display', '' ); if ( staticCostTypeInput.val() == alopeyk.wcshm.admin.vars.cost.staticCostTypeFixedVal ) { fixedCostInput.parents ( 'tr' ).css ( 'display', '' ); percentageCostInput.parents ( 'tr' ).css ( 'display', 'none' ); } else { percentageCostInput.parents ( 'tr' ).css ( 'display', '' ); fixedCostInput.parents ( 'tr' ).css ( 'display', 'none' ); } } }; $j.merge ( costTypeInput, staticCostTypeInput ).on ( 'change', setCostInputVisibility ); setCostInputVisibility(); $j( 'input:checkbox[data-' + checkboxTargetDataAttr + ']' ).on ( 'change', function () { var targetInput = $j( 'input:checkbox[data-' + checkboxIdDataAttr + '="' + $j( this ).data ( checkboxTargetDataAttr ) + '"]' ), childInput = $j( 'input:checkbox[data-' + checkboxIdDataAttr + '="' + targetInput.data ( checkboxTargetDataAttr ) + '"]' ); targetInput.parents ( 'tr' ).css ( 'display', $j( this ).prop ( 'checked' ) ? '' : 'none' ); if ( childInput.length ) { childInput.parents ( 'tr' ).css ( 'display', $j( this ).prop ( 'checked' ) && targetInput.prop ( 'checked' ) ? '' : 'none' ); } }).trigger ( 'change' ); $j( alopeyk.wcshm.admin.vars.maps.storeLocatorHiddenableInput ).parents ( 'tr' ).first().css ( 'display', 'none' ); $j.each ( $j( uploadInputs ), function ( index, uploadInput ) { uploadInput = $j( uploadInput ); var inputUploadValue = uploadInput.val(), defaultUploadOptions = { frame : 'post', state : 'insert', multiple : false }, previewContainerClass = alopeyk.wcshm.admin.fn.addPrefix ( alopeyk.wcshm.admin.vars.upload.previewContainerClass ), uploadAssetsContainer = $j( '
    ' ).addClass ( alopeyk.wcshm.admin.fn.addPrefix ( alopeyk.wcshm.admin.vars.upload.assetsContainerClass ) ), previewContainer = $j( '
    ' ).addClass ( previewContainerClass ).appendTo ( uploadAssetsContainer ), filenameLabel = $j( '' ).addClass ( alopeyk.wcshm.admin.fn.addPrefix ( alopeyk.wcshm.admin.vars.upload.filenameLabelClass ) ).appendTo ( previewContainer ), uploadButton = $j( '