//Copyright Inprise Corporation 1999, all rights reserved, to be used with Borlands Midas-technology only,
//unless special permission has been given.

//Resourcestrings START

var sDecimalPoint = '.';

var sDateSeparator = '.';
var sTimeSeparator = ':';
var sDateTimeSeparator = ' ';
var sDateDisplayFormat = 'yyyy.mm.dd';
var sTimeDisplayFormat = 'hh:mm';

var sMsgInvalidXMLPacket = "Invalid XML-packet.";
var sMsgInvalidInteger = " : Invalid integer : ";
var sMsgOutOfRange = " : Value is out of range, ";
var sMsgInvalidNumber = " : Invalid number : ";
var sMsgInvalidDateTime = "Invalid date/time: ";
var sMsgValueIsRequired = " : Value is required";
var sMsgLongValue = " : Value is too long";

//Resourcestrings END

var xmldb_vers="1.0";
var xml_ready=false;
var szRowState="RowState", szUni="string.uni", szNested="nested", szTrue="true", szFalse="false", szDel="2", szNew="4", szOrg="1", szMod="8", szDetUpd="64";
var szErr_HasDets="Cannot delete master record with details.";
var szErr_Invalid="Invalid action";
var DecPoint=".";var s= (25/10).toString();var p=s.indexOf(".");DecPoint=p>0?".":",";

new xmlRowSet(null,null,null);
xmlRowSet.prototype.parent=null;
xmlRowSet.prototype.linkFld=null;
xmlRowSet.prototype.pDets=null;
xmlRowSet.prototype.noDel=0;xmlRowSet.prototype.noIns=0;xmlRowSet.prototype.noUpd=0;
//private methods
xmlRowSet.prototype.InitRowSet=InitRowSet;
xmlRowSet.prototype.notify=function(reason){if(this.regobjs==null)return;var j;for(j=0;j<this.regobjs.length;j++)this.regobjs[j].refr(reason);}
xmlRowSet.prototype.forcepost=DsForcePost;
xmlRowSet.prototype.regobj=function(obj){if(this.regobjs==null)this.regobjs=new Array();this.regobjs[this.regobjs.length]=obj;}
xmlRowSet.prototype.DeltaChanges=null;
xmlRowSet.prototype.resetDets=resetDets;
xmlRowSet.prototype.del=delRow;
xmlRowSet.prototype.ins=insRow;
xmlRowSet.prototype.upd=updRow;
//public functions
xmlRowSet.prototype.first=function(){return this.setPos(0);}
xmlRowSet.prototype.next=function(){return this.setPos(this.pos+1);}
xmlRowSet.prototype.prev=function(){return this.setPos(this.pos-1);}
xmlRowSet.prototype.last=function(){return this.setPos(this.RowCnt-1);}
xmlRowSet.prototype.setPos=function(pos){if(pos>=this.RowCnt||pos<0||this.RowCnt==0){this.resetDets();return 1;}if(this.pos!=pos){this.pos=pos;this.resetDets();} this.notify(0);return 0;}
xmlRowSet.prototype.getRow=function(pos){return this.idx.row(pos);}
xmlRowSet.prototype.makeRow=makeRow;
xmlRowSet.prototype.RowState=RowState;
xmlRowSet.prototype.insert=dsInsert;
xmlRowSet.prototype.modify=dsModify;
xmlRowSet.prototype.deletex=dsDelete;
xmlRowSet.prototype.undo=dsUndo;
xmlRowSet.prototype.sort=function(n){this.idx.sort(n);this.first();this.notify(1);}
xmlRowSet.prototype.getDelta=function(){return this.DeltaChanges.make();}
xmlRowSet.prototype.Apply=null;
xmlRowSet.prototype.MakePermanent=function(){this.DeltaChanges.reset();this.notify(1);this.resetDets();}
xmlRowSet.prototype.BeforePost=function(a,r){return r;}
xmlRowSet.prototype.AfterPost=function(a,r){return r;}
xmlRowSet.prototype.OnError=function(s){alert(s);return 1;}
xmlRowSet.prototype.OnNewRow=function(){return null;}

function xmlRowSet(doc, parent, linkFld) 
{
this.doc=doc;
if(doc==null){if(parent!=null)this.doc=parent.doc; else return null;}
if(this.doc==""){if(parent==null)alert(sMsgInvalidXMLPacket); return null;}
this.root=null;
if(parent!=null){this.parent=parent;this.linkFld=linkFld;this.InitRowSet=InitDetailRowSet;}
this.MetaData=null;this.RowData=null;this.FieldCnt=0;this.FieldData=null;
//public:
this.pos=0;this.RowCnt=0;
this.Fields=new Fields();
//Init
this.InitRowSet();
this.pos=-1;
this.first();
return this;
}

function InitRowSet()
{
if(this.doc==null||this.doc=="")return;
var i;
this.root=this.doc.documentElement;
if(this.root==null)return;
if(this.root.tagName=="DATAPACKET"){
 this.MetaData=this.root.childNodes.item(0); 
 this.RowData=this.root.childNodes.item(1);
 this.RowCnt=this.RowData.childNodes.length;
 this.FieldData=this.MetaData.childNodes.item(0);
 this.FieldCnt=this.FieldData.childNodes.length;
 var des;
 for(i=0;i<this.FieldCnt;i++){des=new FldDes(this,this.FieldData.childNodes.item(i));if(des)this.Fields.Add(des);} 
}
else{this.RowData=this.root;this.RowCnt=this.RowData.childNodes.length;}

var params=this.MetaData.childNodes.item(1);

if(params.getAttribute("READONLY")!=null){this.noDel=1;this.noIns=1;this.noUpd=1;}
for(i=0;i<params.childNodes.length;i++)
{var p=params.childNodes.item(i);var n=p.getAttribute("Name");var v=p.getAttribute("Value");
 if(n!=null&&v!=null)if(n=="DISABLE_DELETES")this.noDel=1;else if(n=="DISABLE_INSERTS")this.noIns=1;else if(n=="DISABLE_EDITS")this.noUpd=1;
}
this.DeltaChanges=new DeltaChanges(this);
this.Apply=dsApply;
this.idx=new idx(this);
}

function InitDetailRowSet()
{
var i;
var parent=this.parent;
var fd=parent.FieldData.childNodes;
var l=fd.length;
this.FieldData=parent.Fields.Field[this.linkFld].node.childNodes.item(0); 
if(this.FieldData==null)return;
this.FieldCnt=this.FieldData.childNodes.length ;  
var des;
for(i=0;i<this.FieldCnt;i++){des=new FldDes(this,this.FieldData.childNodes.item(i));if(des)this.Fields.Add(des);}
if(parent.pDets==null)parent.pDets=new Array();
parent.pDets[parent.pDets.length]=this;
this.DeltaChanges=parent.DeltaChanges;
parent.resetDets();
this.idx=new idx(this);
this.noDel=parent.noDel;this.noIns=parent.noIns;this.noUpd=parent.noUpd;
}

function findcnode(n,t)
{
if(n==null)return null;
var j,l=n.childNodes.length;
for(j=0;j<l;j++)if(n.childNodes.item(j).tagName==t)return n.childNodes.item(j);
return null;
}

function resetDets()
{
if (this.pDets==null) return;
var i,l=this.pDets.length;
for(i=0;i<l;i++)
{
 var rsd=this.pDets[i];
 var row=this.idx.row(this.pos);
 var det=findcnode(row,rsd.linkFld);
 rsd.RowData=det;
 rsd.RowCnt=(det==null)?0:det.childNodes.length;
 if(rsd.idx) rsd.idx.sort(null);
 rsd.first();
rsd.resetDets();
 rsd.notify(2);
}
}

//LLehel - reloadAnyway
function dsApply(frm,el, reloadAnyway)
{
if(  (frm==null||el==null||this.forcepost()!=0||this.DeltaChanges.row.length==0)
   &&(reloadAnyway==null || !reloadAnyway)) return;
var delta=this.getDelta();
if((delta.childNodes.item(1).childNodes.length==0)
   &&(reloadAnyway==null || !reloadAnyway)) return;
el.value=(delta.xml!=null)?delta.xml:delta.xmlstr();
frm.submit();
}

function dsInsert(prow,bFollow)
{
if (this.noIns){return this.OnError(szErr_Invalid);}
prow=this.BeforePost(1,prow);
if(prow==null) return 1;
var spos=this.pos;
var pN=this.ins();
if(pN==null) return 1;
var r=this.idx.row(this.pos);
r.setAttribute(szRowState,szNew);
this.upd(prow);

if(this.pDets){
var i,l=this.Fields.Cnt;
for(i=0;i<l;i++){if(this.Fields.Fieldx[i].Type==szNested){var el=this.doc.createElement(this.Fields.Fieldx[i].iname);r.appendChild(el);}}
}

if (bFollow==0)this.pos=spos;
this.resetDets();
this.DeltaChanges.add(szNew,pN,null,this);
this.idx.chg=1;
this.AfterPost(1,prow);
return 0;
}

function dsModify(p,prow)
{
if(this.noUpd){return this.OnError(szErr_Invalid);}
prow=this.BeforePost(3,prow);
if(prow==null) return 1;
var pO,pM;
var spos=this.pos; this.pos=p;
var i,l;
pM=this.idx.row(p);
//LLehel
if(!pM || pM==null) return 0;
var rstate=pM.getAttribute(szRowState);
if(rstate!=szNew){
 pO=pM.cloneNode(0);l=pM.childNodes.length;
 for(i=0;i<l;i++)pO.appendChild(pM.childNodes.item(i).cloneNode(0));
 pM.setAttribute(szRowState,szMod);
 this.upd(prow);
 this.DeltaChanges.add(szMod,pM,pO,this);
//  this.DeltaChanges.add(szMod,pM,null,this);
}else this.upd(prow);
this.pos=spos;
this.idx.chg=1;
this.AfterPost(3,prow);
return 0;
}

function dsDelete(p)
{
if(this.noDel){return this.OnError(szErr_Invalid);}
var r=this.idx.row(p); 
r=this.BeforePost(2,r);
if(r==null)return 1;
var spos=this.pos; this.pos=p;
var i,l=r.childNodes.length;
if(l&&this.pDets)
 for(i=0;i<this.pDets.length;i++){var det=findcnode(r,this.pDets[i].linkFld);if(det&&det.childNodes.length>0)return this.OnError(szErr_HasDets);}
r.setAttribute(szRowState,szDel);
var pD=this.del();
if(p<spos) this.pos=spos-1;
this.resetDets();
this.DeltaChanges.add(szDel,pD,null,this);
this.idx.chg=1;
this.AfterPost(2,null);
return 0;
}

function updRow(prow)
{ 
var i,f,v,r=this.idx.row(this.pos);
if(r==null)return r;
for(i=0;i<this.Fields.Cnt;i++){f=this.Fields.Fieldx[i];v=prow[f.name];if (v!=null) f.put(r,v);}
this.notify(1);
return r;
}

function makeRow()
{
var i,f,v,r=this.idx.row(this.pos);
if(r==null)return r;
var RowBuf=new Array();
for(i=0;i<this.Fields.Cnt;i++){f=this.Fields.Fieldx[i];v=null;if(f.bAsAttr)v=r.getAttribute(f.iname);if(v!=null)RowBuf[f.name]=v;}
return RowBuf;
}

function insRow()
{
if(this.FieldData==null)return null;
var rname="ROW";
def=this.OnNewRow();
if(this.linkFld)rname+=this.linkFld;
var r=this.doc.createElement(rname);
var i,f;
for(i=0;i<this.Fields.Cnt;i++){    
 var F;
 f=this.Fields.Fieldx[i];
 if(f.bAsAttr==0){var T=this.doc.createTextNode("");F=this.doc.createElement(f.iname);F.appendChild(T); r.appendChild(F);}
 else if(def&&def[f.name]!=null)r.setAttribute(def[f.name]);
}
if(this.RowData==null)this.RowData=this.doc.createElement(this.linkFld);
this.RowData.appendChild(r);
this.RowCnt++;
this.pos=this.RowCnt-1;
this.idx.add(this.pos);
return r;
}

function delRow()
{
var r=this.idx.row(this.pos);
if(r==null)return null;
var pos=this.pos;
this.RowData.removeChild(r);
this.idx.rem(pos);
if(pos==this.RowCnt-1&&pos>0)this.pos=pos-1;
this.RowCnt--;      
this.notify(1); 
return r;
}

function RowState(pos)
{
var r=this.idx.row(pos);
if(r==null)return "";
var st=r.getAttribute(szRowState);
if(st==null||st=="")return "";
var v=parseInt(st,10);
if(v==2)st="D";if(v==4)st="I";if(v==8)st="M";if(v==64)st="DU";
return st;
}

function Fields()
{
//public:
this.Field=new Array();
this.Fieldx=new Array();
this.FieldByName=GetFieldByName; //LLehel
this.Add=addFld;
this.Cnt=0;
}

//LLehel
function GetFieldByName(n){
  var i;
  for(i=0; i<this.Cnt ; i++)
    if(this.Fieldx[i].name.toUpperCase()==n.toUpperCase())
      return this.Fieldx[i];
  return null;
}

function addFld(fldDes)
{
var n=fldDes.name;
if(n!=""){this.Field[n]=fldDes;this.Fieldx[this.Cnt]=fldDes;this.Cnt++;}
}

new FldDes(null,null);
FldDes.prototype.bAsAttr=1;
FldDes.prototype.name="";
FldDes.prototype.iname="";
FldDes.prototype.Type="string";
FldDes.prototype.readonly=0;
FldDes.prototype.required=0;
FldDes.prototype.maxlength=0;
FldDes.prototype.subtype=null;
FldDes.prototype.decimals=null;
FldDes.prototype.fixeddec=null;
FldDes.prototype.currencySymbol=null;
FldDes.prototype.minval=null;
FldDes.prototype.maxval=null;
FldDes.prototype.defval="";
FldDes.prototype.minmax=minmax;
FldDes.prototype.validate=Validate;
FldDes.prototype.valtype=function(v){if((this.errNo=this.minmax(v,this.minval,this.maxval))!= 0) return 0;return v;}
FldDes.prototype.valcomp=function(v1,v2){if(v1==v2) return 0;return (v1>v2)?1:-1;}
FldDes.prototype.todisp=function(v){return v;}
FldDes.prototype.frdisp=function(v){return v;}
FldDes.prototype.Value=rsValue;
FldDes.prototype.setValue=rsSetValue;  //LLehel
FldDes.prototype.get=getValue;
FldDes.prototype.put=putValue;
FldDes.prototype.notNull=function(v){if(v=="")return null;return v;}
FldDes.prototype.errNo=0;

function FldDes(rs, node)
{
this.rs=rs;
if(node==null)return;
this.node=node;
var t=node.getAttribute("fieldname"), ti=node.getAttribute("attrname");
if(ti==null){ti=node.getAttribute("tagname");this.bAsAttr=0};
this.iname=ti;
this.name=(t==null)?ti:t;
if(this.iname != null) this.iname = this.iname.toUpperCase();//LLehel
if(this.name  != null) this.name  = this.name.toUpperCase(); //LLehel
t=node.getAttribute("fieldtype");if(t)this.Type=t;
t=node.getAttribute("readonly");if(t)this.readonly=1;
t=node.getAttribute("required");if(t&&this.readonly==0) this.required=1;
t=node.getAttribute("WIDTH");if(t)this.maxlength=parseInt(t,10);
t=node.getAttribute("SUBTYPE");if(t)this.subtype=t;
t=node.getAttribute("DECIMALS");if(t)this.decimals=parseInt(t,10);
if(this.subtype=="Money"){this.decimals=4;}
if(this.Type=="fixed"){this.fixeddec=this.decimals;}
if(this.subtype=="Text")this.maxlength=0;

if(this.Type=="string"||this.Type==szUni){this.notNull=function(v){return v;};}else
if(this.Type=="i1"){this.valtype=valint; this.valcomp=cmpint; this.minval=parseInt("-128");this.maxval=parseInt("127"); }else
if(this.Type=="i2"){this.valtype=valint; this.valcomp=cmpint; this.minval=parseInt("-32768");this.maxval=parseInt("32767");}else
if(this.Type=="i4"){this.valtype=valint; this.valcomp=cmpint; this.minval=parseInt("-2147483648");this.maxval=parseInt("2147483647")}else
if(this.Type=="r8"||this.Type=="fixed"){this.valtype=valfloat; this.valcomp=cmpfloat;this.todisp=dispfloat;this.frdisp=xmlfloat;}else
if(this.Type=="dateTime"){this.valtype=valdatetime;this.valcomp=cmpstr;this.todisp=dispdatetime;this.frdisp=xmldatetime}else
if(this.Type=="date"){this.valtype=valdate;this.valcomp=cmpstr;this.todisp=dispdate;this.frdisp=xmldatetime}else
if(this.Type=="time"){this.valtype=valtime;this.todisp=disptime;}else
if(this.Type=="boolean"){this.valtype=valbool;this.todisp=dispbool;this.frdisp=dispbool;}

t=node.getAttribute("MINVALUE");if(t)this.minval=t;
t=node.getAttribute("MAXVALUE");if(t)this.maxval=t;
for(i=0;i<node.childNodes.length;i++){
 var p=node.childNodes.item(i);var n=p.getAttribute("Name");var v=p.getAttribute("Value");
 if(n!=null&&v!=null)if(n=="MINVALUE") this.minval=v;else if(n=="MAXVALUE"){this.maxval=v;}
}
}

//////////////////////////////////////
//    Compare field values START

function cmpint(v1,v2)
{
if(v1==v2)return 0;
var i1= parseInt(v1,10),i2=parseInt(v2,10);
if(isNaN(i1)||isNaN(i2)) return cmpstr(v1,v2);
return i1-i2;
}

function cmpfloat(v1,v2)
{
if(v1==v2) return 0;
var f1=parseFloat(v1),f2=parseFloat(v2);
if(isNaN(f1)||isNaN(f2)) return cmpstr(v1,v2);
return f1-f2;
}

function cmpstr(v1,v2)
{
if(v1==v2)return 0;
if(v1==null)return -1;
if(v2==null)return 1;
return (v1>v2)?1:-1;
}

//    Compare field values START
//////////////////////////////////////

//////////////////////////////////////
//    Validate field values START

function cntchrs(v){var s=new Array(),l=v.length;s=v.split("&#");l-=(s.length-1)*5;return l>0?l:0;}

function Validate(v, r)
{
var err="";
if(this.required&&v==""){err=this.name + sMsgValueIsRequired;}else
if(this.maxlength&&v.length>this.maxlength){if(cntchrs(v)>this.maxlength) err=this.name + sMsgLongValue;}
if(err!=""){this.rs.OnError(err);return null;}
v=this.valtype(v, r);
if(v!=null){var s=this.frdisp(v, r);if(!s) return s;v=this.todisp(s, r);}
return v;
}

function valbool(v){return v;}

function valint(v)
{
if(v && v!=""){
var i=parseInt(v,10);
if(isNaN(i)) {this.errNo=3;this.rs.OnError(this.name + sMsgInvalidInteger + v);return null;}
if((this.errNo=this.minmax(i,this.minval,this.maxval))!= 0) return null;
v=i.toString();
}
this.errNo=0;
return v;
}

function valfloat(v)
{
v=LocalFloatToFloat(v);
if(v && v!="")
{if(this.currencySymbol!=null){v=this.frdisp(v);}
 var i;
 if(this.Type=="r8") i=parseFloat(v);else i=Number(v);
 if(isNaN(i)){this.errNo=3;this.rs.OnError(this.name + sMsgInvalidNumber + v);return null;}
 if((this.errNo=this.minmax(i,this.minval,this.maxval))!=0) return null;
 v=this.todisp(i.toString());
}
this.errNo=0;
return v;
}

function valdatetime(v, r)
{
if(v && v!=""){var s=this.frdisp(v, r);if(!s) return s;v=this.todisp(s, r);}
return v;
}

function valdate(v){return v;}

function valtime(v){return v;}

function minmax(i,imin,imax)
{
if(imin&&i<imin){this.rs.OnError(this.name+sMsgOutOfRange + i + " < "+imin);return 4;}
if(imax&&i>imax){this.rs.OnError(this.name+sMsgOutOfRange + i + " > "+imax);return 4;}
return 0;
}

//    Validate field values END
//////////////////////////////////////
//////////////////////////////////////
//    Display field values START

function dispbool(v)
{
if(v=="")return v;
if((v.toLowerCase()).indexOf(szTrue)>=0) v=szTrue;else v=szFalse;
return v;
}

function FloatToLocalFloat(s){
  s = new String(s);
  var i = s.indexOf(DecPoint);
  if(i != -1)
    return s.substring(0, i) +  sDecimalPoint + s.substring(i+1, s.length);
  return s;
}

function LocalFloatToFloat(s){
  s = new String(s);
  var i = s.indexOf(sDecimalPoint);
  if(i != -1)
    return s.substring(0, i) +  DecPoint + s.substring(i+1, s.length);
  return s;
}

function dispfloat(n)
{
var f; if(this.Type=="r8")f=parseFloat(n);else f=Number(n);
if(this.decimals!= null){var d=this.decimals;var p=Math.pow(10,d);f=(Math.round(f*p)/p);}
n=f.toString();
if(this.fixeddec!=null&&n.indexOf("e")==-1)
{var j,i=n.indexOf(DecPoint);if(i==-1){n=n+DecPoint;i=0;}else i=n.length-i-1;
for(j=i;j<this.fixeddec;j++) n=n+"0";
}
var c=this.currencySymbol;
if(c!=null){if(n.charAt(0)=='-') n="("+c+n.substring(1)+")";else n=c+n;}
n=FloatToLocalFloat(n);
return n;
}

function xmlfloat(n)
{
var c=this.currencySymbol;if(c==null) return LocalFloatToFloat(n);
var s=n.indexOf("("),j=n.indexOf(c);
n=(j!=-1)? n.substring(j+c.length):n;
if(s!=-1)  n="-"+n.substring(0,n.indexOf(")"));
return LocalFloatToFloat(n);
}

function WithZero(i){
  if(i>9) return(i.toString());
  else return("0"+i);
}

function XMLDateToString(iYear, iMonth, iDay){
 var aElements = sDateDisplayFormat.split(sDateSeparator);
 var sResult="";
 for(i=0; i< aElements.length; i++)
   if     (aElements[i]=="yy"  ) sResult += WithZero(iYear % 100) + sDateSeparator;
   else if(aElements[i]=="yyyy") sResult += iYear + sDateSeparator;
   else if(aElements[i]=="m"   ) sResult += iMonth + sDateSeparator;
   else if(aElements[i]=="mm"  ) sResult += WithZero(iMonth) + sDateSeparator;
   else if(aElements[i]=="d"   ) sResult += iDay + sDateSeparator;
   else if(aElements[i]=="dd"  ) sResult += WithZero(iDay) + sDateSeparator;
 if(sResult.length > 0)
   sResult = sResult.substr(0, sResult.length-1);
 return(sResult);
}

function XMLTimeToString(iHour, iMinute, iSecond){
 var aElements = sTimeDisplayFormat.split(sTimeSeparator);
 var sResult="";
 for(i=0; i< aElements.length; i++)
   if     (aElements[i]=="hh") sResult += WithZero(iHour) + sTimeSeparator;
   else if(aElements[i]=="h" ) sResult += iHour + sTimeSeparator;
   else if(aElements[i]=="mm") sResult += WithZero(iMinute) + sTimeSeparator;
   else if(aElements[i]=="m" ) sResult += iMinute + sTimeSeparator;
   else if(aElements[i]=="ss") sResult += WithZero(iSecond) + sTimeSeparator;
   else if(aElements[i]=="s" ) sResult += iSecond + sTimeSeparator;
 if(sResult.length > 0)
   sResult = sResult.substr(0, sResult.length-1);
 return(sResult);
}

function dispdatetime(v, r){
  if(r){
    var sType = r.getAttribute("DateType");
    if(sType == "Date") {r.setAttribute("TimeValue", dispdatetimeTime(v)); return dispdate(v);}
    if(sType == "Time") {r.setAttribute("DateValue", dispdate(v));return dispdatetimeTime(v);}
  }
 return dispdate(v) + sDateTimeSeparator + dispdatetimeTime(v);
}

function dispdate(v){
 if (v.length<8) return "";
 return XMLDateToString(parseInt(v.substring(0,4),10), parseInt(v.substring(4,6),10), parseInt(v.substring(6,8),10));
}

function dispdatetimeTime(v){
 var t=v.indexOf("T");
 if(t>-1) v = v.substring(t+1,v.length);
 else v = "";
 return disptime(v);
}

function disptime(v){
 var iH = (v.length < 2) ? 0 : parseInt(v.substring(0,2),10);
 var iM = (v.length < 5) ? 0 : parseInt(v.substring(3,5),10);
 var iS = (v.length < 8) ? 0 : parseInt(v.substring(6,8),10);
 return XMLTimeToString(iH, iM, iS);
}

function xmldatetime(v, r){
  if(!v || v=="") return "";
  var aV = v.split(sDateTimeSeparator);
  var vD = "", vT = "";
  if(aV.length > 1){
    vD = aV[0]; vT = aV[1];
  } else {   
    vD = v; vT = "";
    if(r){
      var sType = r.getAttribute("DateType");
      if(sType == "Date") { vD = v; vT = r.getAttribute("TimeValue");}
      if(sType == "Time") { vT = v; vD = r.getAttribute("DateValue");}
      if(!vT || (vT == "")) vT = XMLTimeToString(0, 0, 0);
      if(!vD || (vD == "")) vD = XMLDateToString(1899, 12, 31); 
    }
  }
  vD = xmlDate(vD);
  vT = xmlTime(vT);
  if(vD == null || vT == null){
    this.rs.OnError(sMsgInvalidDateTime + v);
    return null; 
  }
  if(vT != "")
    return vD + "T" + vT;
  else       
    return vD;
}

function xmlDate(v){
  if(!v || v=="") return "";
  var iY=1900, iM=1, iD=1;
  var aElements = sDateDisplayFormat.split(sDateSeparator);
  var aValues = v.split(sDateSeparator);
  if(aElements.length == aValues.length){
    for(i=0; i< aElements.length; i++)
      if     (aElements[i]=="yy"  ) iY = ((parseInt(aValues[i],10) < 51)? 2000 : 1900) + parseInt(aValues[i]);
      else if(aElements[i]=="yyyy") iY =   parseInt(aValues[i],10);
      else if(aElements[i]=="m" || aElements[i]=="mm") iM = parseInt(aValues[i],10);
      else if(aElements[i]=="d" || aElements[i]=="dd") iD = parseInt(aValues[i],10);
    if(! (isNaN(iY)||isNaN(iM)||isNaN(iD) || iM<1 || iM>12 || iD<1 || iD>32) )
      return(iY.toString() + WithZero(iM) + WithZero(iD));
  }
  return null;
}

function xmlTime(v){
  if(!v || v=="") return "";
  var iH=0, iMin=0, iS=0;
  var aElements = sTimeDisplayFormat.split(sTimeSeparator);
  var aValues = v.split(sTimeSeparator);
  if(aElements.length == aValues.length){
    for(i=0; i< aElements.length; i++)
      if     (aElements[i]=="h" || aElements[i]=="hh") iH = parseInt(aValues[i],10);
      else if(aElements[i]=="m" || aElements[i]=="mm") iMin = parseInt(aValues[i],10);
      else if(aElements[i]=="s" || aElements[i]=="ss") iS = parseInt(aValues[i],10);
    if(! (isNaN(iH)||isNaN(iMin)||isNaN(iS)|| iH<0 || iH>23 || iMin<0 || iMin>59 || iS<0 || iS>59 ))
      return(WithZero(iH)+':'+WithZero(iMin)+':'+WithZero(iS));
  }
  return null;
}

//    Display field values END
//////////////////////////////////////

function DeltaChanges(ds)
{
this.ds=ds;
this.action=new Array();
this.row=new Array();
this.rowOrg=new Array();
this.parents=new Array();
this.rs=new Array();
this.rem=RemFromLog;
this.add=AddToLog;
this.find=FindInLog;
this.make=MakeDelta;
this.fullpath=MakePath;
this.reset=ResetLog;
}

//LLehel
function MakeFieldsUpperCase(aRow){
  if(aRow.parsed==0 || !aRow.parsed){aRow.attributes=ReadAttrs(aRow.attributes);aRow.parsed=1;}
  var aAttributes = aRow.attributes;
  var aFieldsUpperCaseNames = new Array();
  for(anElement in aAttributes)
    if(anElement != "item" && anElement != "RowState") // Field names, I hope
      aFieldsUpperCaseNames[anElement.toUpperCase()] = aAttributes[anElement];
    else
      aFieldsUpperCaseNames[anElement] = aAttributes[anElement];
  return aFieldsUpperCaseNames;
}

function AddToLog(Act,pRow,pRowOrg,rs)
{
var i,l=this.action.length;
if(pRowOrg) for (i=0;i<l;i++) if(this.row[i]==pRow) return;

if(Act==szDel)
for(i=0;i<l;i++)
if(this.row[i]==pRow)
{
 if(this.action[i]==szNew){this.rem(i);return;}
 else{pRow=this.rowOrg[i];this.rem(i);l--;break;}
}
this.action[l]=Act;
this.row[l]=pRow;
this.rowOrg[l]=pRowOrg;
this.parents[l]=GetParents(rs);
this.rs[l]=rs;
//LLehel
if(this.row[l]!=null) this.row[l].attributes = MakeFieldsUpperCase(this.row[l]);
if(this.rowOrg[l]!=null) this.rowOrg[l].attributes = MakeFieldsUpperCase(this.rowOrg[l]);
//LLehel
}

function FindInLog(r)
{
var i,l=this.action.length;
for(i=0;i<l;i++)if(this.row[i]==r) return i;
return -1;
}

function ResetLog()
{
var i,l=this.action.length;
for(i=0;i<l;i++){this.row[i].removeAttribute(szRowState);}
this.action.length=0;
}

function RemFromLog(j)
{
var i,l=this.action.length;
for(i=j;i<l-1;i++)
{
 this.action[i]=this.action[i+1];
 this.row[i]=this.row[i+1];
 this.rowOrg[i]=this.rowOrg[i+1];
 this.parents[i]=this.parents[i+1];
 this.rs[i]=this.rs[i+1];
}
this.action.length=l-1;
this.row.length=l-1;
this.rowOrg.length=l-1;
this.parents.length=l-1;
this.rs.length=l-1;
}

function MakeDelta()
{
var ds=this.ds;
var doc=ds.doc.createDocumentFragment();
var e=ds.root.cloneNode(0);
doc.appendChild(e);

var mdata=ds.MetaData.cloneNode(1);
var params=mdata.childNodes.item(1);
params.setAttribute("DATASET_DELTA","1");
e.appendChild(mdata);

var RD=ds.doc.createElement("ROWDATA");
e.appendChild(RD);

var l=this.action.length;
var i;

for(i=0;i<l;i++)
{
 var rs=this.rs[i];
 var pr=this.row[i].cloneNode(0);
 var po=this.rowOrg[i] != null ? this.rowOrg[i].cloneNode(1) :null;
 if(po)
 {
   po.setAttribute(szRowState,szOrg);
   var j,f,v1,v2,cnt=0;
   for(j=0;j<rs.Fields.Cnt;j++)
   {
     f=rs.Fields.Fieldx[j];
     v1=f.get(po);
     v2=f.get(pr);
//LLehel
//   if (f.valcomp(v1,v2)==0) f.put(pr,null);else cnt++;
     if (f.valcomp(v1,v2)!=0) cnt++;
    }
   if(cnt==0){continue;}
 }
 pr.setAttribute(szRowState,this.action[i]);
 if(this.action[i]==szMod||this.action[i]==szNew||this.action[i]==szDel)
 {
   var j,le=this.row[i].childNodes.length;
   for(j=0;j<le;j++) pr.appendChild(this.row[i].childNodes.item(j).cloneNode(0));
  }
  this.fullpath(RD,po,pr,i);
}
return e;
}

function MakePath(RD,po,pr,j)
{
//LLehel - bDoNotPutInDelta
/*var i, bDoNotPutInDelta = this.action[j]==szNew;
if(bDoNotPutInDelta){
  for (var a in pr.attributes)
   if(a!="RowState" && a!="item"){
     bDoNotPutInDelta = pr.attributes[a] != "";
     if(!bDoNotPutInDelta) break;
   }
  if(bDoNotPutInDelta){
    return;
  }
}
*/
var pp=this.parents[j];
if(pp==null){if(po) RD.appendChild(po);RD.appendChild(pr);return;}
var i,rs=this.rs[j];
for(i=pp.length-1;i>=0;i--){
 var pM=pp[i];
 pM=pM.cloneNode(0);
 pM.setAttribute(szRowState,szDetUpd);
 var FldLink=rs.doc.createElement(rs.linkFld);
 if(po){FldLink.appendChild(po);po=null;}
 FldLink.appendChild(pr);
var k,l=pp[i].childNodes.length;
for(k=0;k<l;k++){if(pp[i].childNodes.item(k).tagName==rs.linkFld) pM.appendChild(FldLink);else pM.appendChild(pp[i].childNodes.item(k).cloneNode(0));}
 pr=pM;
 rs=rs.parent;
}
RD.appendChild(pr);
return;
}

function GetParents(rs)
{
var p=rs.parent;
if(p==null)return null;
var cnt=1,i;
var pa=new Array();
while(p.parent!=null){p=p.parent;cnt++;}
p=rs.parent;
for(i=0;i<cnt;i++){pa[cnt-i-1]=p.idx.row(p.pos);p=p.parent;}
return pa;
}

function dsUndo(p)
{
var s=this.RowState(p);//use attributes instead!!
if(s==""){this.notify(1);return;}
if(s=="I"){this.deletex(p);}
else if (s=="M")
{
var pRowOrg,pRow=this.idx.row(p);
var c=this.DeltaChanges.find(pRow);
if(c==-1) return;
pRowOrg=this.DeltaChanges.rowOrg[c];
var i,f,v;
for(i=0;i<this.Fields.Cnt;i++)
{
 f=this.Fields.Fieldx[i];
 if(f.bAsAttr){v=pRowOrg.getAttribute(f.iname);f.put(pRow,v);}
}
pRow.removeAttribute(szRowState);
this.idx.chg=1;
this.DeltaChanges.rem(c);
this.notify(1); //?
}
else if(s=="D"){}
}

function DsForcePost()
{if(this.regobjs==null)return 0;
var j ;
for(j=0;j<this.regobjs.length;j++)
{
 var o=this.regobjs[j];
 if(o.post!=null&&o.post()!=0)return 1;
}
if(this.pDets==null)return 0;
for(j=0;j<this.pDets.length;j++){var det=this.pDets[j];if(det.forcepost()!=0)return 1;}
return 0;
}

function idx(rs)
{
this.rs=rs;
this.chg=0;
this.add=idxadd;
this.rem=idxrem;
this.sort=idxsort;
this.map=new Array();
this.pos=idxpos;
this.row=idxrow;
this.fld=null;
this.sort(null);
}
function idxadd(e){this.map[e]=this.map.length;}
function idxpos(i){return this.map[i];}
function idxrow(i){if(i>=this.rs.RowCnt) return null;i=this.pos(i);return this.rs.RowData.childNodes.item(i);}
function idxrem(e){var i,l=this.map.length,v=this.map[e];for(i=e;i<l;i++) this.map[i]=this.map[i+1];this.map.length=l-1;for(i=0;i<l-1;i++)if(this.map[i]>v) this.map[i]--;}

function idxsort(name)
{
var i,s,cnt=this.rs.RowCnt;
this.map.length=cnt;
if(this.chg==0&&name&&name==this.fld){this.map.reverse();this.rs.first();this.rs.notify(2);return;}
this.chg=0; 
for(i=0;i<cnt;i++)this.map[i]=i;
this.fld=name;
if(name==null)return;
var f=this.rs.Fields.Field[name];  
if(f==null)return;
var sarray=new Array();
this.fld=name;
for(i=0;i<cnt;i++){s=f.Value(i);s=s+"&"+i.toString();sarray[i]=s;}
sarray.sort(f.valcomp);
for(i=0;i<cnt;i++){s=sarray[i].split("&");this.map[i]=parseInt(s[s.length-1],10);}
this.rs.first();
this.rs.notify(2);
}

function rsValue(p)
{
var pos=p;
if(isNaN(p))pos=this.rs.pos;
var r=this.rs.idx.row(pos);
if(r==null) return"";
return this.get(r);
}

//LLehel
function rsSetValue(p, v)
{
var pos=p;
if(isNaN(p))pos=this.rs.pos;
var r=this.rs.idx.row(pos);
if(r==null) return;
return this.put(r, v);
}

function getValue(r)
{
if(this.bAsAttr){var v=r.getAttribute(this.iname);if(v!=null)return v;return "";}
var p=findcnode(r,this.iname);
if(p){p=p.childNodes;if(p.length)return p.item(0).data;}
return "";
}

function putValue(r,v)
{
if(this.bAsAttr){if(v!=null){r.setAttribute(this.iname,v);}else r.removeAttribute(this.iname);return;}
if(v==null) v="";
var p=findcnode(r,this.iname);
if(p){if(p.childNodes.length==0){var T=this.rs.doc.createTextNode("");p.appendChild(T);}p.childNodes.item(0).data=v;}
}


