var encode_char="/"; //znak ukazující kodovaný text
var lns_month = [31,28,31,30,31,30,31,31,30,31,30,31];
var p_z="\"><\\'"; // zakázané znaky
var fn_frm_zaokr,fn_frm_poz,fn_frm_musi,fn_frm_des_c,fn_frm_tis,fn_frm_nazev;// pro formát ceny funkci fn_frm_cn

function IsIP(x,multiple){
	
}
function IsPSC(x){
	return /^\d{3} ?\d{2}$/.test(x);
}

function IsEmail(x,multiple){
//multiple=vícenasobné ip adresy oddělené středníkem
var s;
	if(multiple){
		s = /^((\w|[_%+-])+(\.(\w|[_%+-])+)*@((\w|[_%+-])+\.)+(\w|[_%+-])+)( *; *\1)*$/;
	}else{
		s=/^(\w|[_%+-])+(\.(\w|[_%+-])+)*@((\w|[_%+-])+\.)+(\w|[_%+-])+$/;
	};
	return s.test(x);
}

function IsIMEI(x,ch_sum){
var a,c,o,ch,kont;
	x=String(x);
	o=x;
	if(!/^\d{15}_?$/.test(o)){return false};
	if(!ch_sum){return true};
	o="";
	kont=(x.charAt(14)*1);
// kont = kontrolní číslo
// každé sudé číslo se znásobí a zamění jeho výsledkem v řetězci
// Příklad 49015 42032 3751 + kontrolní vypočítáme
// IMEI 				4	9	 	0 	1 	5 	4 	2 	0 	3 	2 	3 	7 		5 	1 	?
// Double every other 	4	18 		0 	2 	5 	8 	2 	0 	3 	4 	3 	14 		5 	2 	?
// Sum digits 			4 + (1+8) +	0 + 2 + 5 + 8 + 2 + 0 + 3 + 4 + 3 + (1+4)+ 	5 + 2 +	? = 52 + ?
	for(a=0; a<14; a++){
		ch=x.charAt(a);
		c=(a+1)/2;
		if(Math.floor(c)==(c)){
			//sudá * 2 - ale v indexování je to lichá
			ch=String(ch*2);
		}
		o += ch;
	}
	c=o.length;
	x=0;
	for(a=0; a<c; a++){
		x += (o.charAt(a)*1)
	}
	x += kont;
	return (Math.floor(x/10)==(x/10));
}

function IsNumber(x)
{
// x_num= číslo, nebo string
// vrací true když je x_num číslo, jinak vrací false
var z;
	x=String(x);
	if(x.length<1){return false};
	z=/^\-?\d*(\,|\.)?(\d*)?$/;
	if(!z.test(String(x))){return false};
	return true;
}

function CorrectIfShortDatum(x_num){
// upraveno na novější verzi
	return OpravDatum(x_num);
}
function OpravDatum(co){
// vrací původní nebo opravené datum
//převede formát yyyy-mm-dd
//                            dd-mm-yyyy
//                            d.m.y   /  d.m.yy
var x;
	co=String(co);
	co.replace(/ +/gi,'');
	z=/^\d{4}-\d{1,2}-\d{1,2}$/;
	if(z.test(co)){
		//číslo je yyyy-mm-dd
		x=co.split(/-/g);
		x[1]=Math.ceil(x[1]);
		x[2]=Math.ceil(x[2]);
		return x[2]+'.'+x[1]+'.'+x[0];
	}
	z=/^\d{1,2}-\d{1,2}-\d{4}$/;
	if(z.test(co)){
		//číslo je dd-mm-yyyy
		x=co.split(/-/g);
		x[1]=Math.ceil(x[1]);
		x[0]=Math.ceil(x[0]);
		return x[0]+'.'+x[1]+'.'+x[2];
	}
	z=/^\d{1,2}\.\d{1,2}\.\d{1,4}$/;
	if(z.test(co)){
		//číslo je d.m.y
		x=co.split(/\./g);
		x[2]=Math.ceil(x[2]);
		x[1]=Math.ceil(x[1]);
		x[0]=Math.ceil(x[0]);
		if (x[2]<100) {x[2] += (x[2]<80 ? 2000 : 1900)};
		return x[0]+'.'+x[1]+'.'+x[2];
	}
	z=/^\d{1,2}\.\d{1,2}\.?$/;//zkrácené datum
	if(z.test(co)){
		x=co.split(/\./g);
		x[1]=Math.ceil(x[1]);
		x[0]=Math.ceil(x[0]);
		var y= new Date();
		y= y.getFullYear();
		return x[0]+'.'+x[1]+'.'+ y;
	}
	return co;
}

function InputIsDatum(el){
//el=element input, který má obsahovat datum
	el.value=OpravDatum(el.value);
	return IsDatum(el.value);
}

function IsDatum(x_num)
{
var a,b,c,x,z;
// isd_x_num = string nebo jiné, které si převede na string

// vrací true, jestli je string datum-ne s časem, jinak false
// bere datum dd.mm.yyyy d.m.yyyy
	x_num=String(x_num);
//	x_num=CorrectIfShortDatum(x_num);
	if(x_num.length<1){return false};
//	z=/^((\d?\d)\.){2}(\d){4}$/;
	z=/^([1-9]|[12][0-9]|[3][01])\.([1-9]|[1][0-2])\.(((19)|(20))\d{2})$/;
	if(!z.test(x_num)){return false};

	x=x_num.split(".");
	x[0]=Math.floor(x[0]);
	x[1]=Math.floor(x[1]);
	x[2]=Math.floor(x[2]);
	
	//test přestupného roku a min roku 1900
	if(x[2]<1900){return false};
	c=Math.floor(x[2]/4)*4;
	if(c==x[2]){b=true}else{b=false};

	//test měsíce
	if((x[1]>12)||(x[1]<1)){return false};

	//test dne
	if(x[0]<1){return false};
	c=lns_month[x[1]-1];//b=max den
	if(b && (x[1]==2)){c+=1};//v únoru a přestupném roku zvyš o jeden
	if(x[0]>c){return false};

	return true;
}
// *****************************
// **** testovací funkce řetězců
// *****************************

function chk_povol_znaky(co,upozorni)
{
// co=string
// upozorni= boolean
//otestuje znaky na zakázané
// vrací true - když je řetězec ok
//       false - pokud našel zakázaný znak
//
// pokud upozorni=true, tak vyvolá hlášku varovnou hlášku
//zakázané znaky definovány na začátku skriptu
var s,a,x;
	
	s=co+"";
	x=s.length;
	for(a=0;a<x;a++){
		if (p_z.indexOf(s.charAt(a))>-1){
			if (upozorni=true){alert("Výskyt zakázaných znaků :\n"+p_z)};
			return false;
		};
	};
	return true;
}

function chk_numb(x)
{
// chk_numb_x = prvek THML s vlastností value
// vrací 0 když vše ok
// bere i zápornou hodnotu
// chk_numb_x musí být textové pole, nebo podobné s valstností value
var z;
	z=/^\-?\d*(\,|\.)?(\d*)?$/;
	if(!z.test(x.value)){return 1};
	return 0;
}

function IsCas(x)
{
//vrací true pokud je "x" čas formátu 0:0:0 bez mezer
var z;
	z=/^([01]?\d|[2][0-3])\:[0-5]?\d\:[0-5]?\d$/;
	if(!z.test(x)){return false};
	return true;
};

function IsDatumCas(x)
{
//test jestli "x" je datum a čas, je striktní na mezery, mezera může být pouze mez datem a časem 
// formát "d.M.YYYY h:m:s" nebo "dd.MM.yyyy hh:mm:ss" mezera jen jedna
// formát "d.M.YY h:m:s" nebo "dd.MM.yy hh:mm:ss" mezera jen jedna
	x=String(x);
	if(x.length<1){return false};
var z=/^((\d?\d)\.){2}((\d){4}|(\d){2}) (\d?\d\:){2}\d?\d$/;
	if(!z.test(x)){return false};
	x=x.split(" ");
	if (x.length!=2){return false};
	if (IsDatum(x[0])==false){return false};	
	if (IsCas(x[1])==false){return false};	
	
	return true;
}

function IsInteger(x){
// test na integer, celé číslo
// na začátku čísla nebo mezi mínusem a číslem nezmí být nuly
	x=String(x);
	if(x.length<1){return false};
var z=/^\-?[1-9]\d*$/;
	return z.test(x);
}

function IsTelNum(x)
{
//vrací true pokud je tel číslo nebo řetězec "neposkytl", "neposkytla"
//bere +xxx xxx x x x x x x kde mezery nejsou povinné
//bere xxx x x x x x x kde mezery nejsou povinné
// před řetězcem může být mezera
// za řetězcem může být nezera
	x=String(x);
	if(x.length<1){return false};
	return IsTelNums_fn(x,true,true);
}
function IsTelNums_fn(x,nps,vic)
{
// pokud nps=true tak přijme jako tel číslo taky "neposkytl", "neposkytla" ale jen pokud je zadáno jen jedno, jinak jej nepřijme
// může být více tel čísel oddělených středníkem
// pokud vic=false tak přijme jen jedno číslo
// typ čísel jako fn výše
var a,z,s,ch;
	x=String(x);
	if(x.length<1){return false};
	x=x.split(';');
	if (!vic && (x.length>1)){return false};
	if (nps && (x.length=1)){
		z=/^ ?((\+?(\d){3})?(\d){3} ?((\d){1} ?){6}|[Nn]eposkytla?) ?$/;
	}else{
		z=/^ ?(\+?(\d){3})?(\d){3} ?((\d){1} ?){6} ?$/;
	}
	for (a=0;a<x.length; a++){
		if (!z.test(x[a])){return false};
	}
	return true;
}
// *****************************
// **** konec testovacích funkcí řetězců
// *****************************



// *****************************
// Převody řetězců na číslo a obráceně
// *****************************
function add_to_numdatetime(dttm,co,kolik)
{
// přidá zvolenou hodnotu k datumu, datum musí být ve tvaru čísla
// dttm = datum ve tvaru čísla
// co =	"se"-sekundy
//	  = "mi"=minuty
//    = "ho"=hodiny
//    = "d"=dny
//    = "m"=měsíce
//	  = "y"=roky
// co není case
// kolik záporná, nebo kladná hodnota

	if(IsNumber(kolik)==false){return 0};
	if(kolik!=Math.floor(kolik)){return 0};
	kolik=Math.floor(kolik);
	if(IsNumber(dttm)==false){return 0};

var a,b;
var h=1/24;
var m=h/60;
var s=m/60;
var dt=Math.floor(dttm);//jen datum
var tm=dttm-dt;//čas
var dt_t;//pro testování data
	dt=num_to_date(dt);
	dt=dt.split(".");
	dt[0]=Math.floor(dt[0]);
	dt[1]=Math.floor(dt[1])-1;
	dt[2]=Math.floor(dt[2]);
	
	co=String(co);
	co=co.toLowerCase();
	switch (co){
		case "se" :
			dttm+=(kolik*s);
			break;
		case "mi" :
			dttm+=(kolik*m);
			break;
		case "ho" :
			dttm+=(kolik*h);
			break;
		case "d" :
			dttm+=kolik;
			break;
		case "m" :
			kolik+=Math.floor(dt[1]);// = přičti aktuální měsíce
			a=Math.floor(kolik/12);	//a = kolik roků přičíst
			b=kolik-a*12;			//b = kolik měsíců přičíst na další rok
			kolik=a;				// kolik = kolik roků přičíst
			dt[1]=String(b);
		case "y" :
		//přidat kontrolu, jestli  není datum vyšší než je povoleno v roku
			dt[1]=Math.floor(dt[1])+1;
			dt[2]=Math.floor(dt[2])+kolik;
			dt_t=lns_month[dt[1]-1];//získej max datum v měsíci
			if(Math.floor(dt[2]/4)==(dt[2]/4) && dt[1]==2){//oprav datum u druhého měcíce, pokud je přestupný rok
				dt_t += 1;
			}
			if(dt[0]>dt_t){//pokud je den větší jak povolený tak uprav
				dt[0]=dt[0]-dt_t;
				dt[1] += 1;
				if(dt[1]>12){//pokud  je měcíc vyšší jak 12, tak uprav
					dt[1]=dt[1]-12;
					dt[2] += 1;
				}
			}
			dttm=date_to_num(dt[0]+"."+dt[1]+"."+dt[2])+tm;
			break;
	}
	return dttm;
}

function date_to_num(x)
{
//převede datum na číslo

var a,b,y,m,d,c
	if (IsDatum(x)==false){return 0};
	
	x=x.split(".");
	a=x[2]-1900;
	m=x[1]-1;
	d=x[0]-1;
	
	b=Math.floor(a/4);
	c=a*365+b;

	b=0;
	for(a=0;a<m;a++){
		b+=lns_month[a];
	};
	b+=d;
	
	return (b+c);
}

function num_to_date(x)
{
//převede číslo na datum

var a,y
	if(IsNumber(x)==false){return ""};

	a=Math.floor(x/1461);//1461= 4*365+1
	x-=a*1461;
	y=a*4;
	
	a=Math.floor(x/365);
	y+=a+1900;
	x-=a*365;
	//y=rok
	//x=zbytek
	
	a=0;
	while(x>=lns_month[a]){
		x-=lns_month[a];
		a++;
	};
	
	return ((x+1)+"."+(a+1)+"."+y);	
}

function time_to_num(x)
{
if (IsCas(x)==false){return 0};

var h=1/24;
var m=h/60;
var s=m/60;
var	a;

	x=x.split(":");

	a=h*x[0];
	a+=m*x[1];
	a+=s*x[2];
	return (a);	
}

function num_to_time(x)
{
var a=24*60*60;
var h,m;
	if(IsNumber(x)==false){return ""};

	if ((x>=1)||(x<=0)){return 0};
	x=Math.round(x*a);
	
	h=Math.floor(x/3600);
	x-=h*3600;
		
	m=Math.floor(x/60);
	x-=m*60;
		
	return (h+":"+m+":"+x);
}

function datetime_to_num(x)
{
var a;
	if(IsDatumCas(x)==false){return 0};
	
	x=x.split(" ");
	
	a=date_to_num(x[0]);
	a+=time_to_num(x[1]);
	
	return a;
}

function num_to_datetime(x)
{
var a;
	if(IsNumber(x)==false){return ""};
	a=Math.floor(x);
	x-=a;
	
	return (num_to_date(a)+" "+num_to_time(x));
}

// *****************************
// Konec převodů řetězců na číslo a obráceně
// *****************************


function zaokrouhli(x,zaokr,poz){
// x=číslo k zaokrouhlení
// zaokr=na jaké číslo se má zaokroulit
// poz=kolik dec.míst

//př.: zaokrouhlování na 0,05 se zadá zaokr=5 a poz=2
var b,c
	b=Math.pow(10,poz);//získej čím se má násobit
	c=zaokr/b/2;// číslo pro korekci zaokrouhlení
	x=x+c;//přičti korekci
	c=Math.floor(x*b/zaokr);//zaokrouhli
	x=c*zaokr/b;// vstup je saokrouhlen na požadovanou hodnotu
	return x;
}

function zaokrouhli_penezne(x,zaokr,poz){
// x=číslo k zaokrouhlení
// zaokr=na jaké číslo se má zaokroulit
// poz=kolik dec.míst
// pěněžní zaokrouhlení se provádí na nejbližší větší
// např. na celé čísla
// 0.5=1 ; 0.2=1 ; 1.1=2 ; 1=1; 0=0

//př.: zaokrouhlování na 0,05 se zadá zaokr=5 a poz=2
var b,e,c
	b=Math.pow(10,poz);//získej čím se má násobit
	e=x*b/zaokr;
	c=Math.floor(e);//zaokrouhli
	if(c!=e){c+=1}
	x=c*zaokr/b;// vstup je saokrouhlen na požadovanou hodnotu
	return x;
}

function set_fn_frm_cn(zaokr,poz,musi,des_c,tis,nazev){
	fn_frm_zaokr=zaokr;
	fn_frm_poz=poz;
	fn_frm_musi=musi;
	fn_frm_des_c=des_c;
	fn_frm_tis=tis;
	fn_frm_nazev=nazev;
	return true;
}
function fn_frm_cn(vstup){
// před prvním použitím musí být použito funkce "set_fn_frm_cn"
//pokud není nastaveno v definičním souboru jako globální nastavení
var s;
	s=format_ceny(vstup,fn_frm_zaokr,fn_frm_poz,fn_frm_musi,fn_frm_des_c,fn_frm_tis);
	if(String(fn_frm_nazev).length>0){
		s += " "+fn_frm_nazev;
	}
	return (format_ceny(vstup,fn_frm_zaokr,fn_frm_poz,fn_frm_musi,fn_frm_des_c,fn_frm_tis)+" "+fn_frm_nazev);
}
function format_ceny(vstup,zaokr,poz,musi,des_c,tis)
{
// vstup=string, nebo číslo
// zaokr=na jaké číslo se má zaokrouhlit, zadává se jen číslo
// poz=pozice desetinného čísla
// musi= pokud=true desetinná místa musí být na délku(=poz) čísla za des.tečkou
// des_c=znak desetinné čárky
// tis=znak pro oddělení tisíců

// př.:
// 0.1 = "poz=1 a zaokr=1" 0.01= "poz=2 a zaokr=1"
// zaokrouhlení na padesátníky je "poz=1 a zaokr=5"
// taokrouklení na 2 centy je "poz=2 a zaokr=2"
// pokud vstup=0.5, poz=2, zaokr=1 a musi=true, tak výsledek bude 0.50, pokud by bylo musi=false tak vysledek bude 0.5

//funkce upraví číslo do tvaru ceny tzn. že před desetinou čárkou odděluje tisíce a za des.čárkou se řídí pravidly viz.výše

var a,b,c,d,s,x,o,v;

	vstup=String(vstup);
	if(tis=="_"){tis=" "};
	if (vstup.length==0){return ""};
	
	vstup=vstup.replace(/,/,".");
	x=vstup*1;
	a=zaokrouhli_penezne(x,zaokr,poz);
	vstup=String(x)
	
	a=vstup.indexOf(".");
	if (a>-1){
		vstup=vstup.substring(0,a)+","+vstup.substring(a+1,vstup.length);
		b=vstup.substring(0,a);
		c=vstup.substring(a+1,vstup.length);
	}else{
		b=vstup;
		c="";
	};
	// b=hlavní
	// c=za des.čárkou
	s="";
	x=0;
	for (d=(b.length-1);d>-1;d--){
		v=x/3;
		o=Math.ceil(v);
		if ((x>0)&&(o==v)){s=tis+s};
		s=b.charAt(d)+s;
		x+=1;
	};
	// s=hlavní číslo
	if(a>-1){
		if(musi){
			c+="00000000";
			s+=des_c+c.substring(0,poz);// pokud není celé číslo doplň na délku pokud musi
		}else{
			s+=des_c+c.substring(0,poz);// pokud ne tak jen zbytek
		};
	}else{
		if(musi){
			s+=des_c+"-"; // pokud je celé číslo, tak doplň ,-
		};
	};
	return s;	
}

//původní řádek z asp
//na_kc=format_ceny(nk_cena,s_mena("zaok"),s_mena("poz"),true,s_mena("des_carka"),s_mena("tisice"))&" "&s_mena("mena")

function opr_cena(vstup)
{
//opraví cenu na cenu v Kč
	return (format_ceny(vstup,s_mena_zaok,s_mena_poz,true,s_mena_des_carka,s_mena_tisice)+" "+s_mena_mena);
}
// *******************
// tolik funkce s cenami
// *******************
// funkce konverze
// *******************
function byte_to_text(co,zaok){
// opraví "co" číslo na kB,MB,GB a zaokrouhlí na "zaok"
var x,a
var conv_byte_tx = ["","kB","MB","GB","TB"];
	x=0
	while ((co>1024)&&(x<4)){
		co=co/1024;
		x=x+1;
	}
	co=zaokrouhli(co,1,2);
	co=String(co);
	co=co.replace(/\./,",");
	return (co+" "+conv_byte_tx[x]);
}

function text_to_hex(t)
{
  var hex_tab = "0123456789abcdef";
  var str = "";
  t=escape(String(t));
  for(var i = 0; i < t.length; i++)
  {
	str +=	hex_tab.charAt( t.charCodeAt(i) >>> 4 )+
			hex_tab.charAt( t.charCodeAt(i) & 15 );
  }
  return str;
}
function hex_to_text(t){
	var a,b,c,l,h,s;
	var nula="0".charCodeAt(0);
	var acko="a".charCodeAt(0)-"9".charCodeAt(0)-1;
	
	s="";
	t=String(t).toLowerCase();
	for (a = 0; a < (t.length >> 1); a++){
		h=t.charCodeAt(a<<1)- nula;
		l=t.charCodeAt((a<<1) + 1) - nula;
		if (h>9){h -= acko}
		if (l>9){l -= acko}
		s+=String.fromCharCode((h<<4)+l)
	}
	return unescape(s);
//	return s;
}
function code_text(t){
//zakóduje text
//nahradí nebezpečné znaky pro texty, nebo url
var s,a;
	t=String(t);
	s="";
	for (a=0; a<t.length; a++){
		switch(t.charAt(a)){
			case "~" :
				s += "~\x00";
				break;
			case "'" :
				s += "~°";
				break;
			case "\"" :
				s += "~~";
				break;
			case "?" :
				s += "~0";
				break;
			case "&" :
				s += "~1";
				break;
			default :
				s += t.charAt(a);
		}
	}
	return s;
}
function decode_text(t){
var s,a,x;
	t=String(t);
	a=0;
	s="";
	while (a<t.length){
		if (t.charAt(a)=="~"){
			a += 1;
			switch(t.charAt(a)){
				case "~" :
					s += "\"";
					break;
				case "°" :
					s += "'" ;
					break;
				case "\x00" :
					s += "~";
					break;
				case "0" :
					s += "?" ;
					break;
				case "1" :
					s += "&" ;
					break;
				default :
					s += t.charAt(a);
			}
		}else{
			s += t.charAt(a);
		}
		a += 1;
	};

	return s;
	//s=String(t);	
	//s=s.replace(/\~\~+/,"\"");
	//s=s.replace(/\~\°+/,"'");
	//s=s.replace(/\~\x00+/,"~");
}
function encode_xor_text(s_txt,s_heslo){
// zakóduje/dekóduje text v "s_txt" heslem "s_heslo"
// kódování
//		1)zakóduje heslem
//		2)převede na HEX řetězec
//		3)přidá označení z "ch_e"
//		!! kóduje se jen spodními 4mi bity
var a,s,ln_h,ln_t,cn_h,sx,deco,ch_e;
	ch_e=encode_char;
	s_txt=String(s_txt);
	s_heslo=String(s_heslo);
	ln_t=s_txt.length;
	ln_h=s_heslo.length;
	if ((ln_t<1)||(ln_h<1)){return ""};
	deco= (s_txt.charAt(0)==ch_e) ? true : false;
	if (deco){
		s_txt=s_txt.substring(1,ln_t);
		if(ln_t<1){return ""};
		s_txt=hex_to_text(s_txt);
		ln_t=s_txt.length;
	}
	cn_h=0;
	s="";
	if(s_heslo.length>0){
		for (a=0; a<ln_t ;a++){
			sx=(s_txt.charCodeAt(a) & 240 )+((s_txt.charCodeAt(a) ^ s_heslo.charCodeAt(cn_h)) & 15);
			s += String.fromCharCode(sx);
			cn_h += 1;
			if(cn_h >= ln_h){ln_h=0};
		}
	}else{s=sx};
	if (!deco){
		s=ch_e+text_to_hex(s);
	}
	return s;
}
function encode_search_num(num,hes){
var x,s,deco,ch_e,a,b;
var hex_tab = "0123456789ABCDEF";
var nula="0".charCodeAt(0);
var acko="A".charCodeAt(0)-"9".charCodeAt(0)-1;
	ch_e=encode_char;
	x=String(num);
	hes=String(hes);
	deco = (x.charAt(0)==ch_e) ? true : false;
	if ((!IsNumber(num)) && (!deco)){return ""};
	s="";
	if (deco){
		//dekóduj
		num = String(num);
		num = encode_xor_text(num,hes);
		num = num.toUpperCase();
		s=0;
		for (x=0 ; x<num.length ; x++){
			s=s * 16;
			a=num.charCodeAt(x)- nula;
			if (a>9){a -= acko};
			s += a;
		}
	}else{
		//kóduj
		num = Math.round(num);
		while(num!=0){
			s = hex_tab.charAt(num & 15)+s;
			num >>>= 4;
		};
		s=encode_xor_text(s,hes);
	}
	return(s);
}


//**********************************
//**********************************
// EOF formuláře
function test_formulare(formular,prefix){
//testuje hotnoty v polích formuláře které začínají prefixem např."val_"
//následující prefixy
//	"txt_" = musí být text - "txtn_" = nemusí být text
//	"int_" = musí být integer - "intn_" = nemusí být
//	"inp_" = musí být kladné celé - "inpn_" - nemusí
//	"dbl_"= musí být číslo - "dbln_" - nemusí být
//	"dbp_"= musí být kladné číslo - "dbpn" - nemusí být 
//	"dt_"=musí být datum - "dtn_" = nemusí
//	"tm_"=musí být čas - "tmn_"= nemusí
//	"sel_"= hodnota nesmí obsahovat "-" za tímto prefixem následuje některý z předchozích prefixů kvůli identifikaci hodnoty pro VB
var a,b,rgx,nm,hodn,zpr;

	for (a=0; a<formular.length; a++){
		hodn=String(formular[a].value);
		nm=String(formular[a].name).toLowerCase();
		b=true;
		rgx=RegExp("^"+prefix);
		zpr="";
		if(rgx.test(nm)){
			nm=nm.replace(rgx,"");
			if (/^txtn?_/.test(nm)){
				if((/^txt_/.test(nm))&&(hodn.length<1)){
					zpr="Musí být vyplněno !!!";
					b=false;
				}
			}
			if((/^intn?_/.test(nm))&& b){
				if((/^int_/.test(nm))||(hodn.length>0)){
					if(!/^-?[1-9]\d*$/.test(hodn)){
						zpr="Musí být vyplněno celým číslem !!";
						b=false;
					}
				}
			}
			if((/^inpn?_/.test(nm))&& b){
				if((/^inp_/.test(nm))||(hodn.length>0)){
					if(!/^[1-9]\d*$/.test(hodn)){
						zpr="Musí být vyplněno kladným celým číslem !!";
						b=false;
					}
				}
			}
			if((/^dbln?_/.test(nm))&& b){
				if((/^dbl_/.test(nm))||(hodn.length>0)){
					if(!/^-?[1-9]\d*([,.]\d{0,3})?$/.test(hodn)){
						zpr="Musí být vyplněno číslem max.3 des čísla !!!";
						b=false;
					}
				}
			}
			if((/^dbpn?_/.test(nm))&& b){
				if((/^dbp_/.test(nm))||(hodn.length>0)){
					if(!/^[1-9]\d*([,.]\d{0,3})?$/.test(hodn)){
						zpr="Musí být vyplněno kladným číslem max.3 des čísla !!!";
						b=false;
					}
				}
			}
			if((/^dtn?_/.test(nm))&& b){
				if((/^dt_/.test(nm))||(hodn.length>0)){
					if(!IsDatum(hodn)){
						zpr="Musí být vyplněno datumeme ve zprávném formátu !!!";
						b=false;
					}
				}
			}
			if((/^tmn?_/.test(nm))&& b){
				if((/^tm_/.test(nm))||(hodn.length>0)){
					if(!IsCas(hodn)){
						zpr="Musí být vyplněno datumeme ve zprávném formátu !!!";
						b=false;
					}
				}
			}
			if((/^sel_/.test(nm))&& b){
				if(hodn == "-"){
						zpr="Musí být něco vybráno !!!";
						b=false;
				}
			}

		}
		if(b){
			formular[a].style.backgroundColor="";
			formular[a].style.color="";
		}else{
			formular[a].style.backgroundColor="red";
			formular[a].style.color="white";
			formular[a].focus();
			alert(zpr);
			return false;
		}	
	}
return true;	
}
function test_formulare_by_array(){
/*	testuje rormuláře polem podle pole s definicí které se musí jmenovat "FrmTestArr"
	kde v jednom záznamu pole jsou hodnoty
	FrmTestArr[x][0]=název/y pole/í, které se skládá z názvu formuláře plus znak "/" a názvu pole, názvy se myslí atributy "name" ne "id"
	   těchto jmen může být víc, ale musí být odděleny čárkou bez mezer
	FrmTestArr[x][1]=reexpr hodnota pro povolené znaky pole
	FrmTestArr[x][2]=reexpr hodnota pro konečnou validaci, pokud je zadán řetězec, tak je vyhodnocen jako funkce
	    kde funkce musí vracet true nebo flase a na vstupu je volána s retězcem, který má být kontrolován v proměnné "s_val"
		tzn.př.: "IsNumber(s_val)"
	
	FrmTestArr[x][3]=když <> '' tak chybová správa
	
 př. pole:
	FrmTestArr.push([  'nazev_formulare/nazev_pole' ,   /[0-9a-f]/gi ,   /^[0-9a-f]+$/i ,   'Zadej hex číslo, tj. 0-9 a-f, pole nesmí být prázdné.'   ]);
	pokud povolené znaky mají i počet, tak smaozřejmě funguje  tzn.př.:    /^[0-9a-f]{1,16}$/gi = povolené znaky 0-9 a-f tzn.hex znaky z délkou 1-16 znaků
	
	tento objekt má podobjek "errObj" kde  	"errObj.err" obsahuje text chyby např pro alert hlášení
								"errObj.errHML" obsahuje HTML text chyby např pro <DIV>
								"errObj.count" obsahuje počet chyb
								"errObj.HTMLelement" je null, pokud do něj nastaváme element, např DIV, tak nude automaticky nastavován jeho obsah na chybu
								
								
	
*/
	this.init = function(){
		var a,b,pl;
		if(typeof(FrmTestArr)=="undefined") return;
		
		for(a=0; a<FrmTestArr.length; a++){
			pl=String(FrmTestArr[a][0]).split(/,/);//udělěj pole formulářových prvků, které jsou odděleny čárkou
			for(b=0;b<pl.length;b++){
				this.prep(FrmTestArr[a],pl[b]);
			}
		}
	}
	this.prep = function (x,hledany){
	var frm,el,s;
		s=String(hledany).split(/\//);
		if(s.length!=2) return;
		frm=document.forms[String(s[0])];
		if(frm==null) return;
		el=frm[s[1]];
		x[4]=null;
		if(el==null)return;
		Event.observe(el,'blur', function(event){
			TestFrmFn.blur(this);
		});
		Event.observe(el,'keypress', function(event){
			if (!TestFrmFn.stisk(event,this)){
				Event.stop(event);
			};
		});
	};
	this.najdi_el = function(el){
		//najde element formuláře v poli FrmTestArr
		var frm,s,a,p;
		frm=el.form;
		s=String('/'+frm.name+'\\/'+el.name+'/i');
		s=eval(s);
//		s=String(frm.name+'/'+el.name).toLowerCase();
		for(a=0;a<FrmTestArr.length;a++){
			p=FrmTestArr[a];
//			if(s==String(p[0]).toLowerCase()){
			if(s.test(String(p[0]))){
				return p;
			}
		}
		return null;
	};
	
	this.errObj={};
	
	this.errObj.HTMLelement=null;
	this.errObj.err='';
	this.errObj.count=0;
	this.errObj.errHTML='';
	this.errObj.add=function(x){
			this.HTMLelement=$(this.HTMLelement);
			this.errHTML += x + '<br>';
			this.err += x + '\n';
			this.count += 1;
			if(this.HTMLelement!=null)this.HTMLelement.innerHTML=this.errHTML;
	}
	this.errObj.clear=function(){
			this.HTMLelement=$(this.HTMLelement);
			this.err='';
			this.errHTML='';
			this.count=0
			if(this.HTMLelement!=null)this.HTMLelement.innerHTML='';
	};
	
	this.TestP=function(p,s_val){
	//s_val=hodnota pole
	//p=podpole z hlavního pole
		var x;
				if(typeof(p[2])=="string"){
					x=p[2];
					x='x='+x;
					try{
						eval(x);
						if(!x) {
							//ok=msg;
							if(p[3]!='') this.errObj.add(p[3]);
							return false;
						}
					}catch(er){
						return false;
					}
				}else{
					x=p[2].test(s_val);
					if(!x) {
						//ok=msg;
						if(p[3]!='') this.errObj.add(p[3]);
						return false;
					}
				}
		return true;
	};
	
	
	this.validateMsg = function(frm){
	//otestuje validitu formuláře v "frm", nepodává hlášení o chybě, ale jen označí chybně vyplněná pole
	//v this.err_cn vrací počet chyb po ukončení funkce
	//v this.err_tx vrací texty chyb HTML formátované
		var a,p,x,ok,s_val,er;
		var msg='Formulář není zprávně vyplněn, nebude odeslán, dokud jej neopravíš !';
		this.errObj.clear();
		if(typeof(frm)=='string')
			frm=document.forms[frm];
		if(typeof(frm)!='object')
			return 'Chyba validace formuláře - formulář nenalezen.';
		ok='';
		for(a=0;a<frm.length;a++){
			p=TestFrmFn.najdi_el(frm[a]);
			
			if(p!=null){
				x=this.TestP(p,$F(frm[a]));
				TestFrmFn.upozorni(frm[a],x,p,false);
				if(!x) {
					ok=msg;
				}
			}
		}
		return ok;
	}
	this.validate = function(frm,msg){
	//otestuje validitu formuláře v "frm", kde "msg je tru, pokud chceme podat právu u každého chybného pole"
	var s,s2;
	var ok=true;
		if(typeof(msg)=='undefined') msg=false;
		s=TestFrmFn.validateMsg(frm);
		if(s!=''){
			ok=false;
			s2="Nalezeno chyb ve formuláři : "+this.errObj.count;
			if(msg)
				alert(s+"\n"+s2);
			this.errObj.add(s)
			this.errObj.add(s2)
		}
		return ok;
	}
	
	this.upo_pl = [];
	this.upozorni = function (el,x,p,z){
		//jestli je "z" true, tak bude zobrazena hláška u daného elementu
		var nm,px;
		nm='x_'+el.form.name+'/'+el.name;
		//return;
		px=this.upo_pl[nm];
		if(px==null){
			this.upo_pl[nm]=[];
			px=this.upo_pl[nm];
		}
		if(typeof(z)=='undefined') z=false;
		if(!x){
			if(px.length==0){
				//p[nm]=[];
				px[0]=el.style.color;
				px[1]=el.style.backgroundColor;
				px[2]=el.style.fontWeight;
			}
			el.style.color='white';
			el.style.backgroundColor='red';
			el.style.fontWeight='bold';
			if(z){
				if(p[3]!=''){
					if(this.errObj.HTMLelement==null){
						alert(p[3]);
					}else{
						this.errObj.HTMLelement.innerHTML=p[3];
					}
				}
				el.focus();			
//			}else{
			}
		}else{
			if(px.length!=0){
				el.style.color=px[0];
				el.style.backgroundColor=px[1];
				el.style.fontWeight=px[2];
				px=[];
			}
		}
	}
	this.blur = function (el){
		// test validity před blur
		this.errObj.clear();
		var p,x;
		p=TestFrmFn.najdi_el(el);
		if(p==null) return true; // vyskoč jako vše ok, pokd nebylo nalezeno v poli, jinak by nebyla okce blur provedena
		
		//x=p[2].test($F(el));
		
		x=true;
		if(p!=null) x=this.TestP(p,$F(el));
		
		TestFrmFn.upozorni(el,x,p,true);
		//return x;
		return true;
	};
	this.stisk = function (e,el){
		//test povolených znaků
		var p,x,kod,znak;

		if(window.event){ // IE
			kod = e.keyCode;
		}else if(e.which){ // Netscape/Firefox/Opera
			kod = e.which;
		}
		if (kod<32 || kod==null){return true};
		znak = String.fromCharCode(kod);


		p=TestFrmFn.najdi_el(el);
		if(p==null) return true; // vyskoč jako vše ok, pokd nebylo nalezeno v poli, jinak by nebyla okce stisk provedena
		
//		x=p[1].test($F(el));
		x=p[1].test(znak);
		TestFrmFn.upozorni(el,x,p);
		return x;
	};
}
var TestFrmFn = new test_formulare_by_array;
//inicializace na konci dokumentu

// EOF formuláře
// *******************
// *******************
// BOW prototype window
function protowin_self_close(z,opr){
// pokud "z"=true tak parent okno reloadne
var e;
  try{
	if(typeof(opr)=="undefined")opr=-1;
	if(z){
		if(opr!=-1){
			window.parent.location="zobraz.asp?plznitel=0&nmb="+opr;
		}else{
			window.parent.location.reload();
		}
	}
	window.parent.Windows.closeAll();
  }catch(e){}
}
//EOF prototype window
// ****************************
// ****************************
//BOF tabulky
function tables_aktivuj_obarvi_onmouseover(){
	//aktivuje obarvení tabulek při přejezdu myši na "sel_lr" z css
	// aktivuje jen u tabulek obsahující v "class" "tblsellr"
	// a ignoruje vše co je za tblsellr
	//př. class="xxx tblsellr yyy oooo" jako základ buňky
	//  při přejezdu myší umaže vše za tblsellr a přidá sel_lr tzn výsledek bude jen "xxx tblsellr sel_lr"
	var x,i,el,s;
		x=$$('.tblsellr');
		for(i=0;i<x.length;i++){
			//zjisti jestli existuje v bubble_info a inicializuj
			el=x[i];
			Event.observe(el,'mouseout', function(event){
				this.className=this.old_class_name;
			});
			Event.observe(el,'mouseover', function(event){
				s=String(this.className);
				s=s.replace(/tblsellr.*$/gi,'');
				s += ' sel_lr';
				this.old_class_name=this.className;
				this.className=s;
			});			
		}
}
//inicializace na konci dokumentu
//EOF tabulky





//********************************************************************************************
//konec dokumentu - inicializace různých funkcí po onload dokumentu
if(typeof(document)!="undefined"){
	//test jestli existuje dokument - při zpracování v ASP na straně serveru dokument neexistuje a vyhazovalo by to chybu
	if(typeof(document.observe)=='function')
		//test načtení prototype
		Event.observe(window,'load',function(){
			TestFrmFn.init();
			tables_aktivuj_obarvi_onmouseover();
		});
}

