ct_autocompleter.js 10.4 KB
/**
 * 自己写一个自动补全
 */
var ct_autocompleter = (function () {

    var maxItem = 10;
    var _active;
    var _input;
    var _wrap;

    var init = function (wrap, searchFun, showRsFun, confirmFun) {
        var input = $('input', wrap);

        //input事件
        input.on('input', function () {
            var list = [],
                v = $(this).val();

            if(!v){
                cancel(wrap);
                return;
            }

            var list = searchFun(v);
            if(showRsFun)
                showRsFun(list, wrap);
            else
                defaultShowRsList(list, wrap);

            _active = true;
            _input = this;
            _wrap = wrap;
        });
        $(wrap).append('<div class="ct_autocompleter"><ul class="item-list"></ul></div>');

        wrap = $('.ct_autocompleter', wrap);
        $(wrap).on('mouseenter', '.item-list>li.item', function () {
            $('li.item.active', wrap).removeClass('active');
            $(this).addClass('active');
        });
        //事件
        input.on('keydown', function (e) {
            if(e.keyCode == 13){
                var atItem = $('li.item.active', wrap);
                if(atItem.length > 0){
                    input.val(atItem.text());

                    confirmFun && confirmFun(atItem, input);
                    cancel(wrap);
                    return;
                }
            }
            moveFocus(e, wrap)
        });

        //选中
        $(wrap).on('click', '.item-list>li.item', function () {
            input.val($(this).text());

            confirmFun && confirmFun(this, input);
            cancel(wrap);
        });
    };

    var cancel = function (wrap) {
        $('.item-list', wrap).empty();
        $(wrap).hide();
        _active = false;
        _input = null;
    };

    var defaultShowRsList = function (list, wrap) {
        var htmlStr = '';
        for(var i=0,v;v=list[i++];){
            htmlStr += '<li class="item">'+v+'</li>';
        }
        $('.item-list', wrap).html(htmlStr);
        $(wrap).show();
    };

    var moveFocus = function (e, wrap) {
        if(e.keyCode != 38 && e.keyCode != 40)
            return;

        var ca = $('li.item.active', wrap)
            , i = 0
            , max;

        if(ca.length > 0){
            if(e.keyCode == 40){//下
                i = ca.index() + 1;
            }
            else if(e.keyCode == 38){//上
                i = ca.index() - 1;
            }

            max = $('li.item', wrap).length;

            if(i >= max)
                i = 0;
            if(i < 0)
                i = max - 1;
        }

        $('li.item.active', wrap).removeClass('active');
        $('.item-list>li:eq('+i+')', wrap).addClass('active');
    };

    var initPerson = function (wrap) {
        init(wrap, function (v) {
            v = v.toUpperCase();
            var data = gb_o_s_basic_data.findAllPerson(),
                list = [];

            for(var i=0,p;p=data[i++];){

                if(list.length >= maxItem)
                    break;
                if(p.name.indexOf(v) != -1
                    || p.code.indexOf(v) != -1
                    || p.fc.indexOf(v) != -1
                    || p.cc.indexOf(v) != -1){
                    list.push(p.code + '/' + p.name);
                }
            }

            return list;
        });
    };


    var initBus = function (wrap) {
        init(wrap, function (v) {
            v = v.toUpperCase();
            var data = gb_o_s_basic_data.findAllBus(),
                list = [];

            for(var i=0,nbbm;nbbm=data[i++];){

                if(list.length >= maxItem)
                    break;
                if(nbbm.indexOf(v) != -1)
                    list.push(nbbm);
            }

            return list;
        });
    };
    
    var initLine = function (wrap, lineIdx) {
        var _data = gb_o_s_basic_data.findAllLine();
        if(lineIdx){//过滤线路
            var array = lineIdx.split(','), newData = [];
            for(var i=0,line;line=_data[i++];){
                if(array.indexOf(line.lineCode) != -1)
                    newData.push(line);
            }
            _data = newData;
        }
        init(wrap, function (v) {
            v = v.toUpperCase();
            var data = _data,
                list = [];

            for(var i=0,line;line=data[i++];){
                if(list.length >= maxItem)
                    break;

                if(line.nameCamelChars.indexOf(v) !=-1
                    || line.nameFullChars.indexOf(v) !=-1
                    || line.name.indexOf(v) !=-1){
                    list.push(line.name);
                }
            }
            return list;
        });
    };

    /***
     * ############## 自定义的 auto comp ################33
     * @returns {Array}
     */
    function extractNbbmsBySch() {
        var all = gb_os_card.findAll()
            , groupData = {};
        for(var i=0,sch;sch=all[i++];){
            groupData[sch.lineCode+'_'+sch.lpName+'_'+sch.nbbm]=sch;
        }

        var _data = []
            , array = gb_common.get_vals(groupData);

        for(var j=0,obj;obj=array[j++];){
            _data.push({
                nbbm: obj.nbbm,
                lineCode: obj.lineCode,
                lineName: obj.lineName,
                lpName: obj.lpName
            })
        }
        return _data;
    }

    function extractJsysBySch() {
        var all = gb_os_card.findAll()
            , groupData = {};
        for(var i=0,sch;sch=all[i++];){
            groupData[sch.lineCode+'_'+sch.lpName+'_'+sch.jsy]=sch;
        }

        var _data = []
            , array = gb_common.get_vals(groupData);

        for(var j=0,obj;obj=array[j++];){
            _data.push({
                jsy: obj.jsy,
                lineCode: obj.lineCode,
                lineName: obj.lineName,
                lpName: obj.lpName,
                jNameFullChars: obj.jNameFullChars,
                jNameCamelChars: obj.jNameCamelChars
            })
        }
        return _data;
    }


    var initLineAndOpenSch = function (wrap, lineIdx) {
        var _data = gb_o_s_basic_data.findAllLine();
        if(lineIdx){//过滤线路
            var array = lineIdx.split(','), newData = [];
            for(var i=0,line;line=_data[i++];){
                if(array.indexOf(line.lineCode) != -1)
                    newData.push(line);
            }
            _data = newData;
        }
        init(wrap, function (v) {
            v = v.toUpperCase();
            var data = _data,
                list = [];

            for(var i=0,line;line=data[i++];){
                if(list.length >= maxItem)
                    break;

                if(line.nameCamelChars.indexOf(v) !=-1
                    || line.nameFullChars.indexOf(v) !=-1
                    || line.name.indexOf(v) !=-1){
                    list.push(line.name);
                }
            }
            return list;
        }, null , function (item, input) {
            var code = gb_o_s_basic_data.getCodeByName($(item).text());
            $(input).val('');
            gb_common.open_modal_default('/pages/abnormal/fragments/expand_card_modal.html'
                , '出场班次明细(' + current_tcc_name + ')', {lineCode: code}, 1020);
        });
    };

    /**
     * 从班次信息里搜索车辆
     * @param wrap
     */
    var initBusBySch = function (wrap) {
        var _data = extractNbbmsBySch();

        init(wrap, function (v) {
            v = v.toUpperCase();
            var data = _data,
                list = [];

            for(var i=0,obj;obj=data[i++];){
                if(list.length >= 9)
                    break;

                if(obj.nbbm.indexOf(v) !=-1)
                    list.push(obj);
            }
            return list;
        }, function (list, wrap) {
            //渲染
            var htmlStr = '';
            for(var i=0,obj;obj=list[i++];){
                htmlStr += '<li class="item active_grey" ><span class="sch_nbbm">'+obj.nbbm+'</span><span class="sch_lp">'+obj.lpName+'</span><span class="sub_text" data-code="'+obj.lineCode+'">'+obj.lineName+'</span></li>';
            }
            $('.item-list', wrap).html(htmlStr);
            $(wrap).show();
        }, function (item, input) {
            var $e = $(item)
                ,lineCode = $('.sub_text', $e).data('code')
                ,nbbm = $('.sch_nbbm', $e).text()
                ,lpName = $('.sch_lp', $e).text();

            $(input).val('');
            gb_common.open_modal_default('/pages/abnormal/fragments/expand_card_modal.html'
                , '出场班次明细(' + current_tcc_name + ')', {lineCode: lineCode, nbbm: nbbm, lpName: lpName}, 1020);
        });
    };


    var initPersonBySch = function (wrap) {
        var _data = extractJsysBySch();
        init(wrap, function (v) {
            v = v.toUpperCase();
            var data = _data,
                list = [];

            for(var i=0,obj;obj=data[i++];){
                if(list.length >= 9)
                    break;

                if(obj.jsy.indexOf(v) !=-1
                    ||obj['jNameFullChars'].indexOf(v) !=-1
                    ||obj['jNameCamelChars'].indexOf(v) !=-1)
                    list.push(obj);
            }
            return list;
        }, function (list, wrap) {
            //渲染
            var htmlStr = '';
            for(var i=0,obj;obj=list[i++];){
                htmlStr += '<li class="item active_grey" ><span class="sch_jsy">'+obj.jsy+'</span><span class="sch_lp">'+obj.lpName+'</span><span class="sub_text" data-code="'+obj.lineCode+'">'+obj.lineName+'</span></li>';
            }
            $('.item-list', wrap).html(htmlStr);
            $(wrap).show();
        }, function (item, input) {
            var $e = $(item)
                ,lineCode = $('.sub_text', $e).data('code')
                ,jsy = $('.sch_jsy', $e).text()
                ,lpName = $('.sch_lp', $e).text();

            $(input).val('');
            gb_common.open_modal_default('/pages/abnormal/fragments/expand_card_modal.html'
                , '出场班次明细(' + current_tcc_name + ')', {lineCode: lineCode, jsy: jsy, lpName: lpName}, 1020);
        });
    };

    $(document).on('click', function (e) {
        if(_active && e.target!=_input){
            cancel(_wrap);
        }
    });

    return {
        initPerson : initPerson,
        initBus: initBus,
        initBusBySch: initBusBySch,
        initPersonBySch: initPersonBySch,
        initLine: initLine,
        initLineAndOpenSch: initLineAndOpenSch
    }
})();