﻿
//-------------------------------------------------------------[Class] TabContainer-----------------------------------------------------------//
//  描述：  标签显示控件。
//  构造：  new TabContainer(id,elements,selectedIndex)
//              id：            [String]        控件在JS中名称，注意不要与parentID同名。
//              elements：      [Array(String)] 标签的内容元素的id的集合。
//              selectedIndex： [Number]        当前选中的标签的索引。
//              isTabMode：     [Boolean]       是否Tab模式。
//  方法：
//          select(index)
//          选中指定索引[index]的标签。
//          changeTabName(index,name,title)
//          改变指定索引[index]的标签名称[name]和说明[title]。
//          onBeforeClick(index)
//          点击索引为[index]的标签后在显示标签内容前执行，当返回值为 true 时显示选中标签页内容，否则不显示。
//          onAfterClick(index)
//          点击索引为[index]的标签后在显示标签内容后执行。
//          setVisible(index,visible[,index,visible])
//          设置指定索引的标签的显示状态。
//-------------------------------------------------------------[Class] TabContainer-----------------------------------------------------------//
//  标签显示控件。
function TabContainer(id, elements, selectedIndex, titleVerticalAlign, isTabMode)
{
    //  设置指定索引的标签的显示状态。
    this.setVisible = function(index, visible)
    {
        if (this.IsTabMode == false)
        {
            for (var i = 0; i < arguments.length; i = i + 2)
            {
                if (arguments[i + 1] == true)
                {
                    this.Lis[arguments[i]].style.display = "inline-block";
                    this.Elements[arguments[i]].style.display = "inline-block";
                }
                else
                {
                    this.Lis[arguments[i]].style.display = "none";
                    this.Elements[arguments[i]].style.display = "none";
                }
            }
        }
        else
        {
            for (var i = 0; i < arguments.length; i = i + 2)
            {
                if (arguments[i + 1] == true)
                {
                    this.Lis[arguments[i]].style.display = "inline-block";
                }
                else
                {
                    this.Lis[arguments[i]].style.display = "none";
                }
            }
        }
    };
    //  选中指定索引[index]的标签。
    this.select = function(index)
    {
        this.onmouseover(index);
        this.onclick(index);
    };
    //  改变指定索引[index]的标签名称[name]和说明[title]。
    this.changeTabName = function(index, name, title)
    {
        var li = this.Lis[index];
        li.title = title;
        li.getElementsByTagName("label")[0].innerText = name;
    };
    //  点击索引为[index]的标签后在显示标签内容前执行，当返回值为 true 时显示选中标签页内容，否则不显示。
    this.onBeforeClick = function(index)
    {
        return true;
    };
    //  点击索引为[index]的标签后在显示标签内容后执行。
    this.onAfterClick = function(index)
    {
        return true;
    };
    this.onmouseover = function(index)
    {
        if (this.IsTabMode == false)
        {
            return;
        }
        else
        {
            if (this.SelectedIndex == index)
            {
                return;
            }
            else
            {
                var obj = this.Lis[index];
                obj.className = "tc_Li_Nml";
                obj.getElementsByTagName("span")[0].className = "tc_Span1_Nml";
                obj.getElementsByTagName("label")[0].className = "tc_Label_Nml";
                obj.getElementsByTagName("span")[1].className = "tc_Span2_Nml";
            }
        }
    };
    this.onmouseout = function(index)
    {
        if (this.IsTabMode == false)
        {
            return;
        }
        else
        {
            if (this.SelectedIndex == index)
            {
                return;
            }
            var obj = this.Lis[index];
            obj.className = "tc_Li";
            obj.getElementsByTagName("span")[0].className = "tc_Span1";
            obj.getElementsByTagName("label")[0].className = "tc_Label";
            obj.getElementsByTagName("span")[1].className = "tc_Span2";
        }
    };
    this.onclick = function(index)
    {
        if (this.IsTabMode == false)
        {
            return;
        }
        else
        {
            var obj = this.Lis[index];
            obj.className = "tc_Li_Atd";
            obj.getElementsByTagName("span")[0].className = "tc_Span1_Atd";
            obj.getElementsByTagName("label")[0].className = "tc_Label_Atd";
            obj.getElementsByTagName("span")[1].className = "tc_Span2_Atd";
            if (this.SelectedIndex == index)
            {
                return;
            }
            if (this.onBeforeClick(index) == false)
            {
                return;
            }
            var obj = this.Lis[index];

            if (this.SelectedIndex != -1)
            {
                var l = this.Lis[this.SelectedIndex];
                l.className = "tc_Li";
                l.getElementsByTagName("span")[0].className = "tc_Span1";
                l.getElementsByTagName("label")[0].className = "tc_Label";
                l.getElementsByTagName("span")[1].className = "tc_Span2";
                this.Elements[this.SelectedIndex].style.display = "none";
            }
            this.Elements[index].style.display = "inline-block";
            this.SelectedIndex = index;
            this.onAfterClick(index);
        }
    };
    this.ID = id;
    this.SelectedIndex = selectedIndex;
    this.Elements = [];
    this.TitleVerticalAlign = titleVerticalAlign;
    this.IsTabMode = isTabMode;
    if (this.TitleVerticalAlign == 1)//tabTitle垂直对齐方式。
    {
        this.Lis = document.getElementById(id).lastChild.getElementsByTagName("LI");
    }
    else
    {
        this.Lis = document.getElementById(id).firstChild.getElementsByTagName("LI");
    }
    for (var i = 0; i < elements.length; i++)
    {
        this.Elements[i] = document.getElementById(elements[i]);
    }
    if (this.SelectedIndex >= this.Elements.length)
    {
        this.SelectedIndex = -1;
        this.select(this.Elements.length - 1);
    }
}
//-------------------------------------------------------------[Class] TabContainer-----------------------------------------------------------//

//-------------------------------------------------------------[Class] Datalist----------------------------------------------------------//
//  描述：  数据列表显示控件。
//  构造：  new DataList(dataListInfo)
//              var dataListInfo = {
//                  ID：                        [String]            JS中本对象的ID。
//                  ParentID：                  [String]            本对象的容器ID。
//                  TypeName：                  [String]            查询的实体的类型。
//                  Properties：                [Array(String)]     要查询的实体的属性,并且显示时按指定顺序。
//                  Sortable：                  [Array(Boolean)]    是否允许排序。
//                  Titles：                    [Array(String)]     列表显示的名称。
//                  Display：                   [Array(Number)]     显示的样式。
//                  TextAligns：                [Array(Number)]     数据水平位置。
//                  PaginalNumber：             [Number]            每页记录数量。
//                  RecordCount：               [Number]            总记录数。
//                  PageNumber：                [Number]            显示的页码。
//                  Constraint：                [String]            约束条件。
//                  Compositor：                [String]            排序条件。
//                  Values：                    [Array(Object)]     约束值。
//                  ActionID：                  [String]            记录的标识属性。
//                  ActionNames：               [Array(String)]     显示在数据行上的操作的名称。
//                  CanSelect：                 [Boolean]           是否显示选择框。
//                  CanDbClick：                [Boolean]           行记录是否可以双击。
//                  BottomDisplay：             [Boolean]           底部页码控制是否显示。  
//                  TextLengths                 [Array(Number)]     数据字符长度。
//                  CellNumber                  [Number]            每行列数。
//                  OtherImg                    [String]            替换图片地址。
//                  ListType                    [Enumeration]       列表类型。  
//              };
//  属性：
//          v：             [DataListInfo]      数据列表实体信息。
//          selectedIndex： [Array(Number)]     选框框选中的行索引数组。
//          selectedValue： [Array(Object)]     选择框选中的数据标识数组。
//  方法：
//          render()
//          显示或刷新列表数据控件。
//          doAction(actionIndex,actionName,index,id)
//          列表行数据的操作事件，actionIndex为点击的[ActionNames]的索引，actionName为点击的[ActionNames]的内容，index为点击行索引，id为点击行的数据的[ActionID]。
//          doClick(index,id)
//          列表行数据的单击事件，index为单击的索引，id为单击的数据的[ActionID]。
//          doDbClick(index,id)
//          列表行数据的双击事件，index为双击的索引，id为双击的数据的[ActionID]。
//          doButtonClick(index,id)
//          列表行数据的按钮事件，index为按钮的索引，id为按钮的数据的[ActionID]。
//-------------------------------------------------------------[Class] DataList----------------------------------------------------------//
//  数据列表显示控件。
function DataList(dataListInfo)
{
    this.v = dataListInfo;
    //选框框选中的行索引数组。
    this.selectedIndex = [];
    //选择框选中的数据标识数组。
    this.selectedValue = [];
}
//  重新刷新当前页码的数据。
DataList.prototype.render = function(isClearSelected)
{
    if (this.v.PageNumber == 0)
    {
        this.v.PageNumber = 1;
    }
    this.v.Entities = null;
    this.v.Content = null;
    var res = Vxun.BL.DataList.LoadData(this.v);
    if (res.error != null)
    {
        alert(res.error.Message);
    }
    else
    {
        var p = $(res.value.ParentID);
        p.innerHTML = res.value.Content;
        this.v = res.value;

        this.selectedIndex = [];
        this.selectedValue = [];
    }
};
DataList.prototype.setCompositor = function(compositor)
{
    compositor = "[" + compositor + "]";
    if (this.v.Compositor.indexOf(compositor) == 0)
    {
        if (this.v.Compositor == compositor)
        {
            this.v.Compositor = compositor + " DESC";
        }
        else
        {
            this.v.Compositor = compositor;
        }
    }
    else
    {
        this.v.Compositor = compositor;
    }
};
DataList.prototype.changePage = function(pageNumber, totalPageNumber)
{
    if (totalPageNumber != undefined)
    {
        pageNumber = parseInt(pageNumber);
        if (isNaN(pageNumber))
        {
            pageNumber = this.v.PageNumber;
        }
        if (pageNumber < 0)
        {
            pageNumber = -pageNumber;
        }
        if (pageNumber == 0)
        {
            pageNumber = 1;
        }
        else if (pageNumber > totalPageNumber)
        {
            pageNumber = totalPageNumber;
        }
    }

    this.v.PageNumber = pageNumber;
    this.render(false);
};
//  列表行数据的操作事件。
DataList.prototype.doAction = function(actionIndex, actionName, index, id)
{
};
//  列表行数据的单击事件。
DataList.prototype.doClick = function(index, id)
{
};
//  列表行数据的双击事件。
DataList.prototype.doDbClick = function(index, id)
{
};
//  列表行数据的按钮事件。
DataList.prototype.doButtonClick = function(index, id)
{
};

//-------------------------------------------------------------[Class] DataList----------------------------------------------------------//-->

//-------------------------------------------------------------[Class] DataView----------------------------------------------------------//
//  描述：  数据显示控件。
//  构造：  new DataView(displayInfo)
//              var displayInfo = {
//                  ID：                        [String]            JS中本对象的ID。
//                  ParentID：                  [String]            本对象的容器ID。
//                  InfoID：                    [String]            信息标识。
//                  IsOnlyContent：             [Boolean]           是否只显示内容。
//                  Title：                     [String]            信息标题。
//                  TypeName                    [String]            实体类型。
//                  DisplayType                 [Enumeration]       信息类型。
//              };
//  属性：
//          v：             [DisplayInfo]      数据实体信息。
//  方法：
//          render()
//          显示或刷新数据控件。
//-------------------------------------------------------------[Class] DataView----------------------------------------------------------//
//  数据显示控件。
function DataView(displayInfo)
{
    this.v = displayInfo;
}
//  重新刷新当前页码的数据。
DataView.prototype.render = function()
{
    this.v.Content = null;
    var res = Vxun.BL.DataView.LoadData(this.v);
    if (res.error != null)
    {
        alert(res.error.Message);
    }
    else
    {
        var p = $(res.value.ParentID);
        p.innerHTML = res.value.Content;
        this.v = res.value;
    }
};
//-------------------------------------------------------------[Class] DataView----------------------------------------------------------//-->