﻿/*输入框自动过滤下拉*/
(function ($) {
    $.fn.jqueryinputfilter = function (options) {
        var settings = {
            url: null, 	//ajax请求url
            haveScroll: false,  //marginTop需加上document.documentElement.scrollTop
            marginObject: null,   //输入框所在的一个有滚动条的层
            marginTop: 23,   //弹出下拉框离输入框顶部距离
            marginLeft: 0,   //弹出下拉框离左边距离
            objectType: null,  //过滤对象类型 1:Domain 2:Type 3:Topic 6:User
            dependType: null,  //依赖对象类型 1:Domain 2:Type 3:Topic 4:Property 6:User 0:Null
            dependID: 0,  //依赖对象编号
            withOutType: null, //不包含对象类型 1:Domain 2:Type 3:Topic 4:Property 6:User 0:Null
            withOutID: 0,   //不包含对象编号
            forUser: false,  //是否用户所在类型
            isSystemGenerate: true, //是否主题所属类型
            disabled: null, //获取数据时不可用对象
            canAdd: false, //不存在是否需要添加按钮 false：不需要 true：需要
            afterChoiceEvent: null, //选中后触发事件
            pageIndex: 1, //当前页码
            actionInput: null, //显示结果输入框
            autoInput: false, //自动输入
            actionEvent: 'keyup' //触发事件
        };

        if (options) {
            $.extend(settings, options);
        }

        if ($('.inputfilter').length == 0) {
            $('<div class="inputfilter"></div>').prependTo('body');
        }

        if ($('.inputfilterinfo').length == 0) {
            $('<div class="inputfilterinfo"></div>').prependTo('body');
        }

        var $inputfilter = $('.inputfilter');
        var $inputfilterinfo = $('.inputfilterinfo');
        $inputfilter.hide(); //列表
        $inputfilterinfo.hide(); //选中信息简介
        $inputfilter.click(function (event) {
            event.stopPropagation();
        });
        $inputfilterinfo.click(function (event) {
            event.stopPropagation();
        }).mouseover(function () {
            if (getDetailInfoTimeObj != null)
                clearTimeout(getDetailInfoTimeObj);
        });

        function ShowCurrInputFilterDd() {
            return;
            //使当前选中属性始终可见
            var $currDl = $inputfilter.find('dl:eq(0)');
            var $currDd = $currDl.find('dd.item:eq(' + selectedItem + ')');
            var dlScrollTop = $currDl.parent()[0].scrollTop;
            var dlHight = $currDl.height();
            var ddHeight = $currDd.height() + 4;
            var ddTopAndHight = 0;
            $currDl.find('dd.item:lt(' + selectedItem + ')').each(function () {
                ddTopAndHight += $(this).height() + 4;
            });
            if (ddTopAndHight + ddHeight - dlScrollTop > 200 || ddTopAndHight < dlScrollTop) {
                var myScrollTop = ddTopAndHight - ddHeight;
                $currDl.parent().animate({ scrollTop: myScrollTop }, 'slow');
            }
        }

        function GetFilterDetailInfo(objId) {
            if (getDetailInfoTimeObj != null) {
                clearTimeout(getDetailInfoTimeObj);
            }
            try {
                if (prevObjId != objId) {
                    var bodyWidth = document.documentElement.scrollWidth;
                    var tempTop = getABSTop($inputfilter[0]);
                    var tempLeft = getABSLeft($inputfilter[0]) + $inputfilter.width() + 5;
                    if (tempLeft + $inputfilterinfo.width() > bodyWidth)
                        tempLeft = getABSLeft($inputfilter[0]) - $inputfilterinfo.width() - 25;

                    $inputfilterinfo.html('<img class="loading" src="/Images/Public/loading.gif" align="absmiddle" />正在装载中...').css("top", tempTop).css("left", tempLeft).css('width', '115px').show();
                    getDetailInfoID = objId;
                    $.post(settings.url + '/GetFilterDetailInfoAjax/', {
                        'objectType': settings.objectType,
                        'objectID': objId
                    }, function (data) {
                        if (data.length > 0) {
                            $inputfilterinfo.html(data).css("top", tempTop).css("left", tempLeft).css('width', '236px').show();
                        }
                        resultBack = true;
                    });
                    prevObjId = objId;
                } else {
                    $inputfilterinfo.show();
                    resultBack = true;
                }
            }
            catch (err) { }
        }

        var selectedItem = null; //当前选中li索引，默认是没有选中项
        var oldKeyword = null;
        var resultBack = true;
        var abstop = 0;
        var absleft = 0;
        var thisObj = this;
        var oldObjTitle = '';
        var oldObjId = '';
        var prevObjId = null;
        var getDetailInfoID = null;
        var getDetailInfoTimeObj = null;
        var SetSelectedItem = function () {
            if (selectedItem == null) {
                oldKeyword = null;
                $inputfilter.hide();
                $inputfilterinfo.hide();
                if (getDetailInfoTimeObj != null) {
                    resultBack = true;
                    clearTimeout(getDetailInfoTimeObj);
                }
                return;
            }

            var liCount = $inputfilter.find('dl:eq(0) > dd.item').length - 1;

            if (selectedItem == -2)
                selectedItem = liCount;
            else if (selectedItem > liCount)
                selectedItem = -1;

            $inputfilter.find('dl:eq(0) > dd.item').removeClass('selected');
            if (selectedItem >= 0) {
                $inputfilter.find('dl:eq(0) > dd.item').eq(selectedItem).addClass('selected');
                var objTitle = $inputfilter.find('dl:eq(0) > dd.item').eq(selectedItem).attr('objTitle');
                var objId = $inputfilter.find('dl:eq(0) > dd.item').eq(selectedItem).attr('objId');
                if (settings.autoInput)
                    $(thisObj).val(objTitle);
                if (getDetailInfoTimeObj != null) {
                    resultBack = true;
                    clearTimeout(getDetailInfoTimeObj);
                }
                if (resultBack && settings.objectType == 3) {
                    resultBack = false;
                    //                    GetFilterDetailInfo();
                    getDetailInfoTimeObj = window.setTimeout(GetFilterDetailInfo, 1000, objId);
                }
                ShowCurrInputFilterDd();
            } else {
                if (settings.autoInput && oldKeyword != null)
                    $(thisObj).val(oldKeyword);
            }
        };

        var SaveSelectedValue = function () {
            $inputfilter.hide();
            $inputfilterinfo.hide();
            if (getDetailInfoTimeObj != null) {
                resultBack = true;
                clearTimeout(getDetailInfoTimeObj);
            }
            if ($(this).attr('objId') != undefined || ($(this).attr('objId') == undefined && $inputfilter.find('dl:eq(0) > dd.selected').length > 0)) {
                if (selectedItem != null && selectedItem != -1) {
                    var objTitle = $inputfilter.find('dl:eq(0) > dd.item').eq(selectedItem).attr('objTitle');
                    var objId = $inputfilter.find('dl:eq(0) > dd.item').eq(selectedItem).attr('objId');
                    $(thisObj).val(objTitle);

                    if (settings.actionEvent == 'keydown' || settings.actionEvent == 'click') {
                        $(thisObj).attr('oldvalue', objTitle).removeClass('currTxtTopic').removeClass('emptyTxtTopic');
                        currInputFilterObj = null;
                    }

                    if ($(thisObj).next().length > 0)
                        $(thisObj).next().val(objId);
                    if (settings.disabled != null) {
                        settings.disabled.attr('disabled', false);
                    }
                    try {
                        if (settings.afterChoiceEvent != null)
                            eval(settings.afterChoiceEvent + '()');
                    }
                    catch (err) { }
                    try {
                        EditBoxKeyEvent(thisObj, 1);
                    }
                    catch (err) { }
                }
                selectedItem = null;
                SetSelectedItem();
            }
        };

        function showInputFilterDiv(thisObj, settings, keyword) {
            oldKeyword = keyword;
            $(thisObj).attr('inputfilter', 'on');
            abstop = getABSTop(thisObj);
            absleft = getABSLeft(thisObj);
            var bodyWidth = document.documentElement.scrollWidth;
            var tempTop = abstop + settings.marginTop;
            if (settings.haveScroll)
                tempTop += document.documentElement.scrollTop;
            if (settings.marginObject != null)
                tempTop = tempTop - settings.marginObject.scrollTop;
            var tempLeft = absleft + settings.marginLeft;
            if (tempLeft + $inputfilter.width() > bodyWidth)
                tempLeft = absleft - ($inputfilter.width() - $(thisObj).width());

            try {
                prevObjId = null;
                $inputfilter.find('dl:eq(0)').remove();
                $inputfilter.prepend('<dl class="list"><dd>&nbsp;&nbsp;<img class="loading" src="/Images/Public/loading.gif" align="absmiddle" />正在装载中...</dd></dl>').css("top", tempTop).css("left", tempLeft).show();
                $.post(settings.url + '/GetFilterListAjax/', {
                    'objectType': settings.objectType == null ? 0 : settings.objectType,
                    'keyword': keyword,
                    'dependType': settings.dependType == null ? 0 : settings.dependType,
                    'dependID': settings.dependID == null ? 0 : settings.dependID,
                    'withOutType': settings.withOutType == null ? 0 : settings.withOutType,
                    'withOutID': settings.withOutID == null ? 0 : settings.withOutID,
                    'forUser': settings.forUser == null ? false : settings.forUser,
                    'isSystemGenerate': settings.isSystemGenerate == null ? true : settings.isSystemGenerate,
                    'canAdd': settings.canAdd == null ? false : settings.canAdd,
                    'pageIndex': settings.pageIndex
                }, function (data) {
                    //如果输入值还是等于刚刚传进来的keyword,就继续显示
                    if (data.length > 0 || settings.actionEvent == 'keydown' || settings.actionEvent == 'click' || $.trim($(thisObj).val()) == keyword) {
                        $inputfilter.html(data).find('.toNextPage,.toPrevPage').unbind().click(function (event) {
                            event.stopPropagation();
                            settings.pageIndex = $(this).attr('page');
                            showInputFilterDiv(thisObj, settings, keyword);
                            if (settings.autoInput && oldKeyword != null)
                                $(thisObj).val(oldKeyword);
                            return;
                        });

                        $inputfilter.find('dl:eq(0) > dd.item').unbind().hover(function () {
                            if ($(this).attr('objId') != undefined) {
                                var index = $inputfilter.find('dl:eq(0) > dd.item').index(this);
                                selectedItem = index;
                                SetSelectedItem();
                            }
                            else {
                                $inputfilter.find('dl:eq(0) > dd.item').removeClass('selected');
                                //$(thisObj).val(keyword).attr('oldvalue', keyword);
                            }
                        }, function () {
                            if ($(this).attr('objId') != undefined) {
                                $inputfilter.find('dl:eq(0) > dd.item').removeClass('selected');
                                if (settings.autoInput && oldKeyword != null)
                                    $(thisObj).val(oldKeyword);
                            }
                        }).click(SaveSelectedValue);

                        if ($inputfilter.find('dl:eq(0) > dd.item').length > 0) {
                            selectedItem = -1;
                            //                            SetSelectedItem();
                        }

                        $('#txtTopicKeyword').unbind().click(function (event) {
                            event.stopPropagation();
                            this.select();
                        });
                        $('#btnAddObject').unbind().click(function (event) {
                            event.stopPropagation();
                            if (userID <= 0) {
                                ShowLogin();
                                return;
                            }
                            var topicKeyword = '';
                            if ($('#txtTopicKeyword').length > 0)
                                topicKeyword = $.trim($('#txtTopicKeyword').val());
                            if (!confirm('确定添加主题“' + keyword + '”吗？')) return;
                            ShowLoading(); //InitParam.js公用方法
                            $.post(settings.url + '/AddFilterObjectAjax/', {
                                'objectType': settings.objectType == null ? 0 : settings.objectType,
                                'keyword': keyword,
                                'topicKeyword': topicKeyword,
                                'dependType': settings.dependType == null ? 0 : settings.dependType,
                                'dependID': settings.dependID == null ? 0 : settings.dependID,
                                'withOutType': settings.withOutType == null ? 0 : settings.withOutType,
                                'withOutID': settings.withOutID == null ? 0 : settings.withOutID,
                                'forUser': settings.forUser == null ? false : settings.forUser,
                                'isSystemGenerate': settings.isSystemGenerate == null ? false : settings.isSystemGenerate,
                                'locationUrl': locationUrl
                            }, function (data) {
                                HideLoading(); //InitParam.js公用方法
                                if (data > 0) {
                                    $(thisObj).next().val(data);
                                    $(thisObj).val(keyword).attr('oldvalue', keyword).removeClass('currTxtTopic').removeClass('emptyTxtTopic');
                                    try {
                                        if (settings.afterChoiceEvent != null)
                                            eval(settings.afterChoiceEvent + '()');
                                    }
                                    catch (err) { }
                                    try {
                                        EditBoxKeyEvent(thisObj, 1);
                                    }
                                    catch (err) { }
                                }
                                else if (data == 'keywordError')
                                    AlertTips('系统提示：', $('#divKeywordDescription').html(), 2);
                                else {
                                    AlertTips('系统提示：', '抱歉，可能由于以下原因无法创建主题<br />1、该主题已经存在<br />2、该主题不能属于该属性指定类型<br />3、由于正在升级或者技术原因', 2);
                                }
                                selectedItem = null;
                                SetSelectedItem();
                            });
                        });
                        $(thisObj).attr('inputfilter', 'off');
                    }
                });
            }
            catch (err) { }
        }

        $(this).attr('inputfilter', 'off').click(function (event) {
            event.stopPropagation();
        }).bind(settings.actionEvent, function (event) {
            if (settings.actionEvent == 'keydown' || settings.actionEvent == 'click') {
                if (event.keyCode == 13 || settings.actionEvent == 'click') {
                    $('#divInputFilterTopic').hide();
                    thisObj = currInputFilterObj;
                    var keyword = $.trim($('#divInputFilterTopic').find('input').val());
                    if (keyword.length == 0) {
                        $(thisObj).val('').attr('oldvalue', '');
                        $(thisObj).next().val('0');
                        $(thisObj).val('点击输入特征').removeClass('currTxtTopic').addClass('emptyTxtTopic');
                        return;
                    }
                    $(thisObj).removeClass('emptyTxtTopic').val('请选择或点此重新输入');
                    oldObjTitle = keyword;
                    if ($(thisObj).next().length > 0)
                        oldObjId = $(thisObj).next().val();

                    window.clearTimeout(inputFilterTimer);

                    if (keyword.length < 1) {
                        selectedItem = null;
                        SetSelectedItem();
                        return;
                    }
                    else if (oldKeyword == keyword) {
                        $inputfilter.show();
                        return;
                    }
                    selectedItem = null;
                    SetSelectedItem();
                    settings.pageIndex = 1;
                    inputFilterTimer = window.setTimeout(showInputFilterDiv, 500, thisObj, settings, keyword);
                }
            } else {
                if (event.keyCode > 40 || event.keyCode == 8 || event.keyCode == 32) {
                    thisObj = this;
                    var keyword = $.trim($(thisObj).val());
                    oldObjTitle = keyword;
                    if ($(thisObj).next().length > 0)
                        oldObjId = $(thisObj).next().val();

                    window.clearTimeout(inputFilterTimer);

                    if (keyword.length < 1) {
                        selectedItem = null;
                        SetSelectedItem();
                        return;
                    }
                    else if (oldKeyword == keyword) {
                        $inputfilter.show();
                        return;
                    }
                    selectedItem = null;
                    SetSelectedItem();
                    settings.pageIndex = 1;
                    inputFilterTimer = window.setTimeout(showInputFilterDiv, 500, thisObj, settings, keyword);

                    //等待用户输入完毕
                    //setTimeout(showInputFilterDiv, 2000);
                }
                else if (event.keyCode == 38 && selectedItem != null) {
                    selectedItem--;
                    SetSelectedItem();
                    event.preventDefault();
                }
                else if (event.keyCode == 40 && selectedItem != null) {
                    selectedItem++;
                    SetSelectedItem();
                    event.preventDefault();
                }
                else if (event.keyCode == 27 && selectedItem != null) {
                    selectedItem = null;
                    SetSelectedItem();
                }
                else if (event.keyCode == 37) {
                    $inputfilter.find('.toPrevPage').click();
                }
                else if (event.keyCode == 39) {
                    $inputfilter.find('.toNextPage').click();
                }
            }
        }).keypress(function (event) {
            if (settings.actionEvent == 'keydown' || settings.actionEvent == 'click')
                return;
            if (event.keyCode == 13 && selectedItem !== null) {
                SaveSelectedValue();
                event.preventDefault();
            }
        });
    };
})(jQuery);
