$(function () { const $days = $('.package_list p'); const $priceTables = $('.country_lists'); const $showPriceDiv = $('.show_price'); const $totalPriceSpan = $('.totalPrices'); let result = []; let submitFlag = false; // tab click $days.on('click', function () { const targetDay = $(this).data('day'); $days.removeClass('active'); $(this).addClass('active'); $priceTables.hide().filter(`[data-day="${targetDay}"]`).show(); }); // country_lists_detail click $priceTables.on('click', '.country_lists_detail', function () { const number = $(this).data('num'); // if(number <1) return messageFn(tipsQuantity); $(this).toggleClass('active'); updateUI(); }); // buy click $('.buyNow').on('click', function () { const session = localStorage.getItem("session"); const user = localStorage.getItem("user"); const selectedItems = getSelectedItems(); let lang = $('#language').val(); var currentUrl = window.location.href; var match = currentUrl.match(/\.com(.*)/); if (!session || !user || user == undefined || user == "undefined") { let url = "/sign-up/" ; if (lang == "zh"){ url = `/${lang}/sign-up/` } let r = ""; if (match && match.length > 1) { var contentAfterCom = match[1]; r = contentAfterCom; } window.location.href = url +"?r=" + r return; } if (selectedItems.length === 0) { messageFn('Please select the purchase quantity'); return; } const transformedData = []; selectedItems.forEach(dayObj => { const day = dayObj.day; dayObj.items.forEach(item => { const code = item.code; const num = item.count; transformedData.push({ day, code, num,lang }); }); }); borderFn(transformedData) }); const borderFn = async(orderList) => { if(submitFlag) return; submitFlag = true; $('.loading-mask').show(); const res = await $POST("/v1/orderStatic", { data: JSON.stringify(orderList) }); submitFlag = false; $('.loading-mask').hide(); if(res.code!=0)return messageFn(res.msg); window.open(res.data.url); } // update info const updateUI = () => { result = getSelectedItems(); renderShowPrice(result); updateTotalPrice(); }; // 获取选中的项目 const getSelectedItems = () => { return $priceTables.map((_, table) => { const day = $(table).data('day'); const unit = $(table).data('unit'); const items = $(table).find('div.active').map((_, p) => { const code = $(p).data('code'); const price = $(p).data('price'); const imgUrl = $(p).data('url'); const unit = $(p).data('unit'); const existingItem = findExistingItem(day, code); const count = existingItem ? existingItem.count : 1; return { code, price, count,imgUrl,unit }; }).get(); return items.length ? { day, unit, items } : null; }).get().filter(Boolean); }; // 查找之前存储的项目 const findExistingItem = (day, code) => { return result.find(item => item.day === day)?.items.find(subItem => subItem.code === code); }; // 渲染选中的项目到页面 const renderShowPrice = (result) => { let PRICE_HTML = ""; if(result.length >0){ result.forEach((i) => { PRICE_HTML += `

${i.day}${i.unit}

`; i.items.forEach((item) => { PRICE_HTML += `

${item.code}

$${item.price}/IP

-

+

`; }); PRICE_HTML += `
`; }); }else{ PRICE_HTML+=`
`; } $(".show_price").html(PRICE_HTML); }; // input window.validateInput = function(input) { const $input = $(input); let v = $input.val(); if (v.startsWith('-')) { v = v.replace(/-/g, ''); $input.val(v); } v = v === '' ? 0 : parseInt(v); $input.val(v > 9999 ? 9999 : v); const quantity = parseInt($input.val()); const $parentDiv = $input.parents('.detaile_country'); const { day, code } = $parentDiv.data(); const dayEntry = result.find(entry => entry.day === day); if (dayEntry) { const itemEntry = dayEntry.items.find(item => item.code === code); if (itemEntry) { itemEntry.count = quantity; } } updateTotalPrice(); }; // updata total price const updateTotalPrice = () => { const total = $showPriceDiv.find('div[data-price]').get().reduce((sum, div) => { const quantity = parseInt($(div).find('input').val()); const unitPrice = parseFloat($(div).data('price')); return sum + quantity * unitPrice; }, 0); $totalPriceSpan.text(`${total.toFixed(2)}`); }; // add reduce event listener to inputCount $showPriceDiv.on('click', '.reduce, .add', function () { const $input = $(this).siblings('input'); let quantity = parseInt($input.val()); const $parentDiv = $(this).parents('.detaile_country'); const isAdd = $(this).hasClass('add'); if (isAdd) { quantity++; } else if (quantity > 1) { quantity--; } else { const { day, code } = $parentDiv.data(); $(`.country_lists[data-day="${day}"]>div[data-code="${code}"]`).removeClass('active'); return updateUI(); } $input.val(quantity); $parentDiv.data('count', quantity); // 更新 result 数组里的 count 字段 const { day, code } = $parentDiv.data(); const dayEntry = result.find(entry => entry.day === day); if (dayEntry) { const itemEntry = dayEntry.items.find(item => item.code === code); if (itemEntry) { itemEntry.count = quantity; } } updateTotalPrice(); }); // clear day country $showPriceDiv.on('click', '.clearDay', function () { const day = $(this).data('day'); $(`.country_lists[data-day="${day}"] .country_lists_detail`).removeClass('active'); result = result.filter(item => item.day!== day); updateUI(); }); updateUI(); couponCuttime(); $('.c_close').on('click', function(){ $('.coupon-model').hide(); }) }); const couponCuttime = async () => { const res = await $POST("/v1/coupons"); if(res.code!=0)return; const coupons = res.data.coupons; let HTML = '' if(coupons.length > 0){ coupons.forEach(coupon => { HTML += `

${coupon.value} ${coupon.value_tip}

${coupon.title}

${expiredTxt}: ${coupon.expired}

`; }); $('.counpin-list').html(HTML) $('.coupon-pop').show(); const countdown = createCountdown(res.data.surplus_time, '.coupon_countdown'); countdown.start(); $('.coupon-pop').on('click', function(e){ console.log(444); $(".coupon-model").show(); }) } }; function createCountdown(totalSeconds, targetSelector) { const $target = $(targetSelector); let timer; const formatTime = (time) => String(time).padStart(2, '0'); const update = () => { const h = formatTime(Math.floor(totalSeconds / 3600)); const m = formatTime(Math.floor((totalSeconds % 3600) / 60)); const s = formatTime(totalSeconds % 60); $target.text(`${h}:${m}:${s}`); }; const start = () => { update(); timer = setInterval(() => { totalSeconds > 0 ? (totalSeconds--, update()) : (clearInterval(timer), $target.hide()); }, 1000); }; const stop = () => clearInterval(timer); return { start, stop }; }