/*
 * title: push-tree
 * @author 王飞腾
 * date: 2018/12/19
*/
layui.define(['jquery'],function(exports){
    var $ = layui.jquery;

    //  生成模板
    function generationTemplate(options,layer){
        //  获取数据格式
        var property = options.data.property;
        //  数据列表
        var list = options.data.list;
        var htmlText = '<ul class="layui-show">';
        if (options.layer <= layer){
            list.forEach(function (item) {
                htmlText += '' +
                    '<li data-id="' + item[property.id] + '" data-pid="' + item[property.pid] + '" data-layer="' + layer + '">' +
                    '<a href="javascript:void(0);" title="' + item[property.name] + '"><cite>' +
                    item[property.name] +
                    '</cite></a></li>';
            });
        }else {
            list.forEach(function (item) {
                htmlText += '<li data-id="' + item[property.id] + '" data-pid="' + item[property.pid] + '" data-layer="' + layer + '">';
                //  判断是否有子节点
                if (item[property.subCount] > 0){
                    htmlText += '<i class="layui-icon layui-icon-triangle-r"></i>';
                }
                htmlText += '<a href="javascript:void(0);" title="' + item[property.name] + '"><cite>' +
                    item[property.name] +
                    '</cite></a></li>';
            });
        }
        return htmlText += '</ul>';
    }

    var tree = {
        //  初始化树
        init    :   function (options) {
            //  树
            var $node = options.$node;

            //  生成模板
            var template = generationTemplate(options,1);
            $node.append(template);

            //  回调函数列表
            var callbackFnMap = {

            };

            //  树展开事件
            $node.on('click','.layui-icon.layui-icon-triangle-r',function () {
                var $this = $(this);
                $this.removeClass('layui-icon-triangle-r').addClass('layui-icon-triangle-d');
                //  获取最近的li
                var $li = $this.closest('li');
                var $ul = $li.find('ul');
                //  判断是否已经加载过子节点
                if ($ul.length === 0){
                    var data = {
                        id      :   $li.attr('data-id'),
                        pid     :   $li.attr('data-pid'),
                        layer   :   parseInt($li.attr('data-layer')),
                        //  异步回调
                        asyncFn :   function(result){
                            options.data = result;
                            //  生成模板
                            var template = generationTemplate(options,data.layer + 1);
                            $li.append(template);
                        }
                    };
                    //  获取回调函数
                    if (!callbackFnMap[data.layer]){
                        callbackFnMap[data.layer] = options.data.getSubList;
                    }
                    //  调用回掉函数 获取子节点数据
                    callbackFnMap[data.layer](data);
                }else {
                    $ul.addClass('layui-show');
                }
            });

            //  树关闭事件
            $node.on('click','.layui-icon.layui-icon-triangle-d',function () {
                var $this = $(this);
                $this.removeClass('layui-icon-triangle-d').addClass('layui-icon-triangle-r');
                $this.closest('li').find('ul').removeClass('layui-show');
            });

            //  树点击事件
            $node.on('click','li a',function () {
                var $this = $(this);
                if ($this.find('cite.active').length > 0){
                    return;
                }
                $this.closest('.layui-tree').find('li a cite.active').removeClass('active');
                $this.find('cite').addClass('active');
                //  获取最近的li
                var $li = $this.closest('li');
                var data = {
                    id      :   $li.attr('data-id'),
                    pid     :   $li.attr('data-pid'),
                    name    :   $this.text(),
                    layer   :   parseInt($li.attr('data-layer'))
                };
                //  调用点击回掉函数
                options.clickFn(data);
            });

            return $node;
        },
        //  取消选中状态
        uncheck :   function ($node) {
            $node.find('cite.active').eq(0).removeClass('active');
        }
    };

    exports('customTree', tree);
});