
//定义
//项－级联菜单项，即 CGradeMenuItem 实例。
//组－由一个或多个项构成，形成的下拉列表框。
//级联菜单－由一个或多个组构成，形成的各下拉列表框之间相关联的下拉列表框（组）。
//选项－下拉列表框的 Option，选项和项有关联，但又有不同，选项只是项的一部分数据。
//选项的 text 为项的 itemText，value 为项的索引。


//级联菜单项类
function CGradeMenuItem(itemID, itemText, itemValue, parentID)
{
    this.itemID = itemID;
    this.itemText = itemText;
    this.itemValue = itemValue;
    this.parentID = parentID;
}


//级联菜单类
//objStr 当前对象的名称，字符串类型。
//targetStr 用于显示控件的 HTML 标签 id 字符串。
//direction 组的排列方向，h－水平方向，v－竖直方向，其它值－水平方向。
//groupSize 下拉列表框的大小（size 属性）。
function CGradeMenu(objStr, targetStr)
{
    this.objStr = objStr;
    this.targetStr = targetStr;
    this.target = document.getElementById(this.targetStr);
    this.direction = "h"; //组的排列方向，h－水平方向，v－竖直方向，其它值－水平方向。
    this.groupSize = 1; //下拉列表框的大小（size 属性）。
    this.itemArr = new Array();
    
    this.AppendItem = CGradeMenu_AppendItem; //追加项。
    this.Create = CGradeMenu_Create; //创建级联菜单。
    this.BuildGroup = CGradeMenu_BuildGroup;
    this.GetGroupCnt = CGradeMenu_GetGroupCnt; //返回当前选择情况下组的级数。
    this.GetGroup = CGradeMenu_GetGroup; //返回当前选择情况下对应组的 HTML 对象。
}


//追加项。
function CGradeMenu_AppendItem(itemID, itemText, itemValue, parentID)
{
    this.itemArr[this.itemArr.length] = new CGradeMenuItem(itemID, itemText, itemValue, parentID);
}


//创建级联菜单。
//第一个参数为隐式参数，表示用 parentID 为该值的项构建第一级组，默认 0。
function CGradeMenu_Create()
{
    var parentID = (arguments.length<1)?0:arguments[0];
    this.target.innerHTML = "";
    
    this.BuildGroup(0, parentID); //构建第一级组。
}


//groupIndex 表示当前要构建的组的级别，如果为 0，则表示要构建第 1 级组，1 则表示第 2 级组……
//parentID 用 parentID 为该值的项构建当前组。
function CGradeMenu_BuildGroup(groupIndex, parentID)
{
    //清除 groupIndex 及其之后的菜单
    while (this.target.childNodes.length > groupIndex)
    {
        this.target.removeChild(this.target.lastChild);
    }
    
    //分析
    var itemIndexArr = new Array(); //将 parentID 等于参数 parentID 的项的索引赋予 itemIndexArr。
    var i = 0;
    for (i=0; i<this.itemArr.length; i++)
    {
        if (this.itemArr[i].parentID == parentID)
        {
            //属于要显示的项。
            itemIndexArr[itemIndexArr.length] = i;
        }
    }
    
    //构建
    if (itemIndexArr.length > 0)
    {
        //parentID 之下存在项。
        var board = this.target.appendChild(document.createElement((this.direction!="v")?"span":"div")); //为了实现水平方向和竖直方向的区别，多创建一层元素。
        var e = board.appendChild(document.createElement("<select name='"+ this.objStr + "_item_" + groupIndex +"'></select>"));
        e.size = this.groupSize;
        e.id = this.objStr + "_item_" + groupIndex;
        var eventStr = this.objStr + ".BuildGroup(" + (groupIndex+1) + ", " + this.objStr + ".itemArr[document.getElementById('" + e.id + "').value].itemID);document.getElementById('sortIdPath').value=gradeMenu.itemArr[gradeMenu.GetGroup(gradeMenu.GetGroupCnt()-1).options[gradeMenu.GetGroup(gradeMenu.GetGroupCnt()-1).options.selectedIndex].value].itemValue";
        if (window.attachEvent)
        {
            //IE
            e.attachEvent("onchange", function(){eval(eventStr)});
        }
        else
        {
            e.setAttribute("onchange", "javascript:" + eventStr);
        }
        
        for (i=0; i<itemIndexArr.length; i++)
        {
            e.options[e.options.length] = new Option(this.itemArr[itemIndexArr[i]].itemText, itemIndexArr[i]);
        }
        
        //在 FF 中，如果下拉列表框的 size 为 1，那么选择第一个选项时不会触发 onchange
        //所以我们按已经选择了第一项的方案处理
        e.options.selectedIndex = 0;
        this.BuildGroup(groupIndex+1, this.itemArr[itemIndexArr[0]].itemID);
    }
}


//返回当前选择情况下组的级数。
function CGradeMenu_GetGroupCnt()
{
    return this.target.childNodes.length;
}


//返回当前选择情况下对应组的 HTML 对象。
function CGradeMenu_GetGroup(groupIndex)
{
    return this.target.childNodes[groupIndex].childNodes[0];
}