//финкции при въвеждане на полета
//Христо Марков Христов - 29 Май 2006 г.

var xmlhttp;
if(typeof XMLHttpRequest!="undefined")
{
	xmlhttp=new XMLHttpRequest();
}
else if(typeof ActiveXObject!="undefined")
{
	var aVersions=["MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp","Microsoft.XmlHttp"];

	for(var i=0;i<aVersions.length;i++)
	{
		try
		{
			xmlhttp=new ActiveXObject(aVersions[i]);
			break;
		}
		catch(oError){;}
	}
}
else
{
	alert("Your browser doesn't support an XML HTTP Request.");
}

/*
function read(callback,t,usl,f,f_st,key_pole,n1,n2)
{
	if (xmlhttp)
	 {
		 xmlhttp.open("POST","read.php",callback==""?false:true);
		 xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		 if(callback!="") xmlhttp.onreadystatechange=callback;
		 xmlhttp.send("t="+escape(t)
		 +"&"+"usl="+escape(usl)
		 +"&"+"f="+escape(f)
		 +"&"+"f_st="+escape(f_st)
		 +"&"+"key_pole="+escape(key_pole)
		 +"&"+"n1="+escape(n1)
		 +"&"+"n2="+escape(n2)
		 );
		 if(callback=="") alert(xmlhttp.responseText);
//		 if(callback=="") return xmlhttp.responseText;
	 }
}
//	 onclick=send_receive_cmd("read.php")
//	 onclick=read("","SCUSXXXXNPXXXXXX","SYS,LENNP","SCUS\0226","SYS,F",10,6)
//	onclick=read("","SCUSXXXXNPXXXXXX","F='EKRMS'","SYS,LENNP","SCUS\0226","SYS,F",10,6)

*/

//
//клас CScusz1
//
function CScusz1()
{
	//
	//променливи
	//
	this.callback=""; //ако искаме асинхронно примене на резултата от read_first => да се сложи като стойност функция
	this.t=""; //име на таблица
	this.r=0; //0 - няма прочетен запис, 1 - записът е прочетен
	this.eof=0; //End of the File ==1 => поледен запис от заявката
	this.bof=0; //Begin Of the File ==1 => Първи запис от заявката
	this.n1=0; //кое е отместването на първият запис в буферът
	this.n2=1; //колко записа след отместването (n1) да се върнат => -1 връща всички записи от 0 до n1
	this.usl=""; //допълнително условие при SELECT заявката
	this.zstr=""; //стринг, съдържащ данните на записите, върнати от сърверът при четене
	this.result=""; //стринг, съдържащ върнатият резултат от сърверът
	this.indst=""; //стойности на полетата от осн. индекс - формират се при прочитане на записа и се използват за промяна на записа (системата да може да прочете оригиналният запис и да му присвои ст-стите на новите полета)
	this.ntp=""; //текстово поле - формула която ще се показва ако е натиснат помощен клавиш
//	this.ntp_tip=0; //текстово поле - тип който ще се формира формулата
//	this.ntp_len=0; //текстово поле - дължина на резултата
//	this.ntp_l=0; //текстово поле - дължина след дес.точка

	this.z_nom=0; //номерът на записът от SELECT заявката
	this.send_str_ok=1; //дали да формира стринг на заявката
	this.f=new CScusform(); //клас за изчисляване на формули
	this.f.z=this;

//	this.nv="";

	//
	// променливи, зареждани при създаване на обекта
	//
	////  this.nv => името на връзката, ако записът е не е основен, а е свързан
	//  this.ms => името(обекта) на ms към който се създава CScusz1.
	//  this.npstr; //стринг съдържащ всичко полета от записа подредени едно след друго по нарастващ номер в записа
	//  this.np; // масив, съдържащ полетата
	//  this.tip; // масив, съдържащ типът на полетата
	//  this.len; // масив, съдържащ дължината на полетата
	//  this.l; // масив, съдържащ дължината след дес.точка на полетата
	//
	//  this.vnp; // масив, съдържащ виртуалните полетата
	//  this.vtip; // масив, съдържащ типът на виртуалните полетата
	//  this.vlen; // масив, съдържащ дължината на виртуалните полетата
	//  this.vl; // масив, съдържащ дължината след дес.точка на виртуалните полетата
	//  this.vform =>масив, съдържащ формулите на виртуалните полета
	//  this.vst =>масив, съдържащ стойности от изчисление на формулите на виртуалните полета => vst[номер на вирт.поле]
	//
	// 
	//  this.indstr_ime[ime]=nomer; //масивг, съдържащ с индекси имената на ключовете, за да мога по името на ключа да намеря неговият номер
	//  this.indstr; //масив съдържащ номерата на полетата участащи във всеки идекс "nom_pole1, nom_pole2, ..."
	//  this.indnom; //масив съдържащ номера на индексните полета => this.indstr[0].split(",");
	//  this.mknom; //масив съдържащ номера на ключовите полета за извлизаче на стойности от записа => this.indstr[nom_key].split(",");
	//  this.z =>масив, съдържащ стойностите на полетата
	//  this.zvr =>масив, от свързани записи към основният запис
	//  this.mainp =>масив, от свързани формулите на полетата от осн.запис, стойностите на които се зареждат като ключови на св.запис

	//
	//фунции
	//
	//за работа със запис
	//
	this.read_first=CScusz1_read_first;
	this.read_next=CScusz1_read_next;
	this.read_before=CScusz1_read_before;
	this.rectoz1=CScusz1_rectoz1;
	this.add=CScusz1_add;
	this.update=CScusz1_update;
	this.del=CScusz1_del;
	this.lock=CScusz1_lock;
	this.unlock=CScusz1_unlock;
	this.readzvr=CScusz1_readzvr;
	this.setzvr=CScusz1_setzvr;
	this.chTable=CScusz1_chTable;
	this.chTable=CScusz1_loadkey;
	this.free_vform_st=CScusz1_free_vform_st;
	
	//
	//за работа с полетата от записа
	//
	this.s=CScusz1_s;
	this.p=CScusz1_p;
	this.clrp=CScusz1_clrp;
}
function CScusz1_free_vform_st() //извиства стойностите на виртуалните полета за ново преизчисление
{
	if(typeof(this.vform_st)!="undefined") this.vform_st.splice(0,this.vform_st.length); //премахвам елементите от масива и така показвам, че стойността на виртуалните полета трябва да се преизчисли
}
function CScusz1_readzvr(Vr)
{
	if(this.setzvr(Vr)!=scus_success) return scus_error;
	zvr1=this.zvr[Vr];
	ret=scus_success;zvr1.clrp(); zvr1.r=0;
	var n1=zvr1.n1,n2=zvr1.n2;
	zvr1.n1=0;zvr1.n2=1;

	vform=new CScusform();vform.z=this.zvr[Vr];

	for(i=0;i<zvr1.mainp.length;i++)
	{
		zvr1.z[zvr1.mknom[i]-1]=vform.scusf(zvr1.mainp[i],this);
//		this.zvr[Vr].z[this.zvr[Vr].mknom[i]]=vform.scusf(this.zvr[Vr].mainp[i],this);

	}
	if((ret=zvr1.read_first())!=scus_success) zvr1.clrp();

	zvr1.n1=n1;zvr1.n2=n2;

	return ret;
}
function CScusz1_setzvr(Vr)
{

	if(typeof(this.zvr[Vr])!="undefined") return scus_success;
	
	g0=new CScusz1();
	g0.t="SCUSXXXXNV";
	g0.npstr="SYS,F,NV,IMENV,ZAD1,CONN,SYS1,FILE1,IND1,KEY1,NVNP1,NVNP2,NVNP3,NVNP4,NVNP5,NVNP6,NVNP7,NVNP8,NVNP9,NVNP10,NVNP11,NVNP12,NVNP13,NVNP14,NVNP15,NVNP16,NVNP17,NVNP18,NVNP19,NVNP20";
	g0.np=g0.npstr.split(",");
	g0.tip="3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3".split(",");
	g0.len="8,8,8,30,1,2,2,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8".split(",");
	g0.l="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0".split(",");
	g0.indnom="1,2,3".split(",");
	g0.mknom="1,2,3".split(",");
	g0.z=new Array(30);
	g0.clrp();

	//зареждам sys, file, nv
	for(i=8;i--;i>0) if(this.t.slice(i-1,i)!="X") break;
	g0.z[0]=this.t.slice(0,i);
	for(i=this.t.length;i--;i>8) if(this.t.slice(i-1,i)!="X") break;
	g0.z[1]=this.t.slice(8,i);
	g0.z[2]=Vr; x="XXXXXXXX";

	if(g0.read_first()==scus_success)
	{
		this.zvr[Vr]=new CScusz1();
		this.zvr[Vr].ms="";
		this.zvr[Vr].chTable(g0.z[6]+x.slice(0,8-g0.z[6].length)+g0.z[7]+g0.z[6]=="SCUS"?x.slice(0,8-g0.z[7].length):"");
		if(g0.z[9]!=" ") //връзката е по ключ и зареждам ключа като ключ за работа в св. запис
		{
			nom_ind=this.zvr[Vr].indstr_ime[g0.z[9]];
			this.zvr[Vr].mknom=this.zvr[Vr].indstr[nom_ind].split(",");
		}

		//зареждам полетата от осн. запис, които ще се равняват на ключовите ст-ти на св. запис

		for(ii=0;ii<20;ii++)
		{
			if(g0.z[ii+11]==" ") break;
			this.zvr[Vr].mainp[i]=g0.z[ii+11];
		}
	}
	else return scus_error;
	return scus_success;
}
function CScusz1_chTable(Table)
{
	if(Table==this.t) return scus_success;

	this.t=Table;

	g=new CScusz1();
	g.t="SCUSXXXXNP";
	g.npstr="SYS,F,NP,IMENP,TIPNP,LENNP,LNP,NVNP,FORMNP,COLNP,SHORTIME";
	g.np=g.npstr.split(",");
	g.tip="3,3,3,3,1,1,1,3,3,1,3".split(",");
	g.len="8,8,8,30,2,3,2,8,255,4,10".split(",");
	g.l="0,0,0,0,0,0,0,0,0,0,0".split(",");
	g.indnom="1,2,3".split(",");
	g.mknom="1,2,3".split(",");
	g.z=new Array(11);
	g.clrp();
	x="XXXXXXXX";

	for(i=8;i--;i>0) if(this.t.slice(i-1,i)!="X") break;
	g.z[0]=this.t.slice(0,i);
	for(i=this.t.length;i--;i>8) if(this.t.slice(i-1,i)!="X") break;
	g.z[1]=this.t.slice(8,i);

	if(g.read_first()==scus_success)
	{
		ii=-1;iv=-1;
		this.vnp="".split(",");
		this.z="".split(",");
		this.npstr="";
		this.tip="".split(",");this.len="".split(",");this.l="".split(",");
		do
		{
			if(g.z[8]==" ") //реално поле (няма формула)
			{
				this.npstr+=g.z[2];
				this.tip[++ii]=g.z[4];
				this.len[ii]=g.z[5];
				this.l[ii]=g.z[6];
				this.z[ii]=" ";
			}
			else //виртуално поле
			{
				this.vnp[++iv]=g.z[2];
				this.vtip[iv]=g.z[4];
				this.vlen[iv]=g.z[5];
				this.vl[iv]=g.z[6];
			}
		}while(g.read_next()==scus_success);
	}
	this.np=this.npstr.split(",");
	loadkey();

	//зарждам като основен ключ по който ще се работи в записа => по индекс
	this.indnom=this.indstr[0].split(",");
	this.mknom=this.indstr[0].split(",");
}
function CScusz1_loadkey() //зарежда номерата на полетата за всеки ключ
{
	gkey=new CScusz1();
	gkey.t="SCUSXXXXIND";
	gkey.npstr="SYS,F,IND,NTPIND,I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,I14,I15,I16,I17,I18,I19,I20";
	gkey.np=gkey.npstr.split(",");
	gkey.tip="3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3".split(",");
	gkey.len="8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8".split(",");
	gkey.l="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0".split(",");
	gkey.indnom="1,2,3".split(",");
	gkey.mknom="1,2,3".split(",");
	gkey.z=new Array(24);
	gkey.clrp();
	x="XXXXXXXX";

	for(i=8;i--;i>0) if(this.t.slice(i-1,i)!="X") break;
	gkey.z[0]=this.t.slice(0,i);
	for(i=this.t.length;i--;i>8) if(this.t.slice(i-1,i)!="X") break;
	gkey.z[1]=this.t.slice(8,i);

	this.indstr="".split(","); this.indstr[0]="";
	this.indstr_ime="".split(",");this.indstr_ime["IND"]=0;

	if(gkey.read_first()==scus_success)
	{
		for(ii=0;ii<20;ii++)
		{
			if(gkey.z[ii+5]==" ") break;
			this.indstr[0]+=gkey.z[ii+5]+ii>0?",":"";
		}
	}

	if(this.indstr[0]=="") return scus_error;

	gkey.t="SCUSXXXXKEY";
	gkey.npstr="SYS,F,KEYKEY,PPP,TIPKEY,NTPKEY,KI1,KI2,KI3,KI4,KI5,KI6,KI7,KI8,KI9,KI10,KI11,KI12,KI13,KI14,KI15,KI16,KI17,KI18,KI19,KI20";
	gkey.np=gkey.npstr.split(",");
	gkey.tip="3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3".split(",");
	gkey.len="8,8,8,1,1,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8".split(",");
	gkey.l="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0".split(",");
	gkey.indnom="1,2,3".split(",");
	gkey.mknom="1,2,3".split(",");
	gkey.z=new Array(26);
	gkey.clrp();

	if(gkey.read_first()==scus_success)
	{
		jj=0;
		do
		{
			this.indstr[++jj]="";
			this.indstr_ime[gkey.z[2]]=jj;
			for(ii=0;ii<20;ii++)
			{
				if(gkey.z[ii+7]==" ") break;
				this.indstr[jj]+=gkey.z[ii+7]+ii>0?",":"";
			}
		}while(gkey.read_next()==scus_success);
	}
	return scus_success;
}
function CScusz1_read_first()
{
	ret=scus_error;this.r=0;this.eof=0;this.bof=0;
	for(var ii in this.zvr)
	{
		this.zvr[ii].r=0;
		this.zvr[ii].free_vform_st();
	}
	this.free_vform_st();

	if (xmlhttp)
	{

		if(this.send_str_ok)
		{
//			mkstr="";for(i=0;i<this.mknom.length;i++) mkstr+=this.np[i]+(i<this.mknom.length-1?",":"");
			mkstr="";for(i=0;i<this.mknom.length;i++) mkstr+=this.np[this.mknom[i]-1]+(i<this.mknom.length-1?",":"");
//alert(mkstr);
			f_st=""; for(i=0;i<this.mknom.length;i++) f_st+=this.z[this.mknom[i]-1]+(i<this.mknom.length-1?"\022":"");
		}
		xmlhttp.open("POST","..//system//read.php",this.callback==""?false:true);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		if(this.callback!="") xmlhttp.onreadystatechange=this.callback;


		var usl=this.usl;
		xmlhttp.send("t="+escape(this.t)
			 +"&"+"usl="+escape(Utf8.encode(usl))
			 +"&"+"f="+escape(mkstr)
			 +"&"+"f_st="+escape(Utf8.encode(f_st))
			 +"&"+"key_pole="+escape(mkstr)
			 +"&"+"n1="+escape(this.n1)
			 +"&"+"n2="+escape(this.n2)
			 );

//alert(xmlhttp.responseText);
		this.zstr=xmlhttp.responseText;	this.result=this.zstr.split("\022"); this.z_nom=0;

//		if(this.result[2+this.z_nom]!="")
		if(this.result[0]==scus_success&&this.result[2+this.z_nom]!="")
		{
			ret=scus_success;
			this.rectoz1();
		}
		else ret=scus_notfound;
	}
	return ret;
}
function CScusz1_read_next()
{
	var ret,z_nom,zstr,n1,n2;
	if(this.eof) return scus_notfound;
	ret=scus_success;this.r=0;
	for(var ii in this.zvr)
	{
		this.zvr[ii].r=0;
		this.zvr[ii].free_vform_st();
	}
	this.free_vform_st();


	if((2+(++this.z_nom))>this.result.length-2) //това означава, че няма повече записи в буферът и трябва да се обърнем към сърверът за да вземем следващият запис
	{
		z_nom=this.z_nom; n1=this.n1; n2=this.n2; zstr=this.zstr;

		this.n1+=this.n2;
		this.send_str_ok=0;

		ret=this.read_first();

		if(ret!=scus_success)
		{
			this.z_nom=z_nom; this.n1=n1; this.n2=n2; this.zstr=zstr;
			this.result=this.zstr.split("\022");
		}
		this.send_str_ok=1;
	}

	if(ret==scus_success) 
	{
		this.eof=0;this.bof=0;
		this.rectoz1();
	}
	else this.eof=1;

	return ret;
}
function CScusz1_rectoz1()
{
	var ret,i,f;
	if(this.result[2+this.z_nom]!="")
	{
		ret=scus_success; this.r=1;
		this.z=this.result[2+this.z_nom].split("\001");
		if(this.ms!=""&&typeof(this.mainp)=='undefined') //зарежда полетата в ms само ако е дефиниран и ако не е свързан запис
		{
			for(i=0;i<document[this.ms.id].length;i++)
			{
				f=document[this.ms.id].elements[i];
				if(typeof(f.scusnom)!='undefined')
				{
					switch(+f.scustype)
					{
					case 4: //превръща цифра в дд.мм.гггг
						f.value=st_date(this.z[f.scusnom-1]);
					break;
					case 7: //превръща цифра в mm/dd/gggg
						f.value=st_date7(this.z[f.scusnom-1]);
					break;
					default: f.value=this.z[f.scusnom-1];
					break;
					}
//					f.value=this.z[f.scusnom-1];
				}
			}
		}
		this.indst=""; for(i=0;i<this.indnom.length;i++) this.indst+=this.z[this.indnom[i]-1]+(i<this.indnom.length-1?"\001":"");
	}
}
function CScusz1_read_before()
{
	var ret,z_nom,zstr,n1,n2;
	if(this.bof) return scus_notfound;
	ret=scus_success;this.r=0;
	for(var ii in this.zvr)
	{
		this.zvr[ii].r=0;
		this.zvr[ii].free_vform_st();
	}
	this.free_vform_st();

	if(--this.z_nom<0) //това означава, че няма повече записи в буферът и трябва да се обърнем към сърверът за да вземем предишен запис
	{
		if(this.n1==0) //в първият запис на select съм и няма повече записи напред
		{
			this.bof=1;
			return scus_notfound;
		}

		z_nom=this.z_nom; n1=this.n1; n2=this.n2; zstr=this.zstr;

		this.n1-=this.n2;
		this.n1=this.n1>0?this.n1:0;

		this.send_str_ok=0;
		ret=this.read_first();

		if(ret!=scus_success)
		{
			this.z_nom=z_nom; this.n1=n1; this.n2=n2; this.zstr=zstr;
			this.result=this.zstr.split("\022");
		}
		this.send_str_ok=1;
		
	}

	if(ret==scus_success)
	{
		this.eof=0;this.bof=0;
		this.rectoz1();
	}
	else this.bof=1;

	return ret;
}
function CScusz1_add()
{
	//
	//преди да се добави записа => да се проверява дали този запис не е блокиран от друг потребител
	//
	if (xmlhttp)
	{
		f_st=""; for(i=0;i<this.z.length;i++) f_st+=this.z[i]+(i<this.z.length-1?"\001":"");
		xmlhttp.open("POST","..//system//add.php",false);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlhttp.send("t="+escape(this.t)
		 +"&"+"f="+escape(this.npstr)
		 +"&"+"f_st="+escape(Utf8.encode(f_st))
		);
	}

	this.result=xmlhttp.responseText.split("\022");
	return this.result[0];
}
function CScusz1_update()
{
	//преди да се промени записа => да се проверява дали този запис не е блокиран от друг потребител
	if(this.r==0) return scus_error;
	if (xmlhttp)
	{
		indstr="";for(i=0;i<this.indnom.length;i++) indstr+=this.np[i]+(i<this.indnom.length-1?",":"");
		f_st=""; for(i=0;i<this.z.length;i++) f_st+=this.z[i]+(i<this.z.length-1?"\001":"");
		
		xmlhttp.open("POST","..//system//update.php",false);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

		var usl=this.usl,indst=this.indst;
		xmlhttp.send("t="+escape(this.t)
		 +"&"+"usl="+escape(Utf8.encode(usl))
		 +"&"+"ind="+escape(indstr)
		 +"&"+"ind_st="+escape(Utf8.encode(indst))
		 +"&"+"f="+escape(this.npstr)
		 +"&"+"f_st="+escape(Utf8.encode(f_st))
		);
	}

	this.result=xmlhttp.responseText.split("\022");
	return this.result[0];
}
function CScusz1_del()
{
	//преди да се изтрие записа => да се проверява дали този запис не е блокиран от друг потребител

	if(this.r==0) return scus_error;
	if (xmlhttp)
	{
		indstr="";for(i=0;i<this.indnom.length;i++) indstr+=this.np[i]+(i<this.indnom.length-1?",":"");
		xmlhttp.open("POST","..//system//delete.php",false);
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

		var usl=this.usl,indst=this.indst;
		xmlhttp.send("t="+escape(this.t)
		 +"&"+"usl="+escape(Utf8.encode(usl))
		 +"&"+"f="+escape(indstr)
		 +"&"+"f_st="+escape(Utf8.encode(indst))
		);
		this.result=xmlhttp.responseText.split("\022");
	}
	return this.result[0];
}
function CScusz1_s(Col,St)
{
	if((Col>0)&&(Col<this.z.length+1))
	{
		this.z[Col-1]=(St==""?" ":St);
		this.free_vform_st();
	}
}
function CScusz1_p(Col)
{
	if(typeof(this.z[Col-1])!="undefined") return this.z[Col-1];
	return " ";
}
function CScusz1_clrp()
{
	for(i=0;i<this.z.length;i++) this.z[i]=" ";
}
function CScusz1_lock()
{
}
function CScusz1_unlock()
{
	alert("unlock");
}
//
//край на клас CScusz1
//

