cart.js 6.23 KB
/**
 * 购物车Logic
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2015/10/20
 */
var $ = require('jquery'),
    ellipsis = require('yoho.mlellipsis'),
    Hammer = require('yoho.hammer');

var chosePanel = require('./chose-panel'),
    dialog = require('../me/dialog'),
    loading = require('../plugin/loading'),
    tip = require('../plugin/tip');

var $cartContent = $('.cart-content'),
    cartType = $('#cartType').val(),
    $cartNav = $('.cart-nav'),
    $cartPage = $('.shopping-cart-page'),
    hasShowCartPresellTip = false;

var navHammer,
    advanceBuyHammer,
    freebieHammer,
    switchChose = false;

var isRefreshByDelete = window.cookie('_yoho-cart-refreshByDelete') === 'true' ? true : false;

var lowStockCount = 0;

loading.showLoadingMask();

function needLoadRecommandForYou() {
    return window.isCookiesEnabled() ?
            $('.cart-goods').length <= 0 && !isRefreshByDelete :
            $('.cart-goods').length <= 0;
}

if (needLoadRecommandForYou()) {
    require('../product/recommend-for-you');
} else {
    if (isRefreshByDelete) {
        $('body').css('background-color', '#f0f0f0');
    }
    require('./good');
}

$cartPage.css('display', 'block');
loading.hideLoadingMask();

window.setCookie('_yoho-cart-refreshByDelete', false);

ellipsis.init();

function cartContentShow() {
    return $cartContent.not('.hide');
}

function mlellipsisHiddenNames() {
    cartContentShow().find('.shopping-cart-good .name').each(function() {
        this.mlellipsis(2);
    });
    switchChose = true;
}

function hasChecked() {
    return cartContentShow().find('.cart-goods .icon-cb-checked').length > 0 ? true : false;
}

function shouldSelectGift() {
    var $freebie = cartContentShow().find('.freebie');

    if ($freebie.length <= 0) {
        return false;
    }

    return true;
}

function shouldLowStocks() {
    var $lowStocks,
        result = false;

    if ('ordinary' === cartType) {
        $lowStocks = $('.common .low-stocks');
    } else if ('advance' === cartType) {
        $lowStocks = $('.presell .low-stocks');
    }

    if ($lowStocks.length <= 0) {
        return result;
    }

    $lowStocks.each(function(idx, item) {
        if ($(item).parent().parent().parent().siblings('.checkbox').hasClass('icon-cb-checked')) {
            lowStockCount += 1;
            result = true;
        }
    });

    return result;
}

function showChooseGifDialog() {
    dialog.showDialog({
        dialogText: '您还未选择赠品,是否去选择赠品',
        hasFooter: {
            leftBtnText: '我不要赠品',
            rightBtnText: '去选择'
        }
    }, function() {
        window.location.href = cartContentShow().find('.freebie > a').attr('href');
    }, function() {
        var info = window.cookie('order-info');

        if (info) {
            window.setCookie('order-info', '');
        }
        window.location.href = '/cart/index/orderEnsure?cartType=' + cartType;
    });
}

if (typeof window.cookie === 'function' && 'y' === window.cookie('_hasShowCartPresellTip')) {
    $('#presell-tip').removeClass('show').addClass('hide');
    hasShowCartPresellTip = true;
} else {
    $('#presell-tip').removeClass('hide').addClass('show');
}

if ('advance' === cartType) {
    $cartContent.toggleClass('hide');
    $('#common-cart-nav').removeClass('active');
    $('#presell-cart-nav').addClass('active');

    mlellipsisHiddenNames();
    $(window).trigger('scroll');
}

if ($cartNav.length > 0) {
    navHammer = new Hammer(document.getElementsByClassName('cart-nav')[0]);
    navHammer.on('tap', function(e) {
        var $this = $(e.target).closest('li');

        if ($this.hasClass('active')) {
            return;
        }

        if (cartType === 'ordinary') {
            cartType = 'advance';
            $('#cartType').val('advance');
        } else {
            cartType = 'ordinary';
            $('#cartType').val('ordinary');
        }

        $this.siblings('.active').removeClass('active');
        $this.addClass('active');

        //切换普通商品和预售商品购物车显示
        $cartContent.toggleClass('hide');

        if (switchChose === false) {
            mlellipsisHiddenNames();
        }

        //trigger lazyload
        $(window).trigger('scroll');
    });

    if (!hasShowCartPresellTip) {
        setTimeout(function() {
            $('#presell-tip').removeClass('show').addClass('hide');
            window.setCookie('_hasShowCartPresellTip', 'y');
        }, 3000);
    }
}

if ($('.advance-buy').length > 0) {
    advanceBuyHammer = new Hammer(document.getElementsByClassName('advance-buy')[0]);
    advanceBuyHammer.on('tap', function(e) {
        window.location.href = '/cart/index/advanceBuy?cartType=' + cartType;
    });
}

if ($('.freebie').length > 0) {
    freebieHammer = new Hammer(document.getElementsByClassName('freebie')[0]);
    freebieHammer.on('tap', function(e) {
        window.location.href = '/cart/index/gift?cartType=' + cartType;
    });
}

if (/MicroMessenger/i.test(navigator.userAgent)) {
    $('.btn-login').attr('href', '/passport/login/wechat?refer=' + location.href);
}

$('.btn-balance').on('touchend', function() {
    var info = window.cookie('order-info');

    lowStockCount = 0;

    if (shouldLowStocks()) {
        tip.show('所选商品中有' + lowStockCount + '种库存不足的商品');
        return false;
    }

    if (shouldSelectGift()) {
        showChooseGifDialog();
        return false;
    }

    if (hasChecked()) {
        if (info) {
            window.setCookie('order-info', '');
        }
        window.location.href = '/cart/index/orderEnsure?cartType=' + cartType;
    } else {
        tip.show('请先勾选商品');
    }
});

$('.off-shell-goods').on('touchstart touchend', function(e) {
    var $this = $(e.target).closest('span');

    if ($this.hasClass('icon-del')) {
        return;
    }

    tip.show('商品已下架');
    return false;
});

$('.chose').on('touchend', function() {
    chosePanel.show();
});

$cartNav.on('touchstart', 'li', function(e) {
    $(this).addClass('bytouch');
}).on('touchend touchcancel', function() {
    $cartNav.find('li').removeClass('bytouch');
});

//提前触发lazyload
$(window).scrollTop(1).scrollTop(0);

if ($('.invalid-goods').find('.shopping-cart-good').length === 0) {
    $('#failure-goods').removeClass('invalid-goods');
}