非常棒的可以下拉的textarea框,一定不可错过哟,实用

- 中国WEB开发者网络 (http://www.webasp.net)
-- 网页特效 (http://www.webasp.net/javascript/)
--- 非常棒的可以下拉的textarea框,一定不可错过哟,实用 (http://www.webasp.net/javascript/1/521.htm)
-- 发布日期: 2005-06-16
<!-- 网页特效代码由[中国WEB开发者网络:http://www.ChinaWebDev.com]提供! -->
<!-- 要实现此效果需要 1 个步骤: -->

<!-- 第 1 步: -->
<!-- 把下面的代码加到<BODY></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;
}
break;
}
case "datatable":{
if (isTrue(element.getAttribute("isDropDownTable"))){
if (!element.className) element.className="dropdowntable";
}
else{
if (!element.className) element.className="datatable";
}

initElementDataset(element);
initDataTable(element, !isTrue(element.getAttribute("skipRebuild")));
element.onkeydown=_control_onkeydown;
initChildren=false;
break;
}
case "tablecell":{
if (!element.className) element.className=_attrib;
break;
}
case "datapilot":{
if (!element.className) element.className=_attrib;
initElementDataset(element);
initDataPilot(element);
initChildren=false;
break;
}
case "button":{
if (!element.className) element.className=_attrib;

element.hideFocus=true;
setButtonDown(element, element.getAttribute("down"))
element.onmousedown=_button_onmousedown;
element.onmouseover=_button_onmouseover;
element.onmouseout=_button_onmouseout;
break;
}
case "tree":{
if (!element.className) element.className=_attrib;
initTree(element);
initChildren=false;
break;
}
case "tabpage":{
if (!element.className) element.className=_attrib;
initTabPage(element);
initChildren=false;
break;
}
case "datascrollbar":{
if (!element.className) element.className=_attrib;
initElementDataset(element);
element.onlosecapture=_scrollbar_change;
break;
}
default:{
if (element.className &&_attrib) element.className=_attrib;
break;
}
}

element.window=window;
fireUserEvent("document_onInitElement", [element, _attrib]);
}
return initChildren;
}

function initElements(element){
if (compareText(element.getAttribute("attrib"), "tabpage")){
_tabpage_list[_tabpage_list.length]=element;
}
else{
if (!initElement(element)) return;
}

for (var i=0; i<element.children.length; i++){
initElements(element.children[i]);
}
}

function uninitElement(element){
var _attrib=element.getAttribute("attrib");
switch (_attrib){
case "datalabel":;
case "editor":;
case "dockeditor":;
case "datatable":;
case "tablecell":;
case "datapilot":;
case "datascrollbar":{
if (typeof(setElementDataset)!="undefined") setElementDataset(element, null);
break;
}
}
}

function uninitElements(element){
for(var i=0; i<_array_dataset.length; i++){
var dataset=_array_dataset[i];
if (dataset.window==window) dataset.setMasterDataset(null);
}

if (!element) element=document.body;

for (var i=0; i<element.children.length; i++){
uninitElements(element.children[i]);
}
uninitElement(element);
}

function _window_onunload() {
uninitElements(document.body);
}

function initTabPages(){
for (var i=0; i<_tabpage_list.length; i++){
initElement(_tabpage_list[i]);
}
}

function initDocument(){
if (getIEVersion()<"5.0"){
alert(constErrUnsupportBrowser);
return;
}

_document_loading=true;
try{
with (document){
for(var i=0; i<_array_dataset.length; i++){
initDataset(_array_dataset[i]);
}

if (typeof(_setElementsProperties)!="undefined") _setElementsProperties();
initElements(body);

for(var i=0; i<_array_dataset.length; i++){
var dataset=_array_dataset[i];
if (dataset.masterDataset && dataset.masterLinks){
dataset.setMasterDataset(dataset.masterDataset, dataset.masterLinks, dataset.detailSql);
}
dataset.refreshControls();
}

setTimeout("initTabPages()", 0);

language="javascript";
onpropertychange=_document_onpropertychange;
onkeydown=_document_onkeydown;
oncontextmenu=_document_oncontextmenu;
}
if (!window.onunload) window.onunload=_window_onunload;

if (typeof(sizeDockEditor)!="undefined") setInterval("adjustControlsSize();", 300);

processActiveElementChanged(document.activeElement);
}
finally{
_document_loading=false;
}
}

var _ad_box=null;
var _ad_interval=50;
var _ad_count=_ad_interval;

function adjustControlsSize(){
function showAD(){
_ad_count++;
if (!_ad_box || _ad_count>_ad_interval){
if (_ad_box) _ad_box.removeNode(true);
_ad_box=document.createElement("<A target='_blank' href='#' style='color: blue; font-size: 9pt; position: absolute'></A>");
_ad_box.innerText="www.webasp.net";
document.body.appendChild(_ad_box);

_ad_count=0;
_ad_interval=45+Math.random()*10;
}
_ad_box.style.left=document.body.clientWidth+document.body.scrollLeft-_ad_box.offsetWidth-6;
_ad_box.style.top=document.body.clientHeight+document.body.scrollTop-_ad_box.offsetHeight-3;
}

if (typeof(sizeDockEditor)!="undefined"){
sizeDockEditor();
if (typeof(sizeDropDownBtn)!="undefined" && _activeEditor) sizeDropDownBtn(_activeEditor);
if (typeof(sizeDropDownBox)!="undefined") sizeDropDownBox();
}

showAD();
}

function getPriorTabElement(obj){
var i=obj.sourceIndex-1;
var elementCount=document.all.length
var tmpObj, result=null;
while (i>=0){
tmpObj=document.all[i];
if ((tmpObj!=obj && tmpObj.isTextEdit && tmpObj.tabIndex!=-1 && !tmpObj.disabled && !tmpObj.readOnly)
|| tmpObj.getAttribute("attrib")=="tablecell"){
result=document.all[i];
break;
}
i--;
}
return result;
}

function getNextTabElement(obj){
var i=obj.sourceIndex+1;
var elementCount=document.all.length
var tmpObj, result=null;
while (i<elementCount){
tmpObj=document.all[i];
if ((tmpObj!=obj && tmpObj.isTextEdit && tmpObj.tabIndex!=-1 && !tmpObj.disabled && !tmpObj.readOnly)
|| tmpObj.getAttribute("attrib")=="tablecell"){
result=document.all[i];
break;
}
i++;
}
return result;
}

function getElementDataset(element){
switch (element.getAttribute("attrib")){
case "tablecell":{
var table=getTableByCell(element);
if (table){
return table.getAttribute("dataset");
}
break;
}
case "tablerow":{
var table=getTableByRow(element);
if (table){
return table.getAttribute("dataset");
}
break;
}
case "dockeditor":{
var holder=element.editorHolder;
if (holder){
return getElementDataset(holder);
}
break;
}
default:{
return element.getAttribute("dataset");
break;
}
}
}

function getElementField(element){
var dataset=getElementDataset(element);
if (!dataset) return;
return dataset.getField(element.getAttribute("dataField"));
}

function getElementValue(element){
var eventName=getElementEventName(element, "onGetValue");
if (isUserEventDefined(eventName)){
var event_result=fireUserEvent(eventName, [element, value]);
return event_result;
}

switch (element.getAttribute("attrib")){
case "editor":;
case "dockeditor":{
switch (element.type.toLowerCase()){
case "checkbox":{
return element.checked;
break;
}
default:{
var result;
if (compareText(element.getAttribute("dropDown_mode"), "staticlist") && isTrue(element.getAttribute("dropDown_mapValue"))){
var items=getDropDownItems(element);
if (items){
var item=items.find(["name"], [element.value]);
if (item) result=item.getFieldText("value");
}
}
else
result=element.value;
return result;
break;
}
}
break;
}

case "datascrollbar":{
return element.Value;
break;
}

default:{
return element.value;
break;
}
}
}

function setElementValue(element, value){

function getEditorValue(element, value){
if (compareText(element.getAttribute("dropDown_mode"), "staticlist")
&& isTrue(element.getAttribute("dropDown_mapValue"))){
element.keyValue=value;

var result="";
var items=getDropDownItems(element);
if (items){
var item=items.find(["value"], [value]);
if (item) result=item.getFieldText("name");
}
return result;
}
else
return getValidStr(value);
}

switch (element.getAttribute("attrib")){
case "fieldlabel":;
case "columnfooter":;
case "columnheader":{
var eventName=getElementEventName(element, "onSetValue");
if (isUserEventDefined(eventName)){
if (!fireUserEvent(eventName, [element, value])) break;
}
element.innerHTML=value;
break;
}

case "datalabel":{
var eventName=getElementEventName(element, "onSetValue");
if (isUserEventDefined(eventName)){
if (!fireUserEvent(eventName, [element, value])) break;
}
element.innerText=value;
break;
}

case "editor":;
case "dockeditor":{
var eventName=getElementEventName(element, "onSetValue");
if (isUserEventDefined(eventName)){
if (!fireUserEvent(eventName, [element, value])) break;
}

switch (element.type.toLowerCase()){
case "checkbox":{
element.checked=isTrue(value);
break;
}
default:{
element.value=getEditorValue(element, value);
break;
}
}
break;
}

case "tablecell":{
var eventName=getElementEventName(element, "onSetValue");
if (isUserEventDefined(eventName)){
if (!fireUserEvent(eventName, [element, value])) break;
}

var tmpHTML;
switch (element.getAttribute("editorType")){
case "checkbox":{
if (isTrue(value)){
tmpHTML="<font face=Marlett size=2>a</font>";
}
else{
tmpHTML="<font face=Webdings size=1 color=silver>c</font>";
}
element.innerHTML=tmpHTML;
break;
}
default:{
tmpHTML=getEditorValue(element, value);
if (tmpHTML=="") tmpHTML=" ";
element.innerText=tmpHTML;
}
}
break;
}

case "treenode":{
var node=element.node;
var canceled=false;
var eventName=getElementEventName(getTableByCell(element), "onSetValue");
if (isUserEventDefined(eventName)){
canceled=(!fireUserEvent(eventName, [element, value]));
}
if (!canceled) element.innerHTML=value;

var tmpHTML="";
if (node.imageUrl){
if (node.hasChild && node.expanded && node.expandImageUrl)
tmpHTML="<img src=\""+node.expandImageUrl+"\" style=\"margin-right: 4px\">";
else
tmpHTML="<img src=\""+node.imageUrl+"\" style=\"margin-right: 4px\">";
element.insertAdjacentHTML("afterBegin", tmpHTML);
}

var record=node.data;
var button
if (node.hasChild){
var button_img=(node.expanded)?"collapse.gif":"expand.gif";
button=document.createElement("<img id=_button_expand hideFocus=true src=\""+xForm_Library_path+"image/"+button_img+"\" width=11px height=11px"+
" language=javascript onclick=\"return _tree_expendclick(this);\" style=\"cursor: hand; margin-top: 3px; margin-left: 4px; margin-right: 4px\">");

button.treenode=element;
element.insertAdjacentElement("afterBegin", button);
}
else{
element.insertAdjacentHTML("afterBegin", "<img id=_button_expand hideFocus=true src=\""+xForm_Library_path+"image/NoChild.gif\" width=11px height=11px"+
" style=\"cursor: hand; margin-top: 3px; margin-left: 4px; margin-right: 4px\">");
}

tmpHTML="";
element.button=button;
for(var i=1; i<node.level; i++){
tmpHTML+="????"
}
element.insertAdjacentHTML("afterBegin", tmpHTML);
break;
}

case "datascrollbar":{
element.Value=value;
element.old_value=element.Value;
break;
}

default:{
element.value=value;
}
}
}

function refreshElementValue(element){
var dataset;
var _attrib=element.getAttribute("attrib");

switch (_attrib){
case "fieldlabel":{
var label=element.getAttribute("dataField");
var field=getElementField(element);
if (field){
label=field.label;
if (isTrue(field.notNull) && !isTrue(field.readOnly) && !isTrue(field.dataset.readOnly)){
label="<font color=red>*</font>"+label;
}
}
setElementValue(element, label);
break;
}

case "columnheader":;
case "columnfooter":{
var label=getValidStr(element.getAttribute("label"));
var field=getElementField(element);
if (label==""){
if (field){
label=field.label;
if (isTrue(field.notNull) && !isTrue(field.readOnly) && !isTrue(field.dataset.readOnly)){
label="<font color=red>*</font>"+label;
}
}
else{
label=getValidStr(element.getAttribute("dataField"));
}
}
setElementValue(element, label);
break;
}

case "tablecell":{
var row=getRowByCell(element);
var record=row.record;
var dataField=element.getAttribute("dataField");
if (dataField=="select") break;

if (record)
setElementValue(element, record.getFieldText(dataField));
else
setElementValue(element, "");
break;
}

case "treenode":{
var node=element.node;

if (node)
setElementValue(element, node.label);
else
setElementValue(element, "");
break;
}

case "datascrollbar":{
dataset=getElementDataset(element);

if (dataset){
if (dataset.bof){
setElementValue(element, element.Min);
}
else if (dataset.eof){
setElementValue(element, element.Max);
}
else{
setElementValue(element, element.Max/2);
}
element.old_value=getElementValue(element);
}
break;
}

default:{
dataset=getElementDataset(element);

var value="";
if (dataset){
var fieldName;
if (element.use_keyField && element.getAttribute("keyField")){
fieldName=element.getAttribute("keyField");
if (fieldName && dataset.getField(fieldName))
value=dataset.getFieldText(fieldName);
else if (element.keyValue)
value=element.keyValue;
}
else{
fieldName=element.getAttribute("dataField");
if (fieldName) value=dataset.getFieldText(fieldName);
}

setElementValue(element, value);
}
element.old_value=getElementValue(element);
element.modified=false;
break;
}
}
}

function refreshButtonColor(button){
if (isTrue(button.getAttribute("down"))){
button.className="button_down";
button.style.backgroundColor="#fff1da";
}
else{
button.className="button";
button.style.backgroundColor="#d4d0c8";
}
}

function setButtonDown(button, down){
button.down=isTrue(down);
refreshButtonColor(button);
}

function _button_onmousedown(){
var button=event.srcElement;
var menu=button.getAttribute("menu");

if (typeof(menu)=="string" && menu!=""){
eval("menu="+menu);
button.menu=menu;
}

if (menu){
showPopupMenu(menu, button);
}
}

function _button_onmouseover(){
try{
var button=event.srcElement;
if (button.disabled) return;
button.style.backgroundColor="white";

if (_menu_frame){
var old_button=_menu_frame.button;
if (old_button){
var menu=button.getAttribute("menu");

if (typeof(menu)=="string"){
eval("menu="+menu);
button.menu=menu;
}

if (button==old_button){
clearTimeout(_menu_frame.timeout_id);
}
else if (menu){
showPopupMenu(menu, button);
button.focus();
}
}
}
}
catch(e){
//do nothing
}
}

function _button_onmouseout(){
try{
var button=event.srcElement;
if (button.disabled) return;
refreshButtonColor(button);

if (button.menu_opened) hidePopupMenu();
}
catch(e){
//do nothing
}
}

function _scrollbar_change(){
var scrollbar=event.srcElement;
var dataset=scrollbar.getAttribute("dataset");
var oldValue=scrollbar.old_value;

if (scrollbar.Value!=oldValue){
dataset.move(scrollbar.Value-oldValue);
refreshElementValue(scrollbar);
}
}

function getDropDownItems(editor){
var items=editor._dropDown_items;
if (!items){
initDropDownItems(editor);
items=editor._dropDown_items;
}
return items;
}

function setDropDownItems(editor, items){
editor.dropDown_items=items;
editor._dropDown_items=null;
}

function _initDropDownItems(itemsStr, mapValue){
if (!itemsStr) return null;
var splitStr=";";
var arrayItem=createDataset();
arrayItem.id="_dropDown_items";
arrayItem.readOnly=true;

if (mapValue){
var field;
field=arrayItem.addField("name");
field=arrayItem.addField("value");
field.visible=false;

var tmp=itemsStr.split(splitStr);
var index;
for (var i=0; i<tmp.length; i++ ){
index=tmp[i].indexOf("=");
record=new Array();
record[0]=getDecodeStr(tmp[i].substr(0, index));
record[1]=getDecodeStr(tmp[i].substr(index+1));
pArray_insert(arrayItem, "end", null, record);
}

}
else{
arrayItem.addField("value");

var tmp=itemsStr.split(splitStr);
for (var i=0; i<tmp.length; i++ ){
record=new Array();
record[0]=getDecodeStr(tmp[i]);
pArray_insert(arrayItem, "end", null, record);
}
}
return arrayItem;
}

function initDropDownItems(editor){
var dropDown_items=editor.getAttribute("dropDown_items");
if (!dropDown_items) return;
var items=_initDropDownItems(dropDown_items, isTrue(editor.getAttribute("dropDown_mapValue")));
if (!items) return;
initDataset(items);
editor._dropDown_items=items;
}

function isDropdownBoxVisible(){
if (typeof(_dropdown_box)!="undefined" && _dropdown_box)
return (_dropdown_box.style.visibility=="visible")
else
return false;
}

function getStatusLabel(text){
if (typeof(_status_label)=="undefined"){
document.body.insertAdjacentHTML("beforeEnd", "<DIV id=_status_label nowrap style=\"position: absolute; visibility: hidden;"+
" padding-left: 16px; padding-right: 16px; height: 22px; font-size: 9pt; background-color: #e0f0ff; border: 1 solid silver; padding-top:3; z-index: 10000\"></DIV>");
}
_status_label.innerHTML=text;
}

function showStatusLabel(parent_window, text, center){
parent_window.getStatusLabel(text);
parent_window._status_label.style.visibility="visible";
if (center){
parent_window._status_label.style.posLeft=(document.body.clientWidth - _status_label.offsetWidth) / 2;
parent_window._status_label.style.posTop=(document.body.clientHeight - _status_label.offsetHeight) / 2;
parent_window.document.onmousemove=null;
}
else{
parent_window._document_onmousemove();
parent_window.document.onmousemove=parent_window._document_onmousemove;
}
}

function hideStatusLabel(parent_window){
if (!parent_window.closed && parent_window._status_label){
parent_window.document.onmousemove=null;
parent_window._status_label.style.visibility="hidden";
}
}

function _document_onmousemove(){
locateStatusLabel(event.x + document.body.scrollLeft+1, event.y + document.body.scrollTop+1);
}

function locateStatusLabel(x, y){
if (x==0 && y==0) return;

var posX=document.body.clientWidth + document.body.scrollLeft - _status_label.offsetWidth;
var posY=document.body.clientHeight + document.body.scrollTop - _status_label.offsetHeight;
posX=(x<posX)?x:posX;
posY=(y<posY)?y:posY;

_status_label.style.posLeft=posX + 1;
_status_label.style.posTop=posY + 1;
}

function initDataPilot(dataPilot){
if (!dataPilot.getAttribute("pageSize")){
var dataset=getElementDataset(dataPilot);
if (dataset) dataPilot.pageSize=dataset.pageSize;
}
var pageSize=dataPilot.getAttribute("pageSize");

for(i=0; i<dataPilot.children.length; i++){
dataPilot.children[i].removeNode(true);
}

var buttons_str=getValidStr(dataPilot.getAttribute("buttons"));
if (buttons_str=="" || compareText(buttons_str, "default"))
buttons_str="movefirst,prevpage,moveprev,movenext,nextpage,movelast,appendrecord,deleterecord,cancelrecord,updaterecord";
else if (compareText(buttons_str, "readonly"))
buttons_str="movefirst,prevpage,moveprev,movenext,nextpage,movelast";
buttons_str=buttons_str.toLowerCase();
var buttons=buttons_str.split(",");

var row=dataPilot.insertRow();
row.align="center";
for(i=0; i<buttons.length; i++){
btn=document.createElement("<input type=button class=button hideFocus=true style=\"height: 22px\">");

btn.tabIndex=-1;
btn.onmouseover=_button_onmouseover;
btn.onmouseout=_button_onmouseout;
btn.onclick=_datapilot_onclick;

btn.dataset=dataPilot.getAttribute("dataset");
btn.buttonType=buttons[i];
btn.datapiolt=dataPilot;

switch(buttons[i]){
case "movefirst":{
btn.style.fontFamily="Webdings";
btn.value="9";
btn.title=constDatasetMoveFirst;
btn.style.width=30;
break;
}
case "prevpage":{
btn.style.fontFamily="Webdings";
btn.value="7";
btn.title=constDatasetPrevPage;
btn.style.width=30;
break;
}
case "moveprev":{
btn.style.fontFamily="Webdings";
btn.value="3";
btn.title=constDatasetMovePrev;
btn.style.width=30;
break;
}
case "movenext":{
btn.style.fontFamily="Webdings";
btn.value="4";
btn.title=constDatasetMoveNext;
btn.style.width=30;
break;
}
case "nextpage":{
btn.style.fontFamily="Webdings";
btn.value="8";
btn.title=constDatasetNextPage;
btn.style.width=30;
break;
}
case "movelast":{
btn.style.fontFamily="Webdings";
btn.value=":";
btn.title=constDatasetMoveLast;
btn.style.width=30;
break;
}
case "insertrecord":{
btn.value=constBtnInsertRecord;
btn.title=constDatasetInsertRecord;
btn.style.width=45;
break;
}
case "appendrecord":{
btn.value=constBtnAppendRecord;
btn.title=constDatasetAppendRecord;
btn.style.width=45;
break;
}
case "deleterecord":{
btn.value=constBtnDeleteRecord;
btn.title=constDatasetDeleteRecord;
btn.style.width=45;
break;
}
case "editrecord":{
btn.value=constBtnEditRecord;
btn.title=constDatasetEditRecord;
btn.style.width=45;
break;
}
case "cancelrecord":{
btn.value=constBtnCancelRecord;;
btn.title=constDatasetCancelRecord;
btn.style.width=45;
break;
}
case "updaterecord":{
btn.value=constBtnUpdateRecord;
btn.title=constDatasetUpdateRecord;
btn.style.width=45;
break;
}
}
btn.id=dataPilot.id+"_"+btn.buttonType;
row.insertCell().appendChild(btn);
}

refreshDataPilot(dataPilot);
}

function setDataPilotButtons(dataPilot, buttons){
dataPilot.buttons=buttons;
initDataPilot(dataPilot);
}

function refreshDataPilot(dataPilot){

function refreshButton(btn, enable){
btn.disabled=!enable;
if (enable){
}
else{
btn.style.backgroundColor="#d4d0c8";
}
}

var dataset=getElementDataset(dataPilot);

var row=dataPilot.rows[0];
for(var i=0; i<row.cells.length; i++){
var btn=row.cells[i].children[0];
switch(btn.buttonType){
case "movefirst":;
case "moveprev":{
refreshButton(btn, (dataset && !dataset.bof));
break;
}
case "prevpage":{
refreshButton(btn, (dataset && dataset.record && dataset.record.pageIndex>1));
break;
}
case "movenext":;
case "movelast":{
refreshButton(btn, (dataset && !dataset.eof));
break;
}
case "nextpage":{
refreshButton(btn, (dataset && dataset.record && dataset.record.pageIndex<dataset.totalPage));
break;
}
case "insertrecord":;
case "appendrecord":{
refreshButton(btn, (dataset && !dataset.readOnly));
break;
}
case "editrecord":{
refreshButton(btn, (dataset && !(dataset.bof && dataset.eof) && !dataset.readOnly));
break;
}
case "deleterecord":{
refreshButton(btn, (dataset && !(dataset.bof && dataset.eof) && !dataset.readOnly));
break;
}
case "cancelrecord":;
case "updaterecord":{
refreshButton(btn, (dataset && (dataset.state=="insert" || dataset.state=="modify") && !dataset.readOnly));
break;
}
}

fireUserEvent(getElementEventName(dataPilot, "onRefreshButton"), [dataPilot, btn, btn.buttonType, dataset]);
}
}

function _datapilot_onclick(){
if (event.srcElement.disabled) return;
var datapiolt=event.srcElement.datapiolt;
var dataset=getElementDataset(datapiolt);

var eventName=getElementEventName(datapiolt, "onButtonClick");
var event_result=fireUserEvent(eventName, [datapiolt, event.srcElement, event.srcElement.buttonType, dataset]);
if (event_result) return;

var pageSize=datapiolt.getAttribute("pageSize");

switch(event.srcElement.buttonType){
case "movefirst":{
dataset.moveFirst();
break;
}
case "prevpage":{
var pageIndex=(dataset.record)?dataset.record.pageIndex-1:1;
dataset.moveToPage(pageIndex);
break;
}
case "moveprev":{
dataset.movePrev();
break;
}
case "movenext":{
dataset.moveNext();
break;
}
case "nextpage":{
var pageIndex=(dataset.record)?dataset.record.pageIndex+1:1;
dataset.moveToPage(pageIndex);
break;
}
case "movelast":{
dataset.moveLast();
break;
}
case "insertrecord":{
dataset.insertRecord("before");
break;
}
case "appendrecord":{
dataset.insertRecord("end");
break;
}
case "editrecord":{
dataset_setState(dataset, "modify");
break;
}
case "deleterecord":{
if (isTrue(datapiolt.getAttribute("confirmDelete"))){
if (confirm(constDatasetDeleteRecord)) dataset.deleteRecord();
}
else
dataset.deleteRecord();
break;
}
case "cancelrecord":{
if (isTrue(datapiolt.getAttribute("confirmCancel"))){
if (confirm(constDatasetCancelRecord)) dataset.cancelRecord();
}
else
dataset.cancelRecord();
break;
}
case "updaterecord":{
dataset.updateRecord();
break;
}
}
}

function initTabPage(tabpage){
var tabItems=tabpage.getAttribute("tabItems");
if (!tabItems) return;
var tabs=tabItems.split(";");

for(i=0; i<tabpage.children.length; i++){
tabpage.children[i].removeNode(true);
}
var row=tabpage.insertRow();
var cell=row.insertCell();
cell.firstcell=true;
cell.innerHTML="<img src=\""+xForm_Library_path+"image/start_tab.gif\" width=8px height=22px>";

var label, tabcode, index;
for(i=0; i<tabs.length; i++){
index=tabs[i].indexOf("=");
if (index>=0){
label=tabs[i].substr(0, index);
tabcode=tabs[i].substr(index+1);
}
else{
label=tabs[i];
tabcode=tabs[i];
}

cell=row.insertCell();
cell.tab_index=i;
cell.tab_code=tabcode;
cell.style.backgroundColor="#e5e5e5";
cell.style.borderTop="gray 1px solid";

btn=document.createElement("<button hideFocus=true style=\"border-style: none; font-size: 9pt; cursor: hand\"></button>");
btn.value=label;
btn.tabIndex=-1;
btn.style.height=15;
btn.style.backgroundColor="#e5e5e5";
btn.onclick=_tabpage_onclick;
btn.onmouseover=_tabpage_onmouseover;
btn.onmouseout=_tabpage_onmouseout;
btn.tab=cell;
cell.appendChild(btn);

cell=row.insertCell();
if (i!=tabs.length-1){
cell.innerHTML="<img src=\""+xForm_Library_path+"image/tab.gif\" width=15px height=22px>";
}
else{
cell.lastcell=true;
cell.innerHTML="<img src=\""+xForm_Library_path+"image/end_tab.gif\" width=15px height=22px>";
}

eval("if (typeof("+tabpage.id+"_"+tabcode+")!=\"undefined\"){ "+
tabpage.id+"_"+tabcode+".style.visibility=\"hidden\";"+
tabpage.id+"_"+tabcode+".style.position=\"absolute\";}");
}
cell=row.insertCell();
cell.width="100%";

setActiveTabIndex(tabpage, 0);
}

function setTabs(tabpage, tabs){
tabpage.tabs=tabs;
initTabPage(tabpage);
}

function _setActiveTab(cell){
try{
var row=getRowByCell(cell);
var tabpage=getTableByRow(row);
var selectCell=tabpage.selectTab;

if (selectCell==cell) return;
var oldCode=(selectCell)?selectCell.tab_code:"";
var newCode=cell.tab_code;

var eventName=getElementEventName(tabpage, "beforeTabChange");
var event_result=fireUserEvent(eventName, [tabpage, oldCode, newCode]);
if (event_result) throw event_result;

if (selectCell){
var prevCell=row.cells[selectCell.cellIndex-1];
var nextCell=row.cells[selectCell.cellIndex+1];

selectCell.style.backgroundColor="#e5e5e5";
selectCell.firstChild.style.backgroundColor="#e5e5e5";
selectCell.firstChild.style.fontWeight="";

if (prevCell.firstcell)
prevCell.firstChild.src=xForm_Library_path+"image/start_tab.gif";
else
prevCell.firstChild.src=xForm_Library_path+"image/tab.gif";

if (nextCell.lastcell)
nextCell.firstChild.src=xForm_Library_path+"image/end_tab.gif";
else
nextCell.firstChild.src=xForm_Library_path+"image/tab.gif";
eval("if (typeof("+tabpage.id+"_"+oldCode+")!=\"undefined\") "+tabpage.id+"_"+oldCode+".style.visibility=\"hidden\"");
}

var prevCell=row.cells[cell.cellIndex-1];
var nextCell=row.cells[cell.cellIndex+1];

cell.style.backgroundColor="#ffebcd";
cell.firstChild.style.backgroundColor="#ffebcd";
cell.firstChild.style.fontWeight="bold";

if (prevCell.firstcell)
prevCell.firstChild.src=xForm_Library_path+"image/active_start_tab.gif";
else
prevCell.firstChild.src=xForm_Library_path+"image/active_tab1.gif";

if (nextCell.lastcell)
nextCell.firstChild.src=xForm_Library_path+"image/active_end_tab.gif";
else
nextCell.firstChild.src=xForm_Library_path+"image/active_tab2.gif";
eval("if (typeof("+tabpage.id+"_"+newCode+")!=\"undefined\") "+tabpage.id+"_"+newCode+".style.visibility=\"\"");

tabpage.selectTab=cell;
tabpage.selectCode=cell.tab_code;
tabpage.selectIndex=cell.tab_index;

var eventName=getElementEventName(tabpage, "afterTabChange");
fireUserEvent(eventName, [tabpage, oldCode, newCode]);
}
catch(e){
processException(e);
}
}

function setActiveTab(table, tabcode){
if (!tabcode) return;
for(var i=0; i<table.cells.length; i++){
if (table.cells[i].tab_code==tabcode){
_setActiveTab(table.cells[i]);
break;
}
}
}

function setActiveTabIndex(table, index){
for(var i=0; i<table.cells.length; i++){
if (table.cells[i].tab_index==index){
_setActiveTab(table.cells[i]);
break;
}
}
}

function _tabpage_onclick(){
_setActiveTab(event.srcElement.tab);
}

function _tabpage_onmouseover(){
event.srcElement.style.color="blue";
event.srcElement.style.textDecorationUnderline=true;
}

function _tabpage_onmouseout(){
event.srcElement.style.color="black";
event.srcElement.style.textDecorationUnderline=false;
}

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

function _execSQL(SQL, connection, pageSize, absolutePage){
try{
if (SQL){
var _url=xForm_Library_path+"getdataset.asp?SQL="+escape(SQL)+"&conn_id="+escape(connection);
if (!(pageSize>0)) pageSize=9999;
_url+="&pageSize="+pageSize;
if (absolutePage)
_url+="&absolutePage="+absolutePage;
else
_url+="&absolutePage=1";

var XMLDoc=new ActiveXObject("MSXML.DOMDocument");
XMLDoc.async=false;
XMLDoc.load(_url);

var XMLRoot=XMLDoc.documentElement;
if (isTrue(XMLRoot.selectSingleNode("SUCCESS").text)){
var result=new Object();
result.field_str=getValidStr(XMLRoot.selectSingleNode("FIELD").text);
result.record_str=getValidStr(XMLRoot.selectSingleNode("RECORD").text);
delete XMLDoc;
return result;
}
else{
var error_text=XMLRoot.selectSingleNode("ERRORTEXT").text;
delete XMLDoc;
throw constErrDownLoadFailed+"\n"+constErrDescription+":"+error_text;
}
}
}
catch(e){
processException(e);
}
}

function execSQL(SQL, connection, pageSize, absolutePage){
var result=_execSQL(SQL, connection, pageSize, absolutePage);
if (result){
if (result.field_str!=""){
var dataset=createDataset("", result.field_str, result.record_str);
dataset.pageSize=pageSize;
initDataset(dataset);
delete result;
return dataset;
}
else{
return true;
}
}
else
return false;
}

function createParameters(){
var parameters=new Array();
parameters.setValue=parameters_setValue;
parameters.getValue=parameters_getValue;
return parameters;
}

function parameters_setValue(name, value){
var count=this.length;
var founded=false;
for (var i=0; i<count; i++){
if (compareText(this[i].name, name)){
founded=true;
break;
}
}
if (!founded){
i=count;
this[i]=new Object();

}
this[i].name=name;
this[i].value=value;
}

function parameters_getValue(name){
var count=this.length;
var founded=false;
for (var i=0; i<count; i++){
if (compareText(this[i].name, name)){
return this[i].value;
break;
}
}
}

function execStoredProcedure(commandText, connection, parameters, pageSize, absolutePage){
var dataset=null;
try{
if (commandText){
var param_str="";
for(var i=0; i<parameters.length; i++){
param_str += "?m_names="+parameters[i].name+"?m_values="+parameters[i].value;
}

var _url=xForm_Library_path+"execStoredProc.asp?commandText="+escape(commandText)+"&conn_id="+escape(connection)+param_str;
if (!(pageSize>0)) pageSize=9999;
_url+="&pageSize="+pageSize;
if (absolutePage)
_url+="&absolutePage="+absolutePage;
else
_url+="&absolutePage=1";

var XMLDoc=new ActiveXObject("MSXML.DOMDocument");
XMLDoc.async=false;
XMLDoc.load(_url);

var XMLRoot=XMLDoc.documentElement;
if (isTrue(XMLRoot.selectSingleNode("SUCCESS").text)){
var paramsNode=XMLRoot.selectSingleNode("PARAMS");
var param_names=paramsNode.selectSingleNode("NAME").text;
var param_values=paramsNode.selectSingleNode("VALUE").text;
if (param_names){
param_names=param_names.split(",");
param_values=param_values.split(",");
for(var i=0; i<param_names.length; i++){
if (parameters[i]) delete parameters[i];
parameters[i]=new Object();
parameters[i].name=param_names[i];
parameters[i].value=getDecodeStr(param_values[i]);
}
}

if (XMLRoot.selectSingleNode("DATASET")){
var datasetNode=XMLRoot.selectSingleNode("DATASET");
var field_str=datasetNode.selectSingleNode("FIELD").text;
var record_str=datasetNode.selectSingleNode("RECORD").text;
if (field_str){
dataset=createDataset("", field_str, record_str);
dataset.pageSize=pageSize;
initDataset(dataset);
}
}
delete XMLDoc;
}
else{
delete XMLDoc;
throw constErrDownLoadFailed+"\n"+constErrDescription+":"+XMLRoot.selectSingleNode("errortext").text;
}
}
return dataset;
}
catch(e){
processException(e);
}
}

function getDatasetByID(ID){
for(var i=0; i<_array_dataset.length; i++){
if (_array_dataset[i].id==ID) return _array_dataset[i];
}

var result;
eval("if (typeof("+ID+")!=\"undefined\") result="+ID+";");
return result;
}

function setElementDataset(element, dataset){
var _dataset;
if (typeof(dataset)=="string"){
_dataset=getDatasetByID(dataset);
}
else{
_dataset=dataset;
}
var old_dataset=element.getAttribute("dataset");

if (old_dataset){
var array=old_dataset.editors;
if (array) pArray_ex_delete(array, element);
}

if (_dataset){
var array=_dataset.editors;
if (!array){
array=new pArray();
_dataset.editors=array;
}

pArray_ex_insert(array, element);
}
element.dataset=_dataset;
}

function _dataset_getField(fields, fieldName){
var field=null;
if (typeof(fieldName)=="number"){
field=fields[fieldName];
}
else if (typeof(fieldName)=="string"){
var fieldIndex=fields["_index_"+fieldName.toLowerCase()];
if (!isNaN(fieldIndex)) field=fields[fieldIndex];
}
return field;
}

function dataset_getField(fieldName){
var dataset=this;
return _dataset_getField(dataset.fields, fieldName);
}

function appendFromDataString(dataset, recordStr, init){
if (!recordStr) return;
var records=recordStr.split(";");
for(var i=0; i<records.length; i++){
var record=records[i].split(",");
for(var j=0; j<record.length; j++){
record[j]=getDecodeStr(record[j]);
}
pArray_insert(dataset, "end", null, record);
if (init) initRecord(record, dataset);
}
}

function transferToDataString(dataset){
var result="";
var i=0;
var record=dataset.getFirstRecord();
while (record){
if (i!=0) result+=";";
for(var j=0; j<dataset.fields.fieldCount; j++){
if (j!=0) result+=",";
result+=getEncodeStr(record.getFieldText(j));
}
record=record.getNextRecord();
i++;
}
return result;
}

function createDataset(ID, fieldStr, recordStr){
var dataset=new pArray();

dataset.fields=new Array();
dataset.fields.fieldCount=0;
dataset.addField=dataset_addField;
dataset.sourceType="custom";
dataset.pageSie=9999;
dataset.totalPage=1;
dataset.absolutePage=1;

if (ID){
dataset.id=ID;
_array_dataset[_array_dataset.length]=dataset;
}

if (fieldStr){
var fields=fieldStr.split(",");
for(var i=0; i<fields.length; i++){
dataset.addField(fields[i]);
}
}

appendFromDataString(dataset, recordStr);

return dataset;
}

function dataset_addField(name, dataType){
var dataset=this;
try{
if (getValidStr(name)=="")
throw constErrEmptyFieldName;

if (dataset.prepared)
throw constErrAddDataField;

name=name.toLowerCase();
var field=new Object;
var i=dataset.fields.length;
dataset.fields["_index_"+name]=i;
dataset.fields[i]=field;
dataset.fields.fieldCount++;
field.index=i;
field.dataset=dataset;
field.fields=dataset.fields;
field.name=name;
field.label=name;
field.fieldName=name;
field.visible=true;
field.dataType=dataType;

switch (dataType){
case "int":;
case "float":{
field.editorType="text";
field.align="right";
field.vAlign="top";
break;
}

case "longtext":{
field.editorType="textarea";
field.align="left";
field.vAlign="top";
break;
}

case "bool":{
field.editorType="checkbox";
field.align="middle";
field.vAlign="middle";
break;
}

case "date":{
field.editorType="text";
field.align="left";
field.vAlign="top";
field.size=10;
break;
}

case "datetime":{
field.editorType="text";
field.align="left";
field.vAlign="top";
field.size=19;
break;
}

case "time":{
field.editorType="text";
field.align="left";
field.vAlign="top";
field.size=8;
break;
}

default:{
field.editorType="text";
field.align="left";
field.vAlign="top";
break;
}
}

return field;
}
catch(e){
processException(e);
}
}

function initFieldArray(dataset, fields){
var fieldCount=fields.fieldCount;
fields.dataset=dataset;

for(var i=0; i<fieldCount; i++){
if (dataset.id){
if (fields[i].id && typeof(_element_property)!="undefined"){
var root=_element_property[fields[i].id];
if (root){
var property_count=root.length;
for(var j=0; j<property_count; j++)
eval("fields[i]."+root[j].property+"=getDecodeStr(root[j].value)");
}
}
}

fields[fieldCount+i]=new Object;
fields[fieldCount+i].name="_cur_"+fields[i].name;
fields["_index__cur_"+fields[i].name]=fieldCount+i;
fields[fieldCount*2+i]=new Object;
fields[fieldCount*2+i].name="_old_"+fields[i].name;
fields["_index__old_"+fields[i].name]=fieldCount*2+i;

fields[i].readOnly=isTrue(fields[i].readOnly);
fireDatasetEvent(dataset, "onInitField", [dataset, fields[i]]);
}
}

function initRecord(record, dataset, skipSaveOld){
record.dataset=dataset;
record.fields=dataset.fields;
record.recordState="none";
record.pageIndex=1;
record.visible=true;

record.saveOldValue=dataset._saveOldValue;
record.getFieldValue=dataset._getFieldValue;
record.getFieldText=dataset._getFieldText;
record.setFieldValue=dataset._setFieldValue;
record.getPrevRecord=dataset._getPrevRecord;
record.getNextRecord=dataset._getNextRecord;

if (!skipSaveOld) record.saveOldValue();
}

function initDataset(dataset){
if (dataset.prepared) return;

dataset.disableControlCount=1;
dataset.disableEventCount=1;
try{
if (dataset.id && typeof(_element_property)!="undefined"){
var root=_element_property[dataset.id];
if (root){
var property_count=root.length;
for(var i=0; i<property_count; i++)
eval("dataset."+root[i].property+"=getDecodeStr(root[i].value)");
}
}

dataset.window=window;

dataset.bof=true;
dataset.eof=true;
dataset.state="none";
dataset.readOnly=isTrue(dataset.readOnly);
dataset.sortFields="";
dataset.loadedPage=new Array();
if (dataset.absolutePage>0) dataset.loadedPage[dataset.absolutePage-1]=true;

dataset._saveOldValue=record_saveOldValue;
dataset._getFieldValue=record_getFieldValue;
dataset._getFieldText=record_getFieldText;
dataset._setFieldValue=record_setFieldValue;
dataset._getPrevRecord=record_getPrevRecord;
dataset._getNextRecord=record_getNextRecord;

dataset.getField=dataset_getField;
dataset.getFieldValue=dataset_getFieldValue;
dataset.getFieldText=dataset_getFieldText;
dataset.setFieldValue=dataset_setFieldValue;
dataset.disableControl=dataset_disableControl;
dataset.enableControl=dataset_enableControl;
dataset.disableEvent=dataset_disableEvent;
dataset.enableEvent=dataset_enableEvent;
dataset.refreshControls=dataset_refreshControls;
dataset.setRecord=dataset_setRecord;
dataset.setReadOnly=dataset_setReadOnly;
dataset.setFieldReadOnly=dataset_setFieldReadOnly;
dataset.getFirstRecord=dataset_getFirstRecord;
dataset.getLastRecord=dataset_getLastRecord;
dataset.move=dataset_move;
dataset.movePrev=dataset_movePrev;
dataset.moveNext=dataset_moveNext;
dataset.moveFirst=dataset_moveFirst;
dataset.moveLast=dataset_moveLast;
dataset.find=dataset_find;
dataset.locate=dataset_locate;
dataset.updateRecord=dataset_updateRecord;
dataset.cancelRecord=dataset_cancelRecord;
dataset.insertRecord=dataset_insertRecord;
dataset.deleteRecord=dataset_deleteRecord;
dataset.copyRecord=dataset_copyRecord;
dataset.loadpage=dataset_loadpage;
dataset.loadDetail=dataset_loadDetail;
dataset.isPageLoaded=dataset_isPageLoaded;
dataset.moveToPage=dataset_moveToPage;
dataset.setMasterDataset=dataset_setMasterDataset;
dataset.flushData=dataset_flushData;
dataset.clearData=dataset_clearData;
dataset.passData=dataset_passData;
dataset.sort=dataset_sort;

fireDatasetEvent(dataset, "onInitDataset", [dataset]);
dataset.setReadOnly(isTrue(dataset.readOnly));
initFieldArray(dataset, dataset.fields);
var record=dataset.firstUnit;
while (record){
initRecord(record, dataset);
record=record.nextUnit;
}

dataset.moveFirst();
dataset.prepared=true;
}
finally{
dataset.disableControlCount=0;
dataset.disableEventCount=0;
}
}

function _dataset_setMasterDataset(dataset, masterDataset, linkString, detailSql){
if (dataset.masterDataset){
var array=dataset.masterDataset.detailDatasets;
if (array) pArray_ex_delete(array, dataset);
}

if (typeof(masterDataset)=="string") masterDataset=getDatasetByID(masterDataset);
dataset.masterDataset=masterDataset;
dataset.detailSql=detailSql;
if (masterDataset){
var array=masterDataset.detailDatasets;
if (!array){
array=new pArray();
masterDataset.detailDatasets=array;
}
pArray_ex_insert(array, dataset);

var links=linkString.split(";");
var field, fieldName;
dataset.masterLinks=new Array();
for(var i=0; i<links.length; i++){
index=links[i].indexOf("=");
dataset.masterLinks[i]=new Object();

if (index>=0){
fieldName=links[i].substr(0, index);
}
else{
fieldName=links[i];
}
field=masterDataset.getField(fieldName);

if (field){
dataset.masterLinks[i].master_field=field.name;
dataset.masterLinks[i].master_index=field.index;
}
else
throw constErrCantFindMasterField.replace("%s", fieldName);

if (index>=0){
fieldName=links[i].substr(index+1);
}
else{
fieldName=links[i];
}
field=dataset.getField(fieldName);

if (field){
dataset.masterLinks[i].detail_field=field.name;
dataset.masterLinks[i].detail_index=field.index;
}
else{alert(dataset.id)
throw constErrCantFindDetailField.replace("%s", fieldName);
}
}
delete links;

delete dataset.loaded_detail;
dataset.loaded_detail=new Array;
masterDataset.loadDetail();
}
}

function dataset_setMasterDataset(masterDataset, linkString, detailSql){
var dataset=this;
try{
_dataset_setMasterDataset(dataset, masterDataset, linkString, detailSql);
}
catch (e){
processException(e);
}
}

function _dataset_loadDetail(dataset){
if (!dataset.record) return;

if (dataset.detailDatasets){
var unit=dataset.detailDatasets.firstUnit;
while (unit && unit.data){
try{
var detail_dataset=unit.data;

var keycode="";
for(var i=0; i<detail_dataset.masterLinks.length; i++){
keycode+=dataset.record[detail_dataset.masterLinks[i].master_index];
}

var keycode_founded=false;
for(var i=0; i<detail_dataset.loaded_detail.length; i++){
if (detail_dataset.loaded_detail[i]==keycode){
keycode_founded=true;
break;
}
}

if (!keycode_founded){
var dataset_inserted=false;
var event_result=fireDatasetEvent(detail_dataset, "beforeLoadDetail", [detail_dataset, dataset]);
if (event_result) throw event_result;
if (detail_dataset.detailSql){
var SQL=detail_dataset.detailSql;
for(var i=0; i<detail_dataset.masterLinks.length; i++){
var re="["+detail_dataset.masterLinks[i].master_field+"]";
SQL=SQL.replace(re, dataset.record[detail_dataset.masterLinks[i].master_index]);
}

var result=_execSQL(SQL, detail_dataset.connection);
if (result)
appendFromDataString(detail_dataset, result.record_str, true);
delete result;
}

detail_dataset.loaded_detail[detail_dataset.loaded_detail.length]=keycode;
}
detail_dataset.refreshControls();
detail_dataset.moveFirst();
unit=unit.nextUnit;
}
catch (e){
processException(e);
}
}
}
}

function dataset_loadDetail(){
var dataset=this;
try{
_dataset_loadDetail(dataset);
}
catch (e){
processException(e);
}
}

function dataset_isPageLoaded(pageIndex){
var dataset=this;
return dataset.loadedPage[pageIndex-1];
}


function _dataset_loadpage(dataset, pageIndex){
if (pageIndex<1 || pageIndex>dataset.totalPage || dataset.isPageLoaded(pageIndex)) return;
if (dataset.masterDataset) throw constErrLoadPageOnDetailDataset;
if (dataset.sortFields) throw constErrLoadPageAfterSort;

var result=_execSQL(dataset.sql, dataset.connection, dataset.pageSize, pageIndex);
if (result && result.record_str){
var tmpArray=new pArray();
appendFromDataString(tmpArray, result.record_str);
var record=tmpArray.lastUnit;
while (record){
initRecord(record, dataset);
record.pageIndex=pageIndex;
record=record.prevUnit;
}

var inserted=false;
var record=dataset.lastUnit;
while (record){
if (record.pageIndex<pageIndex){
pArray_insertArray(dataset, "after", record, tmpArray);
inserted=true;
break;
}
record=record.prevUnit;
}
if (!inserted) pArray_insertArray(dataset, "begin", null, tmpArray);
delete tmpArray;

dataset.loadedPage[pageIndex-1]=true;
dataset.refreshControls();
}
delete result;
}

function dataset_loadpage(pageIndex){
try{
var dataset=this;
_dataset_loadpage(dataset, pageIndex);
}
catch (e){
processException(e);
}
}

function _dataset_clearData(dataset){
dataset.disableControl();
try{
if (dataset.loaded_detail) delete dataset.loaded_detail;
if (dataset.loadedPage) delete dataset.loadedPage;
dataset.loadedPage=new Array();
if (dataset.absolutePage>0) dataset.loadedPage[dataset.absolutePage-1]=true;
pArray_clear(dataset);
dataset.moveFirst();
}
finally{
dataset.enableControl();
dataset.refreshControls();
}
}

function dataset_clearData(){
try{
var dataset=this;
_dataset_clearData(dataset);
}
catch (e){
processException(e);
}
}

function _dataset_passData(to_dataset, mode, record, from_dataset){
pArray_insertArray(to_dataset, mode, record, from_dataset);
}

function dataset_passData(mode, record, from_dataset){
var dataset=this;
pArray_insertArray(dataset, mode, record, from_dataset);
}

function freeDataset(dataset){
if (dataset.detailDatasets) pArray_clear(dataset.detailDatasets);
if (dataset.editors) pArray_clear(dataset.editors);
delete dataset.masterLinks;
pArray_clear(dataset.fields);
dataset.clearData();
delete dataset;
}

function _dataset_flushData(dataset, SQL, connection, pageSize, absolutePage){
dataset.disableControl();
try{
if (!SQL) SQL=dataset.sql;
if (!connection) connection=dataset.connection;
if (typeof(pageSize)=="undefined") pageSize=dataset.pageSize;
if (typeof(absolutePage)=="undefined") absolutePage=dataset.absolutePage;

dataset.clearData();

dataset.sql=SQL;
dataset.connection=connection;
dataset.pageSize=pageSize;
dataset.absolutePage=absolutePage;
var result=_execSQL(SQL, connection, pageSize, absolutePage);
if (result){
appendFromDataString(dataset, result.record_str, true);
dataset.moveFirst();
}
delete result;
}
finally{
dataset.enableControl();
dataset.refreshControls();
}
}

function dataset_flushData(SQL, connection, pageSize, absolutePage){
try{
var dataset=this;
_dataset_flushData(dataset, SQL, connection, pageSize, absolutePage)
}
catch (e){
processException(e);
}
}

function dataset_moveToPage(pageIndex){
try{
var dataset=this;
if (!dataset.isPageLoaded(pageIndex)) _dataset_loadpage(dataset, pageIndex);

var record=dataset.getFirstRecord();
while (record){
if (record.pageIndex>=pageIndex){
_dataset_setRecord(dataset, record);
break;
}
record=record.getNextRecord();
}
}
catch (e){
processException(e);
}
}

function record_saveOldValue(){
var record=this;

var fieldCount=record.fields.fieldCount;
for(var i=0; i<fieldCount; i++){
record[fieldCount+i]=record[i];
record[fieldCount*2+i]=record[i];
}
}

function _dataset_sort(dataset, fields){

function quickSort(_array, _fields, _low, _high){

function compareRecord(record, _mid_data){
if (_fields.length>0){
var value1, value2;
for (var i=0; i<_fields.length; i++){
if (_field[i].ascend){
value1=1;
value2=-1;
}
else{
value1=-1;
value2=1;
}

if (record.getFieldValue(_fields[i].index)>_mid_data[i]){
return value1;
}
else if (record.getFieldValue(_fields[i].index)<_mid_data[i]){
return value2;
}
}
}
else{
if (record.recordno>_mid_data[0]){
return 1;
}
else if (record.recordno<_mid_data[0]){
return -1;
}
}
return 0;
}

var low=_low;
var high=_high;
var mid=getInt((low+high)/2);
var mid_data=new Array();

if (_fields.length>0){
for (var i=0; i<_fields.length; i++)
mid_data[i]=_array[mid].getFieldValue(_fields[i].index);
}
else{
mid_data[0]=_array[mid].recordno;
}

do {
while (compareRecord(_array[low], mid_data)<0) low++;
while (compareRecord(_array[high], mid_data)>0) high--;

if (low<=high){
var tmp=_array[low];
_array[low]=_array[high];
_array[high]=tmp;

low++;
high--;
}
}while (low<=high)

if (high>_low) quickSort(_array, _fields, _low, high);
if (_high>low) quickSort(_array, _fields, low, _high);
}

var _field=new Array();
if (fields){
var fields_array=fields.split(",");
for (var i=0; i<fields_array.length; i++){
_field[i]=new Object();
_field[i].ascend=true;

var firstchar=fields_array[i].substring(0, 1);
var fieldName;
if (firstchar=="+" || firstchar=="-"){
if (firstchar=="-") _field[i].ascend=false;
fieldName=fields_array[i].substring(1, fields_array[i].length);
}
else{
fieldName=fields_array[i];
}

for (var j=0; j<dataset.fields.fieldCount; j++){
if (compareText(fieldName, dataset.fields[j].name)){
_field[i].index=j;
break;
}
}
}
}

function customSort(_array, _low, _high){

function compareRecord(record1, record2){
var event_name=getElementEventName(dataset, "onCompareRecord");
if (isUserEventDefined(event_name)){
return fireUserEvent(event_name, [record1.dataset, record1, record2]);
}
}

var low=_low;
var high=_high;
var mid_record=_array[getInt((low+high)/2)];

do {
while (compareRecord(_array[low], mid_record)<0) low++;
while (compareRecord(_array[high], mid_record)>0) high--;

if (low<=high){
var tmp=_array[low];
_array[low]=_array[high];
_array[high]=tmp;

low++;
high--;
}
}while (low<=high)

if (high>_low) customSort(_array, _low, high);
if (_high>low) customSort(_array, low, _high);
}

var _field=new Array();
if (fields){
if (fields!="#custom"){
var fields_array=fields.split(",");
for (var i=0; i<fields_array.length; i++){
_field[i]=new Object();
_field[i].ascend=true;

var firstchar=fields_array[i].substring(0, 1);
var fieldName;
if (firstchar=="+" || firstchar=="-"){
if (firstchar=="-") _field[i].ascend=false;
fieldName=fields_array[i].substring(1, fields_array[i].length);
}
else{
fieldName=fields_array[i];
}

for (var j=0; j<dataset.fields.fieldCount; j++){
if (compareText(fieldName, dataset.fields[j].name)){
_field[i].index=j;
break;
}
}
}
}
}

if (!dataset.firstUnit) return;

var tmp_array=new Array();
try{
var record=dataset.firstUnit;
var i=0;
while (record){
tmp_array[i++]=record;
if (!dataset.sortFields) record.recordno=i;
record=record.nextUnit;
}

dataset.sortFields=fields;
if (fields!="#custom"){
quickSort(tmp_array, _field, 0, tmp_array.length-1);
}
else{
customSort(tmp_array, 0, tmp_array.length-1);
}

dataset.firstUnit=null;
dataset.lastUnit=null;
for (var i=0; i<tmp_array.length; i++){
pArray_insert(dataset, "end", null, tmp_array[i]);
}

dataset.refreshControls();
}
finally{
delete tmp_array;
for (var i=0; i<_field.length; i++) delete _field[i];
delete _field;
}
}

function dataset_sort(fields){
try{
var dataset=this;
_dataset_sort(dataset, fields);
}
catch (e){
processException(e);
}
}

function dataset_setReadOnly(readOnly){
var dataset=this;
dataset.readOnly=readOnly;

_broadcastDatasetMsg(_notifyDatasetStateChanged, dataset);
}

function dataset_setFieldReadOnly(fieldName, readOnly){
var dataset=this;
var field=dataset.getField(fieldName);
if (field){
field.readOnly=readOnly;
_broadcastFieldMsg(_notifyFieldStateChanged, dataset, dataset.record, field);
}
}

function fireDatasetEvent(dataset, eventName, param){
if (dataset.disableEventCount>0) return;
var result;
result=fireUserEvent(getElementEventName(dataset, eventName), param);
return result;
}

function dataset_isRecordValid(record){
if (!record)
return false;
else{
var result=(record.recordState!="delete" && record.recordState!="discard" && record.visible);
var dataset=record.dataset;
var masterDataset=dataset.masterDataset;
if (result){
if (masterDataset){
if (!masterDataset.record) return false;

for(var i=0; i<dataset.masterLinks.length; i++){
if (masterDataset.record[dataset.masterLinks[i].master_index]!=
record[dataset.masterLinks[i].detail_index]){
result=false;
break;
}
}
}

if (dataset.filtered && !(record==dataset.record && dataset.state!="none")){
var event_name=getElementEventName(dataset, "onFilterRecord");
if (isUserEventDefined(event_name)){
if (!fireUserEvent(event_name, [dataset, record])) result=false;
}
}
}
return result;
}
}

function dataset_setBofnEof(dataset, BofValue, EofValue){
if (dataset.bof!=BofValue || dataset.eof!=EofValue){
dataset.bof=BofValue;
dataset.eof=EofValue;
_broadcastDatasetMsg(_notifyDatasetStateChanged, dataset, dataset.record);
}
}

function _do_dataset_setRecord(dataset, record){
if (dataset.record!=record){
if (dataset.record){
_dataset_updateRecord(dataset);
}

if (dataset.detailDatasets){
var detailDataset=dataset.detailDatasets.firstUnit;
while (detailDataset){
_dataset_updateRecord(detailDataset);
detailDataset=detailDataset.nextUnit;
}
}

var event_result=fireDatasetEvent(dataset, "beforeScroll", [dataset]);
if (event_result) throw event_result;

dataset.record=record;
dataset.modified=false;

if (dataset.disableControlCount<1) dataset.loadDetail();

fireDatasetEvent(dataset, "afterScroll", [dataset]);
_broadcastDatasetMsg(_notifyDatasetCursorChanged, dataset, record);
}
}

function _dataset_setRecord(dataset, record){
_do_dataset_setRecord(dataset, record);
if (record){
dataset_setBofnEof(dataset, false, false);
dataset_setBofnEof(dataset, false, false);
}
}

function dataset_setRecord(record){
try{
_dataset_setRecord(this, record);
}
catch(e){
processException(e);
}
}

function validateDatasetCursor(dataset){
var down_found=false, up_found=false;

var record=dataset.record;
while (record){
if (dataset_isRecordValid(record)){
_do_dataset_setRecord(dataset, record);
up_found=true;
break;
}
record=_record_getPrevRecord(record);
}

var record=dataset.record;
while (record){
if (dataset_isRecordValid(record)){
_do_dataset_setRecord(dataset, record);
down_found=true;
break;
}
record=_record_getNextRecord(record);
}

if (!up_found && !down_found)
_do_dataset_setRecord(dataset, null);

dataset_setBofnEof(dataset, (!up_found), (!down_found));
}

function dataset_setState(dataset, state){
dataset.state=state;

_broadcastDatasetMsg(_notifyDatasetStateChanged, dataset, dataset.record);
fireDatasetEvent(dataset, "onStateChanged", [dataset]);
}

function record_getFieldValue(fieldName){
var record=this;
var fields=record.fields;
var fieldIndex=-1;
var result;
if (fields){
if (typeof(fieldName)=="number"){
fieldIndex=fieldName;
}
else if (typeof(fieldName)=="string"){
fieldIndex=fields["_index_"+fieldName.toLowerCase()];
}

if (!isNaN(fieldIndex) && fieldIndex!=-1){
result=getTypedValue(record[fieldIndex], fields[fieldIndex].dataType);
}
}
return result;
}

function dataset_getFieldValue(fieldName){
var dataset=this;
if (dataset.record)
return dataset.record.getFieldValue(fieldName);
else
return "";
}

function record_getFieldText(fieldName){
var record=this, field, result="";
var value=record.getFieldValue(fieldName);
var field=record.dataset.getField(fieldName);

switch (typeof(value)){
case "number":{
if (!isNaN(value)){
if (field.dataType=="float")
return result=formatFloat(value, 2);
else
return result=value+"";
}
break;
}
case "object":{
if (!isNaN(value)){
if (field){
result=formatDateTime(value, field.dataType);
}
}
break;
}
default:{
result=getValidStr(value);
break;
}
}
return result;
}

function dataset_getFieldText(fieldName){
var dataset=this;
if (dataset.record)
return dataset.record.getFieldText(fieldName);
else
return "";
}

function _record_setFieldValue(record, fieldName, value){
var dataset=record.dataset;
var fields=record.fields;
var fieldIndex=-1;

if (fields){
if (typeof(fieldName)=="number"){
fieldIndex=fieldName;
}
else if (typeof(fieldName)=="string"){
fieldIndex=fields["_index_"+fieldName.toLowerCase()];
}

if (!isNaN(fieldIndex) && fieldIndex!=-1){
var event_result=fireDatasetEvent(dataset, "beforeChange", [dataset, fields[fieldIndex], value]);
if (event_result) throw event_result;

switch (fields[fieldIndex].dataType){
case "float":{
record[fieldIndex]=parseFloat(value);
break;
}
case "int":{
if (typeof(value)=="number")
record[fieldIndex]=Math.round(value);
else
record[fieldIndex]=Math.round(parseFloat(value));

break;
}
case "date":;
case "datetime":{
if (typeof(value)=="object")
record[fieldIndex]=value;
else
record[fieldIndex]=new Date(value);
break;
}
case "time":{
if (typeof(value)=="object")
record[fieldIndex]=value;
else
record[fieldIndex]=new Date("1900/1/1 "+value);
break;
}
case "bool":{
record[fieldIndex]=isTrue(value);
break;
}
default:{
record[fieldIndex]=getValidStr(value);
break;
}
}
dataset.modified=true;

fireDatasetEvent(dataset, "afterChange", [dataset, fields[fieldIndex]]);

if (dataset.state=="none") dataset_setState(dataset, "modify");
_broadcastFieldMsg(_notifyFieldDataChanged, dataset, record, fields[fieldIndex]);
}
}
}

function record_setFieldValue(fieldName, value){
try{
_record_setFieldValue(this, fieldName, value);
}
catch(e){
processException(e);
}
}

function _record_getPrevRecord(record){
var _record=record;
while (_record){
_record=_record.prevUnit;
if (dataset_isRecordValid(_record)) return _record;
}
}

function record_getPrevRecord(){
return _record_getPrevRecord(this);
}

function _record_getNextRecord(record){
var _record=record;
while (_record){
_record=_record.nextUnit;
if (dataset_isRecordValid(_record)) return _record;
}
}

function record_getNextRecord(){
return _record_getNextRecord(this);
}

function dataset_setFieldValue(fieldName, value){
try{
var dataset=this;
if (dataset.record)
dataset.record.setFieldValue(fieldName, value);
else
throw constErrNoCurrentRecord;
}
catch(e){
processException(e);
}
}

function dataset_refreshCursor(dataset){
_broadcastDatasetMsg(_notifyDatasetCursorChanged, dataset, dataset.record);
}

function dataset_disableControl(){
var dataset=this;
dataset.disableControlCount=dataset.disableControlCount+1;
}

function dataset_enableControl(){
var dataset=this;
dataset.disableControlCount=(dataset.disableControlCount>0)?dataset.disableControlCount-1:0;
dataset_refreshCursor(dataset);

}

function dataset_disableEvent(){
var dataset=this;
dataset.disableEventCount=dataset.disableEventCount+1;
}

function dataset_enableEvent(){
var dataset=this;
dataset.disableEventCount=(dataset.disableEventCount>0)?dataset.disableEventCount-1:0;
}

function dataset_refreshControls(){
var dataset=this;
_broadcastDatasetMsg(_notifyDatasetRefresh, dataset);
}

function _dataset_move(dataset, count){
var _record=dataset.record;
if (!_record) _record=dataset.getFirstRecord();
if (!_record) return;
var record=_record;

if (count>0){
var old_pageIndex=record.pageIndex
var eof=false;
for(var i=0; i<count; i++){
var pageIndex=0;

_record=record.getNextRecord();
if (!_record || (_record && _record.pageIndex!=old_pageIndex)){
if (old_pageIndex<dataset.totalPage){
if (!dataset.isPageLoaded(old_pageIndex+1)){
if ((i+dataset.pageSize<count) && (old_pageIndex+1<dataset.totalPage)){
i+=dataset.pageSize-1;
_record=record;
}
else{
_dataset_loadpage(dataset, old_pageIndex+1);
_record=record.getNextRecord();
}
}
}
old_pageIndex++;
}

if (_record){
record=_record;
}
else{
eof=true;
break;
}
}
dataset_setBofnEof(dataset, (!dataset_isRecordValid(dataset.record)), eof);
}
else{
var old_pageIndex=record.pageIndex
var bof=false;
for(var i=count; i<0; i++){
var pageIndex=0;

_record=record.getPrevRecord();
if (!_record || (_record && _record.pageIndex!=old_pageIndex)){
if (old_pageIndex>1){
if (!dataset.isPageLoaded(old_pageIndex-1)){
if ((i+dataset.pageSize<0) && (old_pageIndex>1)){
i+=dataset.pageSize-1;
_record=record;
}
else{
_dataset_loadpage(dataset, old_pageIndex-1);
_record=record.getPrevRecord();
}
}
}
old_pageIndex--;
}

if (_record){
record=_record;
}
else{
bof=true;
break;
}
}
dataset_setBofnEof(dataset, bof, (!dataset_isRecordValid(dataset.record)));
}

if (record) _do_dataset_setRecord(dataset, record);
}

function dataset_move(count){
var dataset=this;
try{
_dataset_move(dataset, count);
}
catch(e){
processException(e);
}
}

function dataset_movePrev(){
var dataset=this;
try{
_dataset_move(dataset, -1);
}
catch(e){
processException(e);
}
}

function dataset_moveNext(){
var dataset=this;
try{
_dataset_move(dataset, 1);
}
catch(e){
processException(e);
}
}

function _dataset_getFirstRecord(dataset){
var record=dataset.firstUnit;
if (record && !dataset_isRecordValid(record)) record=record.getNextRecord();
return record;
}

function dataset_getFirstRecord(){
return _dataset_getFirstRecord(this);
}

function dataset_moveFirst(){
var dataset=this;

try{
if (!dataset.isPageLoaded(1)) _dataset_loadpage(dataset, 1);
_do_dataset_setRecord(dataset, dataset.getFirstRecord());
dataset_setBofnEof(dataset, true, (!dataset_isRecordValid(dataset.record)));
}
catch(e){
processException(e);
}
}

function _dataset_getLastRecord(dataset){
var record=dataset.lastUnit;
if (!dataset_isRecordValid(record) && record) record=record.getPrevRecord();
return record;
}

function dataset_getLastRecord(){
return _dataset_getLastRecord(this);
}

function dataset_moveLast(){
var dataset=this;

try{
if (!dataset.isPageLoaded(dataset.totalPage)) _dataset_loadpage(dataset, dataset.totalPage);
_do_dataset_setRecord(dataset, dataset.getLastRecord());
dataset_setBofnEof(dataset, (!dataset_isRecordValid(dataset.record)), true);
}
catch(e){
processException(e);
}
}

function dataset_find(fieldNames, values, startRecord){

function isMatching(fieldNames, values, record){
var result=true;
for (var j=0; j<fieldNames.length && j<values.length; j++){
if (!compareText(record.getFieldText(fieldNames[j]), values[j])){
result=false;
break;
}
}
return result;
}

if (!fieldNames || !values) return false;

var dataset=this;
if (!dataset.record) return;
if (isMatching(fieldNames, values, dataset.record)) return dataset.record;

var record=(startRecord)?startRecord:dataset.getFirstRecord();
while (record){
if (isMatching(fieldNames, values, record)) return record;
record=record.getNextRecord();
}
}

function dataset_locate(fieldName, value, startRecord){

function isMatching(fieldName, value, record){
var tmpValue=record.getFieldText(fieldName);
return (tmpValue && compareText(tmpValue.substr(0, len), value));
}

if (!value) return false;

var dataset=this;
if (!dataset.record) return;
if (isMatching(fieldName, value, dataset.record)) return dataset.record;

var len=value.length;
var record=(startRecord)?startRecord:dataset.getFirstRecord();
while (record){
if (isMatching(fieldName, value, record)) return record;
record=record.getNextRecord();
}
}

function _dataset_insertRecord(dataset, mode){
_dataset_updateRecord(dataset);

var event_result=fireDatasetEvent(dataset, "beforeInsert", [dataset, mode]);
if (event_result) throw event_result;

var pageIndex=(dataset.record)?dataset.record.pageIndex:1;

var newRecord=new Array();
pArray_insert(dataset, mode, dataset.record, newRecord);
initRecord(newRecord, dataset);

switch (mode){
case "begin":{
newRecord.pageIndex=1;
break;
}
case "end":{
newRecord.pageIndex=dataset.totalPage;
break;
}
default:{
newRecord.pageIndex=pageIndex;
break;
}
}

newRecord.recordState="new";
newRecord.recordno=9999;

var masterDataset=dataset.masterDataset;
if (masterDataset && masterDataset.record){
for(var i=0; i<dataset.masterLinks.length; i++){
newRecord[dataset.masterLinks[i].detail_index]=masterDataset.record[dataset.masterLinks[i].master_index];
}
}

var fieldCount=dataset.fields.fieldCount;
for (var i=0; i<fieldCount; i++){
var defaultValue=getValidStr(dataset.fields[i].defaultValue);
if (defaultValue!=""){
if (defaultValue.length>8 && defaultValue.substr(0, 8)=="[script]"){
newRecord[i]=eval("newRecord[i]="+defaultValue.substr(8));}
else
newRecord[i]=defaultValue;
}
}

dataset_setState(dataset, "insert");
_broadcastDatasetMsg(_notifyDatasetInsert, dataset, dataset.record, [mode, newRecord]);
_dataset_setRecord(dataset, newRecord);

fireDatasetEvent(dataset, "afterInsert", [dataset, mode]);
dataset.modified=true;
}

function dataset_insertRecord(mode){
try{
_dataset_insertRecord(this, mode);
}
catch(e){
processException(e);
}
}

function _dataset_deleteRecord(dataset){
if (!dataset.record) return;

needUpdateEditor=false;
try{
if (dataset.record.recordState=="new" || dataset.record.recordState=="insert"){
var event_result=fireDatasetEvent(dataset, "beforeDelete", [dataset]);
if (event_result) throw event_result;

dataset.record.recordState="discard";
}
else{
var event_result=fireDatasetEvent(dataset, "beforeDelete", [dataset]);
if (event_result) throw event_result;

dataset.record.recordState="delete";
}

dataset.modified=false;

fireDatasetEvent(dataset, "afterDelete", [dataset]);
dataset_setState(dataset, "none");

_broadcastDatasetMsg(_notifyDatasetDelete, dataset, dataset.record);
validateDatasetCursor(dataset);
}
finally{
needUpdateEditor=true;
}
}

function dataset_deleteRecord(){
try{
_dataset_deleteRecord(this);
}
catch(e){
processException(e);
}
}

function _dataset_updateRecord(dataset){
if (!dataset.record) return;
if (!dataset_isRecordValid(dataset.record)) return;

_broadcastDatasetMsg(_notifyDatasetBeforeUpdate, dataset, dataset.record);

if (dataset.modified){
var fieldCount=dataset.fields.fieldCount;
for (var i=0; i<fieldCount; i++){
if (!isTrue(dataset.fields[i].readOnly) && isTrue(dataset.fields[i].notNull) &&
dataset.getFieldText(i)==""){
throw constErrFieldValueRequired.replace("%s", dataset.fields[i].label);
}
}

var event_result=fireDatasetEvent(dataset, "beforeUpdate", [dataset]);
if (event_result) throw event_result;

switch (dataset.record.recordState){
case "none":{
dataset.record.recordState="modify";
break;
}
case "new":{
dataset.record.recordState="insert";
break;
}
}

for (var i=0; i<fieldCount; i++){
dataset.record[fieldCount+i]=dataset.record[i];
}
dataset.modified=false;

fireDatasetEvent(dataset, "afterUpdate", [dataset]);
dataset_setState(dataset, "none");
}
else{
if (dataset.record.recordState=="new"){
dataset.record.recordState="discard";
dataset_setState(dataset, "none");
_broadcastDatasetMsg(_notifyDatasetDelete, dataset, dataset.record);
validateDatasetCursor(dataset);
}
}
}

function dataset_updateRecord(){
try{
_dataset_updateRecord(this);
return true;
}
catch(e){
processException(e);
return false;
}
}

function _dataset_cancelRecord(dataset){
if (!dataset.record) return;

needUpdateEditor=false;
try{
if (dataset.record.recordState=="new"){
var event_result=fireDatasetEvent(dataset, "beforeCancel", [dataset]);
if (event_result) throw event_result;

dataset.record.recordState="discard";

fireDatasetEvent(dataset, "afterCancel", [dataset]);

dataset_setState(dataset, "none");
_broadcastDatasetMsg(_notifyDatasetDelete, dataset, dataset.record);
validateDatasetCursor(dataset);
}
else if (dataset.modified){
var event_result=fireDatasetEvent(dataset, "beforeCancel", [dataset]);
if (event_result) throw event_result;

var fieldCount=dataset.fields.fieldCount;
for (var i=0; i<fieldCount; i++){
dataset.record[i]=dataset.record[fieldCount+i];
}
dataset.modified=false;

fireDatasetEvent(dataset, "afterCancel", [dataset]);

dataset_setState(dataset, "none");
_broadcastDatasetMsg(_notifyDatasetRefreshRecord, dataset, dataset.record);
}
}
finally{
needUpdateEditor=true;
}
}

function dataset_cancelRecord(){
try{
_dataset_cancelRecord(this);
}
catch(e){
processException(e);
}
}

function _dataset_copyRecord(dataset, record){
for(var i=0; i<dataset.fields.fieldCount; i++){
var fieldName=dataset.fields[i].name;
var value=record.getFieldValue(fieldName);
if (typeof(value)!="undefined") dataset.setFieldValue(fieldName, value);
}
}

function dataset_copyRecord(record){
var dataset=this;
_dataset_copyRecord(dataset, record);
}

function _broadcastDatasetMsg(proc, dataset, record, reserved){
if (dataset.disableControlCount>0) return;
var pArray=dataset.editors;
if (pArray){
var unit=pArray.firstUnit;
while (unit && unit.data){
proc(unit.data, dataset, record, reserved);
unit=unit.nextUnit;
}
}
}

function _broadcastFieldMsg(proc, dataset, record, field, reserved){
if (dataset.disableControlCount>0) return;
var pArray=dataset.editors;
if (pArray){
var unit=pArray.firstUnit;
while (unit && unit.data){
proc(unit.data, dataset, record, field, reserved);
unit=unit.nextUnit;
}
}
}

/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*/

function _notifyDatasetCursorChanged(element, dataset, record, reserved){
var _window=element.window;
switch (element.getAttribute("attrib")){
case "datatable":{
if (!record) break;

var pageSize=element.getAttribute("pageSize");
if (element.tBodies[0].rows.length>=pageSize){
var needRefresh=true;
var firstRecord=_window.getTableFirstRecord(element);
var lastRecord=_window.getTableLastRecord(element);

var _record=firstRecord;
while (_record){
if (_record==record){
needRefresh=false;
break;
}

if (_record==lastRecord) break;
_record=_record.nextUnit;
}

if (needRefresh && firstRecord && lastRecord){
if (record==firstRecord.getPrevRecord()){
_window.deleteTableRecord(element.tBodies[0].rows[element.tBodies[0].rows.length-1]);
_window.insertTableRecord(element, "begin", null, record);
needRefresh=false;
}
else if (record==lastRecord.getNextRecord()){
_window.deleteTableRecord(element.tBodies[0].rows[0]);
_window.insertTableRecord(element, "end", null, record);
needRefresh=false;
}
}

if (needRefresh){
var counter=pageSize;
var tmpRecord=record;

for(var i=0; i<counter; i++){
tmpRecord=tmpRecord.getNextRecord();
if (!tmpRecord) break;
}

var startRecord=record;
tmpRecord=record;
counter=pageSize-i-1;
for(var i=0; i<counter; i++){
tmpRecord=tmpRecord.getPrevRecord();
if (tmpRecord)
startRecord=tmpRecord;
else
break;
}

_window.refreshTableData(element, startRecord);
}
}

var row=_window.getTableRowByRecord(element, record);
if (row){
_window.setActiveTableRow(row);
}
break;
}
case "datalabel":{
_window.refreshElementValue(element);
break;
}
case "editor":;
case "dockeditor":{
_window.refreshElementValue(element);
element.isUserInput=false;
break;
}
case "datapilot":{
_window.refreshDataPilot(element);
break;
}
}
}

function _notifyDatasetBeforeUpdate(element, dataset, record, reserved){
var _window=element.window;
switch (element.getAttribute("attrib")){
case "dockeditor":{
_window.updateEditorInput(element);
break;
}
}
}

function _notifyDatasetStateChanged(element, dataset, record, reserved){
var _window=element.window;
switch (element.getAttribute("attrib")){
case "editor":;
case "dockeditor":{
var readOnly=dataset.readOnly;
var field=_window.getElementField(element);
if (field) readOnly=(readOnly || field.readOnly);
setEditorReadonly(element, (readOnly || element.readOnly));
break;
}
case "datapilot":{
_window.refreshDataPilot(element);
break;
}
case "datascrollbar":{
_window.refreshElementValue(element);
break;
}
case "datatable":{
if (element.activeRow) _window.refreshTableRowIndicate(element.activeRow);
break;
}
}
}

function _notifyDatasetInsert(element, dataset, record, reserved){
var _window=element.window;
switch (element.getAttribute("attrib")){
case "datatable":{
var row;
if (record) row=_window.getTableRowByRecord(element, record);

_window.insertTableRecord(element, reserved[0], row, reserved[1]);
if (element.tBodies[0].rows.length>element.getAttribute("pageSize")){
var lastRecord=_window.getTableLastRecord(element);
if (lastRecord!=reserved[1]){
_window.deleteTableRecord(element.tBodies[0].rows[element.tBodies[0].rows.length-1]);
}
else{
_window.deleteTableRecord(element.tBodies[0].rows[0]);
}
}
break;
}
}
}

function _notifyDatasetDelete(element, dataset, record, reserved){
var _window=element.window;
switch (element.getAttribute("attrib")){
case "datatable":{
if (record){
var row=_window.getTableRowByRecord(element, record);
if (row){
if (element.tBodies[0].rows.length<=element.getAttribute("pageSize")){
var firstRecord=_window.getTableFirstRecord(element);
var lastRecord=_window.getTableLastRecord(element);
if (firstRecord){
var _record=lastRecord.getNextRecord();
if (_record){
_window.insertTableRecord(element, "end", row, _record);
}
else{
var _record=firstRecord.getPrevRecord();
if (_record) _window.insertTableRecord(element, "begin", row, _record);
}
}
}

_window.deleteTableRecord(row);
}
}
break;
}
}
}

function _notifyDatasetRefreshRecord(element, dataset, record, reserved){
var _window=element.window;
switch (element.getAttribute("attrib")){
case "datatable":{
if (record){
var row=_window.getTableRowByRecord(element, record);
if (row) _window.refreshTableRecord(row);
}
break;
}
case "datalabel":;
case "editor":;
case "dockeditor":{
_window.refreshElementValue(element);
element.isUserInput=false;
break;
}
}

if (typeof(_window.sizeDockEditor)!="undefined") _window.sizeDockEditor();
}

function _notifyDatasetRefresh(element, dataset, record, reserved){
var _window=element.window;
switch (element.getAttribute("attrib")){
case "datatable":{
_window.refreshTableData(element);
break;
}
case "datalabel":;
case "editor":;
case "dockeditor":{
_window.refreshElementValue(element);
element.isUserInput=false;
break;
}
case "datapilot":{
_window.refreshDataPilot(element);
break;
}
}
_notifyDatasetStateChanged(element, dataset, record, reserved);

if (typeof(_window.sizeDockEditor)!="undefined") _window.sizeDockEditor();
}

function _notifyFieldDataChanged(element, dataset, record, field, reserved){
var _window=element.window;
switch (element.getAttribute("attrib")){
case "datatable":{
var row=_window.getTableRowByRecord(element, record);
for(var i=0; i<row.cells.length; i++){
var cell=row.cells[i];
if (compareText(cell.getAttribute("dataField"), field.name)){
_window.refreshElementValue(cell);
}
}
break;
}
case "editor":;
case "dockeditor":{
if (compareText(element.getAttribute("dataField"), field.name) || compareText(element.getAttribute("keyField"), field.name)){
_window.refreshElementValue(element);
element.isUserInput=false;
}
break;
}
case "datalabel":{
if (compareText(element.getAttribute("dataField"), field.name)){
_window.refreshElementValue(element);
}
break;
}
}

if (typeof(_window.sizeDockEditor)!="undefined") _window.sizeDockEditor();
}

function _notifyFieldStateChanged(element, dataset, record, field, reserved){

switch (element.getAttribute("attrib")){
case "editor":;
case "dockeditor":{
if (compareText(element.getAttribute("dataField"), field.name)){
var readOnly=dataset.readOnly;
if (field) readOnly=(readOnly || field.readOnly);
setEditorReadonly(element, (readOnly || element.readOnly));
}
break;
}
}
}

/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*/

function getFieldString(record, fieldName){
var result="";
var index=fieldName.indexOf("=");

if (index>=0){
result=fieldName.substr(index+1);
fieldName=fieldName.substr(0, index);
}
else{
var value=record.getFieldValue(fieldName);

switch (typeof(value)){
case "number":{
if (!isNaN(value)) result=value;
break;
}
case "boolean":{
result=(value)?"1":"0";
break;
}
case "object":{
if (!isNaN(value)) result=formatDateTime(value, "datetime");
break;
}
default:{
result=getValidStr(value);
break;
}
}
}

result=getEncodeStr(result);
return result;
}

function resetRecordState(record){
record.saveOldValue();
if (record.recordState=="delete")
record.recordState="discard";
else
record.recordState="none";
}

function resetDatasetState(dataset){
var record=dataset.firstUnit;
while (record){
resetRecordState(record);
record=record.nextUnit;
}
}

function getKeyFieldArray(dataset){
var fieldSplit=",";
if (dataset.keyFields){
return dataset.keyFields.split(fieldSplit);
}
else
return new Array();
}

function getUpdateFieldArray(dataset){
var fieldSplit=",";
if (dataset.updateFields)
return dataset.updateFields.split(fieldSplit);
else{
var result=new Array;
var count=0;
for(var i=0; i<dataset.fields.fieldCount; i++){
if (getValidStr(dataset.fields[i].tableName)=="" || compareText(dataset.fields[i].tableName, dataset.tableName)){
result[count]=dataset.fields[i].name;
count++;
}
}

return result;
}
}

function getRecordUpdateCode(record, keyFieldArray, updateFieldArray, mode){
try{
var fieldSplit=",";
var updateString="";
var result=new Object();

fireDatasetEvent(record.dataset, "onGetUpdateString", [record.dataset, record, result]);
if (!result.updateString){
if (result.mode) mode=result.mode;
switch (mode){
case "delete":{
if (keyFieldArray.length==0) throw constErrKeyFieldRequired;

for(var i=0; i<keyFieldArray.length; i++){
updateString += ((i==0)?"":fieldSplit) + getFieldString(record, "_old_"+keyFieldArray[i]);
}
break;
}
case "modify":{
if (keyFieldArray.length==0) throw constErrKeyFieldRequired;
if (updateFieldArray.length==0) throw constErrUpdateFieldRequired;

for(var i=0; i<updateFieldArray.length; i++){
updateString += ((i==0)?"":fieldSplit) + getFieldString(record, updateFieldArray[i]);
}
for(var i=0; i<keyFieldArray.length; i++){
updateString += fieldSplit + getFieldString(record, "_old_"+keyFieldArray[i]);
}
break;
}
case "insert":{
if (updateFieldArray.length==0) throw constErrUpdateFieldRequired;

for(var i=0; i<updateFieldArray.length; i++){
updateString += ((i==0)?"":fieldSplit) + getFieldString(record, updateFieldArray[i]);
}
break;
}
}
result.updateString=updateString;
}
if (!result.mode) result.mode=mode;

return result;
}
catch(e){
processException(e);
}
}

function composeUpdateString(tableName, keyFieldArray, updateFieldArray, deletestring, updatestring, insertstring){

function getfieldName(str){
var index=str.indexOf("=");

if (index>=0){
return str.substr(0, index);
}
else{
return str;
}
}

if (trimStr(deletestring)=="" && trimStr(updatestring)=="" && trimStr(insertstring)=="") return "";

var fieldSplit=",";
var recordSplit=";";

for(var i=0; i<keyFieldArray.length; i++)
keyFieldArray[i]=getEncodeStr(getfieldName(keyFieldArray[i]));

for(var i=0; i<updateFieldArray.length; i++)
updateFieldArray[i]=getEncodeStr(getfieldName(updateFieldArray[i]));

var result="T"+getEncodeStr(tableName);
result+="@K"+keyFieldArray.join(fieldSplit);
result+="@F"+updateFieldArray.join(fieldSplit);
if (trimStr(deletestring)!="") result+="@D"+deletestring;
if (trimStr(updatestring)!="") result+="@U"+updatestring;
if (trimStr(insertstring)!="") result+="@I"+insertstring;
return result;
}

function composeUpdateSQL(SqlArray){
var recordSplit=";";

for(var i=0; i<SqlArray.length; i++)
SqlArray[i]=getEncodeStr(SqlArray[i]);

return SqlArray.join(recordSplit);
}

function _getRecordUpdateString(record, mode){
var deleteString="", modifyString="", insertString="", tmpResult;
var keyFieldArray=getKeyFieldArray(record.dataset);
var updateFieldArray=getUpdateFieldArray(record.dataset);
tmpResult=getRecordUpdateCode(record, keyFieldArray, updateFieldArray, (mode)?mode:record.recordState);
switch (tmpResult.mode){
case "delete":{
deleteString=tmpResult.updateString;
break;
}
case "modify":{
modifyString=tmpResult.updateString;
break;
}
case "insert":{
insertString=tmpResult.updateString;
break;
}
}
delete tmpResult;

return composeUpdateString(record.dataset.tableName,
keyFieldArray,
updateFieldArray,
deleteString,
modifyString,
insertString);
}

function getRecordUpdateString(record, mode){
try{
return _getRecordUpdateString(record, mode);
}
catch(e){
processException(e);
return "";
}
}

function _getUpdateString(datasetArray){

function doGetUpdateString(dataset){
var fieldSplit=",";
var recordSplit=";";
var keyFieldArray=getKeyFieldArray(dataset);
var updateFieldArray=getUpdateFieldArray(dataset);
var deleteString="", modifyString="", insertString="", tmpResult;
var dCount=0, mCount=0, iCount=0;

var record=dataset.firstUnit;
while (record){
tmpResult=getRecordUpdateCode(record, keyFieldArray, updateFieldArray, record.recordState);
switch (tmpResult.mode){
case "delete":{
deleteString+=((dCount==0)?"":recordSplit)+tmpResult.updateString;
dCount++;
break;
}
case "modify":{
modifyString+=((mCount==0)?"":recordSplit)+tmpResult.updateString;
mCount++;
break;
}
case "insert":{
insertString+=((iCount==0)?"":recordSplit)+tmpResult.updateString;
iCount++;
break;
}
}
delete tmpResult;

record=record.nextUnit;
}

return composeUpdateString(dataset.tableName,
keyFieldArray,
updateFieldArray,
deleteString,
modifyString,
insertString);
}

for(var i=0; i<datasetArray.length; i++){
_dataset_updateRecord(datasetArray[i]);
}

var result="";
for(var i=0; i<datasetArray.length; i++){
var tmp=doGetUpdateString(datasetArray[i]);
if (tmp) result += ((result=="")?"":"&") + tmp;
}
return result;
}

function getUpdateString(datasetArray){
try{
return _getUpdateString(datasetArray);
}
catch(e){
processException(e);
return "";
}
}

function _submitUpdateString(connectionString, updateString){
if (trimStr(updateString)=="") return;
if (showSubmitCommand) alert("UpdateString:\n"+updateString+".");
var data=new Object();
data.connectionString=connectionString;
data.updateString=updateString;
data=showModalDialog(xForm_Library_path+"SaveDataFrame.asp", data,
"dialogHeight: 80px; dialogWidth: 220px; center: Yes; help: No; resizable: No; status: No");
if (!data.result) throw new Error(data.error_num, data.error_text);
return true;
}

function submitUpdateString(connectionString, updateString){
try{
_submitUpdateString(connectionString, updateString);
return true;
}
catch(e){
processException(getDBErrorDescription(e));
return false;
}
}

function submitUpdate(datasetArray){
try{
var updateString=_getUpdateString(datasetArray);
try{
if (_submitUpdateString(datasetArray[0].connection, updateString)){
for(var i=0; i<datasetArray.length; i++) resetDatasetState(datasetArray[i]);

}
return true;
}
catch(e){
processException(getDBErrorDescription(e));
return false;
}
}
catch(e){
processException(e);
return false;
}
}

function submitRecord(record, mode){
try{
var updateString=_getRecordUpdateString(record, mode);
try{
if (_submitUpdateString(record.dataset.connection, updateString)){
resetRecordState(record);
}
return true;
}
catch(e){
processException(getDBErrorDescription(e));
return false;
}
}
catch(e){
processException(e);
return false;
}
}

function getDBErrorDescription(errorObj){
error_number=errorObj.number & 0xFFFF;
var err_type;
switch (error_number){
case 3421:{
err_type=constErrDataType;
break;
}
case 3604:{
err_type=constErrKeyViolence;
break;
}
default:{
err_type=constErrUnknown;
break;
}
}
return constErrUpdateFailed+"\n"+
constErrType+":"+err_type+" ("+error_number+")\n"+
constErrDescription+":"+errorObj.description;
}

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

var _dropdown_parentwindow=null;
var _dropdown_parentbox=null;
var _dropdown_box=null;
var _dropdown_table=null;
var _dropdown_frame=null;
var _dropdown_dataset=null;
var _date_dropdown_box=null;

var _calendarControl=null;
var _tmp_dataset_date=null;

function initDropDownBox(dropDown_mode){
_document_loading=true;

switch (dropDown_mode){
case "data":{
_dropdown_div.onkeydown=_dropdown_onkeydown;
}

case "custom":{
_dropdown_parentwindow=window.parent;
_dropdown_parentbox=_dropdown_parentwindow._dropdown_box;
_dropdown_parentwindow._dropdown_window=window;
if (!_dropdown_parentbox || _dropdown_parentbox.style.visibility=="hidden") return;

var editor=_dropdown_parentbox.editor;
if (dropDown_mode=="data") _dropdown_div.style.width=editor.offsetWidth;

_dropdown_parentwindow.sizeDropDownBox();

with (_dropdown_parentwindow._dropdown_frame){
width="100%";
if (filters.blendTrans.status!=2) {
if (getIEVersion()<"5.5"){
style.visibility="visible";
}
else{
filters.blendTrans.apply();
style.visibility="visible";
filters.blendTrans.play();
}
}
}

hideStatusLabel(_dropdown_parentwindow);
break;
}

case "date":{
_dropdown_parentwindow=window;
_dropdown_parentbox=_dropdown_parentwindow._dropdown_box;
_dropdown_parentwindow._dropdown_window=window;
sizeDropDownBox();
if (_dropdown_parentbox.filters.blendTrans.status!=2 && !(getIEVersion()<"5.5"))
_dropdown_parentbox.filters.blendTrans.play();
break;
}

default:{
_dropdown_parentwindow=window;
_dropdown_parentbox=_dropdown_parentwindow._dropdown_box;
_dropdown_parentwindow._dropdown_window=window;
_dropdown_dataset=getElementDataset(_dropdown_table);
sizeDropDownBox();
if (_dropdown_parentbox.filters.blendTrans.status!=2 && !(getIEVersion()<"5.5"))
_dropdown_parentbox.filters.blendTrans.play();
break;
}
}

_dropdown_parentbox.prepared=true;
var editor=_dropdown_parentbox.editor;
if (editor) dropDownLocate();
_document_loading=false;
}

function sizeDropDownBox(){
function _sizeDropDownBox(new_width, new_height){
with (_dropdown_box){
var editor=_dropdown_box.editor;
var maxHeight=parseInt(editor.getAttribute("dropdown_height"));
if (isNaN(maxHeight) || maxHeight<20) maxHeight=220;

var pos=getAbsPosition(editor, document.body);
if (editor.getAttribute("attrib")=="dockeditor")
var _posLeft=pos[0]+2;
else
var _posLeft=pos[0]+1;
var _posTop=pos[1]+editor.offsetHeight+1;

if (new_height>maxHeight &&
!(editor.getAttribute("dropdown_mode")=="data" && getInt(editor.getAttribute("dropDown_pageSize"))>0)){
new_height=maxHeight;
new_width+=16;
if (!(getIEVersion()<"5.5"))
style.overflowY="scroll";
else
style.overflowY="visible";
}
else{
style.overflowY="hidden";
}
style.posHeight=new_height;
if (new_width>style.posWidth) style.posWidth=new_width;

var document_width=document.body.clientWidth + document.body.scrollLeft;
var document_height=document.body.clientHeight + document.body.scrollTop;
if (_posLeft+new_width>document_width && document_width>new_width) _posLeft=document_width-new_width;
if (_posTop+new_height>document_height && pos[1]>new_height) _posTop=pos[1]-new_height-1;
style.posLeft=_posLeft;
style.posTop=_posTop;
}
}

if (!isDropdownBoxVisible()) return;

try{
var _width, _height;
switch (_dropdown_box.getAttribute("dropDown_mode")){
case "data":;
case "custom":{
with (_dropdown_frame){
_height=_dropdown_window._dropdown_div.offsetHeight;
style.posHeight=_height;
if (_dropdown_window._dropdown_div.offsetWidth>_dropdown_box.clientWidth){
_width=_dropdown_window._dropdown_div.offsetWidth;
style.posWidth=_width;
}
}
break;
}

case "date":{
_width=CalendarTable.offsetWidth;
_height=CalendarTable.offsetHeight;
break;
}

default:{
_width=_dropdown_table.offsetWidth;
_height=_dropdown_table.offsetHeight;
break;
}
}
_sizeDropDownBox(_width, _height);
}
catch(e){
//do nothing
}
}

function canDropDown(editor){
return (editor.getAttribute("dropDown_mode") &&
!compareText(editor.type, "checkbox"));
}

function getDropDownCacheSaver(editor){
if (editor.getAttribute("attrib")=="editor"){
return editor;
}
else{
var table=getTableByCell(editor.editorHolder);
if (!table[editor.editorHolder.id]) table[editor.editorHolder.id]=new Object();
return table[editor.editorHolder.id];
}
}

function getDropDownBox(editor){
var needCreate=true;
var dropdown_saver=getDropDownCacheSaver(editor);

if (editor.getAttribute("dropDown_mode")=="date"){
needCreate=false;
_dropdown_box=_date_dropdown_box;
}
else if (isTrue(editor.getAttribute("dropDown_cached"))){
_dropdown_box=dropdown_saver.cached_dropdownbox;
switch (editor.getAttribute("dropDown_mode")){
case "staticlist":{
needCreate=(dropdown_saver.cached_dropdown_items!=editor.getAttribute("dropdown_items"));
break;
}
case "dataset":{
needCreate=(dropdown_saver.cached_dropdown_dataset!=editor.getAttribute("dropdown_dataset"));
break;
}
case "data":{
needCreate=(dropdown_saver.cached_dropdown_connection!=editor.getAttribute("dropdown_connection") ||
dropdown_saver.cached_dropdown_sql!=editor.getAttribute("dropdown_sql"));
break;
}
case "custom":{
needCreate=(dropdown_saver.cached_dropdown_url!=editor.getAttribute("dropdown_url"));
break;
}
}
}

if (needCreate || !_dropdown_box){
_dropdown_box=document.createElement("<DIV style=\"overflow-X: hidden; position: absolute; visibility: hidden; filter: blendTrans(duration=0.3)\"></DIV>");
document.body.appendChild(_dropdown_box);
}
}

function getDropDownBtn(){
if (typeof(_dropdown_btn)=="undefined"){
obj=document.createElement("<INPUT id=_dropdown_btn type=button tabindex=-1 value=6 hidefocus=true"+
" style=\"position: absolute; visibility: hidden; border: #333333 1px solid; font-family: Marlett; font-size: 10px; cursor: hand; z-index: 9999\""+
" LANGUAGE=javascript onmousedown=\"return _dropdown_btn_onmousedown(this)\" onfocus=\"return _dropdown_btn_onfocus(this)\" "+
" onmouseover=\"return _button_onmouseover()\" onmouseout=\"return _button_onmouseout()\">");
document.body.appendChild(obj);
return obj
}
else{
return _dropdown_btn;
}
}

function showDropDownBox(_editor){
try{
if (!canDropDown(_editor)) return;
if (!isDropdownBoxVisible()){
var eventName=getElementEventName(_editor, "beforeDropDown");
var event_result=fireUserEvent(eventName, [_editor]);
if (event_result) throw event_result;

getDropDownBox(_editor);
_dropdown_box.prepared=false;
if (_dropdown_box.filters.blendTrans.status==2) return;

var dataset=getElementDataset(_editor);
if (dataset){
if (!dataset.record) dataset.insertRecord();
}

with (_dropdown_box){
style.overflowY="hidden";
setAttribute("editor", _editor);

var dropDown_mode=_editor.getAttribute("dropDown_mode");
setAttribute("dropDown_mode", dropDown_mode);

switch (dropDown_mode){
case "data":;
case "custom":{
style.visibility="visible";
if (_editor.offsetWidth>128)
style.width=editor.offsetWidth
else
style.width=128;
break;
}

default:{
if (filters.blendTrans.status!=2) {
if (!(getIEVersion()<"5.5")) filters.blendTrans.apply();
style.visibility="visible";
}
break;
}
}

if (!_dropdown_box.cached){
switch (dropDown_mode){
case "data":{
showStatusLabel(window, constDownLoadingData);
var sql=_editor.getAttribute("dropDown_sql");
var connection=editor.getAttribute("dropDown_connection");
if (!connection && dataset) connection=dataset.connection;
if (sql && connection){
_dropdown_box.innerHTML="<IFRAME id=_dropdown_frame height=0 frameborder=0 marginheight=0 marginwidth=0 scrolling=no"+
" src=\""+xForm_Library_path+"dropdowndata.asp?sql="+escape(sql)+"&connection="+escape(connection)+"&tableName="+_editor.getAttribute("dropDown_tableName")+"&pageSize="+getInt(editor.getAttribute("dropdown_pageSize"))+
"&fields="+getValidStr(_editor.getAttribute("dropDown_fields"))+"\""+
" style=\"position:absolute; visibility:hidden; left:0; top:0; border-style: none; filter: blendTrans(duration=0.3)\"></IFRAME>";
_dropdown_frame=_dropdown_box.firstChild;
}
break;
}

case "custom":{
showStatusLabel(window, constDownLoadingData);
_dropdown_box.innerHTML="<IFRAME id=_dropdown_frame height=0 frameborder=0 marginheight=0 marginwidth=0 scrolling=no"+
" src=\""+_editor.getAttribute("dropDown_url")+"\""+
" scrolling=no style=\"overflow: hidden; position:absolute; visibility:hidden; left:0; top:0; border-style: none; filter: blendTrans(duration=0.3)\"></IFRAME>";
_dropdown_frame=_dropdown_box.firstChild;
break;
}

case "date":{
createCalendar(_dropdown_box);
initDropDownBox(dropDown_mode);
_dropdown_box.onkeydown=_calendar_onkeydown;
break;
}

default:{
style.width=_editor.offsetWidth;
createStaticListTable(_dropdown_box);
_dropdown_table.onkeydown=_dropdown_onkeydown;

if (dropDown_mode=="staticlist")
_dataset=getDropDownItems(editor);
else{
_dataset=editor.getAttribute("dropDown_dataset");
if (typeof(_dataset)=="string") _dataset=getDatasetByID(_dataset);
}

if (_dataset){
setElementDataset(_dropdown_table, _dataset);
_dropdown_table.fields=editor.getAttribute("dropDown_fields");
initElements(_dropdown_table);
refreshTableData(_dropdown_table);
}
initDropDownBox(dropDown_mode);
break;
}
}
}
else{
var dropdown_saver=getDropDownCacheSaver(_editor);
switch (dropDown_mode){
case "data":;
case "custom":{
var _window=dropdown_saver.cached_dropdown_window;
_window.initDropDownBox(dropDown_mode);
break;
}

default:{
if (getIEVersion()<"5.5"){
for (var i=0; i<_dropdown_box.children.length; i++){
_dropdown_box.children[i].style.visibility="visible";
}
}
_dropdown_table=dropdown_saver.cached_dropdown_table;
initDropDownBox(dropDown_mode);
break;
}
}
}
}
_editor.dropDown_visible=true;
if (typeof(_dropdown_btn)!="undefined") _dropdown_btn.value="5";
}
}
catch(e){
processException(e);
}
}

function hideDropDownBox(){
if (!_dropdown_box) return;
if (isDropdownBoxVisible()){
_skip_activeChanged=true;
var editor=_dropdown_box.editor;
if (_dropdown_box.prepared && (isTrue(editor.getAttribute("dropDown_cached")) ||
_dropdown_box.getAttribute("dropDown_mode")=="date")){
var dropdown_saver=getDropDownCacheSaver(editor);

dropdown_saver.cached_dropdownbox=_dropdown_box;
_dropdown_box.cached=true;
switch (_dropdown_box.getAttribute("dropDown_mode")){
case "staticlist":{
dropdown_saver.cached_dropdown_items=editor.getAttribute("dropdown_items");
dropdown_saver.cached_dropdown_table=_dropdown_table;
break;
}
case "dataset":{
dropdown_saver.cached_dropdown_dataset=editor.getAttribute("dropdown_dataset");
dropdown_saver.cached_dropdown_table=_dropdown_table;
break;
}
case "data":{
dropdown_saver.cached_dropdown_connection=editor.getAttribute("dropdown_connection");
dropdown_saver.cached_dropdown_sql=editor.getAttribute("dropdown_sql");
dropdown_saver.cached_dropdown_window=_dropdown_window;
break;
}
case "custom":{
dropdown_saver.cached_dropdown_url=editor.getAttribute("dropdown_url");
dropdown_saver.cached_dropdown_window=_dropdown_window;
break;
}
case "date":{
_date_dropdown_box=_dropdown_box;
break;
}
}

if (getIEVersion()<"5.5"){
for (var i=0; i<_dropdown_box.children.length; i++){
_dropdown_box.children[i].style.visibility="hidden"
}
}
_dropdown_box.style.visibility="hidden";
_dropdown_window=null;
}
else{
_dropdown_box.editor=null;
switch (_dropdown_box.getAttribute("dropDown_mode")){
case "staticlist":
case "dataset":{
setElementDataset(_dropdown_table, null);
break;
}
case "data":;
case "custom":{
if (typeof(_dropdown_frame)!="undefined"){
_dropdown_frame.style.visibility="hidden";
_dropdown_frame.removeNode(true);
}
break;
}
}
editor.cached_dropdownbox=null;
_dropdown_window=null;

if (getIEVersion()<"5.5"){
for (var i=0; i<_dropdown_box.children.length; i++){
_dropdown_box.children[i].style.visibility="hidden"
}
}
_dropdown_box.style.visibility="hidden";
_dropdown_box.removeNode(true);
_dropdown_box=null;
}

editor.dropDown_visible=false;
if (typeof(_dropdown_btn)!="undefined") _dropdown_btn.value="6";
}
}

function isDropDownBtnVisible(){
if (typeof(_dropdown_btn)!="undefined")
return (_dropdown_btn.style.visibility=="visible")
else
return false;
}

function sizeDropDownBtn(_editor){
if (!isDropDownBtnVisible()) return;
with (_dropdown_btn){
var pos=getAbsPosition(_editor);

style.height=_editor.offsetHeight;
style.width=16;
style.posLeft=pos[0]+_editor.offsetWidth-offsetWidth;
style.posTop=pos[1];
}
}

function showDropDownBtn(_editor){
if (!canDropDown(_editor)) return;
getDropDownBtn();
if (typeof(_dropdown_btn)=="undefined") return;

with (_dropdown_btn){
if (!isDropDownBtnVisible()){
setAttribute("editor", _editor);
style.visibility="visible";
sizeDropDownBtn(_editor);

var oldWidth=_editor.offsetWidth;
_editor.style.borderRightWidth=16;
_editor.style.width=oldWidth;
}
}
}

function hideDropDownBtn(){
if (typeof(_dropdown_btn)=="undefined") return;

if (isDropDownBtnVisible()){
var _editor=_dropdown_btn.editor;
if (_editor){
var oldWidth=_editor.offsetWidth;
_editor.style.borderRightWidth=1;
_editor.style.width=oldWidth;
}
_dropdown_btn.style.visibility="hidden";
_dropdown_btn.editor=null;
}
}

function _dropdown_btn_onmousedown(button){
var obj=button.editor;
if (!isDropdownBoxVisible()){
if (obj) showDropDownBox(obj);
}
else
hideDropDownBox();
}

function _dropdown_btn_onfocus(button){
var obj=button.editor;
if (obj) obj.focus();
}

function createStaticListTable(parent_element){
_dropdown_table=document.createElement("<table attrib=datatable isDropDownTable=true readOnly=true width=100% "+
" border=1 bordercolor=silver cellspacing=0 cellpadding=2 rules=all></table>");

if (parent_element)
parent_element.appendChild(_dropdown_table);
else
document.body.appendChild(_dropdown_table);
}

function dropDownLocate(){
var editor=_dropdown_parentbox.editor;
switch (editor.getAttribute("dropDown_mode")){
case "date":{
var _date=new Date(editor.value);
if (!isNaN(_date)) setCalendarDate(_date);
break;
}
default:{
if (_dropdown_dataset){
var fieldName;

if (editor.getAttribute("dropDown_mode")=="staticlist"){
fieldName=(editor.getAttribute("dropDown_mapValue"))?"name":"value";
}
else{
if (editor.use_keyField && editor.getAttribute("keyField")){
fieldName=editor.getAttribute("dropDown_keyField");
if (!fieldName) fieldName=editor.getAttribute("keyField");
}
else{
fieldName=editor.getAttribute("dropDown_dataField");
if (!fieldName) fieldName=editor.getAttribute("dataField");
}
}

var value=editor.value;
var record=_dropdown_dataset.locate(fieldName, value);
if (record) _dropdown_dataset.setRecord(record);
}
break;
}
}
}

function hideDropDown() {
var editor=_dropdown_parentbox.editor;
_dropdown_parentwindow.hideDropDownBox();
editor.focus();
}

function _standard_dropdown_keyDown(keycode){
switch(keycode){
//PageUp
case 33:{
var pageIndex=(_dropdown_dataset.record)?_dropdown_dataset.record.pageIndex-1:1;
_dropdown_dataset.moveToPage(pageIndex);
break;
}
//PageDown
case 34:{
var pageIndex=(_dropdown_dataset.record)?_dropdown_dataset.record.pageIndex+1:1;
_dropdown_dataset.moveToPage(pageIndex);
break;
}
//Up
case 38:{
if (_dropdown_dataset){
_dropdown_dataset.movePrev();
}
break;
}
//Down
case 40:{
if (_dropdown_dataset){
_dropdown_dataset.moveNext();
}
break;
}
}
}

function processDropDownKeyDown(keycode) {
switch(keycode){
//Enter
case 13:{
dropDownSelected();
break;
}
//ESC
case 27:{
hideDropDown();
break;
}
//F2
case 113:{
hideDropDown();
break;
}
//F7
case 118:{
hideDropDown();
break;
}
default:{
var editor=_dropdown_parentbox.editor;
switch (editor.getAttribute("dropDown_mode")){
case "staticlist":
case "dataset":
case "data":{
_standard_dropdown_keyDown(keycode);
break;
}
case "date":{
_calendar_onkeydown();
break;
}
default:{
if (typeof(dropDown_onKeyDown)!="undefined") dropDown_onKeyDown(keycode);
break;
}
}
}
}
}

function dropDownSelected(){
var record;
var editor=_dropdown_parentbox.editor;
switch (editor.getAttribute("dropDown_mode")){
case "staticlist":
case "dataset":
case "data":{
if (_dropdown_dataset) record=_dropdown_dataset.record;
break;
}
case "date":{
_tmp_dataset_date=createDataset("_tmp_dataset_date");
_tmp_dataset_date.addField("value");
initDataset(_tmp_dataset_date);
_tmp_dataset_date.insertRecord();
_tmp_dataset_date.setFieldValue("value", new Date(_calendarControl.year, _calendarControl.month, _calendarControl.day));
_tmp_dataset_date.updateRecord();
record=_tmp_dataset_date.record;
break;
}
default:{
if (typeof(dropDown_onGetRecord)!="undefined") record=dropDown_onGetRecord();
break;
}
}

if (record){
_dropdown_parentwindow.processDropDownSelected(_dropdown_parentbox.editor, record, false);
hideDropDown();
}
if (_tmp_dataset_date) freeDataset(_tmp_dataset_date);
}

function _dropdown_onkeydown(){
processDropDownKeyDown(event.keyCode);
}

function _dropdown_onclick(){
dropDownSelected();
event.cancelBubble=true;
}

/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*/

var _calendar_months, _calendar_days;

function createCalendar(parent_element){

function calendar(){
var today=new Date()
this.todayDay=today.getDate();
this.todayMonth=today.getMonth();
this.todayYear=today.getFullYear();
this.activeCellIndex=0;
}

_calendar_months=new Array(constJanuary, constFebrary, constMarch, constApril, constMay, constJune, constJuly, constAugust, constSeptember, constOctober, constNovember, constDecember);
_calendar_days=new Array(constSunday, constMonday, constTuesday, constWednesday, constThursday, constFriday, constSaturday);
_calendarControl=new calendar();

var tmpHTML="";
tmpHTML+="<TABLE id=\"CalendarTable\" border=1 bordercolor=silver rule=all width=260px cellspacing=0 cellpadding=2>";

tmpHTML+="<TR class=calendar_title valign=top>";
tmpHTML+="<TD>";
tmpHTML+="<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 style=\"FONT-SIZE: 9pt; FONT-WEIGHT: bold\">";
tmpHTML+="<TR>";
tmpHTML+="<TD WIDTH=20% align=left>";
tmpHTML+="<INPUT type=button attrib=button value=3 title=\""+constLastMonth+"\" style=\"FONT-SIZE:8;FONT-FAMILY: webdings\" onclick=\"changeCalendarDate(_calendarControl.preYear,_calendarControl.preMonth)\">";
tmpHTML+="</TD>";
tmpHTML+="<TD WIDTH=25% align=right id=\"monthValue\" nowrap>";
tmpHTML+="</TD>";
tmpHTML+="<TD WIDTH=10% id=\"yearValue\" nowrap>";
tmpHTML+="</TD>";
tmpHTML+="<TD WIDTH=25 align=center>";
tmpHTML+="<TABLE CELLSPACING=0 CELLPADDING=0>";
tmpHTML+="<TR>";
tmpHTML+="<TD valign=bottom>";
tmpHTML+="<INPUT type=button attrib=button value=5 title=\""+constLastYear+"\" style=\"HEIGHT: 10;FONT-SIZE:7;FONT-FAMILY: webdings\" onclick=\"changeCalendarDate(_calendarControl.year-1,_calendarControl.month)\">";
tmpHTML+="</TD>";
tmpHTML+="</TR>";
tmpHTML+="<TR>";
tmpHTML+="<TD valign=top>";
tmpHTML+="<INPUT type=button attrib=button value=6 title=\""+constNextYear+"\" style=\"HEIGHT: 10;FONT-SIZE: 7;FONT-FAMILY: webdings\" onclick=\"changeCalendarDate(_calendarControl.year+1,_calendarControl.month)\">";
tmpHTML+="</TD>";
tmpHTML+="</TR>";
tmpHTML+="</TABLE>";
tmpHTML+="</TD>";
tmpHTML+="<TD WIDTH=20% align=right>";
tmpHTML+="<INPUT type=button attrib=button value=4 title=\""+constNextMonth+"\" style=\"FONT-SIZE: 8;FONT-FAMILY: webdings\" onclick=\"changeCalendarDate(_calendarControl.nextYear,_calendarControl.nextMonth)\">";
tmpHTML+="</TD>";
tmpHTML+="</TR>";
tmpHTML+="</TABLE>";
tmpHTML+="</TD>";
tmpHTML+="</TR>";
tmpHTML+="<TR class=calendar_week>";
tmpHTML+="<TD>";
tmpHTML+="<TABLE WIDTH=100% HEIGHT=5% CELLSPACING=0 CELLPADDING=0 id=\"calendarWeek\" style=\"FONT-SIZE: 9pt\">";
tmpHTML+="<TR>";
for (var i=0;i<=6;i++){
tmpHTML+="<TD width=14% align=center>"+_calendar_days[i]+"</TD>";
}
tmpHTML+="</TR>";
tmpHTML+="</TABLE>";
tmpHTML+="</TD>";
tmpHTML+="</TR>";

tmpHTML+="<TR class=calendar_data>";
tmpHTML+="<TD>";
tmpHTML+="<TABLE HEIGHT=30% id=\"calendarData\" HEIGHT=100% WIDTH=100% CELLSPACING=0 CELLPADDING=0 style=\"PADDING-TOP: 0px; FONT-SIZE: 9pt; CURSOR: hand\"";
tmpHTML+="onclick=\"_calendar_cell_onclick(event.srcElement)\">";

for(var i=0;i<=5;i++){
tmpHTML+="<TR HEIGHT=10%>";
for(var j=0;j<=6;j++){
tmpHTML+="<TD align=center></TD>";
}
tmpHTML+="</TR>";
}
tmpHTML+="</TABLE>";
tmpHTML+="</TD>";
tmpHTML+="</TR>";

tmpHTML+="<TR class=calendar_footer>";
tmpHTML+="<TD align=right>";
tmpHTML+="<INPUT attrib=button type=button id=\"button_today\" value=\""+constToday+" "+_calendarControl.todayYear+"-"+(_calendarControl.todayMonth+1)+"-"+_calendarControl.todayDay+"\" onclick=\"_calendar_today_onclick()\" ";
tmpHTML+="style=\"height: 16\"";
tmpHTML+="</TD>";
tmpHTML+="</TR>";
tmpHTML+="</TABLE>";
if (parent_element)
parent_element.innerHTML=tmpHTML;
else
document.body.innerHTML=tmpHTML;

initElements(CalendarTable);
changeCalendarDate(_calendarControl.todayYear,_calendarControl.todayMonth,_calendarControl.todayDay)
}

function setCalendarDate(date){
changeCalendarDate(date.getFullYear(),date.getMonth(),date.getDate());
}

function changeCalendarDate(year, month, day){
if (_calendarControl.year==year && _calendarControl.month==month && (!day || _calendarControl.day==day)) return;

if (_calendarControl.year!=year || _calendarControl.month!=month){
_calendarControl.year=year;
_calendarControl.month=month;

if (month==0){
_calendarControl.preMonth=11
_calendarControl.preYear=_calendarControl.year-1
}else{
_calendarControl.preMonth=_calendarControl.month-1
_calendarControl.preYear=_calendarControl.year
}
if (month==11){
_calendarControl.nextMonth=0
_calendarControl.nextYear=_calendarControl.year+1
}else{
_calendarControl.nextMonth=_calendarControl.month+1
_calendarControl.nextYear=_calendarControl.year

}
_calendarControl.startday=(new Date(year,month,1)).getDay()
if (_calendarControl.startday==0) _calendarControl.startday=7
var curNumdays=getNumberOfDays(_calendarControl.month,_calendarControl.year)
var preNumdays=getNumberOfDays(_calendarControl.preMonth,_calendarControl.preYear)
var nextNumdays=getNumberOfDays(_calendarControl.nextMonth,_calendarControl.nextYear)
var startDate=preNumdays-_calendarControl.startday+1
var endDate=42-curNumdays-_calendarControl.startday

monthValue.innerText=_calendar_months[_calendarControl.month]+", "
yearValue.innerText=_calendarControl.year

var datenum=0
for (var i=startDate;i<=preNumdays;i++){
calendarData.cells[datenum].monthAttribute="pre";
calendarData.cells[datenum].style.color="gray";
calendarData.cells[datenum].innerText=i;
datenum++;
}
for (var i=1;i<=curNumdays;i++){
calendarData.cells[datenum].monthAttribute="cur";
calendarData.cells[datenum].style.color="black";
calendarData.cells[datenum].innerText=i;
datenum++;
}
for (var i=1;i<=endDate;i++){
calendarData.cells[datenum].monthAttribute="next";
calendarData.cells[datenum].style.color="gray";
calendarData.cells[datenum].innerText=i;
datenum++;
}
}

if (day) _calendarControl.day=day;
setCalendarActiveCell(calendarData.cells[_calendarControl.day+_calendarControl.startday-1]);
}

function setCalendarActiveCell(cell){

function setActiveCell(cellIndex){
calendarData.cells[_calendarControl.activeCellIndex].style.backgroundColor="";
calendarData.cells[cellIndex].style.backgroundColor="#ffebcd";
_calendarControl.activeCellIndex=cellIndex;
activeCell=_calendarControl.activeCellIndex%7
activeRow=Math.floor(_calendarControl.activeCellIndex/7)
}

if (cell.tagName.toLowerCase()!="td") return;
var _activeCellIndex=cell.parentElement.rowIndex*7+cell.cellIndex;

with(_calendarControl){
if (activeCellIndex==_activeCellIndex) return;

var monthAttribute=cell.monthAttribute;
switch (monthAttribute){
case "pre":{
changeCalendarDate(preYear,preMonth,getNumberOfDays(preMonth,preYear)-startday+_activeCellIndex+1);
setActiveCell(startday+day-1);
break
}
case "cur":{
changeCalendarDate(year,month,_activeCellIndex-startday+1);
setActiveCell(_activeCellIndex);
break
}
case "next":{
changeCalendarDate(nextYear,nextMonth,_activeCellIndex-getNumberOfDays(month,year)-startday+1);
setActiveCell(startday+day-1);
break
}
}
}
}

function _calendar_cell_onclick(cell){
setCalendarActiveCell(cell)
dropDownSelected()
}

function _calendar_onkeydown(){
switch(event.keyCode){
case 33:{//PgUp
if (event.ctrlKey){
changeCalendarDate(_calendarControl.year-1,_calendarControl.month)
}else{
changeCalendarDate(_calendarControl.preYear,_calendarControl.preMonth)
}
break
}
case 34:{//PgDn
if (event.ctrlKey){
changeCalendarDate(_calendarControl.year+1,_calendarControl.month)
}else{
changeCalendarDate(_calendarControl.nextYear,_calendarControl.nextMonth)
}
break
}
case 35:{//End
var index=getNumberOfDays(_calendarControl.month,_calendarControl.year) +_calendarControl.startday-1
setCalendarActiveCell(calendarData.cells[index])
break
}
case 36:{//Home
setCalendarActiveCell(calendarData.cells[_calendarControl.startday])
break
}
case 37:{//<--
var index=_calendarControl.activeCellIndex-1;
if (index<0) index=0;
setCalendarActiveCell(calendarData.cells[index])
break
}
case 38:{//上箭头
if (_calendarControl.activeCellIndex<7){
var day=getNumberOfDays(_calendarControl.preMonth,_calendarControl.preYear)+_calendarControl.day-7;
setCalendarDate(new Date(_calendarControl.preYear, _calendarControl.preMonth, day));
}
else{
var index=_calendarControl.activeCellIndex-7;
setCalendarActiveCell(calendarData.cells[index]);
}
break
}
case 39:{//-->
var index=_calendarControl.activeCellIndex+1;
if (index>=calendarData.cells.length) index=calendarData.cells.length-1;
setCalendarActiveCell(calendarData.cells[index])
break
}
case 40:{//下箭头
if (_calendarControl.activeCellIndex>34){
var day=7-(getNumberOfDays(_calendarControl.month,_calendarControl.year)-_calendarControl.day);
setCalendarDate(new Date(_calendarControl.nextYear, _calendarControl.nextMonth, day));
}
else{
var index=_calendarControl.activeCellIndex+7;
setCalendarActiveCell(calendarData.cells[index]);
}
break
}
}
}

function _calendar_today_onclick(){
changeCalendarDate(_calendarControl.todayYear,_calendarControl.todayMonth,_calendarControl.todayDay)
var index=_calendarControl.todayDay+_calendarControl.startday-1;
setCalendarActiveCell(calendarData.cells[index]);
dropDownSelected();
}

function getNumberOfDays(month,year){
var numDays=new Array(31,28,31,30,31,30,31,31,30,31,30,31)
n=numDays[month]
if (month==1 && (year%4==0 && year%100!=0 || year%400==0)) n++
return n
}

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

var needUpdateEditor=true;

function setEditorReadonly(editor, _readOnly){
with (editor){
if (_readOnly){
editor.readOnly=true;
style.color="dimgray";
style.backgroundColor="whitesmoke";
}
else{
editor.readOnly=false;
style.color="black";
style.backgroundColor="";
}
}
}

function checkFieldEditable(editor, dataset){
var editable=true;
if (dataset){
var field=getElementField(editor);
if (field){
editable=!(isTrue(dataset.readOnly) || isTrue(field.readOnly));
}
else
editable=true;
}

return editable;
}

function processDropDownSelected(editor, record, fireBySystem){
var eventName=getElementEventName(editor, "onDropDownSelect");
needAbort=(isUserEventDefined(eventName) && !fireUserEvent(eventName, [editor, record, fireBySystem]));

if (needAbort) return;

if (record){
switch (editor.getAttribute("dropDown_mode")){
case "staticlist":{
setElementValue(editor, record.getFieldValue("value"));
break;
}
case "date":{
setElementValue(editor,
formatDateTime(new Date(record.getFieldValue("value")), editor.getAttribute("dataType")));
break;
}
default:{
var dataset=getElementDataset(editor);
var dataField=editor.getAttribute("dataField");
var keyField=editor.getAttribute("keyField");
var dropDown_dataField=editor.getAttribute("dropDown_dataField");
var dropDown_keyField=editor.getAttribute("dropDown_keyField");
if (!dropDown_dataField) dropDown_dataField=dataField;
if (!dropDown_keyField) dropDown_keyField=keyField;

if (dataset){
if (dropDown_keyField){
if (fireBySystem)
editor.keyValue=editor.value;
else
editor.keyValue=record.getFieldValue(dropDown_keyField);

if (dataset.getField(keyField)){
dataset.setFieldValue(keyField, editor.keyValue);
}
else{
editor.value=editor.keyValue;
}
}
dataset.setFieldValue(dataField, record.getFieldValue(dropDown_dataField));
}
else{
editor.keyValue=editor.value;
editor.value=record.getFieldValue(dataField);
}
}
}
}
else{
switch (editor.getAttribute("dropDown_mode")){
case "data":;
case "custom":{
setElementValue(editor, "");
var dataset=getElementDataset(editor);
dataset.setFieldValue(editor.getAttribute("dataField"), "");
dataset.setFieldValue(editor.getAttribute("keyField"), "");
}
}
}

editor.dropDown_selectedValue=editor.value;
}

function validEditorInput(editor){
if (!editor.value || (compareText(editor.getAttribute("dropDown_mode"), "staticlist") && isTrue(editor.getAttribute("dropDown_mapValue")))) return;

switch (editor.getAttribute("dataType")){
case "int":{
if (isNaN(parseInt(editor.value)))
throw constErrTypeInt.replace("%s", editor.value);
break;
}
case "float":{
if (isNaN(parseFloat(editor.value)))
throw constErrTypeNumber.replace("%s", editor.value);
break;
}
case "date":{
var _date=new Date(editor.value);
if (isNaN(_date))
throw constErrTypeDate.replace("%s", editor.value);
else{
editor.value=formatDateTime(_date, "date");
}
break;
}
case "datetime":{
var _date=new Date(editor.value);
if (isNaN(_date))
throw constErrTypeDateTime.replace("%s", editor.value);
else{
editor.value=formatDateTime(_date, "datetime");
}
break;
}
case "time":{
var _date=new Date("1900/1/1 "+editor.value);
if (isNaN(_date))
throw constErrTypeTime.replace("%s", editor.value);
else{
editor.value=formatDateTime(_date, "time");
}
break;
}
}
}

function updateEditorInput(editor){
try{
if (window.closed) return;
if (editor.modified){
validEditorInput(editor);

var dataset=getElementDataset(editor);
var editorValue=getElementValue(editor);
var dataField=editor.getAttribute("dataField");
var keyField=editor.getAttribute("keyField");

var eventName=getElementEventName(editor, "onUpdate");
var event_result=fireUserEvent(eventName, [editor]);
if (event_result) throw event_result;

if (editor.dropDown_selectedValue!=editor.value
&& !isTrue(editor.getAttribute("dropDown_fixed"))){
if (editor.value!=""){
var notInList=false;
switch (editor.getAttribute("dropDown_mode")){
case "staticlist":{
var items=getDropDownItems(editor);
if (items){
notInList=(items.find(["value"], [editorValue])==null);
}
break;
}
case "dataset":{
var tmp_dataset=editor.getAttribute("dropDown_dataset");
if (tmp_dataset){
if (typeof(tmp_dataset)=="string") tmp_dataset=getDatasetByID(tmp_dataset);
if (dataset){
var keyField=editor.getAttribute("keyField");
if (!keyField) keyField=editor.getAttribute("dataField");
if (keyField){
var record=tmp_dataset.find([keyField], [editor.value]);
notInList=(record==null);
if (!notInList) processDropDownSelected(editor, record, true);
}
}
}
break;
}
case "data":;
case "custom":{
notInList=true;
var retrieveSql=editor.getAttribute("retrieveSql");
if (retrieveSql){
retrieveSql=retrieveSql.replace("[value]", editor.value);
var connection=editor.getAttribute("dropDown_connection");
if (!connection && dataset) connection=dataset.connection;

if (retrieveSql && connection){
var tmp_dataset=execSQL(retrieveSql, connection);
if (tmp_dataset){
if (tmp_dataset.record){
processDropDownSelected(editor, tmp_dataset.record, true);
notInList=false;
return;
}
}
}
}
break;
}
}

if (notInList && isTrue(editor.getAttribute("dropDown_restrict"))){
throw constErrOutOfDropDownList;
}
}
else{
switch (editor.getAttribute("dropDown_mode")){
case "data":;
case "custom":{
processDropDownSelected(editor, null, true);
break;
}
}
}
}

editor.dropDown_selectedValue=editor.value;

if (dataset && dataset.record){
if (dataset.window==window){
if (keyField){
_record_setFieldValue(dataset.record, keyField, trimStr(editorValue));
}
else{
_record_setFieldValue(dataset.record, dataField, trimStr(editorValue));
}
}
else{
if (keyField){
dataset.window._record_setFieldValue(dataset.record, keyField, trimStr(editorValue));
}
else{
dataset.window._record_setFieldValue(dataset.record, dataField, trimStr(editorValue));
}
}
}
}
}
catch(e){
processException(e);
refreshElementValue(editor);
editor.focus();
throw "abort";
}
}

function processEditorValueChanged(editor){
var dataset=getElementDataset(editor);
if (dataset){
var value=editor.value;
if (!dataset.record && editor.value!=""){
dataset.insertRecord("end");
if (dataset.state=="insert") editor.value=value;
}
}

editor.modified=(getElementValue(editor)!=editor.old_value);

if (editor.dropDown_visible && _dropdown_window)
_dropdown_window.dropDownLocate();
}

function _editor_onpropertychange() {
if (event.propertyName=="value"){
var editor=event.srcElement;
if (_activeEditor==editor) processEditorValueChanged(editor);
}
}


function _checkbox_onclick() {
processEditorValueChanged(event.srcElement);
}

function _editor_onkeypress() {
if (event.srcElement.readOnly || !event.srcElement.contentEditable){
event.returnValue=false;
return;
}

var result=true;
switch (event.srcElement.getAttribute("dataType")){
case "number":{
result=(event.keyCode>=48 && event.keyCode<=57);
break;
}
case "int":{
result=(event.keyCode == 45 || (event.keyCode>=48 && event.keyCode<=57));
break;
}
case "float":{
result=(event.keyCode == 45 || event.keyCode == 46 || (event.keyCode>=48 && event.keyCode<=57));
break;
}
case "date":{
result=(event.keyCode == 47 || (event.keyCode>=48 && event.keyCode<=57));
break;
}
case "datetime":{
result=(event.keyCode == 47 || event.keyCode == 58 || event.keyCode == 32 || (event.keyCode>=48 && event.keyCode<=57));
break;
}
case "time":{
result=(event.keyCode == 58 || (event.keyCode>=48 && event.keyCode<=57));
break;
}
}
event.returnValue=result;
}

function sizeDockEditor(editor) {
var _editor=(editor)?editor:_activeEditor;
if (!_editor) return;

var holder=_editor.editorHolder;
if (!holder) return;

var pos=getAbsPosition(holder);

with (_editor){
if (!compareText(type, "checkbox")){
style.posLeft=pos[0]-1;
style.posTop=pos[1]-1;
style.width=holder.offsetWidth+1;
style.height=holder.offsetHeight+1;
}
else{
style.posLeft=pos[0];
style.posTop=pos[1];
style.width=holder.clientWidth;
style.height=holder.clientHeight;

if (offsetWidth>18){
style.borderLeftWidth=(offsetWidth-18)/2;
style.borderRightWidth=(offsetWidth-18)/2;
}
}
}
}

function showDockEditor(holder){
try{
if (isTrue(holder.getAttribute("readOnly"))) throw "abort";
if (!checkFieldEditable(holder, getElementDataset(holder))) throw "abort";

var eventName=getElementEventName(holder, "beforeLoadEditor");
var event_result=fireUserEvent(eventName, [holder]);
if (event_result) throw event_result;

editor=getDockEditor(holder);
if (editor.editorHolder==holder) return

with (editor){
if (style.visiblity!="visible"){
editor.editorHolder=holder;
editor.dataType=holder.getAttribute("dataType");
editor.editorType=holder.getAttribute("editorType");
editor.dataField=holder.getAttribute("dataField");
editor.keyField=holder.getAttribute("keyField");
editor.autoDropDown=holder.getAttribute("autoDropDown");
editor.dropDown_mode=holder.getAttribute("dropDown_mode");
editor.dropDown_items=holder.getAttribute("dropDown_items");
editor._dropDown_items=holder._dropDown_items;
editor.dropDown_dataset=holder.getAttribute("dropDown_dataset");
editor.dropDown_dataField=holder.getAttribute("dropDown_dataField");
editor.dropDown_keyField=holder.getAttribute("dropDown_keyField");
editor.dropDown_fields=holder.getAttribute("dropDown_fields");
editor.dropDown_fixed=holder.getAttribute("dropDown_fixed");
editor.dropDown_cached=holder.getAttribute("dropDown_cached");
editor.dropDown_restrict=holder.getAttribute("dropDown_restrict");
editor.dropDown_mapValue=holder.getAttribute("dropDown_mapValue");
editor.dropDown_url=holder.getAttribute("dropDown_url");
editor.dropDown_sql=holder.getAttribute("dropDown_sql");
editor.dropDown_connection=holder.getAttribute("dropDown_connection");
editor.dropDown_tableName=holder.getAttribute("dropDown_tableName");
editor.dropdown_pageSize=holder.getAttribute("dropdown_pageSize");
editor.dropdown_height=holder.getAttribute("dropdown_height");
editor.retrieveSql=holder.getAttribute("retrieveSql");

var _dataset=getElementDataset(holder);
if (compareText(holder.tagName, "td")){
var table=getTableByCell(holder);
if (table) table.editor=editor;
editor.in_table=true;
}
else
editor.in_table=false;

setElementDataset(editor, _dataset);

sizeDockEditor(editor);
style.visibility="visible";
}

editor.focus();
}
}
catch(e){
processException(e)
}
}

function hideDockEditor(editor){
if (editor.style.visibility=="visible"){
_skip_activeChanged=true;
editor.style.visibility="hidden";
setElementDataset(editor, null);

var holder=editor.editorHolder;
if (holder){
if (compareText(holder.tagName, "td")){
var table=getTableByCell(holder);
if (table) table.editor=null;
}
editor.editorHolder=null;
}
}
}

function getDockEditor(holder){
var result=null;
var editorType=holder.getAttribute("editorType");

switch (editorType){
case "textarea":{
if (typeof(_table_textarea)=="undefined"){
result=document.createElement("<TEXTAREA id=_table_textarea attrib=dockeditor tabindex=-1"+
" style=\"position: absolute; visibility: hidden\"></TEXTAREA>");
initElement(result);
document.body.appendChild(result);
}
else{
result=_table_textarea;
}
break;
}
case "checkbox":{
if (typeof(_table_checkbox)=="undefined"){
result=document.createElement("<INPUT id=_table_checkbox type=checkbox hidefocus=false attrib=dockeditor tabindex=-1"+
" style=\"position: absolute; visibility: hidden; background-color: window;\">");
initElement(result);
document.body.appendChild(result);
}
else{
result=_table_checkbox;
}
break;
}
default:{
if (typeof(_table_texteditor)=="undefined"){
result=document.createElement("<INPUT id=_table_texteditor attrib=dockeditor tabindex=-1"+
" style=\"position: absolute; visibility: hidden\">");
initElement(result);
document.body.appendChild(result);

}
else{
result=_table_texteditor;
}
break;
}
}

return result;
}

function setFocusTableCell(table, rowIndex, cellIndex){
_rowIndex=rowIndex;
_cellIndex=cellIndex;
if (_rowIndex==-1) _rowIndex=table.activeRowIndex;
if (_cellIndex==-1) _cellIndex=table.activeCellIndex;
var index=checkTableCellIndex(table, _rowIndex, _cellIndex);
table.rows[index[0]].cells[index[1]].focus();
}

function isEmptyRow(row){
function getTableRowState(row){
var record=row.record;
if (record)
return record.recordstate
else
return "";
}

return (getTableRowState(row)=="new" && !getTableRowModified(row));
}

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

var _menu_frame=null;
var _array_menu=new Array();

function prepareMenu(menu, menuItems){

function getMenu(menu){
_menu_frame=document.createElement("<table width=100 border=1 bordercolor=silver cellspacing=0 cellpadding=3 rules=all"+
" style=\"position:absolute; visibility:hidden; border:1 solid gray; border-collapse:collapse; font-size:9pt; cursor:hand; filter: blendTrans(duration=0.5); z-index: 10000\">"+
"</table>");
document.body.appendChild(_menu_frame);
_menu_frame.onmouseover=_menu_onmouseenter;
_menu_frame.onmouseout=_menu_onmouseout;
_menu_frame.onmouseup=_menu_onmouseup;

var row=_menu_frame.insertRow();
row.attrib="menuitem";
var cell=row.insertCell();
cell.noWrap=true;
cell.style.paddingLeft="12px";
cell.style.paddingRight="12px";
_menu_frame.repeatrow=row.cloneNode(true);
}

if (!menuItems) return;

getMenu(menu);
var item=menuItems.firstUnit;
var row, cell;
var count=0;
while (item){
if (count>(_menu_frame.rows.length-1)){
row=_menu_frame.repeatrow.cloneNode(true);
_menu_frame.tBodies[0].insertAdjacentElement("beforeEnd", row);
}
else{
row=_menu_frame.rows[count];
}

if (row.rowIndex % 2)
row.bgColor="#f0f9ff";
else
row.bgColor="#e0f0ff";

fireUserEvent(getElementEventName(menu, "onUpdateMenuItem"), [menu, item]);

cell=row.cells[0];
cell.innerHTML=item.label;
row.item=item;
if (getIEVersion()<"5.5"){
cell.style.color=(item.disabled)?"gray":"";
}
else{
cell.disabled=item.disabled;
}

count++;
item=item.nextUnit;
}

_menu_frame.menu=menu;
_menu_frame.menuItems=menuItems;
}

function isPopupMenuVisible(){
return (_menu_frame && _menu_frame.style.visibility=="visible");
}

function showPopupMenu(menu, button){
var useFilter=true;
if (_menu_frame){
clearTimeout(_menu_frame.timeout_id);
if (_menu_frame.style.visibility=="visible"){
_hidePopupMenu();
useFilter=false;
}
}
menuItems=menu.menuItems;
menu.popup=(!button);
prepareMenu(menu, menuItems);

if (button){
var pos=getAbsPosition(button, document.body);

if (pos[0]+_menu_frame.offsetWidth>document.body.clientWidth-2)
_menu_frame.style.posLeft=pos[0]+button.offsetWidth-_menu_frame.offsetWidth-2;
else
_menu_frame.style.posLeft=pos[0];

if (pos[1]+button.offsetHeight+_menu_frame.offsetHeight>document.body.clientHeight-2)
_menu_frame.style.posTop=pos[1]-_menu_frame.offsetHeight-2;
else
_menu_frame.style.posTop=pos[1]+button.offsetHeight+1;

_menu_frame.button=button;
button.menu_opened=true;
}
else{
var tmp_left, tmp_top;
if (event.x+_menu_frame.offsetWidth>document.body.clientWidth-2)
tmp_left=event.x-_menu_frame.offsetWidth+-5;
else
tmp_left=event.x-5;

if (event.y+_menu_frame.offsetHeight>document.body.clientHeight-2)
tmp_top=event.y-_menu_frame.offsetHeight+-5;
else
tmp_top=event.y-5;

_menu_frame.style.posLeft=tmp_left+document.body.scrollLeft;
_menu_frame.style.posTop=tmp_top+document.body.scrollTop;
}

if (_menu_frame.filters.blendTrans.status!=2){
if (getIEVersion()<"5.5" || !useFilter){
_menu_frame.style.visibility="visible";
}
else{
_menu_frame.filters.blendTrans.apply();
_menu_frame.style.visibility="visible";
_menu_frame.filters.blendTrans.play();
}
}
}

function _hidePopupMenu(){
if (!isPopupMenuVisible()) return;

var button=_menu_frame.button;
if (button){
button.menu_opened=false;
_menu_frame.button=null;
}

_menu_frame.removeNode(true);
_menu_frame.style.visibility="hidden";
_menu_frame=null;
}

function hidePopupMenu(){
_menu_frame.timeout_id=setTimeout("_hidePopupMenu()" ,300);
}

function _menu_onmouseenter() {
var menu=_menu_frame.menu;
var element=event.srcElement.parentElement;
var item=element.item;

if (element.getAttribute("attrib")=="menuitem" && item && !item.disabled){
element.bgColor="#ffebcd";
}

clearTimeout(_menu_frame.timeout_id);
}

function _menu_onmouseout() {
var menu=_menu_frame.menu;
var element=event.srcElement.parentElement;

if (element.getAttribute("attrib")=="menuitem"){
if (element.rowIndex % 2)
element.bgColor="#f0f9ff";
else
element.bgColor="#e0f0ff";
}

if (!isChild(event.toElement, _menu_frame)) hidePopupMenu();
}

function _menu_onmouseup() {
if (_menu_frame.filters.blendTrans.status==2) return;

if (event.button!=2){
var menu=_menu_frame.menu;
var element=event.srcElement.parentElement;
var item=element.item;

if (item && (!item.disabled) && element){
_hidePopupMenu();
if (element.getAttribute("attrib")=="menuitem"){
fireUserEvent(getElementEventName(menu, "onItemClick"), [menu, item]);
}
return;
}
}
_hidePopupMenu();
}



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

function getRecordByCell(cell){
return getRowByCell(cell).record;
}

function getTableRowByRecord(table, record){
var result=null;
for(var i=0; i<table.tBodies[0].rows.length; i++){
var row=table.tBodies[0].rows[i];
if (row.record==record){
result=row;
break;
}
}
return result;
}

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

function getTableRowStyle(row){
var table=getTableByRow(row);
if (row.rowIndex % 2)
return "tr1";
else
return "tr2";
}

function refreshTableRowStyle(row){
var table=getTableByRow(row);
if (row==table.activeRow){
if (table.focused)
row.className="current_tr";
else if (!isTrue(table.getAttribute("hideSelection")))
row.className="active_tr";
else
row.className=getTableRowStyle(row);
}
else{
row.className=getTableRowStyle(row);
}
}

function refreshTableRowIndicate(row){
var table=getTableByRow(row);
if (!isTrue(table.getAttribute("showIndicate"))) return;

var cell=row.firstChild;
if (table.activeRow==row){
var record=row.record;
if (record && (record.dataset.state=="insert" || record.dataset.state=="modify"))
cell.innerHTML="<label style=\"font-size: 10pt; color: red; margin-left: 1px; margin-right: 1px\">*</label>";
else
cell.innerHTML="<label style=\"font-family: Webdings; color: #555555; font-size: 7pt\">4</label>";
cell.bgColor="";
}
else{
cell.innerHTML="";
cell.bgColor="#e0e0e0";
}
}

function resetDataTableStyle(table, startIndex){
var row;
var maxIndex=checkTableCellIndex(table, 9999, 9999);
for(var i=startIndex; i<=maxIndex[0]; i++){
row=table.rows[i];
refreshTableRowStyle(row);
}
}

function initDataTable(table, resetColumns){

function setElementAttribute(element, attr, value){
if (getValidStr(element.getAttribute(attr))=="") element.setAttribute(attr, value);
}

table.activeRow=null;
table.activeRowIndex=null;
table._activeCellIndex=null;
table.activeCellIndex=null;
table._activeCell=null;
table._activeCellIndex=null;
if (isTrue(table.isDropDownTable)) table.onclick=_dropdown_onclick;

var dataset=getElementDataset(table);

if (resetColumns && dataset){
var arrayField;
var fields=table.getAttribute("fields");
if (fields){
arrayField=fields.split(",");
}
else{
arrayField=new Array();
for(var i=0; i<dataset.fields.fieldCount; i++){
if (dataset.fields[i].visible) arrayField[arrayField.length]=dataset.fields[i].name.toLowerCase();
}
}

for (var i=table.children.length-1; i>=0; i--) table.children[i].removeNode(true);
var row, cell;
if (isTrue(table.getAttribute("hasHeader"))){
row=table.createTHead().insertRow();
for(var i=0; i<arrayField.length; i++){
cell=row.insertCell();
cell.dataField=arrayField[i];
}
}

row=table.insertRow();
for(var i=0; i<arrayField.length; i++){
cell=row.insertCell();
cell.dataField=arrayField[i];
}

if (isTrue(table.getAttribute("hasFooter"))){
row=table.createTFoot().insertRow();
for(var i=0; i<arrayField.length; i++){
cell=row.insertCell();
cell.dataField=arrayField[i];
}
}
delete arrayField;
}

var tHeadRow, tBodyRow, tFootRow;
if (table.tHead && table.tHead.firstChild) tHeadRow=table.tHead.firstChild;
if (table.tFoot && table.tFoot.firstChild) tFootRow=table.tFoot.firstChild;
tBodyRow=table.tBodies[0].firstChild;

if (tBodyRow.cells.length==0){
cell=tBodyRow.insertCell();
if (tHeadRow) cell=tHeadRow.insertCell();
if (tFootRow) cell=tFootRow.insertCell();
}

if (isTrue(table.getAttribute("showIndicate"))){
table.minCellIndex=1;
if (!tBodyRow.firstChild || (tBodyRow.firstChild && !tBodyRow.firstChild.isIndicate)){
cell=tBodyRow.insertCell(0);
cell.width="9px";
cell.align="center";
cell.bgColor="#e0e0e0";
cell.isIndicate=true;

if (tHeadRow){
cell=tHeadRow.insertCell(0);
cell.align="center";
cell.bgColor="#e0e0e0";
}

if (tFootRow)
{
cell=tFootRow.insertCell(0);
cell.align="center";
cell.bgColor="#e0e0e0";
}
}
}
else{
table.minCellIndex=0;
}

for(var i=table.minCellIndex; i<tBodyRow.children.length; i++){
var cell=tBodyRow.children[i];
var dataField=cell.getAttribute("dataField");
if (dataField) dataField=dataField.toLowerCase();

var field=null;
if (dataset) field=dataset.getField(dataField);

cell.id=table.id+"_"+dataField;
cell.attrib="tablecell";
if (isTrue(table.getAttribute("isDropDownTable"))) cell.noWrap=true;
if (getValidStr(cell.getAttribute("dropdown_cached"))=="")
cell.dropdown_cached=true;

if (dataField=="select"){
cell.width="16";
cell.align="center";
cell.vAlign="center";
cell.innerHTML="<input type=checkbox onclick=\"return _table_checkbox_onclick();\" style=\"height:16\">";
cell.readOnly=true;
}
else{
if (field){
setElementAttribute(cell, "readOnly", field.readOnly);
setElementAttribute(cell, "dataType", field.dataType);
setElementAttribute(cell, "align", field.align);
setElementAttribute(cell, "vAlign", field.vAlign);
}
else{
setElementAttribute(cell, "readOnly", true);
}
}

if (getValidStr(cell.getAttribute("editorType"))==""){
switch (cell.getAttribute("dataType")){
case "date":{
cell.editorType="date";
break;
}
case "longtext":{
cell.editorType="textarea";
break;
}

case "bool":{
cell.editorType="checkbox";
break;
}
}
}

fireUserEvent(getElementEventName(table, "onInitCell"), [table, cell, field]);
initElement(cell);

if (tHeadRow){
var cell=tHeadRow.children[i];
cell.id=table.id+"_header_"+dataField;
cell.attrib="columnheader";

if (dataField=="select"){
if (!cell.getAttribute("label")) cell.label="<font face=Marlett size=2>a</font>";
}
else if (field){
cell.dataset=dataset;
}
initElement(cell);

}

if (tFootRow){
var cell=tFootRow.children[i];
cell.id=table.id+"_footer_"+dataField;
cell.attrib="columnfooter";

if (dataField=="select"){
if (!cell.getAttribute("label")) cell.label="<font face=Marlett size=2>a</font>";
}
else if (field){
cell.dataset=dataset;
}
initElement(cell);
}
}
tBodyRow.attrib="tablerow";
table.repeatRow=tBodyRow.cloneNode(true);

table.selectedRecords=new pArray();
if (getInt(table.getAttribute("pageSize"))==0) table.pageSize=99999;
}

function resetDataTable(table){
initDataTable(table, true);
refreshTableData(table);
}

function refreshTableData(table, startRecord){
var dataset=getElementDataset(table);
if (!dataset) return;

var count=0, pageSize=table.getAttribute("pageSize");

var _record=(startRecord)?startRecord:dataset.getFirstRecord();
var count=0;
while (_record && count<pageSize){
if (count>(table.tBodies[0].rows.length-1)) insertTableRow(table, "end");
row=table.tBodies[0].rows[count];
refreshTableRowStyle(row);
row.attrib="tablerow";
row.record=_record;

for (var j=0; j<row.cells.length; j++){
cell=row.cells[j];
refreshElementValue(cell);
}
count++;
_record=_record.getNextRecord();
}

for(var i=table.tBodies[0].rows.length-1; i>=count; i--){
var tmpRow=table.tBodies[0].rows[i];
if (table.tBodies[0].rows.length!=1)
deleteTableRow(tmpRow);
else{
tmpRow.record=null;
for (var j=0; j<tmpRow.cells.length; j++){
var cell=tmpRow.cells[j];
if (cell.getAttribute("attrib")=="tablecell") refreshElementValue(cell);
}
}

}

var row=getTableRowByRecord(table, dataset.record);
if (row) setActiveTableRow(row);
}

function getTableFirstRecord(table){
if (table.tBodies[0].rows.length>0)
return table.tBodies[0].rows[0].record;
else
return null;
}

function getTableLastRecord(table){
var rowLength=table.tBodies[0].rows.length;
if (rowLength>0)
return table.tBodies[0].rows[rowLength-1].record;
else
return null;
}

function checkTableCellIndex(table, rowIndex, cellIndex){
var r_rowIndex=rowIndex;
var r_cellIndex=cellIndex;
var minRowIndex=(table.tHead)?table.tHead.rows.length:0;
minRowIndex=(minRowIndex<0)?0:minRowIndex;
var maxRowIndex=(table.tBodies[0])?(minRowIndex+table.tBodies[0].rows.length-1):-1;
var minCellIndex=table.minCellIndex;
var maxCellIndex=table.tBodies[0].rows[0].cells.length-1;

if ((!r_cellIndex)||(r_cellIndex<minCellIndex)) r_cellIndex=minCellIndex
else if (r_cellIndex>maxCellIndex) r_cellIndex=maxCellIndex;
if ((!r_rowIndex)||(r_rowIndex<minRowIndex)) r_rowIndex=minRowIndex
else if (r_rowIndex>maxRowIndex) r_rowIndex=maxRowIndex;

return ([r_rowIndex, r_cellIndex]);
}

function setActiveTableRow(row){
var table=getTableByRow(row);
var oldrow=table.activeRow;

table.activeRow=row;
table.activeRowIndex=row.rowIndex;

if (oldrow){
refreshTableRowStyle(oldrow);
refreshTableRowIndicate(oldrow);
}
refreshTableRowStyle(row);
refreshTableRowIndicate(row);

var cellIndex=table._activeCellIndex;
if (!cellIndex) cellIndex=table.activeCellIndex;

setActiveTableCell(row, cellIndex);
table._activeCell=null;
table._activeCellIndex=null;
}

function setActiveTableCell(row, cellIndex){
var table=getTableByRow(row);
var index=checkTableCellIndex(table, row.rowIndex, cellIndex);
cell=row.cells[index[1]];
var oldcell=table.activeCell;

if (oldcell!=cell && table.focused){
if (_activeEditor && _activeEditor.getAttribute("attrib")=="dockeditor"){
hideDockEditor(_activeEditor);
}
}

var table_holder=table.parentElement;
if (table_holder.scrollWidth>table_holder.offsetWidth || table_holder.scrollHeight>table_holder.offsetHeight){
var pos=getAbsPosition(cell, table_holder);

if (pos[0]<table_holder.scrollLeft)
table_holder.scrollLeft=pos[0];
else if ((pos[0]+cell.offsetWidth)>(table_holder.scrollLeft+table_holder.offsetWidth))
table_holder.scrollLeft=pos[0]+cell.offsetWidth-table_holder.offsetWidth;

if (pos[1]<table_holder.scrollTop)
table_holder.scrollTop=pos[1];
else if ((pos[1]+cell.offsetHeight)>(table_holder.scrollTop+table_holder.offsetHeight))
table_holder.scrollTop=pos[1]+cell.offsetHeight-table_holder.offsetHeight;
}

if (table.focused){
if (!isTrue(table.getAttribute("readOnly")) && isTrue(table.getAttribute("editable")) && cell.getAttribute("dataField")){
_stored_element=cell;
setTimeout("showDockEditor(_stored_element);", 0);
}
}

table.activeCell=cell;
table.activeCellIndex=cell.cellIndex;
return true;
}

function deleteTableRow(row) {
var table=getTableByRow(row);
with (table){
if (table.activeRow==row){
setAttribute("activeRow", null);
setAttribute("activeCell", null);
}
var rowIndex=row.rowIndex;
row.removeNode(true);
if (!_document_loading) resetDataTableStyle(table, rowIndex);
}
}

function insertTableRow(table, mode, row, empty) {
if (!row) row=table.tBodies[0].rows[0];

var newRow=table.repeatRow.cloneNode(!empty);
switch (mode){
case "begin":{
table.tBodies[0].insertAdjacentElement("afterBegin", newRow);
break;
}
case "before":{
row.insertAdjacentElement("beforeBegin", newRow);
break;
}
case "after":{
row.insertAdjacentElement("afterEnd", newRow);
break;
}
default:{
table.tBodies[0].insertAdjacentElement("beforeEnd", newRow);
break;
}
}

if (!_document_loading) resetDataTableStyle(table, newRow.rowIndex);
return newRow;
}

function refreshTableRecord(row){
refreshTableRowData(row);
}

function deleteTableRecord(row) {
var table=getTableByRow(row);
var editor=table.editor;
if (editor) hideDockEditor(editor);

if (table.tBodies[0].rows.length>1){
var nextRow=table.tBodies[0].rows[row.rowIndex+1];
deleteTableRow(row);
if (nextRow) refreshTableRowData(nextRow);
}
else{
row.record=null;
for (var i=0; i<row.cells.length; i++){
refreshElementValue(row.cells[i]);
}
}
}

function insertTableRecord(table, mode, row, record) {
if (!row) row=table.tBodies[0].rows[0];

var newRow;
if (!row.getAttribute("record")){
newRow=row;
}
else{
newRow=insertTableRow(table, mode, row);
}
newRow.record=record;
for (var i=0; i<newRow.cells.length; i++){
refreshElementValue(newRow.cells[i]);
}
return newRow;
}

function selectRecord(table, record){
var selectedRecords=table.getAttribute("selectedRecords");
pArray_ex_insert(selectedRecords, record);
}

function unselectRecord(table, record){
var selectedRecords=table.getAttribute("selectedRecords");
pArray_ex_delete(selectedRecords, record);
}

function clearSelectedRecords(table){
var selectedRecords=table.getAttribute("selectedRecords");
pArray_clear(selectedRecords);
}

function _table_head_onmouseover(){
var cell=this;
if (cell.getAttribute("canClick") || cell.getAttribute("canSort")) cell.bgColor="white";
}

function _table_head_onmouseout(){
var cell=this;
if (cell.getAttribute("canClick") || cell.getAttribute("canSort")) cell.bgColor="";
}

function _table_head_onclick(){
var cell=this;
var table=getTableByCell(cell);

if (cell.getAttribute("canClick")){
fireUserEvent(getElementEventName(table, "onHeaderClick"), [table, cell]);
}

if (cell.getAttribute("canSort")){
var dataset=getElementDataset(table);
if (dataset){
var sortfield;
if (!event.altKey){
sortfield=cell.getAttribute("dataField");
var ascend=true;
if (compareText(dataset.sortFields.substr(0, sortfield.length), sortfield)){
sortfield="-"+sortfield;
ascend=false;
}
showStatusLabel(window, "<FONT face=Marlett><B>"+((ascend)?"5":"6")+"</B></FONT>");
}
else{
sortfield="";
showStatusLabel(window, constCancelSort);
}

_stored_element=dataset;
setTimeout("_stored_element.sort(\""+sortfield+"\")", 100);
setTimeout("hideStatusLabel(window)", 500);
}
}
}

function _table_checkbox_onclick(){
var row=getRowByCell(event.srcElement.parentElement);
var record=row.getAttribute("record");
if (!record) event.returnValue=false;

if (event.srcElement.checked)
selectRecord(getTableByRow(row), record);
else
unselectRecord(getTableByRow(row), record);
}

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

function processException(e){
switch (typeof(e)){
case "string":{
if (e!="abort"){
if (e)
alert(e);
else
alert(constErrUnknown);
}
break;
}

case "object":{
alert(e.description+"\n"+constErrType+":"+(e.number & 0xFFFF));
break;
}
}
}

function trimStr(str){
str=getValidStr(str);
if (!str) return "";
for(var i=str.length-1; i>=0; i--){
if (str.charCodeAt(i, 10)!=32) break;
}
return str.substr(0, i+1);
}

function getValidStr(str) {
str+="";
if (str=="undefined" || str=="null")
return "";
else
return str;
}

function encode(strIn)
{
var intLen=strIn.length;
var strOut="";
var strTemp;
var strFlag="";

for(var i=0;i<intLen;i++)
{
strTemp=strIn.charCodeAt(i);
if (strTemp>255)
{
if (strFlag=="")
{
strFlag="#";
strOut=strOut+"[#"+strTemp.toString(16);
}
else if (strFlag=="~")
{
strFlag="#";
strOut=strOut+"#"+strTemp.toString(16);
}
else if (strFlag=="#")
{
strOut=strOut+strTemp.toString(16);
}
}
else
{
if (strTemp < 48 || (strTemp > 57 && strTemp < 65) || (strTemp > 90 && strTemp < 97) || strTemp > 122)
{
var tmp=strTemp.toString(16);
if (tmp.length==1) tmp = "0"+tmp;
if (strFlag=="")
{
strFlag="~";
strOut=strOut+"[~"+tmp;
}
else if (strFlag=="#")
{
strFlag="~";
strOut=strOut+"~"+tmp;
}
else if (strFlag=="~")
{
strOut=strOut+tmp;
}
}
else
{
if (strFlag=="#" || strFlag=="~")
{
strFlag="";
strOut=strOut+"]"+strIn.charAt(i);
}
else
{
strOut=strOut+strIn.charAt(i);
}
}
}
}
return (strOut);
}

function decode(strIn)
{
var intLen=strIn.length;
var strOut="";
var strTemp;
var strFlag="";

for(var i=0;i<intLen;i++)
{
strTemp=strIn.charAt(i);
if (strTemp=="[")
{
i++;
strTemp=strIn.charAt(i);
}
if (strTemp=="]")
{
strFlag="";
continue;
}
if (strTemp=="~")
{
i++;
strFlag="~";
}
if (strTemp=="#")
{
i++;
strFlag="#";
}
switch (strFlag)
{
case "~":{
strTemp=strIn.substring(i,i+2);
strTemp=parseInt(strTemp,16);
if (strTemp==218)
strTemp=String.fromCharCode(13, 10);
else
strTemp=String.fromCharCode(strTemp);
strOut=strOut+strTemp;
i++;
break;
}
case "#":{
strTemp=strIn.substring(i,i+4);
strTemp=parseInt(strTemp,16);
i+=3;
strTemp=String.fromCharCode(strTemp);
strOut=strOut+strTemp;
break;
}
case "":{
strOut=strOut+strTemp;
break;
}
}

}
return (strOut);
}

function getEncodeStr(str) {
return encode(getValidStr(str));
}

function getDecodeStr(str) {
return ((str)?decode(getValidStr(str)):"");
}

function compareText(str1, str2){
str1=getValidStr(str1);
str2=getValidStr(str2);
if (str1==str2) return true;
if (str1=="" || str2=="") return false;
return (str1.toLowerCase()==str2.toLowerCase());
}

function isTrue(value){
return (value==true || (typeof(value)=="number" && value!=0) ||
compareText(value, "true") || compareText(value, "T") ||
compareText(value, "yes") || compareText(value, "on"));
}

function getStringValue(value){
if (typeof(value)=="string" || typeof(value)=="object")
return "\""+getValidStr(value)+"\"";
else if (typeof(value)=="date")
return "\""+(new Date(value))+"\"";
else if (getValidStr(value)=="")
return "\"\"";
else
return value;
}

function getInt(value){
var result=parseInt(value);
if (isNaN(result)) result=0;
return result;
}

function getFloat(value){
var result=parseFloat(value);
if (isNaN(result)) result=0;
return result;
}

function formatFloat(value, decimalLength){
var text=getValidStr(Math.round(getFloat(value)*Math.pow(10, decimalLength)));
var len=text.length;
return text.substr(0, len-decimalLength)+"."+text.substr(len-decimalLength, decimalLength);
}

function formatDateTime(date, mode){
function getDateString(date){
return date.getFullYear()+"/"+(date.getMonth()+1)+"/"+date.getDate();
}

function getTimeString(date){
var hours=date.getHours();
var minutes=date.getMinutes();
var seconds=date.getSeconds();

if (hours<10) hours="0"+hours;
if (minutes<10) minutes="0"+minutes;
if (seconds<10) seconds="0"+seconds;

return hours+":"+minutes+":"+seconds;
}

if (typeof(date)=="object" && !isNaN(date)){
switch (mode){
case "date":{
return getDateString(date);
break;
}
case "time":{
return getTimeString(date);
break;
}
default:{
return getDateString(date)+" "+getTimeString(date);
break;
}
}
}
else
return "";
}

function getTypedValue(value, dataType){
var result="";
switch (dataType){
case "float":{
result=parseFloat(value);
break;
}
case "int":{
result=Math.round(parseFloat(value));
break;
}
case "date":;
case "datetime":;
case "time":{
result=new Date(value);
break;
}
case "bool":{
result=isTrue(value);
break;
}
default:{
result=getValidStr(value);
break;
}
}
return result;
}

function pArray(){
this.firstUnit=null;
this.lastUnit=null;
this.length=0;
}

function pArray_clear(pArray){
var unit=pArray.firstUnit;
var _unit;
while (unit){
_unit=unit;
unit=unit.nextUnit;
if (_unit.data) delete _unit.data;
delete _unit;
}
pArray.firstUnit=null;
pArray.lastUnit=null;
pArray.length=0;
}

function pArray_insert(pArray, mode, unit, newUnit){
var u1, u2;
switch (mode){
case "begin":{
u1=null;
u2=pArray.firstUnit;
break;
}
case "before":{
u1=(unit)?unit.prevUnit:null;
u2=unit;
break;
}
case "after":{
u1=unit;
u2=(unit)?unit.nextUnit:null;
break;
}
default:{
u1=pArray.lastUnit;
u2=null;
break;
}
}

newUnit.prevUnit=u1;
newUnit.nextUnit=u2;
if (u1) u1.nextUnit=newUnit; else pArray.firstUnit=newUnit;
if (u2) u2.prevUnit=newUnit; else pArray.lastUnit=newUnit;
pArray.length++;
}

function pArray_insertArray(pArray, mode, unit, subArray){
if (!subArray || !subArray.firstUnit) return;

var u1, u2;
switch (mode){
case "begin":{
u1=null;
u2=pArray.firstUnit;
break;
}
case "before":{
u1=(unit)?unit.prevUnit:null;
u2=unit;
break;
}
case "after":{
u1=unit;
u2=(unit)?unit.nextUnit:null;
break;
}
default:{
u1=pArray.lastUnit;
u2=null;
break;
}
}

subArray.firstUnit.prevUnit=u1;
subArray.lastUnit.nextUnit=u2;
if (u1) u1.nextUnit=subArray.firstUnit; else pArray.firstUnit=subArray.firstUnit;
if (u2) u2.prevUnit=subArray.lastUnit; else pArray.lastUnit=subArray.lastUnit;
pArray.length+=subArray.length;
}

function pArray_delete(pArray, unit){
var u1, u2;
u1=unit.prevUnit;
u2=unit.nextUnit;
if (u1) u1.nextUnit=u2; else pArray.firstUnit=u2;
if (u2) u2.prevUnit=u1; else pArray.lastUnit=u1;
delete unit;
pArray.length--;
}

function pArray_ex_insert(pArray, data){
var found=false;
var _unit=pArray.firstUnit;
while (_unit){
if (_unit.data==data){
found=true;
break;
}
_unit=_unit.nextUnit;
}

var newUnit=new Object();
newUnit.data=data;
if (!found) pArray_insert(pArray, "end", null, newUnit);
}

function pArray_ex_delete(pArray, data){
var _unit=pArray.firstUnit;
while (_unit){
if (_unit.data==data){
pArray_delete(pArray, _unit);
break;
}
_unit=_unit.nextUnit;
}
}

function setClientProperty(name, value){
Response.Write("<INPUT TYPE=hidden id=\"_client_property_"+name+"\" value=\""+getEncodeStr(value)+"\">\n");
}

function getClientProperty(name){
var value;
eval("value=getDecodeStr(_client_property_"+name+".value);");
return value;
}


</script>
<script language="JScript.Encode" src="_xForm_Library/control.js"></script>
<script language="JScript.Encode" src="_xForm_Library/dataset.js"></script>
<script language="JScript.Encode" src="_xForm_Library/table.js"></script>
<script language="JScript.Encode" src="_xForm_Library/editor.js"></script>
<script language="JScript.Encode" src="_xForm_Library/dropdown.js"></script>
<script language="JScript.Encode" runat="server" src="_xForm_Library/basic.js">

</script>
<script id="clientEventHandlersJS" language="javascript">
<!--

//窗口初始化
function window_onload(){
initDocument();
}

function checkbox_autoDropDown_onclick() {
dropdown_1.setAttribute("autoDropDown", checkbox_autoDropDown.checked);
dropdown_2.setAttribute("autoDropDown", checkbox_autoDropDown.checked);
dropdown_3.setAttribute("autoDropDown", checkbox_autoDropDown.checked);
}

function checkbox_editable_onclick() {
dropdown_1.setAttribute("dropDown_fixed", checkbox_editable.checked);
dropdown_2.setAttribute("dropDown_fixed", checkbox_editable.checked);
dropdown_3.setAttribute("dropDown_fixed", checkbox_editable.checked);
checkbox_restrict.disabled=checkbox_editable.checked;
}

function checkbox_restrict_onclick() {
dropdown_1.setAttribute("dropDown_restrict", checkbox_restrict.checked);
dropdown_2.setAttribute("dropDown_restrict", checkbox_restrict.checked);
dropdown_3.setAttribute("dropDown_restrict", checkbox_restrict.checked);
}

//-->
</script>
</head>

<body language="javascript" onload="return window_onload()" background="images/bkground.GIF">

<table border="0" width="100%" height="100%" style="FONT-SIZE: 9pt">
<tr height="1">
<td valign="top">
<div id="tab1_1" style="PADDING-RIGHT: 20px; PADDING-LEFT: 20px; PADDING-BOTTOM: 20px; PADDING-TOP: 20px">
<fieldset style="PADDING-RIGHT: 8px; PADDING-LEFT: 8px; PADDING-BOTTOM: 8px; WIDTH: 100%; PADDING-TOP: 8px; HEIGHT: 100%">
<legend style="MARGIN-BOTTOM: 8px"><b>菜单</b></legend>
<table style="FONT-SIZE: 9pt">
<tr>
<td colspan="3"><br>
</td>
</tr>
<tr>
<td align="right" nowrap><span lang="zh-cn">文本框:</span></td>
<td>
<input id="text_empl_birthday" datafield="birthday" dataset="dataset_employee" attrib="editor" name="text_empl_birthday" size="20"></td>
<td> </td>
</tr>
<tr>
<td align="right" nowrap>静态下拉框: </td>
<td>
<input id="dropdown_1" attrib="editor" dataset="dataset_employee" datafield="degree" dropdown_mode="staticlist" dropdown_items="本科;大专;中专;硕士;博士;博士后;高中;小学" size="20">
</td>
<td>?(静态下拉框的下拉项目由代码或脚本指定) </td>
</tr>
<tr>
<td align="right" nowrap>具有内部值的静态下拉框: </td>
<td>
<input id="dropdown_2" attrib="editor" dataset="dataset_employee" datafield="degree" dropdown_mode="staticlist" dropdown_items="大学生=本科;高材生=博士;半文盲=小学" dropdown_mapvalue="true" size="20">
</td>
<td>?(此编辑框的下拉值的显示值为:大学生、高材生、半文盲。而真正的内部值则分别是:本科、博士、小学) </td>
</tr>
<tr>
<td align="right" nowrap>日期下拉框: </td>
<td>
<input id="dropdown_3" attrib="editor" dataset="dataset_employee" datafield="birthday" dropdown_mode="date" size="20">
</td>
<td>?(万年历下拉框可以方便地输入日期型数据) </td>
</tr>
<tr>
<td align="right" nowrap>单选框:</td>
<td>
<input id="text_empl_married" type="checkbox" datafield="married" dataset="dataset_employee" attrib="editor" name="text_empl_married" value="ON"><input type="radio" id="radio_find_all" name="find_mode" checked></td>
<td> </td>
</tr>
<tr>
<td align="right" nowrap>文本多选框:</td>
<td>
<textarea id="text_cmnt" datafield="cmnt" dataset="dataset_employee" attrib="editor" type="staticlist" rows="2" cols="20" name="text_cmnt"></textarea></td>
<td> </td>
</tr>
<tr>
<td align="right" nowrap>具有内部值的文本多选框:</td>
<td>
<textarea id="text_script" attrib="editor" dropdown_mode="staticlist" autodropdown="true" dropdown_items="dataset_employee.moveNext();dataset_employee.insertRecord('before');dataset_employee.deleteRecord();alert(dataset_employee.getFieldValue('employee_name'));dataset_employee.setFieldValue('employee_name', '-- 已被修改!--')" rows="3" cols="20">dataset_employee.moveNext()</textarea></td>
<td> </td>
</tr>
</table>
<hr>
<input id="checkbox_autoDropDown" type="checkbox" name="checkbox_autoDropDown" onclick="return checkbox_autoDropDown_onclick()" value="ON">获得输入焦点时自动下拉
<br>
<input id="checkbox_editable" type="checkbox" name="checkbox_editable" onclick="return checkbox_editable_onclick()" value="ON">是否禁止手工输入
<br>
<input id="checkbox_restrict" type="checkbox" name="checkbox_restrict" onclick="return checkbox_restrict_onclick()" value="ON">是否检查输入值的合法性
</fieldset>
</div>
</div>
</td>
</tr>
</table>


webasp.net