{
  "version": 3,
  "sources": ["/cdn/shop/t/1044/assets/__blanksUploadHelper.js?auto=format%2Ccompress"],
  "sourcesContent": ["const apiURL = `https://hpz51rjda5.execute-api.us-east-1.amazonaws.com/production`;\r\n// const apiURL = `https://7rfb214pth.execute-api.us-east-1.amazonaws.com/production`;\r\nconst baseAmazonUrl = `s3.amazonaws.com`;\r\nconst ninjaImgixHost = `ninjauploads-production.imgix.net`;\r\nconst ninjaS3Host2 = `ninja-services-production-ninjauploadss3bucket-pj1r4ls6dsdh.s3.amazonaws.com`;\r\nconst ninjaS3Host = `ninjauploads-production.imgix.net`;\r\n\r\nlet uploadArea;\r\nlet fileInput;\r\nconst productURL = `/products/dtf-transfers`;\r\nselectedItemNo = 1;\r\nlet selectedBlockNo = 1;\r\nvar timeout__;\r\nconst AI_DAILY_LIMIT = 50;\r\nconst AI_STATES = {\r\n  ORIGINAL: \"original\",\r\n  PROCESSING: \"processing\",\r\n  RESULT: \"result\",\r\n  RESULT_ORG: \"result-org\"\r\n};\r\nlet designtype = false;\r\nlet grt_photo_id = '';\r\nconst imgParamsSettings = [\r\n  {\r\n    \"fileType\": \"png\",\r\n    \"preview\": \"trim=colorUnlessAlpha&w=2000\",\r\n    \"cart\": \"trim=colorUnlessAlpha&fm=png&auto=compress&q=50&h=100\",\r\n    \"order\": \"[imgIx]trim=colorUnlessAlpha\",\r\n    \"bgRemover\": true,\r\n    \"superRes\": true,\r\n    \"byDefaultBgRemover\": false,\r\n    \"byDefaultSuperRes\": false\r\n  },\r\n  {\r\n    \"fileType\": \"jpg\",\r\n    \"preview\": \"trim=colorUnlessAlpha&fm=png&w=2000\",\r\n    \"cart\": \"trim=colorUnlessAlpha&fm=png&auto=compress&q=50&h=100\",\r\n    \"order\": \"[imgIx]trim=colorUnlessAlpha\",\r\n    \"bgRemover\": true,\r\n    \"superRes\": true,\r\n    \"byDefaultBgRemover\": true,\r\n    \"byDefaultSuperRes\": false\r\n  },\r\n  {\r\n    \"fileType\": \"ai\",\r\n    \"preview\": \"trim=colorUnlessAlpha&fm=png&w=2000\",\r\n    \"cart\": \"trim=colorUnlessAlpha&fm=png&auto=compress&q=50&h=100\",\r\n    \"order\": \"[BOTH_S3]\",\r\n    \"bgRemover\": false,\r\n    \"superRes\": false,\r\n    \"byDefaultBgRemover\": false,\r\n    \"byDefaultSuperRes\": false\r\n  },\r\n  {\r\n    \"fileType\": \"eps\",\r\n    \"preview\": \"fm=png&w=2000\",\r\n    \"cart\": \"trim=colorUnlessAlpha&fm=png&auto=compress&q=50&h=100\",\r\n    \"order\": \"[BOTH_S3]\",\r\n    \"bgRemover\": false,\r\n    \"superRes\": false,\r\n    \"byDefaultBgRemover\": false,\r\n    \"byDefaultSuperRes\": false\r\n  },\r\n  {\r\n    \"fileType\": \"pdf\",\r\n    \"preview\": \"trim=colorUnlessAlpha&fm=png&w=2000\",\r\n    \"cart\": \"trim=colorUnlessAlpha&fm=png&auto=compress&q=50&h=100\",\r\n    \"order\": \"[BOTH_S3]\",\r\n    \"bgRemover\": false,\r\n    \"superRes\": false,\r\n    \"byDefaultBgRemover\": false,\r\n    \"byDefaultSuperRes\": false\r\n  },\r\n  {\r\n    \"fileType\": \"tif\",\r\n    \"preview\": \"trim=colorUnlessAlpha&w=2000\",\r\n    \"cart\": \"trim=colorUnlessAlpha&fm=png&auto=compress&q=50&h=100\",\r\n    \"order\": \"[imgIx]fm=png\",\r\n    \"bgRemover\": true,\r\n    \"superRes\": false,\r\n    \"byDefaultBgRemover\": false,\r\n    \"byDefaultSuperRes\": false\r\n  },\r\n  {\r\n    \"fileType\": \"svg\",\r\n    \"preview\": \"trim=colorUnlessAlpha&fm=png&w=2000\",\r\n    \"cart\": \"trim=colorUnlessAlpha&fm=png&auto=compress&q=50&h=100\",\r\n    \"order\": \"[BOTH_S3]\",\r\n    \"bgRemover\": false,\r\n    \"superRes\": false,\r\n    \"byDefaultBgRemover\": false,\r\n    \"byDefaultSuperRes\": false\r\n  }\r\n]\r\n\r\nfunction initBlanksUploadBox() {\r\n  uploadArea = document.querySelector('.uploadBox .uploadBox__layout');\r\n  fileInput = document.querySelector('.uploadBox #fileInput');\r\n  if (!uploadArea || !fileInput) return;\r\n  if (uploadArea.dataset.uploadBound === 'true') return;\r\n  uploadArea.dataset.uploadBound = 'true';\r\n\r\n  fileInput.addEventListener('change', async (e) => {\r\n    manageFiles( e.target.files );\r\n  });\r\n  uploadArea.addEventListener('click', function (e) {\r\n    // if ( $( e.target ).closest( `a` ).length > 0 ) {\r\n    //   return;\r\n    // }\r\n    fileInput.click();\r\n  });\r\n  uploadArea.addEventListener('dragover', function (event) {\r\n    event.preventDefault();\r\n\r\n    uploadArea.classList.add('drop-zone--over');\r\n  });\r\n  uploadArea.addEventListener('dragleave', function (event) {\r\n    uploadArea.classList.remove('drop-zone--over');\r\n  });\r\n  uploadArea.addEventListener('drop', function (event) {\r\n    event.preventDefault();\r\n    uploadArea.classList.remove('drop-zone--over');\r\n    const files = event.dataTransfer.files;\r\n    manageFiles( files );\r\n  });\r\n}\r\n\r\nwindow.initBlanksUploadBox = initBlanksUploadBox;\r\ninitBlanksUploadBox();\r\n\r\n// Bridge: My Designs picker selection \u2192 blanks multi-upload modal.\r\n// The picker fires `md-picker:use-designs` with `{items: [{file, fileName, id}, ...]}`.\r\n// We fetch each URL into a File and feed it through the existing\r\n// multiFilesManage pipeline so designs appear as new blocks alongside\r\n// any files the user already added \u2014 same UX as a fresh upload.\r\nif (!window.__blanksMdPickerBridgeBound) {\r\n  window.__blanksMdPickerBridgeBound = true;\r\n  document.addEventListener('md-picker:use-designs', async function (e) {\r\n    try {\r\n      var items = (e.detail && e.detail.items) || [];\r\n      if (!items.length) return;\r\n      if (typeof multiFilesManage !== 'function') return;\r\n\r\n      var overlay = document.querySelector('.customTabelPopup__overlay-3');\r\n      if (overlay) overlay.style.setProperty('display', 'none', 'important');\r\n\r\n      // Make sure the multi-upload modal exists (it gets created on first upload).\r\n      // If user picks designs without uploading first, activateMultiupload sets it up.\r\n      if (!document.querySelector('body multi-upload-wrapper') && typeof activateMultiupload === 'function') {\r\n        await activateMultiupload();\r\n      }\r\n\r\n      var filesCounter = $(`multi-upload file-blocks-area uploaded-files-block`).length;\r\n      var beforeUploadAvailableBlocks = filesCounter;\r\n\r\n      for (var i = 0; i < items.length; i++) {\r\n        var url = (items[i] && items[i].file) ? String(items[i].file) : '';\r\n        if (!url) continue;\r\n        if (url.indexOf('?') > -1) url = url.split('?')[0];\r\n        if (typeof ninjaS3Host2 !== 'undefined' && typeof ninjaS3Host !== 'undefined') {\r\n          url = url.split(ninjaS3Host2).join(ninjaS3Host);\r\n        }\r\n\r\n        try {\r\n          var response = await fetch(url);\r\n          if (!response.ok) continue;\r\n          var blob = await response.blob();\r\n          var nameFromUrl = items[i].fileName || url.split('/').pop();\r\n          if (!nameFromUrl || !nameFromUrl.includes('.')) {\r\n            nameFromUrl = 'design_' + Date.now() + '.png';\r\n          }\r\n          var file = new File([blob], nameFromUrl, { type: blob.type || 'image/png' });\r\n\r\n          filesCounter++;\r\n          await multiFilesManage(file, filesCounter);\r\n        } catch (err) {\r\n          console.log('ERROR fetching design from picker', url, err && err.message);\r\n        }\r\n      }\r\n\r\n      // Scroll the multi-upload modal's scroll container so the first\r\n      // newly-added block lands at the top of view. Direct scrollTop\r\n      // animation on `multi-upload upload-area` (the actual scroll\r\n      // container \u2014 confirmed via getComputedStyle: overflow-y auto,\r\n      // scrollHeight > clientHeight) is more reliable here than\r\n      // Element.scrollIntoView, which can no-op inside the fixed-position\r\n      // modal wrapper.\r\n      setTimeout(function () {\r\n        var $newest = $(`multi-upload file-blocks-area uploaded-files-block`).eq(beforeUploadAvailableBlocks);\r\n        var $ua = $(`multi-upload upload-area`);\r\n        if ($newest.length && $ua.length) {\r\n          $ua.animate({ scrollTop: $newest[0].offsetTop }, 500);\r\n        }\r\n      }, 500);\r\n    } catch (err) {\r\n      console.log('ERROR md-picker:use-designs (blanks)', err && err.message);\r\n    }\r\n  });\r\n}\r\n\r\n$(document)\r\n.ready(function () {\r\n  $( `#fileInput` ).val(``);\r\n})\r\n// ANOTHER UPLOAD START\r\n.on(`click`, `multi-upload another-upload-multi`, function( e ) {\r\n  try {\r\n    // The \"Choose a previously uploaded design\" link lives inside the\r\n    // dropzone (.access_old_data > .purchase_from_previous). Without\r\n    // this guard, clicks on that link bubble up to here, get\r\n    // stopImmediatePropagation()'d, and then fire the file input \u2014\r\n    // i.e. the user clicks \"previous designs\" and gets the native file\r\n    // picker instead. Let the link's own handler take the click.\r\n    if ( e.target.closest( `.access_old_data, .purchase_from_previous` ) ) {\r\n      return;\r\n    }\r\n    e.stopImmediatePropagation();\r\n    $( `#anotherFileMultiple` ).click();\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload another-upload-multi`, err.message );\r\n  }\r\n})\r\n.on(`click`, `.purchase_from_previous`, function( e ) {\r\n  try {\r\n    e.preventDefault();\r\n    e.stopImmediatePropagation();\r\n    const $overlay = $( `.customTabelPopup__overlay-3` );\r\n    if ( $overlay.length === 0 ) return;\r\n    $overlay.attr( `data-type`, $( this ).data( `type` ) || `` );\r\n    $overlay.fadeIn( 500 );\r\n  } catch ( err ) {\r\n    console.log( `ERROR .purchase_from_previous (blanks)`, err.message );\r\n  }\r\n})\r\n.on(`change`, `multi-upload #anotherFileMultiple`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    console.log ( 'e', e.target.files );\r\n    let filesCounter = $( `multi-upload uploaded-files-block` ).length;\r\n    let beforeUploadAvailableBlocks = filesCounter;\r\n    for (const file of e.target.files) {\r\n      filesCounter++;\r\n      multiFilesManage( file, filesCounter );\r\n    }\r\n    setTimeout(() => {\r\n      setFocusOfMultiUpload( beforeUploadAvailableBlocks );\r\n    }, 500);\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload #anotherFileMultiple`, err.message );\r\n  }\r\n})\r\n.on(`dragover`, `multi-upload another-upload-multi`, function (e) {\r\n  e.preventDefault();\r\n  e.stopPropagation();\r\n  $( this ).addClass( `dragover` );\r\n})\r\n.on(`dragleave`, `multi-upload another-upload-multi`, function (e) {\r\n  e.preventDefault();\r\n  e.stopPropagation();\r\n  $( this ).removeClass( `dragover` );\r\n})\r\n.on(`drop`, `multi-upload another-upload-multi`, function (e) {\r\n  e.preventDefault();\r\n  e.stopPropagation();\r\n  $( this ).removeClass( `dragover` );\r\n\r\n  const files = e.originalEvent.dataTransfer.files;\r\n  let beforeUploadAvailableBlocks = 0;\r\n  let filesCounter = 0;\r\n  if ( files.length ) {\r\n    filesCounter = $( `multi-upload uploaded-files-block` ).length;\r\n    beforeUploadAvailableBlocks = filesCounter;\r\n    console.log ( 'filesCounter', filesCounter );\r\n    for (const file of files) {\r\n      filesCounter++;\r\n      multiFilesManage( file, filesCounter );\r\n    }\r\n  }\r\n  setTimeout(() => {\r\n    setFocusOfMultiUpload( beforeUploadAvailableBlocks );\r\n  }, 500);\r\n})\r\n// ANOTHER UPLOAD END\r\n.on(`focus`, `multi-upload sizes-blocks .widthHeight__value, multi-upload sizes-blocks .customQtyFile__qty, multi-upload sizes-blocks .popularSizes`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n    selectedItemNo = $( this ).closest( `.widthHeight__custom[item]` ).attr( `item` );\r\n    const selectedItemOption = $( this ).closest( `.widthHeight__custom[item]` ).attr( `option-selected` );\r\n    const activeTab = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n    if ( activeTab == 'custom' && selectedItemOption == 'popular' ) {\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName[value=\"${ selectedItemOption }\"]` ).prop( `checked`, true );\r\n    } else if ( activeTab == 'popular' && selectedItemOption == 'custom' ) {\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName[value=\"${ selectedItemOption }\"]` ).prop( `checked`, true );\r\n    }\r\n    pricesTable();\r\n    updatePreviewBoxSizes();\r\n    $( this ).select();\r\n    setActiveRow();\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload sizes-blocks .widthHeight__value, multi-upload sizes-blocks .customQtyFile__qty, multi-upload sizes-blocks .popularSizes`, err.message );\r\n  }\r\n})\r\n// CUSTOM SIZE INCREASE DECREASE START\r\n.on(`click`, `sizes-blocks .widthHeight__value-minus`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    selectedItemNo = $( this ).closest( `.widthHeight__custom` ).attr( `item` );\r\n    const getVal = $( this ).closest( `.widthHeight__item_inputWrapper` ).find( `.widthHeight__value` ).val() * 1;\r\n    const getStep = $( this ).closest( `.widthHeight__item_inputWrapper` ).find( `.widthHeight__value` ).attr( `step` ) * 1;\r\n\r\n    if ( uploadType == 'multi' ) {\r\n      selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n      const activeTab = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n      if ( activeTab == 'popular' ) {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName[value=\"custom\"]` ).prop( `checked`, true );\r\n      }\r\n    }\r\n\r\n    setActiveRow();\r\n\r\n    $( this ).closest( `.widthHeight__item_inputWrapper` ).find( `.widthHeight__value` ).val( ( getVal - getStep ).toFixed( 2 ) ).trigger( `keyup` );\r\n  } catch ( err ) {\r\n    console.log( `ERROR sizes-blocks .widthHeight__value-minus`, err.message );\r\n  }\r\n})\r\n.on(`click`, `sizes-blocks .widthHeight__value-plus`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    selectedItemNo = $( this ).closest( `.widthHeight__custom` ).attr( `item` );\r\n    const getVal = $( this ).closest( `.widthHeight__item_inputWrapper` ).find( `.widthHeight__value` ).val() * 1;\r\n    const getStep = $( this ).closest( `.widthHeight__item_inputWrapper` ).find( `.widthHeight__value` ).attr( `step` ) * 1;\r\n    if ( uploadType == 'multi' ) {\r\n      selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n      const activeTab = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n      if ( activeTab == 'popular' ) {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName[value=\"custom\"]` ).prop( `checked`, true );\r\n      }\r\n    }\r\n    setActiveRow();\r\n    $( this ).closest( `.widthHeight__item_inputWrapper` ).find( `.widthHeight__value` ).val( ( getVal + getStep ).toFixed( 2 ) ).trigger( `keyup` );\r\n  } catch ( err ) {\r\n    console.log( `ERROR sizes-blocks .widthHeight__value-plus`, err.message );\r\n  }\r\n})\r\n// CUSTOM SIZE INCREASE DECREASE END\r\n.on(`keyup`, `upload-controls sizes-blocks input[name=\"width__value\"], upload-controls sizes-blocks input[name=\"height__value\"], multi-upload sizes-blocks input[name=\"width__value\"], multi-upload sizes-blocks input[name=\"height__value\"]`,async function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n    selectedItemNo = $( this ).closest( `.widthHeight__custom[item]` ).attr( `item` );\r\n    if ( uploadType == 'multi' ) {\r\n      $( `multi-upload .addToCartGroupItemsMultiple` ).addClass( `disabled` );\r\n    }\r\n\r\n    clearTimeout( timeout__ );\r\n    timeout__ = setTimeout(() => {\r\n      let isSizesBlock = $( `upload-controls sizes-blocks` ).length;\r\n      if ( uploadType == 'multi' ) {\r\n        isSizesBlock = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks` ).length;\r\n      }\r\n      if ( isSizesBlock > 0 ) {\r\n        let dpiErr = false;\r\n        const item = $( this ).closest( `.widthHeight__custom[item]` );\r\n        const selectedOption__ = item.attr( `option-selected` );\r\n        let getVal = $( this ).val() * 1;\r\n        console.log ( 'getVal', getVal );\r\n        let otherVal = 0;\r\n        let by = $( this ).closest( `.widthHeight__item` ).attr( `by` );\r\n        if ( by == 'width' ) {\r\n          otherVal = $( this ).closest( `.widthHeight__custom` ).find( `.widthHeight__item[by=\"height\"] .widthHeight__value` ).val() * 1;\r\n        } else if ( by == 'height' ) {\r\n          otherVal = $( this ).closest( `.widthHeight__custom` ).find( `.widthHeight__item[by=\"width\"] .widthHeight__value` ).val() * 1;\r\n        }\r\n        let isWarningErrorActive = item.find( `dpi-warning` ).hasClass( `active` );\r\n        if ( getVal < definedMinWidth ) {\r\n          $( this ).val( definedMinWidth ).attr( `value`, definedMinWidth ).addClass( `minError` );\r\n          getVal = definedMinWidth;\r\n          if ( isWarningErrorActive ) {\r\n            item.find( `dpi-warning` ).removeClass( `active` );\r\n            dpiErr = true;\r\n          }\r\n        }\r\n        let largerDefinedVal;\r\n        if ( definedMaxWidth == definedMaxHeight ) {\r\n          largerDefinedVal = definedMaxWidth;\r\n        } else if ( definedMaxWidth > definedMaxHeight ) {\r\n          largerDefinedVal = definedMaxWidth;\r\n        } else if ( definedMaxHeight > definedMaxWidth ) {\r\n          largerDefinedVal = definedMaxHeight;\r\n        }\r\n        if ( getVal == otherVal && getVal > definedMaxWidth ) {\r\n          console.log ( 'this condition true',  );\r\n        }\r\n        if ( by == 'width' && getVal > definedMaxWidth ) {\r\n          $( this ).val( definedMaxWidth ).addClass( `error` );\r\n          getVal = definedMaxWidth;\r\n          if ( isWarningErrorActive ) {\r\n            item.find( `dpi-warning` ).removeClass( `active` );\r\n            dpiErr = true;\r\n          }\r\n        } else if ( by == 'height' && getVal > definedMaxHeight ) {\r\n          $( this ).val( definedMaxHeight ).addClass( `error` );\r\n          getVal = definedMaxHeight;\r\n          if ( isWarningErrorActive ) {\r\n            item.find( `dpi-warning` ).removeClass( `active` );\r\n            dpiErr = true;\r\n          }\r\n        }\r\n        let getRatio;\r\n        if ( uploadType == 'multi' ) {\r\n          getRatio = getNewRatio( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] preview-box .fileupload_hero`, by );\r\n        }\r\n\r\n        const newVal = calculateNewWidth_orNewHeight( getRatio, by, getVal );\r\n\r\n        console.log ( 'newVal', newVal );\r\n\r\n        if ( by == 'height' && newVal > definedMaxWidth ) {\r\n          item.find( `.widthHeight__item[by=\"width\"] .widthHeight__value` ).val( definedMaxWidth ).attr( `value`, definedMaxWidth ).addClass( `error` );\r\n\r\n          let getRatio;\r\n          if ( uploadType == 'multi' ) {\r\n            getRatio = getNewRatio( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] preview-box .fileupload_hero`, 'width' );\r\n          }\r\n\r\n          const newVal_ = calculateNewWidth_orNewHeight( getRatio, 'width', definedMaxWidth );\r\n          console.log ( 'newVal_ H', newVal_ );\r\n          item.find( `.widthHeight__item[by=\"${ by }\"] .widthHeight__value` ).val( newVal_.toFixed( 2 ) ).attr( `value`, newVal_.toFixed( 2 ) ).addClass( `error` );\r\n\r\n          if ( isWarningErrorActive ) {\r\n            item.find( `dpi-warning` ).removeClass( `active` );\r\n            dpiErr = true;\r\n          }\r\n        } else if ( by == 'width' && newVal > definedMaxHeight ) {\r\n          item.find( `.widthHeight__item[by=\"height\"] .widthHeight__value` ).val( definedMaxHeight ).attr( `value`, definedMaxHeight ).addClass( `error` );\r\n          let getRatio;\r\n          if ( uploadType == 'multi' ) {\r\n            getRatio = getNewRatio( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] preview-box .fileupload_hero`, 'height' );\r\n          }\r\n          const newVal_ = calculateNewWidth_orNewHeight( getRatio, 'height', definedMaxHeight );\r\n          console.log ( 'newVal_ W', newVal_ );\r\n          item.find( `.widthHeight__item[by=\"${ by }\"] .widthHeight__value` ).val( newVal_.toFixed( 2 ) ).attr( `value`, newVal_.toFixed( 2 ) ).addClass( `error` );\r\n\r\n          if ( isWarningErrorActive ) {\r\n            item.find( `dpi-warning` ).removeClass( `active` );\r\n            dpiErr = true;\r\n          }\r\n        } else if ( newVal < definedMinWidth ) {\r\n          if ( by == 'width' ) {\r\n            item.find( `.widthHeight__item[by=\"height\"] .widthHeight__value` ).val( definedMinWidth ).attr( `value`, definedMinWidth ).addClass( `minError` );\r\n            let getRatio;\r\n            if ( uploadType == 'multi' ) {\r\n              getRatio = getNewRatio( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] preview-box .fileupload_hero`, 'height' );\r\n            }\r\n\r\n            const newVal = calculateNewWidth_orNewHeight( getRatio, 'height', definedMinWidth );\r\n            item.find( `.widthHeight__item[by=\"${ by }\"] .widthHeight__value` ).val( newVal.toFixed( 2 ) ).attr( `value`, newVal.toFixed( 2 ) ).addClass( `minError` );\r\n\r\n            if ( isWarningErrorActive ) {\r\n              item.find( `dpi-warning` ).removeClass( `active` );\r\n              dpiErr = true;\r\n            }\r\n          } else if ( by == 'height' ) {\r\n            item.find( `.widthHeight__item[by=\"width\"] .widthHeight__value` ).val( definedMinWidth ).attr( `value`, definedMinWidth ).addClass( `minError` );\r\n            let getRatio;\r\n            if ( uploadType == 'multi' ) {\r\n              getRatio = getNewRatio( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] preview-box .fileupload_hero`, 'width' );\r\n            }\r\n            const newVal = calculateNewWidth_orNewHeight( getRatio, 'width', definedMinWidth );\r\n            item.find( `.widthHeight__item[by=\"${ by }\"] .widthHeight__value` ).val( newVal.toFixed( 2 ) ).attr( `value`, newVal.toFixed( 2 ) ).addClass( `minError` );\r\n\r\n            if ( isWarningErrorActive ) {\r\n              item.find( `dpi-warning` ).removeClass( `active` );\r\n              dpiErr = true;\r\n            }\r\n          }\r\n        } else {\r\n          if ( by == 'width' ) {\r\n            item.find( `.widthHeight__item[by=\"height\"] .widthHeight__value` ).val( newVal.toFixed( 2 ) ).attr( `value`, newVal.toFixed( 2 ) );\r\n          } else if ( by == 'height' ) {\r\n            item.find( `.widthHeight__item[by=\"width\"] .widthHeight__value` ).val( newVal.toFixed( 2 ) ).attr( `value`, newVal.toFixed( 2 ) );\r\n          }\r\n        }\r\n\r\n        setTimeout(() => {\r\n          let updatedWidth, updatedHeight;\r\n          if ( uploadType == 'multi' ) {\r\n            updatedWidth = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"] input[name=\"width__value\"]` ).val();\r\n            updatedHeight = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"] input[name=\"height__value\"]` ).val();\r\n          }\r\n\r\n          if ( typeof updatedWidth !== 'undefined' && updatedWidth && typeof updatedHeight !== 'undefined' && updatedHeight ) {\r\n            let fileDetails = getFileDetailsFunction( selectedBlockNo );\r\n            if ( typeof fileDetails !== 'undefined' && fileDetails ) {\r\n              fileDetails.currentWidth = updatedWidth,\r\n              fileDetails.currentHeight = updatedHeight\r\n\r\n              if ( typeof fileDetails.vector_currentWidth !== 'undefined' && fileDetails.vector_currentWidth && typeof fileDetails.vector_currentHeight !== 'undefined' && fileDetails.vector_currentHeight ) {\r\n                fileDetails.vector_currentWidth = updatedWidth\r\n                fileDetails.vector_currentHeight = updatedHeight\r\n              }\r\n\r\n              const matchedVariant = getMatchingVariant( fileDetails, selectedBlockNo );\r\n              console.log ( 'matchedVariant', matchedVariant );\r\n              matched_variant = matchedVariant;\r\n              if ( typeof matchedVariant !== 'undefined' && matchedVariant ) {\r\n                applyImgToPreviewBox( fileDetails, matchedVariant, false, selectedBlockNo, `no` );\r\n              }\r\n            }\r\n            console.log ( 'fileDetails', fileDetails );\r\n            if ( uploadType == 'multi' ) {\r\n              $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"]` ).attr({\r\n                \"w\": updatedWidth,\r\n                \"h\": updatedHeight,\r\n                \"size\": `${ updatedWidth }x${ updatedHeight }`\r\n              });\r\n            }\r\n          }\r\n\r\n          console.log ( 'updatedWidth', updatedWidth );\r\n          console.log ( 'updatedHeight', updatedHeight );\r\n\r\n          calculateDPILineItem( selectedBlockNo )\r\n        }, 500);\r\n\r\n        setTimeout(() => {\r\n          item.find( `.widthHeight__item .widthHeight__value` ).removeClass( `error minError` );\r\n          if ( dpiErr ) {\r\n            item.find( `dpi-warning` ).addClass( `active` );\r\n            dpiErr = false;\r\n          }\r\n        }, 1500);\r\n      }\r\n      if ( uploadType == 'multi' ) {\r\n        $( `multi-upload .addToCartGroupItemsMultiple` ).removeClass( `disabled` );\r\n      }\r\n      setActiveRow();\r\n    }, 300);\r\n  } catch ( err ) {\r\n    console.log( `ERROR upload-controls input[name=\"width__value\"], upload-controls input[name=\"height__value\"]`, err.message );\r\n  }\r\n})\r\n.on(`keyup`, `upload-controls sizes-blocks .customQtyFile__qty, multi-upload sizes-blocks .customQtyFile__qty`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n    selectedItemNo = $( this ).closest( `.widthHeight__custom[item]` ).attr( `item` );\r\n    if ( uploadType == 'multi' ) {\r\n      $( `multi-upload .addToCartGroupItemsMultiple` ).addClass( `disabled` );\r\n    }\r\n    clearTimeout( timeout__ );\r\n    timeout__ = setTimeout(() => {\r\n      const getVal = $( this ).val() * 1;\r\n      var pattern = /^[0-9]+$/;\r\n      let isError = false;\r\n      let setQty = 0;\r\n      if ( pattern.test( getVal ) ) {\r\n        if ( getVal < definedMinQty ) {\r\n          isError = true;\r\n          setQty = definedMinQty;\r\n        } else {\r\n          setQty = getVal;\r\n        }\r\n      } else {\r\n        isError = true;\r\n        setQty = definedMinQty;\r\n      }\r\n      if ( isError ) {\r\n        $( this ).closest( `.widthHeight__custom` ).attr( `qty`, setQty );\r\n        $( this ).val( setQty ).addClass( `error` );\r\n      } else {\r\n        $( this ).closest( `.widthHeight__custom` ).attr( `qty`, setQty );\r\n        $( this ).removeClass( `error` );\r\n        calculatePrices();\r\n      }\r\n      calculateTotalQty();\r\n      setTimeout(() => {\r\n        $( this ).removeClass( `error` );\r\n      }, 1500);\r\n      if ( uploadType == 'multi' ) {\r\n        $( `multi-upload .addToCartGroupItemsMultiple` ).removeClass( `disabled` );\r\n      }\r\n      setActiveRow();\r\n    }, 300);\r\n  } catch ( err ) {\r\n    console.log( `ERROR upload-controls sizes-blocks .customQtyFile__qty`, err.message );\r\n  }\r\n})\r\n.on(`change`, `multi-upload tab-controls .tabOptionName`,async function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n    console.log ( 'selectedBlockNo', selectedBlockNo );\r\n    const isAdded = await checkAndAddNewSizeRow( selectedBlockNo );\r\n    console.log ( 'isAdded', isAdded );\r\n    let activeOption = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n    if ( isAdded ) {\r\n      let fileDetails = getFileDetailsFunction( selectedBlockNo );\r\n      if ( typeof fileDetails !== 'undefined' && fileDetails ) {\r\n        const matchedVariant = getMatchingVariant( fileDetails, selectedBlockNo );\r\n        if ( typeof matchedVariant !== 'undefined' && matchedVariant ) {\r\n          applyImgToPreviewBox( fileDetails, matchedVariant, false, selectedBlockNo );\r\n\r\n          if ( activeOption == 'custom' ) {\r\n            updateLineItemData( fileDetails.currentWidth, fileDetails.currentHeight, selectedBlockNo )\r\n          } else if ( activeOption == 'popular' ) {\r\n            const getDimension = getWidthHeight_popularSize( matchedVariant.option1_converted );\r\n            updateLineItemData( getDimension.width, getDimension.height, selectedBlockNo );\r\n          }\r\n        }\r\n      }\r\n    }\r\n    // let isRowSelected = false;\r\n    if ( activeOption == 'custom' ) {\r\n      const isAvailable = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks line-items-custom .widthHeight__custom` ).length;\r\n      if ( isAvailable > 0 ) {\r\n        selectedItemNo = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks line-items-custom .widthHeight__custom` ).last().attr( `item` );\r\n      }\r\n    } else if ( activeOption == 'popular' ) {\r\n      const isAvailable = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks line-items-popular .widthHeight__custom` ).length;\r\n      if ( isAvailable > 0 ) {\r\n        selectedItemNo = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks line-items-popular .widthHeight__custom` ).last().attr( `item` );\r\n      }\r\n    }\r\n\r\n    // pricesTable();\r\n    updatePreviewBoxSizes();\r\n    setActiveRow();\r\n    // console.log ( 'selectedItemNo', selectedItemNo );\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload tab-controls .tabOptionName`, err.message );\r\n  }\r\n})\r\n.on(`change`, `multi-upload sizes-blocks .popularSizes`,async function( e ) {\r\n  try {\r\n    e.stopPropagation();\r\n    console.clear();\r\n\r\n    console.log ( 'chaaaaaaa',  );\r\n\r\n    const selectedVal = $(this).val();\r\n    if (!selectedVal) return;\r\n\r\n    selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n    selectedItemNo = $( this ).closest( `.widthHeight__custom[item]` ).attr( `item` );\r\n\r\n    console.log ( 'selectedBlockNo', selectedBlockNo );\r\n    console.log ( 'selectedItemNo', selectedItemNo );\r\n\r\n    const $row      = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"]` );\r\n\r\n    // let activeOption = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n    let fileDetails = getFileDetailsFunction( selectedBlockNo );\r\n    if ( typeof fileDetails !== 'undefined' && fileDetails ) {\r\n      let largerIs = Math.ceil(fileDetails.fileWidth) >= Math.ceil(fileDetails.fileHeight) ? 'width' : 'height';\r\n      // let largerIs =fileDetails.fileHeight ? 'width' : 'height';\r\n\r\n      console.log ( 'fileDetails', fileDetails );\r\n\r\n      console.log ( 'largerIs', largerIs );\r\n\r\n      const matchedVariant = getMatchingVariant( fileDetails, selectedBlockNo );\r\n\r\n      if ( typeof matchedVariant !== 'undefined' && matchedVariant ) {\r\n        console.log ( 'matchedVariant', matchedVariant );\r\n\r\n        if ( typeof smartSizing !== 'undefined' && smartSizing ) {\r\n          console.log ( 'yes it is',  );\r\n          let width  = 0;\r\n          let height = 0;\r\n          if ( matchedVariant && matchedVariant.option1_converted ) {\r\n            const dim = getWidthHeight_popularSize( matchedVariant.option1_converted );\r\n            if (dim) {\r\n              width  = dim.width;\r\n              height = dim.height;\r\n            }\r\n          }\r\n\r\n          console.log ( 'width', width, 'height', height );\r\n\r\n          let updatedDim = {};\r\n\r\n          if ( largerIs == 'width' ) {\r\n            console.log ( 'its by width', Math.ceil(fileDetails.fileWidth), Math.ceil(fileDetails.fileHeight) );\r\n            updatedDim = getProportionalSize( width, 'width', Math.ceil(fileDetails.fileWidth), Math.ceil(fileDetails.fileHeight) );\r\n          } else {\r\n            console.log ( 'its by height', Math.ceil(fileDetails.fileWidth), Math.ceil(fileDetails.fileHeight) );\r\n            updatedDim = getProportionalSize( height, 'height', Math.ceil(fileDetails.fileWidth), Math.ceil(fileDetails.fileHeight) );\r\n          }\r\n\r\n          width = updatedDim.width;\r\n          height = updatedDim.height;\r\n\r\n          console.log ( 'updatedDim', updatedDim );\r\n\r\n          const $select = $(this);\r\n\r\n          resetPopularOptionLabels($select);\r\n\r\n          const $option = $select.find('option:selected');\r\n          const originalLabel = $option.data('original-label') || $.trim($option.text());\r\n\r\n          console.log ( 'originalLabel', originalLabel );\r\n\r\n          if (!$option.data('original-label')) {\r\n            $option.data('original-label', originalLabel);\r\n          }\r\n\r\n          const parts = originalLabel.split('-');\r\n          const desc  = parts.length > 1 ? '-' + parts.slice(1).join('-') : '';\r\n\r\n          const wLabel = formatInchesValue(width);\r\n          const hLabel = formatInchesValue(height);\r\n\r\n          const newLabel = `${wLabel}\" x ${hLabel}\" ${desc}`;\r\n          $option.text(newLabel);\r\n\r\n          fileDetails.currentWidth  = width;\r\n          fileDetails.currentHeight = height;\r\n\r\n          const matchedPricingVariant = getVariantForSmartSize(width, height);\r\n\r\n          console.log ( 'matchedPricingVariant', matchedPricingVariant );\r\n\r\n          if (matchedPricingVariant) {\r\n            $row.attr({\r\n              \"title\": matchedPricingVariant.title,\r\n              \"vid\": matchedPricingVariant.id,\r\n              \"dpi-warning\": '',\r\n              \"price\": matchedPricingVariant.price,\r\n              \"media-id\": matchedPricingVariant.media_id,\r\n              \"w\": width,\r\n              \"h\": height,\r\n              \"size\": `${ width }x${ height }`\r\n            });\r\n          }\r\n\r\n          applyImgToPreviewBox( fileDetails, matchedPricingVariant, false, selectedBlockNo, `no` );\r\n          updateLineItemData( width, height, selectedBlockNo );\r\n        } else {\r\n          applyImgToPreviewBox( fileDetails, matchedVariant, false, selectedBlockNo, `no` );\r\n          const getDimension = getWidthHeight_popularSize( matchedVariant.option1_converted );\r\n          if ( typeof getDimension !== 'undefined' && getDimension ) {\r\n            updateLineItemData( getDimension.width, getDimension.height, selectedBlockNo );\r\n          }\r\n        }\r\n      }\r\n    }\r\n    calculateDPILineItem( selectedBlockNo );\r\n    updatePreviewBoxSizes();\r\n    setActiveRow();\r\n  } catch ( err ) {\r\n    console.log( `ERROR upload-controls tab-controls .tabOptionName`, err.message );\r\n  }\r\n})\r\n// ADD SIZES ROW START\r\n.on(`click`, `multi-upload .addmore_size`,async function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    if ( uploadType == 'multi' ) {\r\n      selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n      let activeOption = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks line-items-${ activeOption }` )\r\n        .append( $( `#multiUploadTemplates template[data-multi-id=\"${ activeOption }\"]` ).html() )\r\n        .addClass( `rowAdded` );\r\n      await applyItemNo( activeOption, selectedBlockNo );\r\n\r\n      let fileDetails = getFileDetailsFunction( selectedBlockNo );\r\n      if ( typeof fileDetails !== 'undefined' && fileDetails ) {\r\n\r\n        const matchedVariant = getMatchingVariant( null, selectedBlockNo );\r\n        console.log ( 'matchedVariant', matchedVariant );\r\n        if ( typeof matchedVariant !== 'undefined' && matchedVariant ) {\r\n          applyImgToPreviewBox( fileDetails, matchedVariant, false, selectedBlockNo, 'no' );\r\n          if ( activeOption == 'custom' ) {\r\n            updateLineItemData( fileDetails.currentWidth, fileDetails.currentHeight, selectedBlockNo )\r\n          } else if ( activeOption == 'popular' ) {\r\n            const getDimension = getWidthHeight_popularSize( matchedVariant.option1_converted );\r\n            updateLineItemData( getDimension.width, getDimension.height, selectedBlockNo );\r\n            console.log ( 'getDimension.height added new size', getDimension.height );\r\n            updatePreviewSizeOnly( getDimension.width, getDimension.height, selectedBlockNo );\r\n          }\r\n        }\r\n      }\r\n    }\r\n    setActiveRow();\r\n  } catch ( err ) {\r\n    console.log( `ERROR upload-controls .addmore_size, multi-upload .addmore_size`, err.message );\r\n  }\r\n})\r\n// ADD SIZES ROW END\r\n// REMOVE ITEM START\r\n.on(`click`, `multi-upload sizes-blocks .del_item_cta`, async function(e) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n\r\n    selectedBlockNo = $(this).closest(`uploaded-files-block`).attr(`block-no`) || 1;\r\n\r\n    $(this).closest(`.widthHeight__custom`).remove();\r\n    const type = $(this).closest(`line-items-popular`).length ? `popular` : `custom`;\r\n    await applyItemNo(type, selectedBlockNo);\r\n\r\n    await selectAvailableTier(selectedBlockNo);\r\n\r\n    await calculateTotalQty();\r\n    await calculatePrices(null, null, selectedBlockNo);\r\n    if (uploadType == 'multi') {\r\n      let totalPrice = 0;\r\n      $(`multi-upload line-items sizes-blocks .widthHeight__custom[item]`).each(function() {\r\n        const qty = $(this).find(`precut-unit-logic .precut-unit-logic__qty .customQtyFile__qty`).val() * 1;\r\n        let unitPrice = $(this).attr(`price`) * 1;\r\n        totalPrice += qty * unitPrice;\r\n      });\r\n      shippingBarData(totalPrice);\r\n    }\r\n  } catch (err) {\r\n    console.log(`ERROR del_item_cta`, err.message);\r\n  }\r\n})\r\n// REMOVE ITEM END\r\n.on(`click`, `multi-upload preview-box a[removefile], multi-upload item-no .itemNo__action a`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n    const fileRemoveHTML = $( `template[data-multi-id=\"fileRemove\"]` ).html();\r\n    $( `body` ).append( fileRemoveHTML );\r\n  } catch ( err ) {\r\n    console.log( `ERROR preview-box a[fileremove], multi-upload item-no .itemNo__action a`, err.message );\r\n  }\r\n})\r\n.on(`click`, `file-remove-wrapper .fileRemoveBlock__removeFile, file-remove-wrapper-multi .fileRemoveBlock__removeFile`,async function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    if ( uploadType == 'multi' ) {\r\n      const totalBlocks = $( `multi-upload uploaded-files-block` ).length;\r\n      if ( totalBlocks == 1 ) {\r\n        $( `multi-upload-wrapper` ).remove();\r\n        $( `file-remove-wrapper-multi` ).remove();\r\n        uploadType = '';\r\n      } else {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"]` ).remove();\r\n        resetItemNo();\r\n        applyItemNo( 'custom', selectedBlockNo );\r\n        $( `file-remove-wrapper-multi` ).remove();\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR file-remove-wrapper .fileRemoveBlock__removeFile, file-remove-wrapper-multi .fileRemoveBlock__removeFile`, err.message );\r\n  }\r\n})\r\n.on(`click`, `file-remove-wrapper-multi .fileRemoveBlock__close, file-remove-wrapper-multi .fileRemoveBlock__cancle`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    $( this ).closest( `file-remove-wrapper-multi` ).remove();\r\n  } catch ( err ) {\r\n    console.log( `ERROR file-remove-wrapper-multi .fileRemoveBlock__close, file-remove-wrapper-multi .fileRemoveBlock__cancle`, err.message );\r\n  }\r\n})\r\n.on(`click`, `multi-upload .multiUpload__close`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    let fileRemoveHTML = $( `template[data-multi-id=\"fileRemove\"]` ).html();\r\n    fileRemoveHTML = fileRemoveHTML.replace( `fileRemoveBlock__removeFile`, `removeAllBlocks` );\r\n    $( `body` ).append( fileRemoveHTML );\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload .multiUpload__close`, err.message );\r\n  }\r\n})\r\n.on(`click`, `file-remove-wrapper-multi .removeAllBlocks`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    $( `multi-upload-wrapper` ).remove();\r\n    $( `file-remove-wrapper-multi` ).remove();\r\n    fileInput.value = '';\r\n    uploadType = '';\r\n  } catch ( err ) {\r\n    console.log( `ERROR file-remove-wrapper-multi .removeAllBlocks`, err.message );\r\n  }\r\n})\r\n.on(`click`, `precut .openmodalbox`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    const precutHTML = $( `template[data-id=\"precutModal\"]` ).html();\r\n    $( `body` ).prepend( precutHTML );\r\n  } catch ( err ) {\r\n    console.log( `ERROR precut .openmodalbox`, err.message );\r\n  }\r\n})\r\n.on(`click`, `multi-upload prices-table .pricesTable__table_viewAll`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    const isShowAll = $( this ).closest( `.pricesTable__items` ).hasClass( `showAll` );\r\n    if ( isShowAll ) {\r\n      $( this ).closest( `.pricesTable__items` ).removeClass( `showAll` );\r\n      $( this ).addClass( `view` );\r\n    } else {\r\n      $( this ).closest( `.pricesTable__items` ).addClass( `showAll` );\r\n      $( this ).removeClass( `view` );\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload prices-table .pricesTable__table_viewAll`, err.message );\r\n  }\r\n})\r\n.on(`change`, `multi-upload toggle-options .toggleOption`,async function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n    if ( uploadType == 'multi' ) {\r\n      await selectAvailableTier( selectedBlockNo );\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] file-preview preview-block.easyzoom` ).addClass( `image-loading` );\r\n      await updatePreviewImgAndLineItems( selectedBlockNo );\r\n      updatePreviewBoxSizes();\r\n\r\n      /* REINFORCE SIZE START */\r\n      $( `line-items-custom .widthHeight__custom[item=\"${ selectedItemNo }\"] .widthHeight__item[by=\"height\"] input[name=\"height__value\"]` ).trigger('keyup');\r\n      /* REINFORCE SIZE END */\r\n\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] file-preview preview-block.easyzoom` ).removeClass( `image-loading` );\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload toggle-options .toggleOption`, err.message );\r\n  }\r\n})\r\n.on(`click`, `.edit-with-ai .edit-with-aiFlex`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    const $uploadedBlock = $(this).closest('uploaded-files-block');\r\n\r\n    if ( uploadType == 'multi' ) {\r\n      selectedBlockNo = $uploadedBlock.attr('block-no');\r\n\r\n      const $customItem = $uploadedBlock\r\n        .find('line-items-custom .widthHeight__custom')\r\n        .first();\r\n\r\n      if ($customItem.length > 0) {\r\n        selectedItemNo = $customItem.attr('item');\r\n      } else {\r\n        selectedItemNo = $uploadedBlock\r\n          .find('line-items-popular .widthHeight__custom')\r\n          .first()\r\n          .attr('item');\r\n      }\r\n\r\n      if (!canUseAiRequest()) {\r\n        showRedToast('You have reached your AI generation limit for today.');\r\n        return;\r\n      }\r\n      $(\"body\").addClass(\"lock-page\");\r\n\r\n      const imgUrl = getCurrentPreviewImageUrl();\r\n      console.log('imgUrl', imgUrl);\r\n\r\n      // Set base image preview\r\n      if (imgUrl) {\r\n        $('#customer_image_preview').attr('src', imgUrl);\r\n      } else {\r\n        $('#customer_image_preview').attr('src', '');\r\n      }\r\n\r\n      // Reset AI result & status each time popup opens\r\n      $('#ai_image_preview').attr('src', '');\r\n      $('#ai_prompt_2').val('');\r\n      $('#ai_status_message').hide().text('');\r\n\r\n      // 1) Reset result container and success class\r\n      $('.ai_result_output').hide();           // keep it hidden by default\r\n      $('.ai-container').removeClass('_success');\r\n\r\n      // 2) Reset Generate button (enable again for fresh run)\r\n      const $btn = $('#ai_generate_image_2');\r\n      $btn.prop('disabled', false);\r\n      $btn.data('busy', '0');\r\n      // const originalBtnText = decodeHTML($btn.data('original-text')) || 'Edit Image';\r\n      // $btn.html(originalBtnText);\r\n      setAIState(AI_STATES.ORIGINAL);\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR .edit-with-ai .edit-with-aiFlex`, err.message );\r\n  }\r\n})\r\n.on('click', '#ai_generate_image_2', async function () {\r\n  if (!canUseAiRequest()) {\r\n    showRedToast('You have reached your AI generation limit for today.');\r\n    return;\r\n  }\r\n  const $btn = $(this);\r\n  const $aiPrompt_2 = $('#ai_prompt_2');\r\n  const $status = $('#ai_status_message');\r\n  let isSuccess = false;\r\n  $('.ai-container').removeClass('_success');\r\n  setAIState(AI_STATES.PROCESSING);\r\n  try {\r\n    // LOCK POPUP\r\n    $('.customTabelPopup__overlay-ai').addClass('ai-overlay-locked');\r\n    $('.customTabelPopup__overlay-ai').addClass('processing-ai');\r\n    const baseImageUrl = $('#customer_image_preview').attr('src');\r\n\r\n    if (!baseImageUrl) {\r\n      alert('No base image found. Please upload an image first.');\r\n      return;\r\n    }\r\n\r\n    // PROMPT VALIDATION\r\n    let promptText = ($('#ai_prompt_2').val() || '').trim();\r\n    if (!promptText) {\r\n      $status.show().text('Please enter a prompt to describe how you want to edit the image.');\r\n      $('#ai_prompt_2').focus();\r\n      return;\r\n    }\r\n\r\n    // UI: set loading state\r\n    $btn.prop('disabled', true);\r\n    $aiPrompt_2.prop('disabled', true);\r\n    $btn.data('busy', '1');\r\n\r\n    $status.hide().text('');\r\n\r\n    // Clear previous AI preview\r\n    $('#ai_image_preview').attr('src', '');\r\n\r\n    // CALL NANO-BANANA\r\n    const newImageUrl = await nanoBananaEditRequest(baseImageUrl, promptText);\r\n\r\n    // Update preview\r\n    $('#ai_image_preview').attr('src', newImageUrl);\r\n    setAIState(AI_STATES.RESULT);\r\n\r\n    isSuccess = true;\r\n  } catch (err) {\r\n    console.log('ERROR #ai_generate_image_2 click', err);\r\n    $status.show().text('Error: ' + (err.message || 'Something went wrong while generating the image.'));\r\n  } finally {\r\n    // UNLOCK POPUP\r\n    $('.customTabelPopup__overlay-ai').removeClass('ai-overlay-locked');\r\n    $('.customTabelPopup__overlay-ai').removeClass('processing-ai');\r\n\r\n    if (!isSuccess) {\r\n      $btn.prop('disabled', false);\r\n      $aiPrompt_2.prop('disabled', false);\r\n      $btn.data('busy', '0');\r\n    } else {\r\n      $btn.prop('disabled', true);\r\n      $aiPrompt_2.prop('disabled', false);\r\n      $btn.data('busy', '0');\r\n    }\r\n  }\r\n})\r\n.on('click', '#use_ai_image', async function () {\r\n  const $btn = $(this);\r\n  const $status = $('#ai_status_message');\r\n  let isSuccess = false;\r\n\r\n  console.log ( 'uploadtype', uploadType, 'selectedBlockNo', selectedBlockNo);\r\n\r\n  try {\r\n    $('.customTabelPopup__overlay-ai').addClass('ai-overlay-locked');\r\n\r\n    const aiImageUrl = $('#ai_image_preview').attr('src');\r\n    if (!aiImageUrl) {\r\n      return;\r\n    }\r\n\r\n    const originalBtnText = $btn.data('original-text') || $btn.html();\r\n    $btn.data('original-text', originalBtnText);\r\n    $btn.prop('disabled', true);\r\n    $btn.html('Applying...');\r\n\r\n    if ( typeof uploadType !== 'undefined' && uploadType === 'multi') {\r\n      if ( typeof selectedBlockNo !== 'undefined' && selectedBlockNo ) {\r\n        if ( $( `uploaded-files-block[block-no=\"${ selectedBlockNo }\"] toggle-options[show-bg-option=\"true\"] .bgRemover .toggleOption` ).length > 0 ) {\r\n          $( `uploaded-files-block[block-no=\"${ selectedBlockNo }\"] toggle-options[show-bg-option=\"true\"] .bgRemover .toggleOption` ).prop( 'checked', true );\r\n          await addDelay( 200 );\r\n        }\r\n        const uploaded = await processFileOrUrl(aiImageUrl, selectedBlockNo);\r\n        console.log ( 'uploaded', uploaded );\r\n\r\n        const fileDetail = {\r\n          originalFile: uploaded.originalFile || aiImageUrl,        // keep S3 here for internal stuff\r\n          imgIxFile: uploaded.imgIxFile || uploaded.originalFile || aiImageUrl,\r\n          file_crc: uploaded.file_crc,\r\n          fileName: uploaded.fileName || 'ai-image.png',\r\n          fileURL: uploaded.originalFile || aiImageUrl,\r\n          isAIEdit: true,\r\n          aiOriginalUrl: aiImageUrl                                // \uD83D\uDC49 nano-banana URL\r\n        };\r\n\r\n        const getFileDetail = getFileDetailsFunction( selectedBlockNo );\r\n\r\n        const updatedObject = {...getFileDetail, ...fileDetail};\r\n\r\n        const isUpdate = updateFileDetailsFunction( updatedObject, selectedBlockNo );\r\n        if ( isUpdate ) {\r\n          console.log ( 'Successfully Update' );\r\n          $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] toggle-options .toggleOption` ).trigger( `change` );\r\n        } else {\r\n          console.log ( 'Unable to Update FileDetails' );\r\n        }\r\n      }\r\n    }\r\n\r\n  } catch (err) {\r\n    console.log('ERROR #use_ai_image click', err);\r\n    $status.show().text('Error: ' + (err.message || 'Something went wrong while applying the AI image.'));\r\n  } finally {\r\n    $('.customTabelPopup__overlay-ai').removeClass('ai-overlay-locked');\r\n    $('.customTabelPopup__overlay-ai').hide();\r\n    if (!isSuccess) {\r\n      $btn.prop('disabled', false);\r\n    } else {\r\n      $btn.prop('disabled', true);\r\n    }\r\n    $btn.prop('disabled', false);\r\n\r\n    const originalBtnText = $btn.data('original-text') || 'Apply AI Edit';\r\n    $btn.html(originalBtnText);\r\n    $(\"body\").removeClass(\"lock-page\");\r\n  }\r\n})\r\n.on(`click`, `upload-controls .zoom_image, multi-upload .zoom_image`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    if ( uploadType == 'multi' ) {\r\n      $( `.customTabelPopup__overlay-5 img` ).attr( `src`, `` );\r\n      selectedBlockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n      let optionParams = getToggleOptionParams( selectedBlockNo );\r\n      let fileDetail = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] file-preview file-details` ).text();\r\n      fileDetail = JSON.parse( fileDetail );\r\n      $( `.customTabelPopup__overlay-5 img` ).attr( `src`, `${ fileDetail.imgIxFile }?${ fileDetail.preview }${ typeof optionParams !== 'undefined' && optionParams ? optionParams : `` }` );\r\n      $( `.customTabelPopup__overlay-5` ).show();\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR upload-controls .zoom_image, multi-upload .zoom_image`, err.message );\r\n  }\r\n})\r\n// ADD TO CART START\r\n.on(`click`, `multi-upload proceed-to-checkout .addToCartGroupItemsMultiple`,async function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    if ( uploadType == 'multi' ) {\r\n      $( this ).addClass( `working` );\r\n      const items = await multiFilesAddToCart();\r\n      $( this ).removeClass( `working` );\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload proceed-to-checkout .addToCartGroupItemsMultiple`, err.message );\r\n  }\r\n})\r\n// ADD TO CART END\r\n.on(`change`, `multi-upload #preCutOption_multi`, function( e ) {\r\n  try {\r\n    e.stopImmediatePropagation();\r\n    const isPreCutActive = $( this ).is( `:checked` );\r\n    if ( isPreCutActive ) {\r\n      $( `multi-upload sizes-blocks .widthHeight__custom` ).attr( `precut`, `Yes` );\r\n    } else {\r\n      $( `multi-upload sizes-blocks .widthHeight__custom` ).attr( `precut`, `` );\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR multi-upload #preCutOption_multi`, err.message );\r\n  }\r\n})\r\n;\r\nasync function multiFilesAddToCart() {\r\n  try {\r\n    let items = [];\r\n    const uploadControl = $( `multi-upload` );\r\n    const discountInputProperty = uploadControl.find( `prices-table discount-properties` ).attr( `discount-input` );\r\n    const discountNameProperty = uploadControl.find( `prices-table discount-properties` ).attr( `discount-name` );\r\n    $($( `multi-upload sizes-blocks .widthHeight__custom[item]` ).get().reverse()).each(function( i ) {\r\n      const blockNo = $( this ).closest( `uploaded-files-block` ).attr( `block-no` );\r\n      const fileDetail = getFileDetailsFunction( blockNo );\r\n      const VID = $( this ).attr( `vid` ) * 1;\r\n      const qty = $( this ).attr( `qty` ) * 1;\r\n      const option = $( this ).attr( `option-selected` );\r\n      const dpi = $( this ).attr( `dpi-warning` );\r\n      const precut = $( this ).attr( `precut` );\r\n      const width = $( this ).attr( `w` );\r\n      const height = $( this ).attr( `h` );\r\n      const size = $( this ).attr( `size` );\r\n      const bgRemover = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] toggle-options .bgRemover .toggleOption` ).is( `:checked` );\r\n      const superRes = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] toggle-options .superRes .toggleOption` ).is( `:checked` );\r\n      const designNote = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] designer-notes .designNotes` ).val().trim();\r\n      const properties = {};\r\n\r\n      const orderProperty = parseOrderString( fileDetail.imgIxFile, fileDetail.originalFile, fileDetail.order, fileDetail.currentOptions );\r\n      if ( typeof orderProperty !== 'undefined' && orderProperty ) {\r\n        if ( orderProperty.imgIx ) {\r\n          properties['Upload (Vector Files Preferred)'] = `${ orderProperty.imgIx_params != '' ? orderProperty.imgIx_params : `` }`;\r\n          console.log(\"designtype: \",designtype, \" :grt_photo_id:\",grt_photo_id);\r\n          if(designtype && grt_photo_id != \"\"){\r\n            properties['design re-used'] = `${grt_photo_id}`;\r\n          }\r\n          if(designtype == 1 && ordername != \"\"){\r\n            properties['design re-used'] = `previously on order # ${ordername}`;\r\n          }\r\n        }\r\n        if ( orderProperty.s3 ) {\r\n          if ( typeof fileDetail.isReadyToPress !== 'undefined' && fileDetail.isReadyToPress == 'Yes' ) {\r\n            properties['Upload (Vector Files Preferred)'] = `${ orderProperty.s3_params != '' ? orderProperty.s3_params : `` }`;\r\n            console.log(\"designtype: \",designtype, \" :grt_photo_id:\",grt_photo_id);\r\n            if(designtype && grt_photo_id != \"\"){\r\n              properties['design re-used'] = `${grt_photo_id}`;\r\n            }\r\n            if(designtype == 1 && ordername != \"\"){\r\n              properties['design re-used'] = `previously on order # ${ordername}`;\r\n            }\r\n          } else {\r\n            properties['_Original Image'] = `${ orderProperty.s3_params != '' ? orderProperty.s3_params : `` }`;\r\n          }\r\n        }\r\n      }\r\n\r\n      properties['_cartImg'] = `${ fileDetail.imgIxFile }?${ fileDetail.cart }${ typeof fileDetail.currentOptions !== 'undefined' && fileDetail.currentOptions ? fileDetail.currentOptions : `` }`;\r\n      if ( typeof bgRemover !== 'undefined' && bgRemover ) {\r\n        properties['Remove Background'] = 'Yes';\r\n      }\r\n      if ( typeof superRes !== 'undefined' && superRes ) {\r\n        properties['Super Resolution'] = 'Yes';\r\n      }\r\n      if ( typeof designNote !== 'undefined' && designNote ) {\r\n        properties['Design Notes'] = designNote;\r\n      }\r\n      if ( dpi != '' ) {\r\n        properties[`DPI Warning`] = dpi;\r\n      }\r\n      if ( precut != '' ) {\r\n        properties['Precut'] = precut;\r\n      }\r\n      if ( option == 'custom' ) {\r\n        properties['_width'] = width;\r\n        properties['_height'] = height;\r\n      } else {\r\n        if ( typeof width !== 'undefined' && width ) {\r\n          properties['_width'] = width;\r\n        }\r\n        if ( typeof height !== 'undefined' && height ) {\r\n          properties['_height'] = height;\r\n        }\r\n      }\r\n      properties['_Size'] = size;\r\n\r\n      if ( typeof discountInputProperty !== 'undefined' && discountInputProperty ) {\r\n        properties['_discount_input'] = discountInputProperty;\r\n      }\r\n      if ( typeof discountNameProperty !== 'undefined' && discountNameProperty ) {\r\n        properties['_discount_name'] = discountNameProperty;\r\n      }\r\n      if ( typeof fileDetail.isReadyToPress !== 'undefined' && fileDetail.isReadyToPress == 'Yes' ) {\r\n        properties['_Ready to Press'] = fileDetail.isReadyToPress;\r\n      }\r\n      if ( typeof fileDetail.isAIImage !== 'undefined' && fileDetail.isAIImage ) {\r\n        properties['AI Created'] = 'Yes';\r\n      }\r\n\r\n      if ( typeof fileDetail.isAIEdit !== 'undefined' && fileDetail.isAIEdit ) {\r\n        properties['AI Edit'] = 'Yes';\r\n      }\r\n\r\n      items.push({\r\n        id: VID,\r\n        quantity: qty,\r\n        properties\r\n      });\r\n    })\r\n\r\n    if ( items.length > 0 ) {\r\n      console.log ( 'items', items );\r\n      const attributes = '';\r\n      // $( `body` )\r\n      // .append( `\r\n      //   <div class=\"loadingScreen__\">\r\n      //     <img src=\"${ loaderGif }\">\r\n      //   </div>\r\n      // ` );\r\n      const getData = await fetch(window.Shopify.routes.root + 'cart/add.js', {\r\n        method: 'POST',\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n        },\r\n        body: JSON.stringify({ items, attributes }),\r\n      })\r\n      .then((response) => {\r\n        toast('', 'Added to cart Successfully');\r\n        return response.json();\r\n      })\r\n      .catch((error) => {\r\n        console.error('Error:', error);\r\n      });\r\n      refreshCart();\r\n      updateCartItemCount();\r\n      loadCartItemsCount();\r\n      flushSingleFileData();\r\n\r\n      // location.href = `/cart`;\r\n      await addDelay( 3000 );\r\n      $( `.loadingScreen__` ).remove();\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR multiFilesAddToCart()`, err.message );\r\n  }\r\n}\r\nasync function flushSingleFileData() {\r\n  try {\r\n    uploadType = '';\r\n    fileInput.value = '';\r\n    $( `multi-upload-wrapper` ).remove();\r\n    $( `upload-controls next-element` ).addClass( `hidden` );\r\n    $( `\r\n      upload-controls preview-box preview-block .fileupload_hero,\r\n      upload-controls preview-box preview-block .viewer-box img\r\n    ` ).attr( `src`, transpareImg );\r\n    $( `upload-controls preview-box preview-block .horizontal_direction` ).attr( `x-is`, `` );\r\n    $( `upload-controls preview-box preview-block .verticle_direction` ).attr( `y-is`, `` );\r\n    $( `upload-controls preview-box file-details` ).empty();\r\n    $( `upload-controls sizes-blocks` )\r\n      .attr({\"total-items\": 1, \"total-qty\": 1})\r\n      .find( `line-items-custom, line-items-popular` )\r\n      .removeClass( `rowAdded` )\r\n      .empty();\r\n    $( `upload-controls toggle-options .toggleOption, upload-controls designer-notes #designerNotes` ).prop( `checked`, false );\r\n    $( `upload-controls tab-controls #customSizeTabOption` ).prop( `checked`, true );\r\n    $( `upload-controls master-upload, upload-controls file-progress` ).removeClass( `hidden` );\r\n    $( `upload-controls file-progress .loadingPercent__counter` ).text( `0%` );\r\n    $( `upload-controls file-progress .fileProgress__bar` ).css( `width`, `0%` );\r\n    $( `upload-controls designer-notes .designNotes` ).val( `` );\r\n    $( `file-remove-wrapper` ).remove();\r\n    $( `#generative-ai-area` ).removeAttr( `style` ).removeClass( `hidden` );\r\n    $( `.generative-ai-area` ).removeClass( `hidden` );\r\n    grt_photo_id = '';\r\n  } catch ( err ) {\r\n    console.log( `ERROR `, err.message );\r\n  }\r\n}\r\nfunction updateCartItemCount() {\r\n  try {\r\n    $.get(`/cart?view=cartItemsCount`, function ( res ) {\r\n      $( `.header-container .area--cart` ).html( res );\r\n    });\r\n  } catch ( err ) {\r\n    console.log( `ERROR updateCartItemCount()`, err.message );\r\n  }\r\n}\r\nfunction parseOrderString( imgIxURL, s3URL, order, selectedOptions = `` ) {\r\n  const result = {\r\n    imgIx: false,\r\n    imgIx_params: \"\",\r\n    s3: false,\r\n    s3_params: \"\"\r\n  };\r\n\r\n  const parts = order.split( `&&` );\r\n\r\n  // Normalize selectedOptions (remove leading ? or &)\r\n  selectedOptions = selectedOptions.replace(/^[?&]+/, \"\");\r\n\r\n  // Helper to normalize part like [imgIx]trim=true -> [imgIx]?trim=true\r\n  const normalizePart = ( part ) => {\r\n    return part.replace(/^(\\[(?:imgIx|s3|both_imgix|both_s3)\\])([^?].+)/i, '$1?$2');\r\n  };\r\n\r\n  // Helper to build full URL\r\n  const buildUrl = ( baseURL, rawParams, appendSelected ) => {\r\n    let url = baseURL;\r\n\r\n    if ( rawParams ) {\r\n      url += rawParams;\r\n    }\r\n\r\n    if ( appendSelected && selectedOptions ) {\r\n      if ( rawParams.includes( `?` ) ) {\r\n        url += `&` + selectedOptions;\r\n      } else {\r\n        url += `?` + selectedOptions;\r\n      }\r\n    }\r\n\r\n    return url;\r\n  };\r\n\r\n  parts.forEach(rawPart => {\r\n    const part = normalizePart( rawPart.trim() );\r\n    const match = part.match(/\\[(imgIx|s3|both_imgix|both_s3)\\](\\?[^\\s]*)?/i);\r\n    if ( match ) {\r\n      const key = match[1].toLowerCase();\r\n      const rawParams = match[2]?.trim() || \"\";\r\n\r\n      if ( key === `imgix` ) {\r\n        result.imgIx = true;\r\n        result.imgIx_params = buildUrl(imgIxURL, rawParams, true);\r\n      } else if ( key === `s3` ) {\r\n        result.s3 = true;\r\n        result.s3_params = buildUrl(s3URL, rawParams, false);\r\n      } else if ( key === `both_imgix` ) {\r\n        result.imgIx = true;\r\n        result.s3 = true;\r\n        result.imgIx_params = buildUrl(imgIxURL, rawParams, true);\r\n        result.s3_params = buildUrl(imgIxURL, rawParams, true);\r\n      } else if ( key === `both_s3` ) {\r\n        result.imgIx = true;\r\n        result.s3 = true;\r\n        result.imgIx_params = buildUrl(s3URL, rawParams, false);\r\n        result.s3_params = buildUrl(s3URL, rawParams, false);\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction updateFileDetailsFunction( fileDetails, blockNo ) {\r\n  try {\r\n    if ( typeof uploadType === 'undefined' || uploadType == 'multi' ) {\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] preview-box file-preview file-details` ).text( JSON.stringify( fileDetails ) );\r\n      return true;\r\n    }\r\n    return false;\r\n  } catch ( err ) {\r\n    console.log( `ERROR `, err.message );\r\n  }\r\n}\r\nasync function processFileOrUrl(fileOrUrl, blockNo) {\r\n  let file;\r\n\r\n  if (fileOrUrl instanceof File) {\r\n    file = fileOrUrl;\r\n  } else if (typeof fileOrUrl === \"string\") {\r\n    const url = fileOrUrl;\r\n\r\n    if (url.includes(\"amazonaws.com\")) {\r\n      return {\r\n        originalFile: url,\r\n        imgIxFile: url.replace(ninjaS3Host2, ninjaImgixHost),\r\n        file_crc: null,\r\n        fileName: url.split(\"/\").pop().split(\"?\")[0]\r\n      };\r\n    }\r\n\r\n    const response = await fetch(url);\r\n    if (!response.ok) throw new Error(\"Failed to fetch external file\");\r\n\r\n    const blob = await response.blob();\r\n\r\n    const urlParts = url.split(\"/\");\r\n    let nameFromUrl = urlParts[urlParts.length - 1].split(\"?\")[0];\r\n    if (!nameFromUrl.includes(\".\")) {\r\n      nameFromUrl = \"file_\" + Date.now() + \".jpg\";\r\n    }\r\n\r\n    file = new File([blob], nameFromUrl, { type: blob.type || \"application/octet-stream\" });\r\n  } else {\r\n    throw new Error(\"Invalid input: must be File or URL string\");\r\n  }\r\n\r\n  let rtn = null;\r\n  const fileReader = new FileReader();\r\n  const fileType = file.type;\r\n  const fileSize = file.size;\r\n\r\n  const nameOnly = file.name\r\n    .split(\".\")[0]\r\n    .toLowerCase()\r\n    .replace(/[^a-z0-9]/gi, \"-\")\r\n    .replace(/-+/g, \"-\")\r\n    .replace(/^-|-$/g, \"\");\r\n\r\n  const extension = file.name.split(\".\").pop();\r\n  const randomName = `${nameOnly}____image_${Date.now()}_${Math.floor(Math.random() * 1000)}.${extension}`;\r\n\r\n  const presignData = await getPresignedUploadUrl(randomName, file.type);\r\n\r\n  if (presignData && presignData.url) {\r\n    fileProcessBar(`start`);\r\n    if (uploadType == \"multi\") {\r\n      progressMove(`multi-upload uploaded-files-block[block-no=\"${blockNo}\"] file-progress`, ``, fileSize);\r\n    }\r\n\r\n    const originalUploadedFileURL = presignData.sourceUrl;\r\n    const response = await fetch(presignData.url, {\r\n      method: \"PUT\",\r\n      body: file,\r\n    });\r\n\r\n    if (response.status == 200) {\r\n      let filePath = `https://${ninjaImgixHost}/${randomName}`;\r\n      const file_crc = await makeCRC(file);\r\n\r\n      fileReader.readAsDataURL(file);\r\n      rtn = {\r\n        originalFile: originalUploadedFileURL,\r\n        imgIxFile: filePath,\r\n        file_crc: file_crc,\r\n        fileName: randomName,\r\n      };\r\n    }\r\n  }\r\n  return rtn;\r\n}\r\nasync function nanoBananaEditRequest(imageUrl, promptText) {\r\n  aiJobCancelled = false;\r\n  console.log ( 'promptText', promptText );\r\n  aiJobAbortController = new AbortController();\r\n  const FAL_KEY = 'be8d6227-0af0-4f18-ac79-14111cef50cb:a8a72b50bf97f848e1144bd9c5481f0f';\r\n  const AUTH_HEADER = 'Key ' + FAL_KEY;\r\n\r\n  // 1. Submit job to queue\r\n  const queueResponse = await fetch('https://queue.fal.run/fal-ai/nano-banana/edit', {\r\n    method: 'POST',\r\n    headers: {\r\n      'Authorization': AUTH_HEADER,\r\n      'Content-Type': 'application/json'\r\n    },\r\n    body: JSON.stringify({\r\n      prompt: promptText,\r\n      num_images: 1,\r\n      aspect_ratio: 'auto',\r\n      output_format: 'png',\r\n      image_urls: [imageUrl]\r\n    })\r\n  });\r\n\r\n  if (!queueResponse.ok) {\r\n    const txt = await queueResponse.text().catch(() => '');\r\n    throw new Error('Failed to queue request (' + queueResponse.status + '): ' + txt);\r\n  }\r\n\r\n  const job = await queueResponse.json();\r\n\r\n  if (!job.status_url || !job.response_url) {\r\n    console.log('nanoBanana job payload:', job);\r\n    throw new Error('Invalid response from nano-banana queue');\r\n  }\r\n\r\n  const statusUrl = job.status_url;\r\n  const resultUrl = job.response_url;\r\n\r\n  // 2. Poll status until COMPLETED\r\n  let attempts = 0;\r\n  const maxAttempts = 40; // ~80 seconds if interval = 2000ms\r\n\r\n  while (attempts < maxAttempts) {\r\n    attempts++;\r\n\r\n    const statusResp = await fetch(statusUrl, {\r\n      method: 'GET',\r\n      headers: {\r\n        'Authorization': AUTH_HEADER,\r\n      },\r\n      signal: aiJobAbortController.signal\r\n    });\r\n\r\n    if (!statusResp.ok) {\r\n      const txt = await statusResp.text().catch(() => '');\r\n      throw new Error('Failed to fetch status (' + statusResp.status + '): ' + txt);\r\n    }\r\n\r\n    const statusJson = await statusResp.json();\r\n    // statuses: IN_QUEUE, IN_PROGRESS, COMPLETED, etc.\r\n    if (statusJson.status === 'COMPLETED') {\r\n      break;\r\n    }\r\n\r\n    if (statusJson.status === 'FAILED' || statusJson.status === 'CANCELLED' || statusJson.status === 'ERROR') {\r\n      console.log('nanoBanana status error:', statusJson);\r\n      throw new Error('nano-banana request failed with status: ' + statusJson.status);\r\n    }\r\n\r\n    // wait before next poll\r\n    await new Promise((resolve) => setTimeout(resolve, 2000));\r\n  }\r\n\r\n  if (aiJobCancelled) {\r\n    throw new Error(\"AI request cancelled by user\");\r\n  }\r\n\r\n  // 3. Get final result\r\n  const resultResp = await fetch(resultUrl, {\r\n    method: 'GET',\r\n    headers: {\r\n      'Authorization': AUTH_HEADER\r\n    }\r\n  });\r\n\r\n  if (!resultResp.ok) {\r\n    const txt = await resultResp.text().catch(() => '');\r\n    throw new Error('Failed to get result (' + resultResp.status + '): ' + txt);\r\n  }\r\n\r\n  const resultJson = await resultResp.json();\r\n  console.log('nanoBanana resultJson:', resultJson);\r\n\r\n  // ---- FLEXIBLE IMAGE EXTRACTION ----\r\n  let images = [];\r\n\r\n  // Your case: { images: [...] }\r\n  if (Array.isArray(resultJson.images)) {\r\n    images = resultJson.images;\r\n  }\r\n\r\n  // Fallbacks if they ever change the shape\r\n  if (!images.length && resultJson.response && Array.isArray(resultJson.response.images)) {\r\n    images = resultJson.response.images;\r\n  }\r\n  if (!images.length && resultJson.data && Array.isArray(resultJson.data.images)) {\r\n    images = resultJson.data.images;\r\n  }\r\n  if (!images.length && resultJson.output && Array.isArray(resultJson.output.images)) {\r\n    images = resultJson.output.images;\r\n  }\r\n\r\n  if (!images.length) {\r\n    throw new Error('No images[] array found in nano-banana response');\r\n  }\r\n\r\n  const first = images[0] || {};\r\n  const url = first.url || first.image_url || first.data_url || first.uri || '';\r\n\r\n  if (!url) {\r\n    console.log('nanoBanana first image object:', first);\r\n    throw new Error('No image URL returned from nano-banana');\r\n  }\r\n\r\n  return url;\r\n}\r\nfunction setAIState(state) {\r\n  const $box = $(\".ai-preview-box\");\r\n\r\n  $box.addClass(\"ai-fade\");\r\n  setTimeout(() => $box.removeClass(\"ai-fade\"), 250);\r\n\r\n  $( `\r\n    #customer_image_preview,\r\n    #ai_image_preview,\r\n    .ai-processing,\r\n    .ai-prompt-box,\r\n    .ai-action-box,\r\n    .black-bg,\r\n    .ai-action-box .button\r\n  ` ).hide();\r\n  $( `.ai-tabs, .ai-tab`).removeClass( `active` );\r\n  $( `.ai-modal` ).removeClass( `ai-is-processing` );\r\n\r\n  if ( state === AI_STATES.ORIGINAL ) {\r\n    $( `.ai-tab[data-tab=\"original\"]` ).addClass( `active` );\r\n    $( `#customer_image_preview, .ai-prompt-box` ).show();\r\n  }\r\n\r\n  if ( state === AI_STATES.PROCESSING ) {\r\n    $( `.ai-processing` ).show();\r\n    $( `.ai-modal` ).addClass( `ai-is-processing` );\r\n  }\r\n\r\n  if ( state === AI_STATES.RESULT ) {\r\n    $( `.ai-tabs, .ai-tab[data-tab=\"ai\"]` ).addClass( `active` );\r\n    $( `#ai_image_preview, .ai-action-box, .ai-action-box .button#use_ai_image` ).show();\r\n    $( `.black-bg` ).css({\"display\":\"flex\"});\r\n  }\r\n\r\n  if ( state === AI_STATES.RESULT_ORG ) {\r\n    $( `.ai-tabs, .ai-tab[data-tab=\"original\"]` ).addClass( `active` );\r\n    $( `#customer_image_preview, .ai-action-box, .ai-action-box .button:not(#use_ai_image)` ).show();\r\n    $( `.black-bg` ).hide();\r\n  }\r\n}\r\nfunction getCurrentPreviewImageUrl() {\r\n  try {\r\n    if ( typeof uploadType !== 'undefined' && uploadType === 'multi' ) {\r\n      if ( typeof selectedBlockNo !== 'undefined' && selectedBlockNo ) {\r\n        const src3 = $(`multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] preview-box .fileupload_hero`).attr('src');\r\n        if ( src3 ) return src3;\r\n      }\r\n    }\r\n    return '';\r\n  } catch (err) {\r\n    console.log('ERROR getCurrentPreviewImageUrl()', err.message);\r\n    return '';\r\n  }\r\n}\r\nfunction canUseAiRequest() {\r\n  const usage = getAiUsage();\r\n  return usage.count < AI_DAILY_LIMIT;\r\n}\r\nfunction getAiUsage() {\r\n  const day = getLocalDayKey();\r\n  const raw = localStorage.getItem('nanoBananaUsage');\r\n  let obj = {};\r\n  try { obj = raw ? JSON.parse(raw) : {}; } catch (e) { obj = {}; }\r\n\r\n  if (!obj || obj.day !== day) obj = { day, count: 0 };\r\n  return obj;\r\n}\r\nfunction getLocalDayKey() {\r\n  // YYYY-MM-DD in USER'S local timezone\r\n  const d = new Date();\r\n  const year  = d.getFullYear();\r\n  const month = String(d.getMonth() + 1).padStart(2, '0');\r\n  const day   = String(d.getDate()).padStart(2, '0');\r\n  return `${year}-${month}-${day}`;\r\n}\r\nfunction setFocusOfMultiUpload( beforeUploadAvailableBlocks ) {\r\n  try {\r\n    console.clear();\r\n    console.log ( 'beforeUploadAvailableBlocks', beforeUploadAvailableBlocks );\r\n    if ( beforeUploadAvailableBlocks == 0 ) {\r\n      $( `multi-upload upload-area` ).animate({scrollTop: 0}, 500);\r\n      return;\r\n    }\r\n    let actualTop = 0;\r\n    $( `multi-upload file-blocks-area uploaded-files-block` ).each(function( i ) {\r\n      const j = i + 1;\r\n      if ( i < beforeUploadAvailableBlocks ) {\r\n        const getBlockHeight = $( this ).outerHeight() + 20;\r\n        actualTop = actualTop + getBlockHeight;\r\n      }\r\n    })\r\n    $( `multi-upload upload-area` ).animate({scrollTop: ( actualTop )}, 500);\r\n  } catch ( err ) {\r\n    console.log( `ERROR setFocusOfMultiUpload( beforeUploadAvailableBlocks )`, err.message );\r\n  }\r\n}\r\nasync function resetItemNo() {\r\n  try {\r\n    $( `multi-upload uploaded-files-block` ).each(function(i) {\r\n      const j = i + 1;\r\n      setIndexNoToBlock( $( this ), j );\r\n    })\r\n  } catch ( err ) {\r\n    console.log( `ERROR resetItemNo()`, err.message );\r\n  }\r\n}\r\nasync function selectAvailableTier( blockNo ) {\r\n  try {\r\n    if ( uploadType == 'multi' && blockNo ) {\r\n      const activeTab = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n      if ( activeTab == 'custom' ) {\r\n        const isCustomTierAvailable = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] line-items-custom .widthHeight__custom` ).length;\r\n        if ( isCustomTierAvailable > 0 ) {\r\n          selectedItemNo = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] line-items-custom .widthHeight__custom` ).last().attr( `item` );\r\n        } else {\r\n          selectedItemNo = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] line-items-popular .widthHeight__custom` ).last().attr( `item` );\r\n        }\r\n      } else if ( activeTab == 'popular' ) {\r\n        const isPopularTierAvailable = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] line-items-popular .widthHeight__custom` ).length;\r\n        if ( isPopularTierAvailable > 0 ) {\r\n          selectedItemNo = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] line-items-popular .widthHeight__custom` ).last().attr( `item` );\r\n        } else {\r\n          selectedItemNo = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] line-items-custom .widthHeight__custom` ).last().attr( `item` );\r\n        }\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR updatePreviewSizeOnly( width, height, blockNo )`, err.message );\r\n  }\r\n}\r\nfunction getVariantForSmartSize(width, height) {\r\n  try {\r\n    let totalInches = parseFloat(width) * parseFloat(height);\r\n\r\n    if (totalInches < 1) {\r\n      totalInches = 1;\r\n    }\r\n    totalInches = Math.ceil(totalInches);\r\n\r\n    const customVariants = bySizeVariants.filter(style => style.isCustom);\r\n    if (!customVariants.length) return null;\r\n\r\n    const highestMaxInches = Math.max(...customVariants.map(style => style.maxInches));\r\n\r\n    if (totalInches > highestMaxInches) {\r\n      // fall back to largest style\r\n      return customVariants.reduce((maxObj, current) =>\r\n        current.maxInches > maxObj.maxInches ? current : maxObj\r\n      );\r\n    }\r\n\r\n    // find style whose min/max range contains this area\r\n    return (\r\n      customVariants\r\n        .slice()\r\n        .reverse()\r\n        .find(\r\n          (obj) => totalInches >= obj.minInches && totalInches <= obj.maxInches\r\n        ) || null\r\n    );\r\n  } catch (err) {\r\n    console.log('ERROR getVariantForSmartSize', err.message);\r\n    return null;\r\n  }\r\n}\r\nfunction formatInchesValue(value) {\r\n  try {\r\n    const num = parseFloat(value);\r\n    if (isNaN(num)) return value;\r\n    return parseFloat(num.toFixed(2)).toString().replace(/\\.00$/, '');\r\n  } catch (err) {\r\n    console.log('ERROR formatInchesValue', err.message);\r\n    return value;\r\n  }\r\n}\r\nfunction resetPopularOptionLabels($select) {\r\n  try {\r\n    $select.find('option').each(function() {\r\n      const $opt = $(this);\r\n      const originalLabel = $opt.data('original-label');\r\n      if (originalLabel) {\r\n        $opt.text(originalLabel);\r\n      }\r\n    });\r\n  } catch (err) {\r\n    console.log(\"ERROR resetPopularOptionLabels\", err.message);\r\n  }\r\n}\r\nfunction getProportionalSize(size, by, uploadedWidth, uploadedHeight) {\r\n  let width, height, widthIn, heightIn;\r\n\r\n  if (by === \"width\") {\r\n    const ratio = size / uploadedWidth;\r\n    width = size;\r\n    height = parseFloat((uploadedHeight * ratio).toFixed(2));\r\n  } else {\r\n    const ratio = size / uploadedHeight;\r\n    height = size;\r\n    width = parseFloat((uploadedWidth * ratio).toFixed(2));\r\n  }\r\n  widthIn = (width/300).toFixed(2);\r\n  heightIn = (height/300).toFixed(2);\r\n\r\n  return { width, height, widthIn, heightIn };\r\n}\r\nfunction updateLineItemData( w, h, blockNo ) {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"]` ).attr({\r\n        \"w\": w,\r\n        \"h\": h,\r\n        \"size\": `${ w }x${ h }`\r\n      });\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR updateLineItemData( w, h )`, err.message );\r\n  }\r\n}\r\nfunction getWidthHeight_popularSize( value ) {\r\n  try {\r\n    // Match formats like: 3^ x 2^, 3\"x2.5, 3.5^x6.15\", etc.\r\n    const match = value.match(/^([\\d.]+)[\\^\"]?\\s*x\\s*([\\d.]+)[\\^\"]?$/i);\r\n    if (match) {\r\n      const width = parseFloat(match[1]);\r\n      const height = parseFloat(match[2]);\r\n      return { width, height };\r\n    }\r\n    return null; // return null if pattern doesn't match\r\n  } catch ( err ) {\r\n    console.log( `ERROR getWidthHeight_popularSize()`, err.message );\r\n  }\r\n}\r\nfunction calculateDPILineItem( blockNo ) {\r\n  if ( uploadType == 'multi' ) {\r\n    const fileDetail = getFileDetailsFunction( blockNo );\r\n\r\n    if ( fileDetail.fileType == 'png' || fileDetail.fileType == 'jpg' || fileDetail.fileType == 'jpeg' ) {\r\n      const uploadedWidth = fileDetail.fileWidth;\r\n      const uploadedHeight = fileDetail.fileHeight;\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks .widthHeight__custom` ).each(function() {\r\n        const width = $( this ).attr( `w` ) * 1;\r\n        const height = $( this ).attr( `h` ) * 1;\r\n\r\n        const rowType = $( this ).attr( `option-selected` );\r\n\r\n        let makeSqInchesForPopular, makeSqInchesForCustom, currentSqInches = 0;\r\n        if ( rowType == 'custom' ) {\r\n          makeSqInchesForCustom = (uploadedWidth * uploadedHeight) / 72;\r\n          currentSqInches = ( width * height ) * 72;\r\n        } else if ( rowType == 'popular' ) {\r\n          makeSqInchesForPopular = width * height;\r\n        }\r\n\r\n        if ( rowType == 'custom' ) {\r\n          if ( makeSqInchesForCustom < 288 ) {\r\n            $( this ).find( `dpi-warning` ).addClass( `active` );\r\n            $( this ).attr( `dpi-warning`, `Yes` );\r\n          } else if ( makeSqInchesForCustom > 288 && makeSqInchesForCustom > currentSqInches ) {\r\n            $( this ).find( `dpi-warning` ).removeClass( `active` );\r\n            $( this ).attr( `dpi-warning`, `` );\r\n          } else {\r\n            $( this ).find( `dpi-warning` ).addClass( `active` );\r\n            $( this ).attr( `dpi-warning`, `Yes` );\r\n          }\r\n        } else if ( rowType == 'popular' ) {\r\n          const recommendedSqInches = ((uploadedWidth / 72) * (uploadedHeight / 72));\r\n          if ( recommendedSqInches < 4 ) {\r\n            $( this ).find( `dpi-warning` ).addClass( `active` );\r\n            $( this ).attr( `dpi-warning`, `Yes` );\r\n          } else if ( makeSqInchesForPopular < recommendedSqInches ) {\r\n            $( this ).find( `dpi-warning` ).removeClass( `active` );\r\n            $( this ).attr( `dpi-warning`, `` );\r\n          } else {\r\n            $( this ).find( `dpi-warning` ).addClass( `active` );\r\n            $( this ).attr( `dpi-warning`, `Yes` );\r\n          }\r\n        }\r\n      })\r\n    }\r\n  }\r\n}\r\n\r\nfunction updatePreviewBoxSizes() {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      let activeTab = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n      const isRowAvailable = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks .widthHeight__custom[option-selected=\"${ activeTab }\"]` ).length;\r\n      if ( isRowAvailable > 0 ) {\r\n        const w = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"]` ).attr( `w` );\r\n        let h = $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"]` ).attr( `h` );\r\n        if ( activeTab == 'custom' ) {\r\n          h = `${ h }\"`;\r\n        } else if ( activeTab == 'popular' ) {\r\n          if ( typeof h == 'undefined' ) {\r\n            h = `Proportional Height`;\r\n          } else {\r\n            h = `${ h }\"`;\r\n          }\r\n          // h = `Proportional Height`;\r\n        }\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] preview-box .horizontal_direction` ).attr( `x-is`, w );\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ selectedBlockNo }\"] preview-box .verticle_direction` ).attr( `y-is`, h );\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR updatePreviewBoxSizes()`, err.message );\r\n  }\r\n}\r\nasync function manageFiles(files) {\r\n  console.clear();\r\n  console.log ( 'files', files.length );\r\n  // if ( files.length > 1 ) {\r\n  await activateMultiupload();\r\n  // }\r\n  let filesCounter = 1;\r\n  for (const file of files) {\r\n    multiFilesManage( file, filesCounter );\r\n    filesCounter++;\r\n  }\r\n}\r\n\r\nasync function multiFilesManage( file, fileIndex ) {\r\n  try {\r\n    uploadType = 'multi';\r\n    selectedItemNo = '1-1';\r\n    console.log ( 'MULTI FILES',  );\r\n    const fileBlockHTML = $( `template[data-multi-id=\"fileBlock\"]` ).html();\r\n    $( `multi-upload file-blocks-area` ).append( fileBlockHTML );\r\n    const lastAddedBlock = $( `multi-upload file-blocks-area uploaded-files-block` ).last();\r\n    await setIndexNoToBlock( lastAddedBlock, fileIndex );\r\n\r\n    const isValidFile = fileValidate( file.type, file.size, file );\r\n    if ( isValidFile ) {\r\n      const fileExt = getFileExt( file.name );\r\n      const selectedParamsObject = imgPreviewBox( `active`, fileExt, fileIndex );\r\n      if ( typeof hideToggleForVectors !== 'undefined' && hideToggleForVectors && ( fileExt == 'ai' || fileExt == 'eps' || fileExt == 'pdf' || fileExt == 'svg' ) ) {\r\n        console.log ( 'selectedParamsObject before', selectedParamsObject );\r\n        selectedParamsObject.bgRemover = false;\r\n        selectedParamsObject.superRes = false;\r\n        selectedParamsObject.byDefaultBgRemover = false;\r\n        selectedParamsObject.byDefaultSuperRes = false;\r\n        console.log ( 'selectedParamsObject after', selectedParamsObject );\r\n\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ fileIndex }\"] toggle-options` ).attr({\r\n          \"show-bg-option\": false,\r\n          \"show-superres-option\": false\r\n        });\r\n      }\r\n      let svgFileStatus = false;\r\n      if ( fileExt == 'svg' ) {\r\n        svgFileStatus = preDeterminedSVGDimension( file );\r\n      }\r\n      const getFileDetails = await processFile( file, fileIndex );\r\n      // console.log ( 'getFileDetails', getFileDetails );\r\n      if ( typeof selectedParamsObject !== 'undefined' && selectedParamsObject && typeof getFileDetails !== 'undefined' && getFileDetails ) {\r\n        getFileDetails['fileExt'] = fileExt;\r\n        getFileDetails['currentOptions'] = '';\r\n        if ( typeof file.isAIImage !== 'undefined' && file.isAIImage ) {\r\n          getFileDetails.isAIImage = file.isAIImage;\r\n        }\r\n        if ( typeof file.isAIEdit !== 'undefined' && file.isAIEdit ) {\r\n          getFileDetails.isAIEdit = file.isAIEdit;\r\n        }\r\n        let fileDetails = { ...selectedParamsObject, ...getFileDetails };\r\n        console.log ( 'fileDetails', fileDetails );\r\n        const dimensionDetails = await fileDimensions( fileDetails );\r\n        if ( typeof dimensionDetails !== 'undefined' && dimensionDetails ) {\r\n          fileDetails = { ...fileDetails, ...dimensionDetails };\r\n          console.log ( 'fileDetails after dimensions', fileDetails );\r\n          await applyClassByDimension( fileDetails, fileIndex );\r\n          const matchedVariant = getMatchingVariant( fileDetails, fileIndex );\r\n          if ( typeof matchedVariant !== 'undefined' && matchedVariant ) {\r\n            console.log ( 'matchedVariant', matchedVariant );\r\n            await checkAndAddNewSizeRow( fileIndex );\r\n            await toggleOptionActiveWhileFileProcessing( fileDetails, fileIndex );\r\n            await applyImgToPreviewBox( fileDetails, matchedVariant, true, fileIndex, `yes` );\r\n\r\n            await updatePreviewImgAndLineItems( fileIndex );\r\n\r\n            saveFileToUser( fileIndex );\r\n          }\r\n\r\n          if (\r\n              typeof fileDetails.fileExt !== 'undefined' &&\r\n              ['pdf', 'ai', 'eps'].includes( fileDetails.fileExt )\r\n            ) {\r\n              console.log ( 'ext found',  );\r\n            await addDelay( 1000 * fileIndex );\r\n            $( `multi-upload uploaded-files-block[block-no=\"${ fileIndex }\"] .widthHeight__item[by=\"width\"] .widthHeight__value` ).trigger( `keyup` );\r\n          } else {\r\n            await addDelay( 1000 * fileIndex );\r\n            $( `multi-upload uploaded-files-block[block-no=\"${ fileIndex }\"] .widthHeight__item[by=\"width\"] .widthHeight__value` ).trigger( `keyup` );\r\n          }\r\n        }\r\n      }\r\n      setActiveRow();\r\n    } else {\r\n      lastAddedBlock.addClass( `drop-disabled-type` );\r\n      // setTimeout(function(){\r\n      //   lastAddedBlock.find( `preview-box preview-block` ).removeClass( `drop-disabled-type` );\r\n      // },2000);\r\n    }\r\n    console.log ( 'lastAddedBlock', lastAddedBlock );\r\n  } catch ( err ) {\r\n    console.log( `ERROR multiFilesManage( file )`, err.message );\r\n  }\r\n}\r\nasync function saveFileToUser( blockNo ) {\r\n  try {\r\n    if ( typeof CUSTOMER_ID !== 'undefined' && CUSTOMER_ID ) {\r\n      let fileDetails;\r\n      if ( uploadType == 'multi' ) {\r\n        fileDetails = getFileDetailsFunction( blockNo );\r\n      }\r\n\r\n      if ( typeof fileDetails !== 'undefined' && fileDetails\r\n        && typeof fileDetails.file_crc !== 'undefined' && fileDetails.file_crc\r\n        && typeof fileDetails.fileName !== 'undefined' && fileDetails.fileName\r\n        && typeof fileDetails.fileWidth_inch !== 'undefined' && fileDetails.fileWidth_inch\r\n        && typeof fileDetails.fileHeight_inch !== 'undefined' && fileDetails.fileHeight_inch\r\n        && typeof fileDetails.imgIxFile !== 'undefined' && fileDetails.imgIxFile\r\n      ) {\r\n        $.ajax({\r\n          url: `${ apiURL }/uploads/saveData`,\r\n          method: \"post\",\r\n          dataType: \"json\",\r\n          data: JSON.stringify([{\r\n            \"variant_title\":  `${ fileDetails.fileWidth_inch }x${ fileDetails.fileHeight_inch }`,\r\n            \"file\": fileDetails.imgIxFile,\r\n            \"customer_id\": CUSTOMER_ID,\r\n            \"file_name\": fileDetails.fileName,\r\n            \"file_crc\": fileDetails.file_crc,\r\n            \"product_id\": PRODUCT_ID,\r\n            \"gangsheet\": isGangPage\r\n          }])\r\n        });\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR saveFileToUser( blockNo )`, err.message );\r\n  }\r\n}\r\n\r\nasync function updatePreviewImgAndLineItems( blockNo ) {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      const optionParams = getToggleOptionParams( blockNo );\r\n      const fileDetails = getFileDetailsFunction( blockNo );\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block .fileupload_hero` ).attr( `src`, `${ fileDetails.imgIxFile }?${ fileDetails.preview }${ typeof optionParams !== 'undefined' && optionParams ? optionParams : `` }` );\r\n      const isImageLoaded =  await imgLoaded( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block .fileupload_hero` );\r\n      if ( typeof isImageLoaded !== 'undefined' && isImageLoaded ) {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block .viewer-box > img` ).attr( `src`, `${ fileDetails.imgIxFile }?${ fileDetails.preview }${ typeof optionParams !== 'undefined' && optionParams ? optionParams : `` }` );\r\n        console.log ( 'image loaded', isImageLoaded );\r\n\r\n        const previewParams_withoutWidthHeight = removeWandHParams( fileDetails.preview );\r\n        const getImgDimensions = await getImageSizeFromUrl( `${ fileDetails.imgIxFile }?${ previewParams_withoutWidthHeight }${ typeof optionParams !== 'undefined' && optionParams ? optionParams : `` }` );\r\n        let getActualWidth = null;\r\n        let getActualHeight = null;\r\n        if ( typeof getImgDimensions !== 'undefined' && getImgDimensions ) {\r\n          getActualWidth = getImgDimensions.width;\r\n          getActualHeight = getImgDimensions.height;\r\n        }\r\n        const newRatio = getNewRatio( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block .fileupload_hero`, 'width', getActualWidth, getActualHeight );\r\n        const getNewHeight = calculateNewWidth_orNewHeight( newRatio, `width`, fileDetails.fileWidth );\r\n        fileDetails.fileHeight = Math.ceil( getNewHeight );\r\n        fileDetails.fileHeight_inch = ( getNewHeight / 300 ).toFixed( 2 );\r\n        fileDetails.currentHeight = ( getNewHeight / 300 ).toFixed( 2 );\r\n\r\n        fileDetails.currentOptions = `${ typeof optionParams !== 'undefined' && optionParams ? optionParams : `` }`;\r\n\r\n        await applyClassByDimension( fileDetails, blockNo );\r\n\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview file-details` ).html( JSON.stringify( fileDetails ) );\r\n\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks line-items-custom .widthHeight__custom` ).each(function() {\r\n          const w = $( this ).find( `.widthHeight__item[by=\"width\"] .widthHeight__value` ).val() * 1;\r\n          const h = calculateNewWidth_orNewHeight( newRatio, `width`, w );\r\n          const fileDetail = fileDetails;\r\n          fileDetail.currentWidth = w.toFixed( 2 );\r\n          fileDetail.currentHeight = h.toFixed( 2 );\r\n          const totalInches = Math.ceil( w * h );\r\n          const matchedVariant = allVariants.slice().reverse().find(obj =>\r\n            obj.isCustom &&\r\n            totalInches >= obj.minInches &&\r\n            totalInches <= obj.maxInches\r\n          );\r\n\r\n          $( this ).find( `.widthHeight__item[by=\"height\"] .widthHeight__value` ).val( h.toFixed( 2 ) );\r\n\r\n          if ( typeof matchedVariant !== 'undefined' && matchedVariant ) {\r\n            $( this ).attr({\r\n              \"vid\": matchedVariant.id,\r\n              \"media-id\": matchedVariant.media_id,\r\n              \"title\": matchedVariant.title,\r\n              \"price\": matchedVariant.price,\r\n              \"w\": w.toFixed( 2 ),\r\n              \"h\": h.toFixed( 2 ),\r\n              \"size\": `${ w.toFixed( 2 ) }x${ h.toFixed( 2 ) }`\r\n            });\r\n          }\r\n          console.log ( '----- matchedVariant', matchedVariant );\r\n        })\r\n\r\n        calculatePrices();\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block.easyzoom` ).removeClass( `image-loading` );\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR getToggleOptionParams()`, err.message );\r\n  }\r\n}\r\nfunction calculateNewWidth_orNewHeight(ratio, by, widthOrHeight) {\r\n  if ( by == 'width' ) {\r\n    const [ratioWidth, ratioHeight] = ratio.split(':').map(Number);\r\n    const newWidth = (widthOrHeight * ratioWidth) / ratioHeight;\r\n    return newWidth;\r\n  } else if ( by == 'height' ) {\r\n    const [ratioHeight, ratioWidth] = ratio.split(':').map(Number);\r\n    const newWHeight = (widthOrHeight * ratioHeight) / ratioWidth;\r\n    return newWHeight;\r\n  }\r\n}\r\nfunction getNewRatio( selector, by, width, height ) {\r\n  let getWidth = $( selector ).width() * 1;\r\n  let getHeight = $( selector ).height() * 1;\r\n\r\n  if ( width && height ) {\r\n    getWidth = width;\r\n    getHeight = height;\r\n  }\r\n\r\n  let getRatio;\r\n  if ( by == 'height' ) {\r\n    getRatio = getRatioFunc( getWidth, getHeight );\r\n  } else if ( by == 'width' ) {\r\n    getRatio = getRatioFunc( getHeight, getWidth );\r\n  } else {\r\n    getRatio = null;\r\n  }\r\n  return getRatio;\r\n}\r\nfunction getRatioFunc(height, width) {\r\n  function gcd(x, y) {\r\n      return y === 0 ? x : gcd(y, x % y);\r\n  }\r\n  const greatestCommonDivisor = gcd(height, width);\r\n  const ratioHeight = height / greatestCommonDivisor;\r\n  const ratioWidth = width / greatestCommonDivisor;\r\n\r\n  return `${ratioHeight}:${ratioWidth}`;\r\n}\r\nasync function getImageSizeFromUrl( url ) {\r\n  return new Promise((resolve, reject) => {\r\n    const img = new Image();\r\n    img.onload = function () {\r\n      resolve({\r\n        width: img.naturalWidth,\r\n        height: img.naturalHeight\r\n      });\r\n    };\r\n    img.onerror = function () {\r\n      reject(new Error('Failed to load image: ' + url));\r\n    };\r\n    img.src = url;\r\n  });\r\n}\r\nasync function imgLoaded(selector) {\r\n  try {\r\n    await waitForImageLoad(selector);\r\n    console.log('\u2705 Image loaded successfully');\r\n    return true;\r\n  } catch (err) {\r\n    console.error('\u274C Image failed to load', err);\r\n    return false;\r\n  } finally {\r\n    console.log('\uD83C\uDFAF Done checking image, moving forward');\r\n    $(\"next-element\").addClass(\"enablereward\");\r\n  }\r\n}\r\nasync function waitForImageLoad(imgSelector, maxRetries = 5, retryDelay = 3000, attemptTimeout = 10000) {\r\n  const img = document.querySelector(imgSelector);\r\n  if (!img) {\r\n    throw new Error(`No image found with selector \"${imgSelector}\"`);\r\n  }\r\n\r\n  const ignoredSrc = '//cdn.shopify.com/s/files/1/0558/0265/8899/files/transparent.png';\r\n  if (img.src.includes(ignoredSrc)) {\r\n    console.log('Image is transparent placeholder \u2013 skipping load check.');\r\n    return null;\r\n  }\r\n\r\n  function tryLoadImage(attempt) {\r\n    return new Promise((resolve, reject) => {\r\n      if (img.complete && img.naturalWidth !== 0) {\r\n        return resolve(img);\r\n      }\r\n\r\n      let settled = false;\r\n      const timeoutId = setTimeout(() => {\r\n        if (!settled) {\r\n          settled = true;\r\n          cleanup();\r\n          console.warn(`Attempt ${attempt + 1}: image load timed out after ${attemptTimeout}ms`);\r\n          if (attempt < maxRetries) {\r\n            setTimeout(() => {\r\n              tryLoadImage(attempt + 1).then(resolve).catch(reject);\r\n            }, retryDelay);\r\n          } else {\r\n            reject(new Error(`Image timed out after ${maxRetries} attempts.`));\r\n          }\r\n        }\r\n      }, attemptTimeout);\r\n\r\n      const onLoad = () => {\r\n        if (!settled) {\r\n          settled = true;\r\n          cleanup();\r\n          clearTimeout(timeoutId);\r\n          resolve(img);\r\n        }\r\n      };\r\n\r\n      const onError = () => {\r\n        if (!settled) {\r\n          settled = true;\r\n          cleanup();\r\n          clearTimeout(timeoutId);\r\n          if (attempt < maxRetries) {\r\n            console.warn(`Attempt ${attempt + 1}: image failed to load. Retrying...`);\r\n            setTimeout(() => {\r\n              tryLoadImage(attempt + 1).then(resolve).catch(reject);\r\n            }, retryDelay);\r\n          } else {\r\n            reject(new Error(`Image failed to load after ${maxRetries} attempts.`));\r\n          }\r\n        }\r\n      };\r\n\r\n      function cleanup() {\r\n        img.removeEventListener('load', onLoad);\r\n        img.removeEventListener('error', onError);\r\n      }\r\n\r\n      img.addEventListener('load', onLoad);\r\n      img.addEventListener('error', onError);\r\n    });\r\n  }\r\n\r\n  return tryLoadImage(0);\r\n}\r\nasync function applyImgToPreviewBox( fileDetails, matchedVariant, updateImg = false, blockNo, isFileUploading = 'no' ) {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      if ( updateImg ) {\r\n        const optionParams = getToggleOptionParams( blockNo );\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block .fileupload_hero` ).attr( `src`, `${ fileDetails.imgIxFile }?${ fileDetails.preview }${ typeof optionParams !== 'undefined' && optionParams ? optionParams : `` }` );\r\n        const isImageLoaded =  await imgLoaded( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block .fileupload_hero` );\r\n        if ( typeof isImageLoaded !== 'undefined' && isImageLoaded ) {\r\n          $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block .viewer-box > img` ).attr( `src`, `${ fileDetails.imgIxFile }?${ fileDetails.preview }` );\r\n          console.log ( 'image loaded', isImageLoaded );\r\n\r\n          const previewParams_withoutWidthHeight = removeWandHParams( fileDetails.preview );\r\n          const getImgDimensions = await getImageSizeFromUrl( `${ fileDetails.imgIxFile }?${ previewParams_withoutWidthHeight }${ typeof optionParams !== 'undefined' && optionParams ? optionParams : `` }` );\r\n          if ( typeof getImgDimensions !== 'undefined' && getImgDimensions ) {\r\n            if (\r\n              typeof fileDetails.fileExt !== 'undefined' &&\r\n              ['pdf', 'ai', 'eps'].includes( fileDetails.fileExt ) &&\r\n              typeof fileDetails.vector_fileWidth !== 'undefined' &&\r\n              fileDetails.vector_fileWidth &&\r\n              typeof fileDetails.vector_fileHeight !== 'undefined' &&\r\n              fileDetails.vector_fileHeight\r\n            ) {\r\n              // console.log ( 'getImgDimensions', getImgDimensions );\r\n              fileDetails.fileWidth = fileDetails.vector_fileWidth;\r\n              fileDetails.fileHeight = fileDetails.vector_fileHeight;\r\n              fileDetails.fileWidth_inch = (fileDetails.vector_fileWidth / 300).toFixed(2);\r\n              fileDetails.fileHeight_inch = (fileDetails.vector_fileHeight / 300).toFixed(2);\r\n              fileDetails.ratioBy_width = `${ fileDetails.vector_fileWidth / fileDetails.vector_fileHeight }`;\r\n              fileDetails.ratioBy_height = `${ fileDetails.vector_fileHeight / fileDetails.vector_fileWidth }`;\r\n              fileDetails.currentWidth = (fileDetails.vector_fileWidth / 300).toFixed(2);\r\n              fileDetails.currentHeight = (fileDetails.vector_fileHeight / 300).toFixed(2);\r\n\r\n              delete fileDetails.vector_fileWidth;\r\n              delete fileDetails.vector_fileHeight;\r\n              delete fileDetails.vector_fileWidth_inch;\r\n              delete fileDetails.vector_fileHeight_inch;\r\n              delete fileDetails.vector_ratioBy_width;\r\n              delete fileDetails.vector_ratioBy_height;\r\n              delete fileDetails.vector_currentWidth;\r\n              delete fileDetails.vector_currentHeight;\r\n            } else {\r\n              console.log ( 'getImgDimensions', getImgDimensions );\r\n              fileDetails.fileWidth = getImgDimensions.width;\r\n              fileDetails.fileHeight = getImgDimensions.height;\r\n              fileDetails.fileWidth_inch = (getImgDimensions.width / 300).toFixed(2);\r\n              fileDetails.fileHeight_inch = (getImgDimensions.height / 300).toFixed(2);\r\n              fileDetails.ratioBy_width = `${ getImgDimensions.width / getImgDimensions.height }`;\r\n              fileDetails.ratioBy_height = `${ getImgDimensions.height / getImgDimensions.width }`;\r\n              fileDetails.currentWidth = (getImgDimensions.width / 300).toFixed(2);\r\n              fileDetails.currentHeight = (getImgDimensions.height / 300).toFixed(2);\r\n            }\r\n          }\r\n\r\n          $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview file-details` ).html( JSON.stringify( fileDetails ) );\r\n\r\n          await applySizes( fileDetails, matchedVariant, blockNo, isFileUploading );\r\n          await calculatePrices( fileDetails, matchedVariant );\r\n          $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview preview-block.easyzoom` ).removeClass( `image-loading` );\r\n          $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-progress` ).addClass( `hidden` );\r\n        }\r\n      } else {\r\n        await applySizes( fileDetails, matchedVariant, blockNo, isFileUploading );\r\n        await calculatePrices( fileDetails, matchedVariant, blockNo );\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR applyImgToPreviewBox( fileDetails, matchedVariant )`, err.message );\r\n  }\r\n}\r\nasync function calculatePrices( fileDetails = null, matchedVariant = null, blockNo ) {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      await pricesTable();\r\n      const selectedIndex = $( `multi-upload prices-table .pricesTable__items .pricesTable__item.selected` ).attr( `index` );\r\n      console.log ( 'selectedIndex', selectedIndex );\r\n      let getDiscountPercent = $( `multi-upload prices-table .pricesTable__items .pricesTable__item.selected` ).attr( `off` );\r\n      console.log ( 'getDiscountPercent', getDiscountPercent );\r\n      let discountText = '';\r\n      if ( getDiscountPercent == '' || getDiscountPercent == '0' ) {\r\n        getDiscountPercent = 0;\r\n      } else {\r\n        discountText = `${ getDiscountPercent }% off`;\r\n      }\r\n\r\n      let totalPrice = 0;\r\n      $( `multi-upload line-items sizes-blocks .widthHeight__custom[item]` ).each(function() {\r\n        const qty = $( this ).find( `precut-unit-logic .precut-unit-logic__qty .customQtyFile__qty` ).val() * 1;\r\n        let unitPrice = $( this ).attr( `price` ) * 1;\r\n\r\n        let unitDiscountPrice = (unitPrice * getDiscountPercent) / 100;\r\n        unitDiscountPrice = unitPrice - unitDiscountPrice;\r\n\r\n        $( this ).attr( `discount`, getDiscountPercent );\r\n        $( this ).find( `precut-unit-logic .precut-unit-logic__price .__originalPrice` ).text( `$${ unitPrice.toFixed( 2 ) }` );\r\n        $( this ).find( `precut-unit-logic .precut-unit-logic__price .__discountedPrice` ).html( Number.isNaN(unitDiscountPrice) ? '$0.00<span>ea</span>' : `$${unitDiscountPrice.toFixed(2)}<span>ea</span>` );\r\n\r\n        $( this ).find( `precut-unit-logic .precut-unit-logic__total .__originalPrice` ).text( `$${ (unitPrice * qty).toFixed(2) }` );\r\n        // $( this ).find( `precut-unit-logic .precut-unit-logic__total .__discountedPrice` ).text( `$${ (unitDiscountPrice * qty).toFixed(2) }` );\r\n        $( this ).find( `precut-unit-logic .precut-unit-logic__total .__discountedPrice` ).text( Number.isNaN(unitDiscountPrice) ? '$0.00' : `$${ (unitDiscountPrice * qty).toFixed(2) }` );\r\n        $( this ).find( `precut-unit-logic .precut-unit-logic__discount > span` ).text( discountText );\r\n\r\n        const total = qty * unitPrice;\r\n\r\n        totalPrice = totalPrice + total;\r\n      })\r\n      console.log ( 'totalPrice', totalPrice );\r\n      shippingBarData( totalPrice );\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR calculatePrices( fileDetails, matchedVariant = null )`, err.message );\r\n  }\r\n}\r\nasync function shippingBarData( total ) {\r\n  try {\r\n    console.log ( 'total', total );\r\n    await fetch( `/cart?view=shipping-bar&price=${ total }` )\r\n      .then(response => {\r\n        return response.text()\r\n      })\r\n      .then(html => {\r\n        $( `multi-upload multi-shipping-bar` ).html( html.replaceAll(`[AMOUNT]`,`$75`) )\r\n      })\r\n  } catch ( err ) {\r\n    console.log( `ERROR shippingBarData( total )`, err.message );\r\n  }\r\n}\r\nasync function pricesTable() {\r\n  try {\r\n    console.log ( 'pricesTable()' );\r\n    if ( uploadType == 'multi' ) {\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR pricesTable()`, err.message );\r\n  }\r\n}\r\nasync function applySizes( fileDetails, matchedVariant = null, blockNo, isFileUploading ) {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview .horizontal_direction` ).attr( `x-is`, `${ fileDetails.currentWidth }` );\r\n      $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-preview .verticle_direction` ).attr( `y-is`, `${ fileDetails.currentHeight }\"` );\r\n      let getSelectedTier;\r\n      if ( isFileUploading == 'yes' ) {\r\n        getSelectedTier = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ blockNo }-1\"]` );\r\n      } else {\r\n        getSelectedTier = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"]` );\r\n      }\r\n\r\n      if (\r\n        typeof fileDetails.fileExt !== 'undefined' &&\r\n        ['pdf', 'ai', 'eps'].includes( fileDetails.fileExt ) &&\r\n        typeof fileDetails.vector_currentWidth !== 'undefined' &&\r\n        fileDetails.vector_currentWidth\r\n      ) {\r\n        getSelectedTier.find( `.widthHeight__item[by=\"width\"] .widthHeight__value` ).val( fileDetails.vector_currentWidth );\r\n        getSelectedTier.find( `.widthHeight__item[by=\"height\"] .widthHeight__value` ).val( fileDetails.vector_currentHeight );\r\n      } else {\r\n        getSelectedTier.find( `.widthHeight__item[by=\"width\"] .widthHeight__value` ).val( fileDetails.currentWidth );\r\n        getSelectedTier.find( `.widthHeight__item[by=\"height\"] .widthHeight__value` ).val( fileDetails.currentHeight );\r\n      }\r\n\r\n      if ( typeof matchedVariant !== 'undefined' && matchedVariant ) {\r\n        getSelectedTier.attr({\r\n          \"title\": matchedVariant.title,\r\n          \"vid\": matchedVariant.id,\r\n          \"dpi-warning\": '',\r\n          \"price\": matchedVariant.price,\r\n          \"media-id\": matchedVariant.media_id,\r\n          \"w\": fileDetails.currentWidth,\r\n          \"h\": fileDetails.currentHeight,\r\n          \"size\": `${ fileDetails.currentWidth }x${ fileDetails.currentHeight }`\r\n        });\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR applySizeToPreviewBox( fileDetails )`, err.message );\r\n  }\r\n}\r\n\r\nfunction removeWandHParams( query ) {\r\n  try {\r\n    let params = new URLSearchParams(query);\r\n    // Delete 'w' and 'h' if they exist\r\n    params.delete('w');\r\n    params.delete('h');\r\n\r\n    // Get the updated query string\r\n    return params.toString();\r\n  } catch ( err ) {\r\n    console.log( `ERROR removeWandHParams( url )`, err.message );\r\n  }\r\n}\r\nfunction getToggleOptionParams( blockNo ) {\r\n  try {\r\n    let bgRemoveState = false;\r\n    let superResState = false;\r\n    if ( uploadType == 'multi' ) {\r\n      bgRemoveState = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] toggle-options .bgRemover .toggleOption` ).is( `:checked` );\r\n      superResState = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] toggle-options .superRes .toggleOption` ).is( `:checked` );\r\n    }\r\n    if ( bgRemoveState || superResState ) {\r\n      let optionParams = ``;\r\n      if ( bgRemoveState ) {\r\n        optionParams += bgRemoveState ? `&bg-remove=true` : ``;\r\n      }\r\n      if ( superResState ) {\r\n        optionParams += superResState ? `&upscale=true` : ``;\r\n      }\r\n      return optionParams\r\n    } else {\r\n      return null;\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR getToggleOptionParams()`, err.message );\r\n  }\r\n}\r\nasync function toggleOptionActiveWhileFileProcessing( fileDetails, blockNo ) {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      let collectCurrentOptions = ``;\r\n      if ( fileDetails.bgRemover && fileDetails.byDefaultBgRemover ) {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] toggle-options .bgRemover .toggleOption` ).prop( `checked`, true );\r\n        collectCurrentOptions = `&bg-remove=true`;\r\n      }\r\n      const getTotalPixels = ( fileDetails.fileWidth * fileDetails.fileHeight );\r\n      if ( fileDetails.superRes && fileDetails.byDefaultSuperRes && typeof isEnabledPixelsValidation !== 'undefined' && isEnabledPixelsValidation && definedMaxPixelsForSuperRes > getTotalPixels ) {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] toggle-options .superRes .toggleOption` ).prop( `checked`, true );\r\n        collectCurrentOptions = `${ collectCurrentOptions }&upscale=true`;\r\n      }\r\n      if (  typeof isEnabledPixelsValidation !== 'undefined' && isEnabledPixelsValidation && definedMaxPixelsForSuperRes < getTotalPixels ) {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] toggle-options` ).attr( `show-superres-option`, false );\r\n      }\r\n      if ( collectCurrentOptions != '' ) {\r\n        fileDetails.currentOptions = collectCurrentOptions;\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] preview-box file-details` ).text( JSON.stringify( fileDetails ) );\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR toggleOptionActiveWhileFileProcessing( blockNo )`, err.message );\r\n  }\r\n}\r\nasync function checkAndAddNewSizeRow( blockNo ) {\r\n  try {\r\n    let rtn = false;\r\n    if ( uploadType == 'multi' ) {\r\n      let activeOption = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n      const isActiveTierAvailable = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks line-items-${ activeOption }` ).hasClass( `rowAdded` );\r\n      if ( isActiveTierAvailable == false ) {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks line-items-${ activeOption }:not(.rowAdded)` )\r\n          .append( $( `#multiUploadTemplates template[data-multi-id=\"${ activeOption }\"]` ).html() )\r\n          .addClass( `rowAdded`, activeOption );\r\n\r\n        await applyItemNo( activeOption, blockNo );\r\n        rtn = true;\r\n      }\r\n    }\r\n    return rtn;\r\n  } catch ( err ) {\r\n    console.log( `ERROR checkAndAddNewSizeRow( selector )`, err.message );\r\n  }\r\n}\r\nasync function applyItemNo( type, blockNo ) {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      let totalQty = 0;\r\n      $( `multi-upload file-blocks-area uploaded-files-block` ).each(function( main_i ) {\r\n        let blockCountNo = 0;\r\n        const newMain_index = main_i + 1;\r\n        $( this ).find( `sizes-blocks line-items-custom .widthHeight__custom` ).each(function( i ) {\r\n          const j = i + 1;\r\n          $( this ).attr({\r\n            \"item\": `${ newMain_index }-${ j }`\r\n          });\r\n          blockCountNo = j;\r\n        })\r\n        let secondCountNo = blockCountNo;\r\n        $( this ).find( `sizes-blocks line-items-popular .widthHeight__custom` ).each(function( i ) {\r\n          const j = blockCountNo + ( i + 1 );\r\n          $( this ).attr({\r\n            \"item\": `${ newMain_index }-${ j }`\r\n          });\r\n          secondCountNo = j;\r\n        })\r\n        $( this ).find( `sizes-blocks` ).attr( `total-items`, secondCountNo );\r\n        totalQty = totalQty + secondCountNo;\r\n      })\r\n      selectedItemNo = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks line-items-${ type } .widthHeight__custom` ).last().attr( `item` );\r\n      let precut = $( `multi-upload precut #preCutOption_multi` ).is( `:checked` );\r\n      if ( typeof precut !== 'undefined' && precut ) {\r\n        precut = 'Yes';\r\n      } else {\r\n        precut = '';\r\n      }\r\n      $( `multi-upload file-blocks-area` ).attr( `total-qty`, totalQty );\r\n      $( `multi-upload sizes-blocks .widthHeight__custom` ).attr( `precut`, precut );\r\n      calculateTotalQty();\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR applyItemNo( selector )`, err.message );\r\n  }\r\n}\r\nasync function calculateTotalQty() {\r\n  try {\r\n    console.log ( 'calculateTotalQty();',  );\r\n    if ( uploadType == 'multi' ) {\r\n      let totalQty = 0;\r\n      $( `multi-upload file-blocks-area uploaded-files-block` ).each(function( main_i ) {\r\n        let blockQty = 0;\r\n        $( this ).find( `sizes-blocks line-items-custom .widthHeight__custom` ).each(function( i ) {\r\n          const q = $( this ).attr( `qty` ) * 1;\r\n          totalQty = totalQty + q;\r\n          blockQty = blockQty + q;\r\n        })\r\n\r\n        $( this ).find( `sizes-blocks line-items-popular .widthHeight__custom` ).each(function( i ) {\r\n          const q = $( this ).attr( `qty` ) * 1;\r\n          totalQty = totalQty + q;\r\n          blockQty = blockQty + q;\r\n        })\r\n        $( this ).find( `line-items sizes-blocks` ).attr( `total-qty`, blockQty );\r\n      })\r\n      $( `multi-upload file-blocks-area, multi-upload prices-table` ).attr( `total-qty`, totalQty );\r\n      const cartQty = $( `multi-upload prices-table` ).attr( `already-in-cart` ) * 1;\r\n      $( `multi-upload prices-table` ).attr( `current-qty-plus-cart-qty`, `${ totalQty + cartQty }` );\r\n\r\n      pricesTableSelectedBar();\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR calculateTotalQty()`, err.message );\r\n  }\r\n}\r\nfunction pricesTableSelectedBar() {\r\n  try {\r\n    console.log ( 'pricesTableSelectedBar()',  );\r\n    if ( uploadType == 'multi' ) {\r\n      var $table = $( `multi-upload prices-table` );\r\n      var totalQty = parseInt($table.attr( `current-qty-plus-cart-qty` ), 10);\r\n      let selectedIndex;\r\n\r\n      console.log ( 'totalQty', totalQty );\r\n\r\n      $table.find( `.pricesTable__items .pricesTable__item` ).each(function () {\r\n        const min     = $( this ).attr( `min` ) * 1;\r\n        const max     = $( this ).attr( `max` ) * 1;\r\n        const indexNo = $( this ).attr( `index` ) * 1;\r\n        if ( totalQty >= min && totalQty <= max ) {\r\n          selectedIndex = indexNo;\r\n        }\r\n      });\r\n      if ( typeof selectedIndex !== 'undefined' && selectedIndex ) {\r\n        $table.find( `.pricesTable__items .pricesTable__item` ).removeClass( `selected` );\r\n        $table.find( `.pricesTable__items .pricesTable__item[index=\"${ selectedIndex }\"]` ).addClass( `selected` );\r\n      }\r\n\r\n      const lastIndexNo = $table.find( `.pricesTable__items .pricesTable__item` ).last().attr( `index` ) * 1;\r\n      const isLastMinumum = $table.find( `.pricesTable__items .pricesTable__item` ).last().attr( `min` ) * 1;\r\n\r\n      if ( lastIndexNo == selectedIndex ) {\r\n        const maxQtyMsg = $table.attr( `max-qty-msg` );\r\n        $table.find( `.pricesTable__items .pricesTable__item[index=\"${ selectedIndex }\"] .pricesTable__item__msg` ).html( maxQtyMsg );\r\n      } else {\r\n        let rowMsg = $table.attr( `items-msg` );\r\n        const CumulativeQty = getCumulativeQty();\r\n        if ( rowMsg.includes( `[QTY]` ) ) {\r\n          rowMsg = rowMsg.replace( `[QTY]`, CumulativeQty );\r\n        }\r\n        if ( rowMsg.includes( `[NEXT_DISCOUNT]` ) ) {\r\n          const nextOff = $table.find( `.pricesTable__items .pricesTable__item[index=\"${ selectedIndex }\"]` ).attr( `next-off` );\r\n          if ( typeof nextOff !== 'undefined' && nextOff ) {\r\n            rowMsg = rowMsg.replace( `[NEXT_DISCOUNT]`, `${ nextOff }% off` );\r\n          }\r\n        }\r\n        console.log ( 'CumulativeQty', CumulativeQty, `isLastMinumum`, isLastMinumum );\r\n        $table.find( `.pricesTable__items .pricesTable__item[index=\"${ selectedIndex }\"] .pricesTable__item__msg` ).html( rowMsg );\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR pricesTableSelectedBar()`, err.message );\r\n  }\r\n}\r\nfunction getCumulativeQty() {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      const pageQty = $( `multi-upload prices-table` ).attr( `total-qty` ) * 1;\r\n      const cartQty = $( `multi-upload prices-table` ).attr( `already-in-cart` ) * 1;\r\n      const max = $( `multi-upload prices-table .pricesTable__items .pricesTable__item.selected` ).attr( `max` ) * 1;\r\n\r\n      let cartState =  cartQty + pageQty;\r\n      let x = max - cartState;\r\n      if ( pageQty === 1 ) return (max + 2) - cartState;\r\n      if(x === 0 ) return 1;\r\n      x = max - cartState;\r\n      return x + 1\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR getCumulativeQty()`, err.message );\r\n  }\r\n}\r\n\r\n\r\n\r\nfunction getMatchingVariant( fileDetail = null, blockNo ) {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      let activeTab = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] tab-controls .tabOptionName:checked` ).val();\r\n      console.log ( 'fileDetail', fileDetail );\r\n      let fileDetails = fileDetail;\r\n      if ( fileDetail == null ) {\r\n        fileDetails = getFileDetailsFunction( blockNo );\r\n      }\r\n      if ( activeTab == `custom` ) {\r\n        let totalInches = parseFloat(fileDetails.currentWidth) * parseFloat(fileDetails.currentHeight);\r\n        if ( totalInches < 1 ) {\r\n          totalInches = 1;\r\n        }\r\n        totalInches = Math.ceil( totalInches );\r\n\r\n        const highestMaxInches = Math.max(...bySizeVariants.filter(style => style.isCustom).map(style => style.maxInches));\r\n        if ( totalInches > highestMaxInches ) {\r\n          const highestObject = bySizeVariants.filter(style => style.isCustom).reduce((maxObj, current) => {\r\n            return current.maxInches > maxObj.maxInches ? current : maxObj;\r\n          });\r\n          // console.log('Object with highest maxInches:', highestObject);\r\n          return highestObject;\r\n        } else {\r\n          const matchedStyle = bySizeVariants.slice().reverse().find(obj =>\r\n            obj.isCustom &&\r\n            totalInches >= obj.minInches &&\r\n            totalInches <= obj.maxInches\r\n          );\r\n          return matchedStyle ?? null;\r\n        }\r\n      } else if ( activeTab == 'popular' ) {\r\n        const getVal = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] sizes-blocks .widthHeight__custom[item=\"${ selectedItemNo }\"] .popularSizes` ).val();\r\n        const matchedVariant = findObjectByKey( bySizeVariants, `option1_converted`, getVal );\r\n        return matchedVariant ?? null;\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR getMatchingVariant( fileDetails )`, err.message );\r\n  }\r\n}\r\nfunction getFileDetailsFunction( blockNo ) {\r\n  try {\r\n    let fileDetails = '';\r\n    if ( uploadType == 'multi' ) {\r\n      fileDetails = $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] preview-box file-preview file-details` ).text();\r\n    }\r\n    if ( typeof fileDetails !== 'undefined' && fileDetails ) {\r\n      fileDetails = JSON.parse( fileDetails );\r\n      return fileDetails;\r\n    } else {\r\n      return null;\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR getFileDetailsFunction()`, err.message );\r\n  }\r\n}\r\n\r\nfunction setActiveRow() {\r\n  try {\r\n    if ( uploadType == 'multi' ) {\r\n      $( `multi-upload .widthHeight__custom` ).removeClass( `active` );\r\n      $( `multi-upload .widthHeight__custom[item=\"${ selectedItemNo }\"]` ).addClass( `active` );\r\n    }\r\n\r\n    // console.log(\"typeof _qtyupdate:\",typeof _qtyupdate)\r\n    if(typeof _qtyupdate == \"function\"){\r\n      _qtyupdate();\r\n      $(\".grt_payment_icons\").removeClass(\"hide\");\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR `, err.message );\r\n  }\r\n}\r\nasync function fileDimensions( fileDetails ) {\r\n  try {\r\n    let getApiResponse, file_width, file_height;\r\n    if ( fileDetails.fileExt == 'psd' || fileDetails.fileExt == 'eps' || fileDetails.fileExt == 'ai' ) {\r\n      if ( fileDetails.fileExt == 'eps' || fileDetails.fileExt == 'ai' ) {\r\n        getApiResponse  =   await sendApiRequest( `${ fileDetails.imgIxFile }?trim=colorUnlessAlpha` );\r\n      } else {\r\n        getApiResponse  =   await sendApiRequest( `${ fileDetails.imgIxFile }`, true );\r\n      }\r\n      if ( typeof getApiResponse !== 'undefined' && getApiResponse.success === true ) {\r\n        console.log ( 'getApiResponse', getApiResponse );\r\n        if ( typeof getApiResponse.data.dimensions !== 'undefined' && getApiResponse.data.dimensions ) {\r\n          if ( fileDetails.fileExt == 'eps' || fileDetails.fileExt == 'ai' ) {\r\n            file_width  =   getApiResponse.data.dimensions.width;\r\n            file_height =   getApiResponse.data.dimensions.height;\r\n\r\n            file_width  =   file_width * 4.167;\r\n            file_height =   file_height * 4.167;\r\n\r\n            file_width  =   file_width * 300;\r\n            file_height =   file_height * 300;\r\n          } else {\r\n            file_width  =   getApiResponse.data.dimensions.width * 300;\r\n            file_height =   getApiResponse.data.dimensions.height * 300;\r\n          }\r\n        }\r\n\r\n        return {\r\n          \"vector_fileWidth\": file_width,\r\n          \"vector_fileHeight\": file_height,\r\n          \"vector_fileWidth_inch\": (file_width / 300).toFixed(2),\r\n          \"vector_fileHeight_inch\": (file_height / 300).toFixed(2),\r\n          \"vector_ratioBy_width\": `${ file_width / file_height }`,\r\n          \"vector_ratioBy_height\": `${ file_height / file_width }`,\r\n          \"vector_currentWidth\": (file_width / 300).toFixed(2),\r\n          \"vector_currentHeight\": (file_height / 300).toFixed(2),\r\n\r\n          \"fileWidth\": file_width,\r\n          \"fileHeight\": file_height,\r\n          \"fileWidth_inch\": (file_width / 300).toFixed(2),\r\n          \"fileHeight_inch\": (file_height / 300).toFixed(2),\r\n          \"ratioBy_width\": `${ file_width / file_height }`,\r\n          \"ratioBy_height\": `${ file_height / file_width }`,\r\n          \"currentWidth\": (file_width / 300).toFixed(2),\r\n          \"currentHeight\": (file_height / 300).toFixed(2)\r\n        }\r\n      } else {\r\n        file_width  =   300;\r\n        file_height =   300;\r\n      }\r\n      return {\r\n        \"fileWidth\": file_width,\r\n        \"fileHeight\": file_height,\r\n        \"fileWidth_inch\": (file_width / 300).toFixed(2),\r\n        \"fileHeight_inch\": (file_height / 300).toFixed(2),\r\n        \"ratioBy_width\": `${ file_width / file_height }`,\r\n        \"ratioBy_height\": `${ file_height / file_width }`,\r\n        \"currentWidth\": (file_width / 300).toFixed(2),\r\n        \"currentHeight\": (file_height / 300).toFixed(2)\r\n      }\r\n    } else {\r\n      let setFileURL = fileDetails.imgIxFile;\r\n      if ( fileDetails.fileExt == 'pdf' ) {\r\n        setFileURL = `${ setFileURL }?trim=colorUnlessAlpha&fm=png`;\r\n        console.log ( 'setFileURL', setFileURL );\r\n        getApiResponse  =   await sendApiRequest( setFileURL, fileDetails.fileName );\r\n      }\r\n\r\n      const dimensions = await getImageDimensions( setFileURL );\r\n      console.log('Image dimensions:', dimensions);\r\n\r\n\r\n      if ( fileDetails.fileExt == 'svg' ) {\r\n        if ( typeof noWidthAndHeightForSVG !== 'undefined' && noWidthAndHeightForSVG ) {\r\n          const getUnitForMultiple = 2480 / dimensions.width;\r\n          file_width = dimensions.width * getUnitForMultiple;\r\n          file_height = dimensions.height * getUnitForMultiple;\r\n        } else {\r\n          file_width = dimensions.width * 4.168067226890756;\r\n          file_height = dimensions.height * 4.168067226890756;\r\n        }\r\n      } else if ( fileDetails.fileExt == 'pdf' && typeof getApiResponse !== 'undefined' && getApiResponse ) {\r\n        if ( typeof getApiResponse.data !== 'undefined' && getApiResponse.data && typeof getApiResponse.data.dimensions !== 'undefined' && getApiResponse.data.dimensions && typeof getApiResponse.data.dimensions.width !== 'undefined' && getApiResponse.data.dimensions.width && typeof getApiResponse.data.dimensions.height !== 'undefined' && getApiResponse.data.dimensions.height ) {\r\n          file_width = getApiResponse.data.dimensions.width;\r\n          file_height = getApiResponse.data.dimensions.height;\r\n\r\n          return {\r\n            \"vector_fileWidth\": ( file_width * 300),\r\n            \"vector_fileHeight\": ( file_height * 300 ),\r\n            \"vector_fileWidth_inch\": file_width,\r\n            \"vector_fileHeight_inch\": file_height,\r\n            \"vector_ratioBy_width\": `${ file_width / file_height }`,\r\n            \"vector_ratioBy_height\": `${ file_height / file_width }`,\r\n            \"vector_currentWidth\": file_width,\r\n            \"vector_currentHeight\": file_height,\r\n            \"fileWidth\": file_width,\r\n            \"fileHeight\": file_height,\r\n            \"fileWidth_inch\": file_width,\r\n            \"fileHeight_inch\": file_height,\r\n            \"ratioBy_width\": `${ file_width / file_height }`,\r\n            \"ratioBy_height\": `${ file_height / file_width }`,\r\n            \"currentWidth\": file_width,\r\n            \"currentHeight\": file_height\r\n          }\r\n        } else {\r\n          if ( getApiResponse.data.dimensions.width > getApiResponse.data.dimensions.height ) {\r\n            let makeMultiplier = getApiResponse.data.dimensions.height / ( dimensions.height / 300 );\r\n\r\n            file_width = dimensions.width * makeMultiplier;\r\n            file_height = dimensions.height * makeMultiplier;\r\n          } else {\r\n            let makeMultiplier = getApiResponse.data.dimensions.width / ( dimensions.width / 300 );\r\n\r\n            file_width = dimensions.width * makeMultiplier;\r\n            file_height = dimensions.height * makeMultiplier;\r\n          }\r\n        }\r\n      } else {\r\n        file_width = dimensions.width;\r\n        file_height = dimensions.height;\r\n      }\r\n      $(\".dtf_body_image_labels\").css({\"opacity\":0});\r\n      calculateRatio( file_width, file_height);\r\n      return {\r\n        \"fileWidth\": file_width,\r\n        \"fileHeight\": file_height,\r\n        \"fileWidth_inch\": (file_width / 300).toFixed(2),\r\n        \"fileHeight_inch\": (file_height / 300).toFixed(2),\r\n        \"ratioBy_width\": `${ file_width / file_height }`,\r\n        \"ratioBy_height\": `${ file_height / file_width }`,\r\n        \"currentWidth\": (file_width / 300).toFixed(2),\r\n        \"currentHeight\": (file_height / 300).toFixed(2)\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR fileDimensions( fileDetails )`, err.message );\r\n  }\r\n}\r\nasync function sendApiRequest(file_url, s3Key ) {\r\n  try {\r\n    if ( s3Key ) {\r\n      let rtn;\r\n      const endCode = encodeURI( s3Key );\r\n      await $.get(`${ apiURL + \"/calculateInches?s3Key=\" + endCode }`, function ( res ) {\r\n        rtn   =   res;\r\n      });\r\n      return rtn;\r\n    }\r\n    else if ( file_url ) {\r\n      let rtn;\r\n      const endCode = encodeURI( file_url );\r\n      await $.get(`${ apiURL + \"/calculateInches?url=\" + endCode }`, function ( res ) {\r\n        rtn   =   res;\r\n      });\r\n      return rtn;\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR sendApiRequest`, err.message );\r\n  }\r\n}\r\nfunction calculateRatio( num_1, num_2 ) {\r\n  num_1 = num_1 * 1;\r\n  num_2 = num_2 * 1;\r\n\r\n  for(num=num_2; num>1; num--) {\r\n    if((num_1 % num) == 0 && (num_2 % num) == 0) {\r\n      num_1=num_1/num;\r\n      num_2=num_2/num;\r\n    }\r\n  }\r\n  ratio_width   =   num_1 * 1;\r\n  ratio_height  =   num_2 * 1;\r\n  console.log(\"ratio_width=ratio_height\",ratio_width,ratio_height);\r\n}\r\nasync function getImageDimensions(url) {\r\n  return new Promise((resolve, reject) => {\r\n    const img = new Image();\r\n    img.onload = () => {\r\n      resolve({\r\n        width: img.width,\r\n        height: img.height\r\n      });\r\n    };\r\n    img.onerror = () => {\r\n      reject(new Error('Failed to load image.'));\r\n    };\r\n    img.src = url;\r\n  });\r\n}\r\nasync function setIndexNoToBlock( selector, indexNo ) {\r\n  try {\r\n    selector.attr( `block-no`, indexNo );\r\n    selector.find( `item-no .itemNo__name` ).text( `Upload ${ indexNo }` );\r\n    selector.find( `preview-box file-preview` ).attr( `id`, `filePreview_${ indexNo }` );\r\n\r\n    selector.find( `toggle-options .bgRemover .toggleOption` ).attr( `id`, `bgRemover_${ indexNo }` );\r\n    selector.find( `toggle-options .bgRemover` ).attr( `for`, `bgRemover_${ indexNo }` );\r\n    selector.find( `toggle-options .superRes .toggleOption` ).attr( `id`, `superRes_${ indexNo }` );\r\n    selector.find( `toggle-options .superRes` ).attr( `for`, `superRes_${ indexNo }` );\r\n\r\n    selector.find( `tab-controls .tabOptionName` ).attr( `name`, `tabOptionName_${ indexNo }` );\r\n    selector.find( `tab-controls .tabOptionName[value=\"custom\"]` ).attr( `id`, `tabOptionCustom_${ indexNo }` );\r\n    selector.find( `tab-controls .tabLink[for*=\"tabOptionCustom_\"]` ).attr( `for`, `tabOptionCustom_${ indexNo }` );\r\n    selector.find( `tab-controls .tabOptionName[value=\"popular\"]` ).attr( `id`, `tabOptionPopular_${ indexNo }` );\r\n    selector.find( `tab-controls .tabLink[for*=\"tabOptionPopular_\"]` ).attr( `for`, `tabOptionPopular_${ indexNo }` );\r\n    selector.find( `designer-notes .popupinput` ).attr( `id`, `designerNotes_${ indexNo }` );\r\n    selector.find( `designer-notes label` ).attr( `for`, `designerNotes_${ indexNo }` );\r\n  } catch ( err ) {\r\n    console.log( `ERROR setIndexNoToBlock( selector, indexNo )`, err.message );\r\n  }\r\n}\r\n\r\nasync function activateMultiupload( files ) {\r\n  try {\r\n    $( `body multi-upload-wrapper` ).remove();\r\n    const multiUploadHTML = $( `template[data-multi-id=\"main\"]` ).html();\r\n    $( `body` ).append( multiUploadHTML );\r\n    loadCartItemsCount();\r\n\r\n  } catch ( err ) {\r\n    console.log( `ERROR activateMultiupload( files )`, err.message );\r\n  }\r\n}\r\nasync function loadCartItemsCount() {\r\n  try {\r\n    const res = await getRequest( `${ productURL }?view=itemsInCart__cumulative` );\r\n    if ( typeof res !== 'undefined' && res ) {\r\n      if ( uploadType == 'multi' ) {\r\n        $( `multi-upload prices-table` ).attr( `already-in-cart`, `${ res.count }` );\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR loadCartItemsCount()`, err.message );\r\n  }\r\n}\r\n\r\nasync function applyClassByDimension( fileDetails = null, blockNo ) {\r\n  try {\r\n    if ( typeof fileDetails !== 'undefined' && fileDetails ) {\r\n      let classByDimension = '';\r\n      if ( fileDetails.fileWidth == fileDetails.fileHeight ) {\r\n        classByDimension = `img_square`;\r\n      } else if ( fileDetails.fileWidth > fileDetails.fileHeight ) {\r\n        classByDimension = `img_wide`;\r\n      } else if ( fileDetails.fileWidth < fileDetails.fileHeight ) {\r\n        classByDimension = `img_tall`;\r\n      }\r\n      if ( uploadType == 'multi' ) {\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] preview-box file-preview` ).removeClass( `img_square img_wide img_tall` );\r\n        $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] preview-box file-preview` ).addClass( classByDimension );\r\n      }\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR applyClassByDimension( fileDetails = null )`, err.message );\r\n  }\r\n}\r\nfunction fileValidate(fileType, fileSize, file) {\r\n  let isImage = imagesTypesNew.filter((type) => fileType.indexOf(`${type}`) !== -1);\r\n  // If The Uploaded File Is An Image\r\n  if (isImage.length !== 0 ) {\r\n    // Check, If File Size Is 2MB or Less\r\n    if (fileSize <= 5368709120) { // 2MB :)\r\n      return true;\r\n    } else { // Else File Size\r\n      return false;\r\n    };\r\n  } else { // Else File Type\r\n    return false\r\n  }\r\n}\r\nfunction getFileExt( fileName ) {\r\n  try {\r\n    let fileExt = fileName.split('.').pop();\r\n    fileExt = fileExt.toLowerCase();\r\n    if ( fileExt == 'jpeg' ) {\r\n      fileExt = 'jpg';\r\n    } else if ( fileExt == 'tiff' ) {\r\n      fileExt = 'tif';\r\n    }\r\n    return fileExt;\r\n  } catch ( err ) {\r\n    console.log( `ERROR getFileExt( fileName )`, err.message );\r\n  }\r\n}\r\nfunction imgPreviewBox( act, fileExt, blockNo ) {\r\n  try {\r\n    if ( act == 'active' ) {\r\n      if ( uploadType == 'multi' ) {\r\n        if ( fileExt ) {\r\n          $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] preview-box file-preview preview-block` ).addClass( `image-loading` );\r\n          const selectedParamsObject = findObjectByKey( imgParamsSettings, `fileType`, fileExt );\r\n          $( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] preview-box toggle-options` ).attr({\r\n            \"show-bg-option\": selectedParamsObject.bgRemover,\r\n            \"show-superres-option\": selectedParamsObject.superRes\r\n          });\r\n          return selectedParamsObject;\r\n        }\r\n      }\r\n\r\n    } else if ( act == 'inactive' ) {\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR imgPreviewBox( act )`, err.message );\r\n  }\r\n}\r\n\r\nasync function preDeterminedSVGDimension( file ) {\r\n  try {\r\n    console.log ( 'file', file );\r\n    if ( typeof file.fileURL !== 'undefined' && file.fileURL ) {\r\n      noWidthAndHeightForSVG = true;\r\n      return noWidthAndHeightForSVG;\r\n    } else {\r\n      const reader = new FileReader();\r\n      reader.onload = function(e) {\r\n        const parser = new DOMParser();\r\n        const svgDoc = parser.parseFromString(e.target.result, 'image/svg+xml');\r\n        const svgElement = svgDoc.documentElement;\r\n        const width = svgElement.getAttribute('width');\r\n        const height = svgElement.getAttribute('height');\r\n        if ( width == null && height == null ) {\r\n          noWidthAndHeightForSVG = true;\r\n        } else {\r\n          noWidthAndHeightForSVG = false;\r\n        }\r\n        // console.log ( 'SVG', `Width: ${width}, Height: ${height}` );\r\n      };\r\n      reader.readAsText(file);\r\n      return noWidthAndHeightForSVG;\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR preDeterminedSVGDimension( file )`, err.message );\r\n  }\r\n}\r\n\r\nasync function processFile( file, blockNo ) {\r\n  let rtn = null;\r\n  const fileReader = new FileReader();\r\n  const fileType = file.type;\r\n  const fileSize = file.size;\r\n\r\n  // const randomName = file.name.split('.')[0].replace(/[^a-z0-9\\s]/gi, '').replace(/[_\\s]/g, '-')+\"____\"+'image_' + Date.now() + '_' + Math.floor(Math.random() * 1000) + '.' + file.name.split('.').pop();\r\n\r\n  const nameOnly = file.name.split('.')[0]\r\n  .toLowerCase()\r\n  .replace(/[^a-z0-9]/gi, '-')        // Replace all non-alphanumerics with dash\r\n  .replace(/-+/g, '-')                // Collapse multiple dashes\r\n  .replace(/^-|-$/g, '');             // Trim leading/trailing dashes\r\n\r\n  const extension = file.name.split('.').pop();\r\n\r\n  const randomName = `${ nameOnly }____image_${ Date.now() }_${ Math.floor( Math.random() * 1000 ) }.${ extension }`;\r\n\r\n\r\n  const presignData = await getPresignedUploadUrl( randomName, file.type );\r\n\r\n  if ( typeof presignData !== 'undefined' && presignData && typeof presignData.url !== 'undefined' && presignData.url ) {\r\n    fileProcessBar( `start` );\r\n    if ( uploadType == 'multi' ) {\r\n      progressMove( `multi-upload uploaded-files-block[block-no=\"${ blockNo }\"] file-progress`, ``, fileSize );\r\n    }\r\n    const originalUploadedFileURL = presignData.sourceUrl;\r\n    const response = await fetch(presignData.url, {\r\n      method: 'PUT',\r\n      body: file\r\n    });\r\n\r\n    if ( typeof response !== 'undefined' && response.status == 200 ) {\r\n      let filePath = `https://${ ninjaImgixHost }/${ randomName }`;\r\n\r\n      const file_crc = await makeCRC( file );\r\n\r\n      fileReader.readAsDataURL( file );\r\n      rtn = {\r\n        \"originalFile\": originalUploadedFileURL,\r\n        \"imgIxFile\": filePath,\r\n        \"file_crc\": file_crc,\r\n        \"fileName\": randomName\r\n      }\r\n    }\r\n  }\r\n  return rtn;\r\n}\r\nasync function getPresignedUploadUrl( file_name, file_type ) {\r\n  try {\r\n    let rtn;\r\n    await $.get(`${ apiURL }/uploads/getPresignedUploadUrl?file_name=${ encodeURIComponent( file_name ) }&file_type=${ encodeURIComponent( file_type ) }`, function ( res ) {\r\n      rtn   =   res;\r\n    });\r\n    return rtn;\r\n  } catch ( err ) {\r\n    console.log( `ERROR getPresignedUploadUrl`, err.message );\r\n  }\r\n}\r\n\r\nfunction fileProcessBar( act ) {\r\n  try {\r\n    if ( act == 'start' ) {\r\n    } else if ( act == 'reset' ) {\r\n      $( `#fileupload_custom` ).hide();\r\n      $( `upload-controls file-preview #fileupload_hero, file-preview .viewer-box` ).attr( `src`, transpareImg );\r\n      uploadArea.classList.remove('upload-area--open');\r\n      loadingText.style.display = `block`;\r\n      fileDetails.classList.remove('file-details--open');\r\n      uploadedFile.classList.remove('uploaded-file--open');\r\n      uploadedFileInfo.classList.remove('uploaded-file__info--active');\r\n      uploadArea.classList.remove( `hidden` );\r\n      // aiImgGenerator.classList.remove( `hidden` );\r\n    }\r\n  } catch ( err ) {\r\n    console.log( `ERROR fileProcessBar()`, err.message );\r\n  }\r\n}\r\nasync function progressMove( selector, filePath, fileSize = 550 ) {\r\n  let counter = 0;\r\n  if ( fileSize > 9000000 ) {\r\n    fileSize = 250;\r\n  } else if ( fileSize > 7000000 ) {\r\n    fileSize = 150;\r\n  } else if ( fileSize > 5000000 ) {\r\n    fileSize = 120;\r\n  } else if ( fileSize > 3000000 ) {\r\n    fileSize = 90;\r\n  } else if ( fileSize > 1000000 ) {\r\n    fileSize = 80;\r\n  } else {\r\n    fileSize = 70;\r\n  }\r\n  fileSize = 50;\r\n  if(filePath == \"quick\"){\r\n    counter = 50\r\n  }\r\n\r\n  let counterIncrease = setInterval(() => {\r\n    if (counter === 100) {\r\n      let isCompleted;\r\n      if ( uploadType == 'multi' ) {\r\n        isCompleted = $( selector ).closest( `uploaded-files-block` ).find( `preview-box .easyzoom` ).hasClass( `image-loading` );\r\n        if ( isCompleted == false ) {\r\n          clearInterval( counterIncrease );\r\n          return 'completed';\r\n        }\r\n      }\r\n    } else {\r\n      if ( uploadType == 'multi' ) {\r\n        counter = counter + 1;\r\n        $( selector ).find( `.fileProgress__bar` ).css({\r\n          \"width\": `${ counter }%`\r\n        });\r\n        $( selector ).find( `.loadingPercent__counter` ).text( `${ counter }%` );\r\n      }\r\n    }\r\n  }, fileSize);\r\n};\r\nasync function getAsByteArray(file) {\r\n  return new Uint8Array(await readFile(file));\r\n}\r\nasync function makeCRC( file ) {\r\n  try {\r\n    const byteArr = await getAsByteArray( file );\r\n    file_crc = (CRC32.buf(byteArr)>>>0).toString(16);\r\n    return file_crc;\r\n  }\r\n  catch (error) {\r\n    console.log(\"Unable to calculate file crc: \" + error)\r\n  }\r\n}\r\nfunction readFile(file) {\r\n  return new Promise((resolve, reject) => {\r\n    let reader = new FileReader();\r\n    reader.addEventListener(\"loadend\", (e) => resolve(e.target.result));\r\n    reader.addEventListener(\"error\", reject);\r\n    reader.readAsArrayBuffer(file);\r\n  });\r\n}\r\n\r\n"],
  "mappings": "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",
  "names": ["getRatio", "newVal", "fileDetails", "file_crc", "num"]
}
