//new DBEdit();
function DBEdit(parent,id){ 
  this.sender=new DBControl(parent,'input','text',id);
  return this.sender;
}

function DBMemo(parent,id){ 
  this.sender=new DBControl(parent,'textarea','',id);
  return this.sender;
}
//new DBLabel();//DBLABEL
function DBLabel(parent,id){ 
  this.sender=new DBControl(parent,'span','span',id);
  return this.sender;
}
//new DBCheckBox();
function DBCheckBox(parent,id){ 
  this.sender=new DBControl(parent,'input','checkbox',id);
  var obj=this.sender;
  obj.CheckedValue=true;
  obj.NoCheckValue=false;
  return obj;
}

//new DBControl();
function DBControl(parent,type,subtype,id)//数据感应基类,TYPE为大类，SUBTYPE为子类
{
  var pdiv,obj=id;
  if(!obj){
	  obj=document.createElement(type);//创建一个控制节点
	  if(type=='input')obj.setAttribute('type',subtype);
	  if(parent){pdiv=parent;}else pdiv=document.body;//获取父块
	  pdiv.appendChild(obj);
	  setStyle(obj);
  }
  DBControl_Bind(obj,subtype);
  return obj;
}

function DBControl_Bind(obj,subtype)
{
  obj.Type=subtype;
  obj.Show=DC_show;
  obj.Refresh=DC_refresh;
  obj.HandleMessage=DC_handlemessage;//消息处理
  if(isIE)
	obj.onpropertychange=DC_onpropertychange
  else
	addEventTimerListener(obj,DC_onpropertychange);
  obj.parent=obj;//parent是用于在draw的事件中用this.parent来得到this
  obj.onchange = jcl_onchange;
  obj.oncontextmenu=div_oncontextmenu;
}

function DC_handlemessage(sender,msg,recno)
{
   if(msg!=6&&msg!=12)
	this.Refresh();
}
function DC_onpropertychange(sender)//属性变化处理
{
  var n;
  if(isIE) {
	  n=event.propertyName;
	  sender=this;
  }
  else
	  n='DataSet';
  switch(n){
	case 'DataSet':
	  if(sender.OldDataSet==sender.DataSet)return;
	  if(sender.OldDataSet)sender.OldDataSet.RemoveLink(sender);//从原来的DATASET中移除
      if(sender.DataSet)sender.DataSet.LinkObj(sender);
	  sender.OldDataSet=sender.DataSet;
	  break;
  }
}
function DC_show()
{
  this.Refresh();
}
function DC_refresh()
{
  var v,f;
  if(this.DataSet.Active){
   f=this.DataSet.Fields.Field[this.DataField];
   if(!f)jcl_err(this.Name+'.DataField:'+this.DataField+Err_NoField);
   if(f){
	this.readOnly=f.ReadOnly;
    v=f.GetValue();
    if(v==null)v='';this.value=v;
    if(this.Type=='span')this.innerHTML=v;//DBLabel
	if(this.Type=='checkbox'){
      if(this.CheckedValue == v){//如果值等于选中时候的值，置状态为选中
        this.checked=true;
		this.defaultChecked=true;                 
	  }
      else{//否则置状态为非选中
        this.checked=false;
	  }
    }
   }
  }
  else{
    this.value='';
    if(this.Type=='span')this.innerHTML='';//DBLabel
  }
}
function jcl_onchange()
{
  var p=this.parent;
  if(p.Type=='checkbox'){
   if(p.checked){
     p.value = p.CheckedValue;
   }
   else{
     p.value = p.NoCheckValue;
   }
  }	
  var v=p.value;
  if(p.DataSet.Fields.State!=szNew){
	if (p.DataSet.RecordCount==0){p.DataSet.Append();}
	else p.DataSet.Edit();
  }
  var f=p.DataSet.Fields.Field[p.DataField];
  if(!f)jcl_err(p.Name+'.DataField:'+p.DataField+Err_NoField);
  f.Value=v;
  if(f.Err){this.focus();this.select();}
}
//--------------------dblookupselect-----------------------
function DBLookupSelect(parent)//构造函数
{  
// alert(parent);
 var pdiv,obj=document.createElement('SELECT');//创建一个控制节点
 if(parent){pdiv=parent;}else pdiv=document.body;//获取父块
 pdiv.appendChild(obj);
 obj.SelectedIndex=0;//当数据发生滚动时，对SELECT要显示的记录进行定位  
 
 obj.oOption=new Array();//创建SELECT的OPTION对象数组
 obj.DataItem=new Array();//要显示在SELECT中的对应的值
 obj.KeyFieldValue=new Array();//对应码表字段名的字段value
 obj.isupdate=0;
 obj.DataField=null;//主表字段    
 obj.DataSet;     
 obj.ListField;//在select中要显示的码表字段名
 obj.KeyField;//对应码表字段名的字段名	 
 obj.ListDataSet;//码表源
 obj.AddOption=DLUS_addoption;//创建option对象，向SELECT中填充内容
 obj.GetOptionItem=DLUS_getoptionitem;//从码表中获取向select中填充内容的值
 obj.Reload=DLUS_reload;
 obj.Refresh=DLUS_refresh;
 obj.RecordMove=DLUS_recordmove;//记录移动   
 obj.HandleMessage=DLUS_handlemessage;	
 obj.OnChange=DLUS_onchange;
  if(isIE)
	obj.onpropertychange=DBUS_onpropertychange
  else
	addEventTimerListener(obj,DBUS_onpropertychange);
// alert(parent);
 obj.style.position='absolute';
 obj.onchange=DLUS_onchange;
 obj.parent=obj; 
 obj.oncontextmenu=div_oncontextmenu;
 setStyle(obj);
 return obj;
}
function DBUS_onpropertychange(sender)//属性变化处理
{
  var n;
  if(isIE) {
	  n=event.propertyName;
	  sender=this;
  }
  else{
	  if(sender.OldList!=sender.ListDataSet)
		 n='ListDataSet'
	  else if(sender.OldDataSet!=sender.DataSet)
		 n='DataSet';
  }	
  switch(n){
	case 'DataSet':
	  if(sender.OldDataSet)sender.OldDataSet.RemoveLink(sender);//从原来的DATASET中移除
      if(sender.DataSet)sender.DataSet.LinkObj(sender);
	  sender.OldDataSet=sender.DataSet;
	  break;
	case 'ListDataSet':
	  if(sender.OldList)sender.OldList.RemoveLink(sender);//从原来的DATASET中移除
      if(sender.ListDataSet)sender.ListDataSet.LinkObj(sender);
	  sender.OldList=sender.ListDataSet;
	  break;
  }
}
function DLUS_refresh(){	
	this.AddOption();	
}
function DLUS_addoption(){	//创建option对象，填充内容	    
	this.oOption[0]=document.createElement("OPTION");
	this.oOption[0].text='';
	this.options.add(this.oOption[0]);	 
	for(var i=0;i<this.DataItem.length;i++){
		this.oOption[i+1]=document.createElement("OPTION");
		this.oOption[i+1].text=this.DataItem[i];	
		this.options.add(this.oOption[i+1]);	 
	}
}
function DLUS_getoptionitem(){//从码表中取出要填充select的值，只取一次以数组的形式保存
  var ld=this.ListDataSet;
  ld.AutoControl=false;
  ld.First();
  for(var i=0;i<ld.RecordCount;i++){
    f=ld.Fields.Field[this.ListField];
	if(!f)jcl_err(this.Name+'.ListField:'+this.ListField+Err_NoField);
    this.DataItem[i]=f.GetValue();			
    f=ld.Fields.Field[this.KeyField]
	if(!f)jcl_err(this.Name+'.KeyField:'+this.KeyField+Err_NoField);
    this.KeyFieldValue[i]=f.Value;				
    ld.Next();			
  }
  ld.First();
  ld.AutoControl=true;	
}
function DLUS_handlemessage(sender,msg,recno,idx)//扑捉DATASET的更新消息	
{
 if(this.style.visibility=='hidden')return;
 if(sender==this.DataSet){
  switch(msg){
    case 0:this.RecordMove();break;
	case 1:this.RecordMove();break;
    case 3:this.RecordMove();break;
	case 4:this.RecordMove();break;
	case 6:this.RecordMove();break;				
  }
 }
 else if(sender==this.ListDataSet){
  switch(msg){
	case 0:this.Reload();break;
//				case 1:	this.Reload();break;
//				case 2:	this.Reload();break;
//				case 4:	this.Reload();break;
//				case 5:	this.Reload();break;				
  }		
 }
}
//当发生记录滚动时,进行更新
function DLUS_recordmove()
{
 var ld=this.ListDataSet;if(!ld)return -1;
 var idx=0;
 var f=this.DataSet.Fields.Field[this.DataField];
 if(!f)jcl_err(this.Name+'.DataField:'+this.DataField+Err_NoField);
 var v=f.GetValue();
 if(!ld.Active){
     ld.Async=false;
	 ld.Open();
 }
 ld.AutoControl=false;
 ld.First();
 if(ld.Locate(this.KeyField,v)){//字段名对应的值是否存在
  idx=ld.RecNo+1;
 }
 ld.AutoControl=true;
 if(this.options[idx])this.options[idx].selected=true;
}
function DLUS_reload(){//当码表有变化时 	
  var disabled=this.disabled;
  this.disabled=false;
	if(this.options.length!=0)//第一次调用reload时，不执行此语句
		while(length!=0){  //更新时删除options
          var length=this.options.length;
	      for(var i=0;i<length;i++)
	        this.options.remove(i);
	        length=length/2;
		   }
	this.GetOptionItem();	
	this.Refresh();	
  this.disabled=disabled;
}
function DLUS_onchange()//在select中发生事件改变时以当前的字段号去更新主表的值
{
 var v,p=this.parent;
 var d=p.DataSet;
 var f1,f=d.Fields.Field[p.DataField];
 var ld=p.ListDataSet;
 var i=this.selectedIndex-1;
 if(i>-1){
  ld.SetPos(i);
  f1=ld.Fields.Field[p.KeyField];
  if(!f1)jcl_err(p.Name+'.KeyField:'+p.KeyField+Err_NoField);
  v=ld.Fields.Field[p.KeyField].Value;
 }
 else{v='';}
   if(p.DataSet.Fields.State!=szNew){
    if (p.DataSet.RecordCount==0){p.DataSet.Append();}
    else p.DataSet.Edit();
   }
 f.Value=v;
 if(f.Err)this.focus();
}
function DBSelect(parent,id)
{
  var pdiv,obj=id;
  if(!obj){
	  obj=document.createElement('select');//创建一个控制节点
	  if(parent){pdiv=parent;}else pdiv=document.body;//获取父块
	  pdiv.appendChild(obj);
	  obj.style.position='absolute';
	  setStyle(obj);
  }	
  obj.DataSet;
  obj.DataField;
  obj.options.Add=DBSelect_Add;
  obj.options.Clear=DBSelect_Clear;
  obj.Locate = DBSelect_Locate;
  obj.onchange=DBSelect_onchange;//属性变化的事件
  obj.HandleMessage=DBSelect_handlemessage;//消息处理
  if(isIE)
	obj.onpropertychange=DC_onpropertychange
  else
	addEventTimerListener(obj,DC_onpropertychange);
  obj.oncontextmenu=div_oncontextmenu;
  return obj;
}
function DBSelect_handlemessage(sender,msg,recno)
{
  switch(msg){
    case 0://初始化消息
      this.Locate();
      break;
    case 1://添加一行的消息
      break;
    case 2://删除一行的消息
      this.Locate();
    case 3://移动一行的消息 
      this.Locate();
      break;
    case 4://更新field
      this.Locate();
      break;
    case 5://全部刷新调用Refresh();
      this.Locate();
      break;
    case 6://编辑操作
      break;
    case 7://关闭数据集
      this.Locate();
      break;
    case 8://提交到服务器成功
      this.Locate();
      break;
    case 9://取消操作
      this.Locate();
      break;
  }
}
function DBSelect_onpropertychange()//属性变化处理
{
  var n=event.propertyName;
  switch(n){
    case 'DataSet':
      if(this.OldDataSet)this.OldDataSet.RemoveLink(this);//从原来的DATASET中移除
      if(this.DataSet)this.DataSet.LinkObj(this);
      this.OldDataSet=this.DataSet;
      break;
  }
}
function DBSelect_onchange()//在select中发生事件改变时更新值
{
 var v=this.options[this.selectedIndex].value;
 var d=this.DataSet;
 var f=d.Fields.Field[this.DataField];
 if(d.Fields.State!=szNew){
    if (d.RecordCount==0){d.Append();}
    else d.Edit();
 }
 f.Value=v;
 if(f.Err)this.focus();
}
function DBSelect_Locate()//定位选中
{
  var idx=0;
  var f=this.DataSet.Fields.Field[this.DataField];
  if(!f)jcl_err(this.Name+'.DataField:'+this.DataField+Err_NoField);
  var v=f.GetValue();
  for(var i=0;i<this.options.length;i++){
    if(this.options[i].value==v){idx=i;break;}
  }
  if(this.options[idx])this.options[idx].selected=true;
}
function DBSelect_Add(name,value)
{
  var oOption = document.createElement("OPTION");
  this.add(oOption);
  oOption.innerText = name;
  oOption.value = value;
}
function DBSelect_Clear()
{
  var l=this.length;
  for (var i=0; i<l; i++){
    this.remove(0);
  }
}
