﻿/*
author:pang
created date:2007-9-13
used to:多级联动框
*/
function ClassList() {
    this.DataObj = null; //数据源对象，程序会从这个对象的value或innerText属性中取数据，可以是input,div,span等各种对象
    this.allClassList = new Array(); //根据dataObj生成的类别数组
    this.selectedValue = "-1"; //默认值
    this.listName = "QuestionClassList"; //生成的选择框的名称，会自动增加1，2，3在后面
    this.returnValueObjName = "__QuestionClassID"; //保存最终选择的值的对象名称ID;
    this.returnValueObjNameName = null; //保存最终选择的值的对象名称;
    this.classCodeWidth = 2; //每一级类别的字符宽度
    this.levelAmount = 3; //总的级别数
    this.listWidth = 0; //每个列表的宽度（默认根据内容的宽度显示）
    this.listRows = 10; //每个列表显示的行数
    this.bgColor = "#ffffff";
    this.showEmptyChild = true;//是否显示空列表

    //根据父类别code，返回一个数组列表
    this.getClassList = function(parentCode) {
         var retArray = new Array();
        for (var i = 0; i < this.allClassList.length; i++) {
            var child = this.allClassList[i].split("|");
            if ((!parentCode || child[1].indexOf(parentCode) == 0) && child[1].length == (parentCode ? parentCode : "").length + this.classCodeWidth) {
                retArray[retArray.length] = new Array(child[0], child[2], child[1]);
            }
        }
         return retArray;
    }

    //根据一个ID返回一个code值
    this.getClassCode = function(classId) {
        if (classId == '' || classId == -1) return "-1";
        for (var i = 0; i < this.allClassList.length; i++) {
            var child = this.allClassList[i].split("|");
            if (child[0] == classId) {
                return child[1];
                break;
            }
        }
        return "-1";
    }

    //根据一个code返回一个ID值
    this.getClassId = function(classCode) {
        if (classCode == '') return "-1";
        for (var i = 0; i < this.allClassList.length; i++) {
            var child = this.allClassList[i].split("|");
            if (child[1] == classCode) {
                return child[0];
                break;
            }
        }
        return "-1";
    }

    //初始化对象
    this.initAllList = function(id) {
        //初始化数据对象
        if (this.DataObj)
            this.allClassList = ($(this.DataObj).val() ? $(this.DataObj).val() : $(this.DataObj).text()).split(',');
        //初始化控件
        this.CreateListAndObject(id);

        //初始化一级类别
        var tmpObj = new SelectOperater(document.getElementById(this.listName + '0'));
        tmpObj.showEmpty = this.showEmptyChild;
        tmpObj.init(this.getClassList());

        //如果有默认值，选择默认值
        if (this.selectedValue != -1)
            this.setValue(this.selectedValue, true);
    }

    //返回value值
    this.value = function() {
        return $G(this.returnValueObjName).value;
    }

    //返回value对应的code值
    this.code = function() {
        return this.getClassCode($G(this.returnValueObjName).value);
    }
    //根据一个ID，获取某一部分对应的id
    this.getPartId = function(part) {
        var code = this.code();
        if (code == -1) return -1;
        if (part * this.classCodeWidth > code.length) return -1;
        return this.getClassId(code.substr(0, part * this.classCodeWidth));
    }

    //根据当前对象的值改变子类别值
    this.changeChild = function(srcObj) {
       
        var childObj = $G(srcObj.getAttribute("childListName"));
        if (childObj) {
            if (childObj.getAttribute("childListName") != "") {
                childObj.value = -1;
                this.changeChild(childObj);
            }
            var tmpObj = new SelectOperater(childObj);
            tmpObj.showEmpty = this.showEmptyChild;
            tmpObj.init(this.getClassList(this.getClassCode(srcObj.value)));  
        }

        //如果不是第一个列表框选择了 “不选”，则保存它前面那个列表框的值
        if (srcObj.value == -1 && srcObj.getAttribute("order") != 0)
            $G(this.returnValueObjName).value = $G(this.listName + (srcObj.getAttribute("order") - 1)).value;
        else
            $G(this.returnValueObjName).value = srcObj.value;
         
    }

    //设置value值，是否需要刷新对象
    this.setValue = function(value, hasRefresh) {
        this.clearValue();
        $G(this.returnValueObjName).value = value;
        if (hasRefresh && value != -1) {
            var thisCode = this.getClassCode(value);
            var level = thisCode.length / this.classCodeWidth;
            this.selectedValue = value;
            $G(this.listName + '0').value = this.getPartId(1);
            for (var i = 1; i <= level; i++) {
                if ($G(this.listName + i))
                    (new SelectOperater($G(this.listName + i))).init(this.getClassList(this.getClassCode($G(this.listName + (i - 1)).value)), this.getPartId(i + 1));
            }
        }
    }

    this.clearValue = function() {
        $G(this.listName + "0").value = -1;
        this.changeChild($G(this.listName + "0"));
    }

    //初始化控件
    this.CreateListAndObject = function(id) {
        this.returnValueObjNameName = this.returnValueObjNameName || this.returnValueObjName;
        var writetxt = "";
        var selectWidth = (this.listWidth == 0 ? 110 : this.listWidth);
        var selectSize = this.listRows;

        for (var i = 0; i < this.levelAmount; i++) {
            //是否是最后一个
            if (i == this.levelAmount - 1) {
                writetxt += "<select id=" + (this.listName + i) + " onchange=" + this.listName + ".changeChild(this) size=" + selectSize + " style='width:" + selectWidth + "px;;background-color:" + this.bgColor + "' order='" + i + "'></select>&nbsp;";
            }
            else {
                writetxt += "<select id=" + (this.listName + i) + " onchange=" + this.listName + ".changeChild(this) size=" + selectSize + " style='width:" + selectWidth + "px;background-color:" + this.bgColor + "' childListName='" + (this.listName + (i + 1)) + "' order='" + i + "'></select>&nbsp;";
            }
        }
        //保存最终value值的对象
        writetxt += "<input type=hidden id=" + this.returnValueObjName + " name=" + this.returnValueObjNameName  + " value=" + this.selectedValue + ">";
        if (id != undefined) {
            $G(id).innerHTML = writetxt;
        }
        else {
            document.write(writetxt);
        }
    }
}
