查看完整版本: 多种自动下拉式菜单

tension 2007-10-11 17:45

多种自动下拉式菜单

脚本说明:
把如下代码加入<body>区域中
<style>
.BODY
{
    FONT-SIZE: 9pt;
}
TABLE.datatable
{
    CURSOR: default;
    BORDER-COLLAPSE: collapse
}
TABLE.datatable THEAD
{
    FONT-SIZE: 9pt;
    BACKGROUND-COLOR: #e0e0e0;
    TEXT-ALIGN: center
}
TABLE.datatable TBODY
{
    FONT-SIZE: 9pt
}
TABLE.datatable TFOOT
{
    FONT-SIZE: 9pt;
    BACKGROUND-COLOR: #e0e0e0;
    TEXT-ALIGN: center
}
TABLE.datatable TR.tr1
{
    BACKGROUND-COLOR: white
}
TABLE.datatable TR.tr2
{
    BACKGROUND-COLOR: whitesmoke
}
TABLE.datatable TR.active_tr
{
    BACKGROUND-COLOR: #e0f0ff;
}
TABLE.datatable TR.current_tr
{
    BACKGROUND-COLOR: #ffebcd;
}
TABLE.datatable TD.active_cell
{
    BACKGROUND-COLOR: #ffffe0;
}
TABLE.dropdowntable
{
    BORDER-RIGHT: gray 1px solid;
    BORDER-TOP: gray 1px solid;
    BORDER-LEFT: gray 1px solid;
    CURSOR: default;
    BORDER-BOTTOM: gray 1px solid;
    BORDER-COLLAPSE: collapse
}
TABLE.dropdowntable THEAD
{
    FONT-WEIGHT: bolder;
    FONT-SIZE: 9pt;
    BACKGROUND-COLOR: #d7ebeb;
    TEXT-ALIGN: center
}
TABLE.dropdowntable TBODY
{
    FONT-SIZE: 9pt
}
TABLE.dropdowntable TFOOT
{
    FONT-SIZE: 9pt;
    BACKGROUND-COLOR: #d7ebeb
}
TABLE.dropdowntable TR.tr1
{
    BACKGROUND-COLOR: #f0f9ff
}
TABLE.dropdowntable TR.tr2
{
    BACKGROUND-COLOR: #e0f0ff
}
TABLE.dropdowntable TR.active_tr
{
    BACKGROUND-COLOR: #ffebcd
}
TABLE.dropdowntable TR.current_tr
{
    BACKGROUND-COLOR: #ffebcd;
}
.editor
{
    FONT-SIZE: 9pt;
    BORDER-RIGHT: DarkGray 1px solid;
    BORDER-TOP: DarkGray 1px solid;
    SCROLLBAR-FACE-COLOR: window;
    SCROLLBAR-HIGHLIGHT-COLOR: lightgrey;
    BORDER-LEFT: DarkGray 1px solid;
    SCROLLBAR-SHADOW-COLOR: gray;
    SCROLLBAR-3DLIGHT-COLOR: window;
    BORDER-BOTTOM: DarkGray 1px solid;
    SCROLLBAR-DARKSHADOW-COLOR: window;
}
.active_editor
{
    FONT-SIZE: 9pt;
    BORDER-RIGHT: #333333 1px solid;
    BORDER-TOP: #333333 1px solid;
    SCROLLBAR-FACE-COLOR: #f0f9ff;
    SCROLLBAR-HIGHLIGHT-COLOR: lightgrey;
    BORDER-LEFT: #333333 1px solid;
    SCROLLBAR-SHADOW-COLOR: gray;
    SCROLLBAR-3DLIGHT-COLOR: #f0f9ff;
    BORDER-BOTTOM: #333333 1px solid;
    SCROLLBAR-DARKSHADOW-COLOR: #f0f9ff;
    BACKGROUND-COLOR: #e0f0ff;
}
.dockeditor
{
    FONT-SIZE: 9pt;
    BORDER-RIGHT: #333333 1px solid;
    BORDER-TOP: #333333 1px solid;
    SCROLLBAR-FACE-COLOR: window;
    SCROLLBAR-HIGHLIGHT-COLOR: lightgrey;
    BORDER-LEFT: #333333 1px solid;
    SCROLLBAR-SHADOW-COLOR: gray;
    SCROLLBAR-3DLIGHT-COLOR: window;
    BORDER-BOTTOM: #333333 1px solid;
    SCROLLBAR-DARKSHADOW-COLOR: window
}
.button
{
    BORDER-RIGHT: DarkGray 1px solid;
    BORDER-TOP: DarkGray 1px solid;
    FONT-SIZE: 9pt;
    BORDER-LEFT: DarkGray 1px solid;
    CURSOR: hand;
    BORDER-BOTTOM: DarkGray 1px solid;
    HEIGHT: 22px;
    BACKGROUND-COLOR: #d4d0c8;
}
.button_down
{
    BORDER-RIGHT: #dddddd 1px solid;
    BORDER-TOP: #666666 1px solid;
    FONT-SIZE: 9pt;
    BORDER-LEFT: #666666 1px solid;
    CURSOR: hand;
    BORDER-BOTTOM: #dddddd 1px solid;
    HEIGHT: 22px;
    BACKGROUND-COLOR: #fff1da
}
TABLE.datapilot
{
    CURSOR: default;
}
TABLE.datapilot BUTTON
{
    CURSOR: hand;
    HEIGHT: 20px
}
.editorholder
{
}
.datascrollbar
{
    CURSOR: hand;
}
TABLE.tree
{
    BORDER-RIGHT: silver 1px solid;
    BORDER-TOP: silver 1px solid;
    BORDER-LEFT: silver 1px solid;
    CURSOR: default;
    BORDER-BOTTOM: silver 1px solid;
    BORDER-COLLAPSE: collapse
}
TABLE.tree TBODY
{
    FONT-SIZE: 9pt
}
TABLE.tree TR.tr1
{
    HEIGHT: 20px;
    BACKGROUND-COLOR: white
}
TABLE.tree TR.tr2
{
    HEIGHT: 20px;
    BACKGROUND-COLOR: white
}
TABLE.tree TR.active_tr
{
    HEIGHT: 20px;
    BACKGROUND-COLOR: #ffebcd
}
TABLE.tree TR.rightclick_tr
{
    HEIGHT: 20px;
    BACKGROUND-COLOR: #e0f0ff
}
TABLE.tree BUTTON
{
    BORDER-RIGHT: gray 1px solid;
    BORDER-TOP: gray 1px solid;
    MARGIN-BOTTOM: 2px;
    BORDER-LEFT: gray 1px solid;
    WIDTH: 11px;
    CURSOR: hand;
    MARGIN-RIGHT: 3px;
    BORDER-BOTTOM: gray 1px solid;
    HEIGHT: 15px
}
TABLE.tree IMG
{
    MARGIN-RIGHT: 2px
}
.fieldlabel
{
    font-size:9pt;
}
.datalabel
{
    font-size:9pt;
}
.tabpage
{
    border-bottom: gray 1px solid;
    font-size:9pt;
    cursor: default;
}
#CalendarTable
{
    BORDER-COLLAPSE: collapse;
    BORDER-RIGHT: gray 1px solid;
    BORDER-TOP: gray 1px solid;
    FONT-SIZE: 9pt;
    BORDER-LEFT: gray 1px solid;
    BORDER-BOTTOM: gray 1px solid;
    CURSOR: default
}
#CalendarTable .calendar_title
{
    BACKGROUND-COLOR: #e4e4e4;
}
#CalendarTable .calendar_footer
{
    BACKGROUND-COLOR: #e4e4e4;
}
#CalendarTable .calendar_week
{
    BACKGROUND-COLOR: #e4e4e4;
}
#CalendarTable .calendar_data
{
    BACKGROUND-COLOR: #f0f9ff;
}
.title1
{
    HEIGHT: 26;
    FONT-WEIGHT: bold;
    FONT-SIZE: 10pt;
    COLOR: #2f2f2f;
    MARGIN-BOTTOM: 4pt;
    filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr=silver, EndColorStr=white)
}
.title2
{
    HEIGHT: 20;
    BACKGROUND-COLOR: #d4d0c8;
    BORDER-RIGHT: 1px outset;
    BORDER-TOP: 1px outset;
    MARGIN-BOTTOM: 2px;
    BORDER-LEFT: 1px outset;
    BORDER-BOTTOM: 1px outset;
    BORDER-COLLAPSE: collapse;
    FONT-SIZE: 9pt
}
.footer1
{
    BACKGROUND-COLOR: white;
    MARGIN-BOTTOM: 2pt;
}
DIV
{
    SCROLLBAR-FACE-COLOR: Gainsboro;
    SCROLLBAR-HIGHLIGHT-COLOR: gray;
    SCROLLBAR-SHADOW-COLOR: gray;
    SCROLLBAR-3DLIGHT-COLOR: Gainsboro;
    SCROLLBAR-DARKSHADOW-COLOR: Gainsboro;
    SCROLLBAR-ARROW-COLOR: gray;
}
</style>
<script language="javascript">
<!--

//---- General Setting ----
var xForm_Library_path = "/xform/_xForm_Library/";
var showSubmitCommand = false;
var disableSystemContextMenu = false;

//---- String Table ----
var constErrType = "错误类型";
var constErrDescription = "错误描述";
var constErrUnknown = "未知错误!";
var constErrDataType = "数据超长或类型不匹配!";
var constErrKeyViolence = "主键或外键约束错误!";
var constErrUnsupportBrowse = "由于您使用的不是 Microsoft Internet Explorer 5.0 或更高版本的浏览器,您将无法获得本页面正确的显示结果!\n本页面中使用的 xForm 技术推荐您使用 Microsoft Internet Explorer 5.5 或更高版本的浏览器,以获得最佳的运行效果。";
var constErrDownLoadFailed = "下载数据失败!";
var constErrUpdateFailed = "保存数据失败!";
var constErrAddDataField = "您不能对已完成初始化的记录集添加字段!";
var constErrEmptyFieldName = "字段名不能为空!";
var constErrCantFindMasterField = "主表字段%s不存在!";
var constErrCantFindDetailField = "从表字段%s不存在!";
var constErrLoadPageOnDetailDataset = "已建立主从绑定的从表记录集不能执行分批下载!";
var constErrLoadPageAfterSort = "已进行客户端排序的记录集不能执行分批下载!";
var constErrFieldValueRequired = "字段[%s]的内容不能为空!";
var constErrKeyFieldRequired = "没有定义主键字段!";
var constErrUpdateFieldRequired = "没有可更新的字段!";
var constErrTypeInt = "您输入的值[%s]不是一个有效的整数!";
var constErrTypeNumber = "您输入的值[%s]不是一个有效的数字!";
var constErrTypeDate = "您输入的值[%s]不是一个有效的日期型值!";
var constErrTypeDateTime = "您输入的值[%s]不是一个有效的日期+时间型值!";
var constErrTypeTime = "您输入的值[%s]不是一个有效的时间型值!";
var constErrOutOfDropDownList = "您输入了无效的值!";
var constErrNoCurrentRecord = "由于记录集没有当前记录而无法修改字段值!";

var constDatasetConfirmCancel = "您确定要撤消对当前记录的修改吗?";
var constDatasetConfirmDelete = "您确定要删除当前记录吗?";
var constDatasetMoveFirst = "移动到第一条记录";
var constDatasetPrevPage = "向前翻页";
var constDatasetMovePrev = "移动到上一条记录";
var constDatasetMoveNext = "移动到下一条记录";
var constDatasetNextPage ="向后翻页";
var constDatasetMoveLast = "移动到最后一条记录";
var constDatasetInsertRecord = "插入一条新记录";
var constDatasetAppendRecord = "添加一条新记录";
var constDatasetDeleteRecord = "删除当前记录";
var constDatasetEditRecord = "修改当前记录";
var constDatasetCancelRecord = "撤销对当前记录的修改";
var constDatasetUpdateRecord = "确认对当前记录的修改";

var constBtnInsertRecord = "插入";
var constBtnAppendRecord = "添加";
var constBtnDeleteRecord = "删除";
var constBtnEditRecord = "修改";
var constBtnCancelRecord = "撤销";
var constBtnUpdateRecord = "确认";

var constJanuary = "一月";
var constFebrary = "二月";
var constMarch = "三月";
var constApril = "四月";
var constMay = "五月";
var constJune = "六月";
var constJuly = "七月";
var constAugust = "八月";
var constSeptember = "九月";
var constOctober= "十月";
var constNovember = "十一月";
var constDecember = "十二月";

var constMonday = "一";
var constTuesday = "二";
var constWednesday = "三";
var constThursday = "四";
var constFriday = "五";
var constSaturday = "六";
var constSunday = "日";

var constLastYear = "上一年";
var constNextYear = "下一年";
var constLastMonth = "上个月";
var constNextMonth = "下个月";
var constToday = "今天";

var constDownLoadingData = "正在下载数据...";
var constCancelSort = "不排序";

//-->

//-----------------------
// xForm v2.0
// Developer: bao yilei
// Nov, 2001
//-----------------------

var _rightclick_row=null;

function initTree(tree){
        for (var i=1; i<=8; i++){
                var tmpDataset=tree.getAttribute("dataset"+i);
                if (typeof(tmpDataset)!="undefined") eval("tree.dataset"+i+"="+tmpDataset+";");
        }

        tree.repeatrow=tree.rows[0].cloneNode(true);
        tree.deleteRow(0);

        var nodes=new pArray();
        nodes.level=1
        nodes.tree=tree;
        tree.nodes=nodes;
}

function getTreeNodeStyle(row){
        if (row.rowIndex % 2)
                return "tr1";
        else
                return "tr2";
}

function refreshTreeNodeColor(row){
        var tree=getTableByRow(row);
        var selectNode=tree.selectNode;
        if (selectNode && selectNode.row==row){
                row.className="active_tr";
        }
        else{
                row.className=getTreeNodeStyle(row);
        }
}

function refreshTreeColor(tree, startIndex){
        var row;
        var maxIndex=tree.rows.length-1;
        for(var i=startIndex; i<=maxIndex; i++){
                row=tree.rows[i];
                refreshTreeNodeColor(row);
        }
}

function refreshTree(tree){
        clearChildTreeNodes(tree);

        expandTreeNode(tree);
        var nodes=tree.nodes;
        setActiveTreeNode(tree, nodes.firstUnit);
}

function refreshTreeNode(node){
        var row=node.row;
        if (row){
                for(var i=0; i<row.cells.length; i++)
                        refreshElementValue(row.cells[i]);
        }
}

function insertTreeNode(tree, parentNode, label, tag, record, mode, node){

        function getSlideNext(node){
                if (node){
                        var result=node.nextUnit;
                        if (!result) result=getSlideNext(node.parentNode);
                        return result;
                }
        }

        var nodes, level;
        if (parentNode){
                if (!parentNode.childNodes) parentNode.childNodes=new pArray();
                nodes=parentNode.childNodes;
                level=parentNode.level;
        }
        else{
                nodes=tree.nodes;
                level=0;
        }
        if (!nodes) return;

        var newNode=new Object();
        newNode.tree=tree;
        newNode.level=level+1;
        newNode.parentNode=parentNode;
        newNode.label=label;
        newNode.tag=tag;
        newNode.record=record;
        newNode.hasChild=true;
        newNode.expanded=false;

        var newRow;
        if (!parentNode || (parentNode && (parentNode.expanding || parentNode.expanded))){
                var _mode, _node;
                switch (mode){
                        case "begin":{
                                _node=nodes.firstUnit;
                                if (_node){
                                        _mode="before";
                                }
                                else{
                                        _mode="after";
                                        if (node) _node=node.parentNode;
                                }
                                break;
                        }
                        case "before":{
                                _node=node;
                                _mode="before";
                                break;
                        }
                        case "after":{
                                _node=node.nextUnit;
                                if (_node){
                                        _mode="before";
                                }
                                else{
                                        _node=getSlideNext(node.parentNode);
                                        if (_node){
                                                _mode="before";
                                        }
                                        else{
                                                _mode="end";
                                        }
                                }
                                break;
                        }
                        default:{
                                _node=getSlideNext(parentNode);
                                if (_node){
                                        _mode="before";
                                }
                                else{
                                        _mode="end";
                                }
                                break;
                        }
                }

                if (!_node){
                        _mode="end";
                }
                else{
                        var row=_node.row;
                }

                newRow=tree.repeatrow.cloneNode(true);
                switch (_mode){
                        case "begin":{
                                tree.tBodies[0].insertAdjacentElement("afterBegin", newRow);
                                break;
                        }
                        case "before":{
                                row.insertAdjacentElement("beforeBegin", newRow);
                                break;
                        }
                        case "after":{
                                row.insertAdjacentElement("afterEnd", newRow);
                                break;
                        }
                        default:{
                                tree.tBodies[0].insertAdjacentElement("beforeEnd", newRow);
                                break;
                        }
                }
                newRow.cells[0].node=newNode;
                newNode.row=newRow;
        }

        pArray_insert(nodes, mode, node, newNode);

        if (parentNode){
                parentNode.hasChild=true;
                refreshTreeNode(parentNode);
        }

        if (tree.selectNode==null) setActiveTreeNode(tree, newNode);

        var eventName=getElementEventName(tree, "onInitTreeNode");
        fireUserEvent(eventName, [tree, newNode]);

        refreshTreeNode(newNode);
        if (newRow) refreshTreeColor(tree, newRow.rowIndex);

        return newNode;
}

function deleteTreeNode(node){
        var tree=node.tree;
        var nodes;
        if (node.parentNode)
                nodes=node.parentNode.childNodes;
        else
                nodes=tree.nodes;
        collapseTreeNode(tree, node);
        pArray_delete(nodes, node);
        if (node.row){
                var rowIndex=node.row.rowIndex;
                node.row.removeNode(true);
                refreshTreeColor(tree, rowIndex);
                node.row=null;
        }

        if (node==tree.rightSelectNode) tree.rightSelectNode=null;
        if (node==tree.selectNode) tree.selectNode=null;

        if (node.parentNode){
                var parentNode=node.parentNode;
                parentNode.hasChild=(parentNode.childNodes)?parentNode.childNodes.length:false;
                refreshTreeNode(parentNode);
        }
}

function _expandTreeNode(node){
        var nodes=node.childNodes;
        if (!nodes) return;

        var tree=node.tree;
        var row=node.row;

        var _node=nodes.firstUnit;
        while (_node){
                var newRow=tree.repeatrow.cloneNode(true);
                row.insertAdjacentElement("afterEnd", newRow);
                newRow.cells[0].node=_node;
                _node.row=newRow;
                refreshTreeNode(_node);

                row=newRow;
                _node=_node.nextUnit;
        }

        _node=nodes.firstUnit;
        while (_node){
                if (_node.expanded) _expandTreeNode(_node);
                _node=_node.nextUnit;
        }
}

function expandTreeNode(tree, node){
        try{
                if (node){
                        if (node.expanded) return;
                        var eventName=getElementEventName(tree, "beforeExpandNode");
                        var event_result=fireUserEvent(eventName, [tree, node]);
                        if (event_result) throw event_result;
                        node.expanding=true;
                }

                if (node && node.childNodes){
                        _expandTreeNode(node);
                }
                else{
                        var level=(node)?node.level:0;
                        eval("var child_dataset=tree.getAttribute(\"dataset"+(level+1)+"\");");
                        if (child_dataset){
                                if (level>0){
                                        eval("var dataset=tree.getAttribute(\"dataset"+level+"\");");
                                        if (dataset) dataset.setRecord(node.record);
                                }

                                var record=child_dataset.getFirstRecord();
                                while (record){
                                        insertTreeNode(tree, node, record[0], null, record);
                                        record=record.getNextRecord();
                                }
                        }
                }

                var eventName=getElementEventName(tree, "afterExpandNode");
                fireUserEvent(eventName, [tree, node]);

                if (node){
                        node.expanded=true;
                        node.hasChild=(node.childNodes)?node.childNodes.length:false;
                        refreshTreeColor(node.tree, node.row.rowIndex);
                        refreshTreeNode(node);
                }
        }
        catch (e){
                processException(e);
        }
        finally{
                if (node) node.expanding=false;
        }
}

function _collapseTreeNode(node){
        if (!node.childNodes) return;

        var _node=node.childNodes.firstUnit;
        while (_node){
                if (_node==_node.tree.selectNode){
                        _node.tree.selectNode=null;
                        setActiveTreeNode(_node.tree, _node.tree.nodes.firstUnit);
                }

                _collapseTreeNode(_node);
                if (_node.row) _node.row.removeNode(true);
                _node=_node.nextUnit;
        }
}

function collapseTreeNode(tree, node){
        try{
                if (!node) return;
                if (!node.expanded) return;

                var eventName=getElementEventName(tree, "beforeCollapseNode");
                var event_result=fireUserEvent(eventName, [tree, node]);
                if (event_result) throw event_result;

                _collapseTreeNode(node);

                var eventName=getElementEventName(tree, "beforeCollapseNode");
                fireUserEvent(eventName, [tree, node]);

                node.expanded=false;
                refreshTreeColor(node.tree, node.row.rowIndex);
                refreshTreeNode(node);
        }
        catch (e){
                processException(e);
        }
}

function clearChildTreeNodes(tree, node){
        function deleteNodes(nodes){
                var unit=nodes.firstUnit;
                var _unit;
                while (unit){
                        _unit=unit;
                        unit=unit.nextUnit;
                        deleteTreeNode(_unit);
                }
        }

        if (node){
                if (node.childNodes){
                        deleteNodes(node.childNodes);
                        delete(node.childNodes);
                }
        }
        else{
                var nodes=tree.nodes;
                if (nodes)
                {
                        deleteNodes(nodes);
                }
        }
}

function TreeNodeClick(tree, node){
        if (node && node.expanded){
                collapseTreeNode(tree, node);
        }
        else{
                expandTreeNode(tree, node);
        }
}

function setActiveTreeNode(tree, node){
        var old_node=tree.selectNode;
        var old_row, row;
        if (old_node) old_row=old_node.row;
        if (node) row=node.row;

        if (old_row!=row){
                tree.selectNode=node;
                if (old_row) refreshTreeNodeColor(old_row);
                if (row) refreshTreeNodeColor(row);

                clearTimeout(tree.timeout_id);
                _stored_element=[tree, node];
                var eventName=getElementEventName(tree, "onNodeChanged");
                if (isUserEventDefined(eventName))
                        tree.timeout_id=setTimeout("fireUserEvent("+eventName+", _stored_element);", 400);
        }
}

function resetRightClickRow(){
        try{
                if (_rightclick_row) refreshTreeNodeColor(_rightclick_row);
        }
        catch (e){
                //do nothing
        }
        finally{
                _rightclick_row=null;
        }
}

function _tree_expendclick(button){
        var cell=button.treenode;
        var row=getRowByCell(cell);
        var node=row.cells[0].node;
        var tree=getTableByRow(row);

        TreeNodeClick(tree, node);
        event.cancelBubble=true;
}

function _tree_onmousedown(row){
        if (event.srcElement.id=="_button_expand") return;

        var tree=getTableByRow(row);
        var selectNode=tree.selectNode;
        var node=row.cells[0].node;

        if (event.button==2){
                if (isTrue(tree.getAttribute("rightSelect"))){
                        tree.rightSelectNode=node;
                        row.className="rightclick_tr";

                        try{
                                if (_rightclick_row) refreshTreeNodeColor(_rightclick_row);
                        }
                        catch (e){
                                //do nothing
                        }
                        _rightclick_row=row;
                        setTimeout("resetRightClickRow()", 1000);
                }
                else
                        setActiveTreeNode(tree, node);
        }
        else{
                setActiveTreeNode(tree, node);
        }
}

function processTreeKeyDown(tree, keycode){

        function getCurrentNode(){
                var node=tree.selectNode;
                if (!node){
                        var nodes=tree.nodes;
                        node=nodes.firstUnit;
                }
                return node;
        }

        switch (keycode){
                //Left
                case 37:{
                        var node=getCurrentNode();
                        if (node && node.hasChild && node.expanded){
                                TreeNodeClick(tree, node);
                        }
                        break;
                }
                //Up
                case 38:{
                        var node=getCurrentNode();
                        var rowIndex=node.row.rowIndex;
                        if (rowIndex>0){
                                setActiveTreeNode(tree, tree.rows[rowIndex-1].cells[0].node);
                        }
                        break;
                }
                //Right
                case 39:{
                        var node=getCurrentNode();
                        if (node && node.hasChild && !node.expanded){
                                TreeNodeClick(tree, node);
                        }
                        break;
                }
                //Down
                case 40:{
                        var node=getCurrentNode();
                        var rowIndex=node.row.rowIndex;
                        if (rowIndex+1<tree.rows.length){
                                setActiveTreeNode(tree, tree.rows[rowIndex+1].cells[0].node);
                        }
                        break;
                }
        }
}

function _tree_onkeydown(tree){
        processTreeKeyDown(tree, event.keyCode);
}

//-----------------------
// xForm v2.0
// Developer: bao yilei
// Nov, 2001
//-----------------------

var _activeElement=null;
var _activeEditor=null;
var _activeTable=null;
var _dropdown_window=null;

var _app_id="", _page_id="";

var _document_loading=false;
var _stored_element=null;
var _array_dataset=new Array();
var _tabpage_list=new Array();

var _skip_activeChanged=false;

function getIEVersion(){
        var index=window.clientInformation.userAgent.indexOf("MSIE");
        if (index<0){
                return "";
        }
        else{
                return window.clientInformation.userAgent.substring(index+5, index+8);
        }
}

function getRowByCell(cell){
        return cell.parentElement;
}

function getTableByCell(cell){
        var tbody=getRowByCell(cell).parentElement;
        if (tbody) return tbody.parentElement;
}

function getTableByRow(row){
        var tbody=row.parentElement;
        if (tbody) return tbody.parentElement;
}

function getElementEventName(element, eventName){
        var result="";
        if (element.attrib!="dockeditor")
                result=element.id+"_"+eventName;
        else{
                var holder=element.editorHolder;
                if (holder) result=holder.id+"_"+eventName;
        }
        return result;
}

function isUserEventDefined(function_name){
        if (function_name=="") return false;
        var result;
        eval("result=(typeof("+function_name+")!=\"undefined\");");
        return result;
}

function fireUserEvent(function_name, param){
        var result;
        var paramstr="";
        for(i=0; i<param.length; i++){
                if (i==0)
                         paramstr="param["+i+"]";
                 else
                         paramstr=paramstr+",param["+i+"]";
        }

        if (isUserEventDefined(function_name))
                eval("result="+function_name+"("+paramstr+");");
        return result;
}

function processActiveElementChanged(activeElement){

        function isChildofTable(obj) {
                var result=null;
                var tmpObj;

                if (obj.getAttribute("attrib")=="dockeditor")
                        tmpObj=obj.editorHolder;
                else
                        tmpObj=obj;

                if (tmpObj.getAttribute("attrib")=="tablecell") result=getTableByCell(tmpObj);
                return result;
        }

        function set_activeEditor(editor){
                if (_activeEditor!=editor){
                        if (_activeEditor){
                                if (needUpdateEditor){
                                        if (_activeEditor.window==window)
                                                updateEditorInput(_activeEditor);
                                        else
                                                _activeEditor.window.updateEditorInput(_activeEditor);
                                }
                                if (typeof(hideDropDownBtn)!="undefined") hideDropDownBtn();
                               
                                switch (_activeEditor.getAttribute("attrib")){
                                        case "editor":{
                                                _activeEditor.className="editor";
                                                break;
                                        }
                                        case "dockeditor":{
                                                hideDockEditor(_activeEditor);
                                                break;
                                        }
                                }
                                _activeEditor.use_keyField=false;
                                refreshElementValue(_activeEditor);
                        }

                        if (editor && !editor.readOnly){
                                var field=getElementField(editor);

                                if (editor.getAttribute("attrib")=="editor"){
                                        editor.className="active_editor";
                                        if (field){
                                                editor.dataType=field.dataType;
                                                editor.editorType=field.editorType;
                                        }
                                }

                                if (field) editor.maxLength=(field.size>0)?field.size:2147483647;
                                if (editor.getAttribute("dataType")=="date" || editor.getAttribute("dataType")=="datetime")
                                        editor.dropDown_mode="date";

                                editor.contentEditable=(!isTrue(editor.getAttribute("dropDown_fixed")));

                                editor.use_keyField=true;
                                refreshElementValue(editor);

                                if (!isTrue(editor.getAttribute("dropDown_fixed")) && !compareText(editor.type, "checkbox")) editor.select();
                                if (typeof(showDropDownBtn)!="undefined"){
                                        showDropDownBtn(editor);
                                        if (isTrue(editor.getAttribute("autoDropDown"))){ showDropDownBox(editor);}
                                }
                        }

                        _activeEditor=editor;
                }
        }

        function processElementBlur(){
                var doblur=(activeElement!=_activeEditor);

                if (_activeElement){
                        if (typeof(_dropdown_btn)!="undefined" && _dropdown_btn){
                                doblur=doblur && (_activeElement!=_dropdown_btn) &&
                                        (activeElement!=_dropdown_btn);
                        }

                        if (typeof(_dropdown_box)!="undefined" && _dropdown_box){
                                var editor=_dropdown_box.editor;
                                doblur=doblur && (activeElement!=editor) &&
                                        (!isChild(activeElement, _dropdown_box));
                        }

                        if (doblur){
                                if (_activeEditor && _activeEditor.dropDown_visible){
                                        if (typeof(hideDropDownBox)!="undefined") hideDropDownBox();
                                        hideStatusLabel(window);
                                }                               
                                set_activeEditor(null);
                        }
                }
                else{
                        doblur=false;
                }

                if (activeElement==document.body && _skip_activeChanged){
                        _skip_activeChanged=false;
                        return;
                }

                if ((doblur || !_activeEditor)){
                        var activeTable=isChildofTable(activeElement);
                        if (_activeTable!=activeTable){
                                if (_activeTable){
                                        _activeTable.focused=false;

                                        var row=_activeTable.activeRow;
                                        if (row) refreshTableRowStyle(row);

                                        var eventName=getElementEventName(_activeTable, "onBlur");
                                        fireUserEvent(eventName, [_activeTable]);
                                }

                                _activeTable=activeTable;

                                if (_activeTable){
                                        _activeTable.focused=true;

                                        var row=_activeTable.activeRow;
                                        if (row) refreshTableRowStyle(row);

                                        var eventName=getElementEventName(_activeTable, "onFocus");
                                        fireUserEvent(eventName, [_activeTable]);
                                }
                        }
                }
        }

        try{
                if (window.closed) return;
                if (activeElement==_activeElement) return;

                if (activeElement){
                        processElementBlur();

                        switch (activeElement.getAttribute("attrib")){
                                case "tablecell":{
                                        var row=getRowByCell(activeElement);
                                        var table=getTableByRow(row);
                                        var dataset=getElementDataset(activeElement);

                                        table._activeCell=activeElement;
                                        table._activeCellIndex=activeElement.cellIndex;
                                        if (row.record){
                                                if (dataset.window==window)
                                                        _dataset_setRecord(dataset, row.record);
                                                else
                                                        dataset.window._dataset_setRecord(dataset, row.record);
                                        }
                                        setActiveTableCell(row, activeElement.cellIndex);
                                        break;
                                }
                                case "editor":;
                                case "dockeditor":{
                                        set_activeEditor(activeElement);
                                        break;
                                }
                        }
                }
                _activeElement=activeElement;
        }
        catch(e){
                processException(e);
        }
}

function _document_onpropertychange() {
        if (event.propertyName=="activeElement")
                processActiveElementChanged(document.activeElement);
}

function _document_onkeydown(){
        switch (event.keyCode){
                case 123:{
                        if (_app_id && _page_id){
                                showModalDialog(xForm_Library_path+"tool/property.asp?app_id="+_app_id+"&page_id="+_page_id+"&modal_mode=1", document,
                                                "dialogHeight: 440px; dialogWidth: 600px; center: Yes; help: No; resizable: Yes; status: No");
                        }
                        break;
                }
        }

}

function _document_oncontextmenu(){
        event.returnValue=(!disableSystemContextMenu);
        if (typeof(_array_menu)=="undefined") return;
        for(var i=0; i<_array_menu.length; i++){
                var strHolders=_array_menu[i].popupHolders;
                if (getValidStr(strHolders)!=""){
                        var arrayHolder=strHolders.split(",");
                        for(var j=0; j<arrayHolder.length; j++){
                                if (arrayHolder[j]=="") continue;
                                var needPopup;
                                eval("needPopup=isChild(event.srcElement,"+arrayHolder[j]+")");
                                if (needPopup){
                                        showPopupMenu(_array_menu[i]);
                                        event.returnValue=false;
                                        return;
                                }
                        }
                }
        }
}

function _control_onkeydown() {

        function getCell(element){
                if (element.getAttribute("attrib")=="tablecell")
                        return element;
                else if (element.in_table)
                        return element.editorHolder;
        }

        function processTab(element){
                var obj=null;
                if (element.in_table){
                        obj=element.editorHolder;
                }
                else{
                        obj=element;
                }
                if (!obj) return;
                if (event.shiftKey)
                        obj=getPriorTabElement(obj);
                else
                        obj=getNextTabElement(obj);

                if (obj){
                        try{
                                obj.focus();
                                event.returnValue=false;
                        }
                        catch(e){
                                event.returnValue=true;
                        }
                }
        }

        element=event.srcElement;
        if (isDropdownBoxVisible()){
                if (_dropdown_window) _dropdown_window.processDropDownKeyDown(event.keyCode);
                event.returnValue=true;
        }
        else{
                var rowindex, colindex;
                switch (event.keyCode) {
                        //Tab
                        case 9:{
                                processTab(element);
                                break;
                        }
                        //Enter
                        case 13:{
                                if (!compareText(element.tagName, "textarea") || event.shiftKey || event.ctrlKey || event.altKey){
                                        var cell=getCell(element);
                                        if (cell && !event.shiftKey){
                                                var row=getRowByCell(cell);
                                                var table=getTableByRow(row);
                                                var maxIndex=checkTableCellIndex(table, 9999, 9999);
                                                if (row.rowIndex==maxIndex[0] && cell.cellIndex==maxIndex[1] && !isTrue(table.getAttribute("readOnly"))){
                                                        var dataset=getElementDataset(element);
                                                        dataset.insertRecord("end");
                                                        dataset.modified=false;
                                                        setActiveTableCell(table.activeRow, 0);
                                                }
                                                else
                                                        processTab(element);
                                        }
                                }
                                break;
                        }
                        //ESC
                        case 27:{
                                if (!element.modified){
                                        var dataset=getElementDataset(element);
                                        if (!dataset || dataset.state=="none") break;

                                        var cell=getCell(element);
                                        if (cell && !isTrue(getTableByCell(cell).getAttribute("readOnly"))){
                                                if (isTrue(getTableByCell(cell).getAttribute("confirmCancel"))){
                                                        if (confirm(constDatasetConfirmCancel)){
                                                                dataset.cancelRecord();
                                                        }
                                                }
                                                else{
                                                        dataset.cancelRecord();
                                                }
                                        }
                                }
                                else{
                                        setElementValue(element, element.old_value);
                                }
                                event.returnValue=false;
                                break;
                        }
                        //Left
                        case 37:{
                                var cell=getCell(element);
                                if (cell){
                                        if ((event.ctrlKey) || (event.altKey)){
                                                var table=getTableByCell(cell);
                                                var rowIndex=getRowByCell(cell).rowIndex;
                                                var cellIndex=cell.cellIndex;
                                                cellIndex--;
                                                setFocusTableCell(table, rowIndex, cellIndex);
                                                event.returnValue=false;
                                        }
                                }
                                break;
                        }
                        //Up
                        case 38:{
                                var cell=getCell(element);
                                if (cell){
                                        var dataset=getElementDataset(element);
                                        if (dataset){
                                                dataset.movePrev();
                                                event.returnValue=false;
                                        }
                                }
                                else{
                                        switch (element.getAttribute("dropDown_mode")){
                                                case "staticlist":{
                                                        var fieldName=(element.getAttribute("dropDown_mapValue"))?"name":"value";
                                                        var tempDataset=getDropDownItems(element);
                                                        var record=tempDataset.locate(fieldName, element.value);
                                                        if (record){
                                                                tempDataset.setRecord(record);
                                                                tempDataset.movePrev();
                                                        }
                                                        processDropDownSelected(element, tempDataset.record, true);
                                                        event.returnValue=false;
                                                        break;
                                                }

                                                case "dataset":{
                                                        var tempDataset=element.getAttribute("dropDown_dataset");
                                                        if (typeof(tempDataset)=="string") tempDataset=getDatasetByID(tempDataset);
                                                        if (tempDataset) tempDataset.movePrev();
                                                        processDropDownSelected(element, tempDataset.record, true);
                                                        event.returnValue=false;
                                                        break;
                                                }
                                        }
                                }
                                break;
                        }
                        //Right
                        case 39:{
                                var cell=getCell(element);
                                if (cell){
                                        if ((event.ctrlKey) || (event.altKey)){
                                                var table=getTableByCell(cell);
                                                var rowIndex=getRowByCell(cell).rowIndex;
                                                var cellIndex=cell.cellIndex;
                                                cellIndex++;
                                                setFocusTableCell(table, rowIndex, cellIndex);
                                                event.returnValue=false;
                                        }
                                }
                                break;
                        }
                        //Down
                        case 40:{
                                if (event.altKey){
                                        showDropDownBox(element);
                                }
                                else{
                                        var cell=getCell(element);
                                        if (cell){
                                                var table=getTableByCell(cell);
                                                var dataset=getElementDataset(element);
                                                if (dataset){
                                                        dataset.moveNext();
                                                        if (dataset.eof && !isTrue(table.getAttribute("readOnly")) && !isTrue(dataset.readOnly)){
                                                                dataset.insertRecord("end");
                                                                dataset.modified=false;
                                                        }
                                                        event.returnValue=false;
                                                }
                                        }
                                        else{
                                                switch (element.getAttribute("dropDown_mode")){
                                                        case "staticlist":{
                                                                var fieldName=(element.getAttribute("dropDown_mapValue"))?"name":"value";
                                                                var tempDataset=getDropDownItems(element);
                                                                var record=tempDataset.locate(fieldName, element.value);
                                                                if (record){
                                                                        tempDataset.setRecord(record);
                                                                        tempDataset.moveNext();
                                                                }
                                                                processDropDownSelected(element, tempDataset.record, true);
                                                                event.returnValue=false;
                                                                break;
                                                        }

                                                        case "dataset":{
                                                                var tempDataset=element.getAttribute("dropDown_dataset");
                                                                if (typeof(tempDataset)=="string") tempDataset=getDatasetByID(tempDataset);
                                                                if (tempDataset) tempDataset.moveNext();
                                                                processDropDownSelected(element, tempDataset.record, true);
                                                                event.returnValue=false;
                                                                break;
                                                        }
                                                }
                                        }
                                }
                                break;
                        }
                        //Insert
                        case 45:{
                                var cell=getCell(element);
                                if (cell && !isTrue(getTableByCell(cell).getAttribute("readOnly"))){
                                        var dataset=getElementDataset(element);
                                        if (!isTrue(dataset.readOnly)){
                                                dataset.insertRecord("before");
                                                dataset.modified=false;
                                        }
                                }
                                break;
                        }
                        //Delete
                        case 46:{
                                var cell=getCell(element);
                                if (cell && !isTrue(getTableByCell(cell).getAttribute("readOnly"))){
                                        if (event.ctrlKey){
                                                if (isTrue(getTableByCell(cell).getAttribute("confirmDelete"))){
                                                        var dataset=getElementDataset(element);
                                                        if (!isTrue(dataset.readOnly) && confirm(constDatasetConfirmDelete)){
                                                                dataset.deleteRecord();
                                                        }
                                                }
                                                else{
                                                        var dataset=getElementDataset(element);
                                                        dataset.deleteRecord();
                                                }
                                                event.returnValue=false;
                                        }
                                }
                                break;
                        }
                        //F2
                        case 113:;
                        //F7
                        case 118:{
                                showDropDownBox(element);
                                break;
                        }
                }
        }
}

function getAbsPosition(obj, offsetObj){
        var _offsetObj=(offsetObj)?offsetObj:document.body;
        var x=obj.offsetLeft;
        var y=obj.offsetTop;
        var tmpObj=obj.offsetParent;

        while ((tmpObj!=_offsetObj) && tmpObj){
                x+=tmpObj.offsetLeft+tmpObj.clientLeft-tmpObj.scrollLeft;
                y+=tmpObj.offsetTop+tmpObj.clientTop-tmpObj.scrollTop;
                tmpObj=tmpObj.offsetParent;
        }
        return ([x, y]);
}

function isChild(obj, parentObj) {
        var tmpObj=obj;
        var result=false;
        if (parentObj) {
                while (tmpObj) {
                        if (tmpObj==parentObj){
                                result=true;
                                break;
                        }
                        tmpObj=tmpObj.parentElement;
                }
        }
        return result;
}

function disableDocument(window){
        if (typeof(_over_label)=="undefined"){
                document.body.insertAdjacentHTML("beforeEnd", "<div id=_over_label language=javascript"+
                        " style=\"position: absolute; background-color: black; left:0; top:0; z-index: 9999; filter:alpha(opacity=30)\"></div>");
        }

        document.body._documentDisabled=true;
        _over_label.style.width=document.body.clientWidth + document.body.scrollLeft;
        _over_label.style.height=document.body.clientHeight + document.body.scrollTop;
        _over_label.style.visibility="visible";
}

function enableDocument(window){
        _over_label.style.visibility="hidden";
        document.body._documentDisabled=false;
}

function isDocumentEnable(){
        return (!isTrue(document.body._documentDisabled));
}

function initElementDataset(element){
        var dataset=element.getAttribute("dataset");
        if (dataset) setElementDataset(element, dataset);
}

function initElement(element){
        var initChildren=true;
        var _attrib=element.getAttribute("attrib");
        if (_attrib){
                switch (_attrib){
                        case "fieldlabel":{
                                if (!element.className) element.className=_attrib;

                                var dataset;
                                var _dataset=element.getAttribute("dataset");
                                if (typeof(_dataset)=="string"){
                                        dataset=getDatasetByID(_dataset);
                                }
                                else{
                                        dataset=_dataset;
                                }
                                element.dataset=dataset;
                                refreshElementValue(element);
                                break;
                        }
                        case "columnheader":{
                                if (!element.className) element.className=_attrib;
                                element.noWrap=true;
                                element.onclick=_table_head_onclick;
                                element.onmouseover=_table_head_onmouseover;
                                element.onmouseout=_table_head_onmouseout;
                                refreshElementValue(element);
                                break;
                        }
                        case "columnfooter":{
                                if (!element.className) element.className=_attrib;
                                refreshElementValue(element);
                                break;
                        }
                        case "datalabel":{
                                if (!element.className) element.className=_attrib;
                                initElementDataset(element);
                                break;
                        }
                        case "editor":;
                        case "dockeditor":{
                                if (!element.className) element.className=_attrib;
                                if (getValidStr(element.getAttribute("dropdown_cached"))=="" && getIEVersion()>"5.0")
                                        element.dropdown_cached=true;

                                initElementDataset(element);
                                with (element){
                                        if (tagName.toLowerCase()=="input" && compareText(type, "checkbox")){
                                                style.borderColor="window";
                                                onclick=_checkbox_onclick;
                                        }

                                        language="javascript";
                                        onkeydown=_control_onkeydown;
                                        onkeypress=_editor_onkeypress;
                                        onpropertychange=_editor_onpropertychange;