order.page.js 8.96 KB
/**
 * 个人中心--我的订单
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2015/11/10
 */

var $ = require('yoho-jquery'),
    Hammer = require('yoho-hammer'),
    lazyLoad = require('yoho-jquery-lazyload'),
    tip = require('../plugin/tip'),
    Swiper = require('yoho-swiper');

var $navLi = $('#order-nav > li'),
    $orderContainer = $('#order-container');

var $curContainer = $orderContainer.children('.orders:not(.hide)');// 保存当前显示的order-container

var winH = $(window).height();

var activeType = $navLi.filter('.active').data('type'); // 当前active的项的index

var order = {
    page: 0,
    end: false
};

var inAjax = false;

var loading = require('../plugin/loading');

var dialog = require('../plugin/dialog');

var orderHammer,
    $reaMask = $('.reason-mask'),
    reasonSwiper;

require('../common');

// 减少计时
function downCount(item) {
    var hoursItem = item.find('.hours');

    var difference = hoursItem.text(), // difference of dates
        interval;

    /**
     * Main downCount function that calculates everything
     */
    function countdown() {

        // basic math variables
        var _second = 1000,
            _minute = _second * 60,
            _hour = _minute * 60,
            _day = _hour * 24,
            hours,
            minutes,
            seconds;

        // calculate dates
        hours = Math.floor((difference % _day) / _hour),
        minutes = Math.floor((difference % _hour) / _minute),
        seconds = Math.floor((difference % _minute) / _second);

        // fix dates so that it will show two digets
        hours = (String(hours).length >= 2) ? hours : '0' + hours;
        minutes = (String(minutes).length >= 2) ? minutes : '0' + minutes;
        seconds = (String(seconds).length >= 2) ? seconds : '0' + seconds;

        // set to DOM
        item.removeClass('hide');
        if (hours === '00') {
            hoursItem.text('剩余' + minutes + ':' + seconds);
        } else {
            hoursItem.text('剩余' + hours + ':' + minutes + ':' + seconds);
        }

        difference -= 1000;

        if (difference <= 0) {
            clearInterval(interval);// stop timer
            return;
        }
    }
    if (difference !== '' && difference > 0) {
        interval = setInterval(countdown, 1000);// start
    }
}

//  初始化时间
function setTime() {

    $('.order').each(function() {
        var item = $(this).find('.count-down');

        if (!$(this).hasClass('hide')) {
            downCount(item);
        }
    });
}

// 加载订单
function getOrders(option) {
    var opt = {
        type: activeType,
        page: order.page + 1
    };

    var show = option && !option.noLoadingMask;

    if (inAjax) {
        return;
    }

    inAjax = true;
    show && loading.showLoadingMask();

    $.ajax({
        type: 'GET',
        url: '/home/getOrders',
        data: opt,
        success: function(data) {
            var num;

            if (data) {
                order.page = opt.page;

                if (opt.page === 1) {
                    $curContainer.html(data);
                    lazyLoad($curContainer.find('.lazy'), {
                        try_again_css: 'order-failure'
                    });
                } else {
                    num = $curContainer.children('.order').length;
                    $curContainer.append(data);

                    // lazyload
                    lazyLoad($curContainer.children('.order:gt(' + (num - 1) + ')').find('.lazy'), {
                        try_again_css: 'order-failure'
                    });
                }

                window.rePosFooter(); // 重新计算底部位置
            } else {
                if (opt.page > 1) {
                    return;
                }
                $curContainer.html('<div class="no-order"><div class="icon"></div><span>你还没有订单!</span><a class="walk-way" href="//m.yohobuy.com/product/new">随便逛逛</a></div>');
                order.end = true;
            }

            inAjax = false;
            show && loading.hideLoadingMask();
            setTime();
        }
    });
}

lazyLoad({
    try_again_css: 'order-failure'
});

// 初始化导航
(function() {
    var liCount = $navLi.length;

    // 默认4个导航项
    if (liCount === 4) {
        return;
    }

    $navLi.width(100 / liCount + '%');
}());

loading.init($('body')); // 满屏loading

// 点击订单区域跳转订单详情页
orderHammer = new Hammer(document.getElementById('order-container'));
orderHammer.on('tap', function(e) {
    var $cur = $(e.target),
        $order,
        id,
        url;

    if ($cur.closest('.locHref').length > 0) {
        return;
    }

    $order = $cur.closest('.order');
    id = $order.data('id');

    $reaMask.data('orderId', id);

    if ($cur.closest('.del').length > 0) {

        // Order delete
        dialog.showDialog({
            dialogText: '确定删除订单吗?',
            hasFooter: {
                leftBtnText: '取消',
                rightBtnText: '确定'
            }
        }, function() {
            $.ajax({
                type: 'GET',
                url: '/home/delOrder',
                data: {
                    id: id
                },
                success: function(data) {
                    dialog.hideDialog();
                    if (data.message) {
                        tip.show(data.message);
                    }
                    if (data.code === 200) {

                        // 删除订单页面刷新
                        window.location.reload();
                    }
                },
                error: function() {
                    tip.show('取消订单失败');
                }
            });
        });
    } else if ($cur.closest('.cancel').length > 0) {
        $reaMask.css('visibility', 'visible');
    } else if ($cur.closest('.order-goods').length > 0) {

        // Location to order detail
        url = $order.data('href');
        location.href = url;
    } else if ($cur.closest('.rebuy').length > 0) {
        $.ajax({
            type: 'GET',
            url: '/home/readd',
            data: {
                orderCode: id
            },
            success: function(res) {
                tip.show(res.message);
                location.href = '/cart/index/index';
            },
            error: function(res) {
                tip.show(res.message);
            }
        });
    }
});

function scrollHandler() {
    if (!order.end && $(window).scrollTop() + winH >
        $(document).height() - 0.25 * $orderContainer.height()) {

        // 下拉请求时不显示mask
        getOrders({
            noLoadingMask: true
        });
    }
}

// srcoll to load more
$(window).scroll(function() {
    window.requestAnimationFrame(scrollHandler);
});

// 初始化请求第一页数据
getOrders();

$(function() {
    reasonSwiper = new Swiper('.box-main', {
        direction: 'vertical',
        slidesPerView: 5,
        centeredSlides: true,
        initialSlide: 0,
        onSlideChangeStart: function(reasonSwiper) {
            var activeIndex = reasonSwiper.activeIndex,
                slides = reasonSwiper.slides,
                i = 0;

            if (slides.length !== 1) {
                if (activeIndex === 0) {
                    for (i = 1; i < slides.length; i++) {
                        $(slides[i]).css('transform', '');
                    }
                } else if (activeIndex === slides.length - 1) {
                    for (i = 0; i < activeIndex; i++) {
                        $(slides[i]).css('transform', 'rotateX(' + (30 + (activeIndex - i) * 12) + 'deg)');
                    }
                } else {
                    for (i = 0; i < activeIndex; i++) {
                        $(slides[i]).css('transform', 'rotateX(' + (30 + (activeIndex - i) * 12) + 'deg)');
                    }
                    for (i = activeIndex + 1; i < slides.length; i++) {
                        $(slides[i]).css('transform', '');
                    }
                }
            }
            $(slides[activeIndex]).css('transform', '');
        }
    });
});

$reaMask.find('.box-cmp').on('touchend', function(e) {
    var selSolid = reasonSwiper.slides[reasonSwiper.activeIndex],
        reason = $(selSolid).text(),
        reasonId = $(selSolid).data('reasonId');

    $.ajax({
        type: 'GET',
        url: '/home/cancelOrder',
        data: {
            id: $reaMask.data('orderId'),
            reason: reason,
            reasonId: reasonId
        }
    }).then(function(res) {
        $reaMask.fadeOut();
        if ($.type(res) !== 'object') {
            return;
        }
        if (res.message) {
            tip.show(res.message);
        }
        setTimeout(function() {
            window.location.href = '/home/orders';
        }, 2000);
    }).fail(function() {
        tip.show('网络错误');
    });
});

$reaMask.on('touchend', function(event) {
    if (event.target.className !== 'reason-mask') {
        return false;
    }

    $reaMask.css('visibility', 'hidden');
    event.stopPropagation();
});