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

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

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('./dialog');

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

// 减少计时
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,
            days,
            hours,
            minutes,
            seconds;

        // calculate dates
        days = Math.floor(difference / _day),
            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
        days = (String(days).length >= 2) ? days : '0' + days;
        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');
        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 {
                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) {
        console.log('s');
        $reaMask.css('visibility', 'visible');
    } else if ($cur.closest('.order-goods').length > 0) {

        //Location to order detail
        url = $order.data('href');
        location.href = url;
    }
});

function scrollHandler() {
    if (order.end === false && $(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();
});