/**
* Inicializace stranky v backendu (volano v HtmlPageClass)
* - provede focusFirstField,
* - v pripade BrowseFormu provede roztahnuti modulemenu podle sirky formu (musi byt javascriptove, nejde pres css)
*/
function appWindowLoad() {
	focusFirstField();
	// window.setTimeout("focusFirstField();",100); // pro jistotu jeste jednou po 100ms, kdyby neco formulari vzalo focus (iframe)
	// pouze browseform - roztahnuti modulemenu podle sirky formu, pokud je vetsi (100% nestaci)
	var mmenu = document.getElementById('mmenu');
	var mmenuappend = document.getElementById('mmenu-append');
	var browseform = document.getElementById('browseform');
	if(mmenu && mmenuappend && browseform) {
		if(mmenu.offsetWidth < browseform.offsetWidth) {
			mmenu.style.width = browseform.offsetWidth+'px';
			mmenuappend.style.width = (browseform.offsetWidth+16)+'px';
		}
	}
}

/**
* Automaticky zvetsi okno podle velikosti obsahu. pouze IE
*/
function autoResizeWindow(win,minWidth,minHeight) {
	if(win.document.readyState=='loading') win.setTimeout("autoResizeWindow(window)",200,minWidth,minHeight);
	else if(win.document.documentElement.clientWidth<win.document.documentElement.scrollWidth || win.document.documentElement.clientHeight<win.document.documentElement.scrollHeight) {
		setWidth = win.document.body.offsetWidth+35;
		setHeight = win.document.body.offsetHeight+60;
		if(minWidth && setWidth<minWidth) setWidth = minWidth;
		if(minHeight && setWidth<minHeight) setHeight = minHeight;
		win.resizeTo(setWidth,setHeight);
	}
}

/**
* Da focus prvnimu textovemu poli na strance. pozor na pripady, kdy je vic frames - focus se udela na posledni z nich!
* v takovem pripade dat nejakemu prvku tabindex="-1" - stejne tak pokud chceme aby se focus provadel pro na jine nez prvni pole
*/
function focusFirstField() {
	// nejdriv zkusime nalezt prvek s atributem focusfirstfield="1"
	var j = $('input:text:[focusfirstfield=1]');
	if(j.size()>0) j.focus();
	else {
		// jinak prvni input=text
		$('input:text:first').focus();
	}
}

/**
* Nastavi hidden field "action"
* pozn. pro pripad, kdy je na strance prvku "action" vic (subformy), nastavi se akce vsechny
* v takovem pripade by se v POSTU uplatnilo jen posledni definovane pole "action"
*/
function setAction(newaction) {
	var arrAction = document.getElementsByName("action");
	var actionsset = 0;
	for (i = 0; i<arrAction.length; i++){
		if (arrAction[i].name == 'action' && arrAction[i].type=='hidden'){
			arrAction[i].value = newaction;
			actionsset++;
		}
	}
	if(actionsset==0) {
		alert('Cannot set action');
		return false;
	} else return true;
}

/**
* Zruseni nastavenou action
*/
function unsetAction(){
	var obj = document.getElementById('action');
	if(obj==null) {
		alert('Cannot unset action');
		return false;
	} else {
		obj.value='';
		return true;
	}
}

// ********************
// Obecne funkce
// ********************

/**
* orizne text..
*/
function trim(str) {

   return str.replace(/^\s*|\s*$/g,"");
}

/**
* vrati true/false podle toho, jestli je promenna s danym jmenem definovana
*/
function isdefined(variablename) {
    return (typeof(window[variablename]) == "undefined")?  false: true;
}

/**
* ignoruje stisk klavesy enter. typicke volani jako form onkeypress="return noEnter(event);"
*/
function noEnter(e) {
	return !(e && e.keyCode == 13);
}

/**
* vrati retezec zopakovany n krat
*/
function multiplyString(n,string) {
	returnstring="";
	for(i=0;i<n;i++)
		returnstring=returnstring+string;
	return returnstring;
}

/**
* prevod barvy z hexa formatu na format 'rgb(cislo,cislo,cislo)
*/
function toRgb(color){
	var r,g,b,tmp,i
	r = (((color.charCodeAt(1) - '0') <= 9)?(color.charCodeAt(1) - '0')*16:(color.charCodeAt(1) - 'a'.charCodeAt(0) + 10)*16)+(((color.charCodeAt(2) - '0') <= 9)?(color.charCodeAt(2) - '0'):(color.charCodeAt(2) - 'a'.charCodeAt(0) + 10));
	g = (((color.charCodeAt(3) - '0') <= 9)?(color.charCodeAt(3) - '0')*16:(color.charCodeAt(3) - 'a'.charCodeAt(0) + 10)*16)+(((color.charCodeAt(4) - '0') <= 9)?(color.charCodeAt(4) - '0'):(color.charCodeAt(4) - 'a'.charCodeAt(0) + 10));
	b = (((color.charCodeAt(5) - '0') <= 9)?(color.charCodeAt(5) - '0')*16:(color.charCodeAt(5) - 'a'.charCodeAt(0) + 10)*16)+(((color.charCodeAt(6) - '0') <= 9)?(color.charCodeAt(6) - '0'):(color.charCodeAt(6) - 'a'.charCodeAt(0) + 10));
	return ("rgb("+r+", "+g+", "+b+")");
}

/**
* v novem okne otevre dump daneho objektu
*/
function debugobj(inobj) {
	op = window.open();
	op.document.open('text/plain');
	for (objprop in inobj) {
		op.document.write(objprop + ' => ' + inobj[objprop] + '\n');
	}
	op.document.close();
}

/**
* jako attachEvent pdo MSIE, funguje i pod FF
*/
function addEvent(obj, evType, fn) {
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, false);
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	}
}

/**
* vrati skutecnou left pozici prvku s id=elementid
* - vraci hodnotu, kterou lze nastavit css.left
*/
function getElementLeft(elementid){
	var obj=document.getElementById(elementid);
	return getElementLeftObj(obj);
}

function getElementLeftObj(obj) {
	var left=obj.offsetLeft;
	var parent=obj.offsetParent;
	var realParent = false;
	while(parent != null) {
		if (realParent) {
	        while (realParent != parent) {
	            left -= realParent.scrollLeft || 0;
	            realParent = realParent.parentNode;
	        }
        }
		left=left+parent.offsetLeft;
        left -= parent.scrollLeft || 0;
		realParent = parent.parentNode;
		parent=parent.offsetParent;
	}
	return left;
}

/**
* vrati skutecnou top pozici prvku s id=elementid
* - vraci hodnotu, kterou lze nastavit css.top
*/
function getElementTop(elementid){
	var obj=document.getElementById(elementid);
	return getElementTopObj(obj);
}

function getElementTopObj(obj) {
	var top=obj.offsetTop;
	var parent=obj.offsetParent;
	var realParent = false;
	while(parent != null) {
		if (realParent) {
	        while (realParent != parent) {
	            top -= realParent.scrollTop  || 0;
	            realParent = realParent.parentNode;
	        }
        }
		top=top+parent.offsetTop;
		top -= parent.scrollTop  || 0;
		realParent = parent.parentNode;
		parent=parent.offsetParent;
	}
	return top;
}

/**
* jako DOM metoda nextSibling, ale fungujici pod IE,FF
*/
function getNextSibling(startBrother) {
	endBrother=startBrother.nextSibling;
	while(endBrother.nodeType!=1){
		endBrother = endBrother.nextSibling;
	}
	return endBrother;
}

function getPreviousSibling(startBrother){
	endBrother=startBrother.previousSibling;
	while(endBrother.nodeType!=1){
		endBrother = endBrother.previousSibling;
	}
	return endBrother;
}

// ********************
// Funkce pro CtlField a fieldy obecne
// ********************

/**
* Pouzivano v CtlFieldu a potomcich pro view a browse (renderuje se jako div),
* pri nastaveni pevne sirky (reseno pres overflow-x, hodnota v prvku je, ale visualne se orizne)
* - pokud ma div mensi sirku nez je sirka obsahu (ctlfield->width), zobrazi pri mouseover tooltip s neoriznutym obsahem
*/
function textDivMouseOver(obj) {
	if(obj.clientWidth > 0 && obj.scrollWidth > obj.clientWidth || obj.clientHeight > 0 && obj.scrollHeight > obj.clientHeight) {
		if(obj.innerText) var text = new String(obj.innerText);
		else {
			var text = new String(obj.innerHTML);
			text = text.replace(/&nbsp;/g,' ');
			text = text.replace(/<BR>/g,' ');
			text = text.replace(/<br>/g,' ');
			text = text.replace(/<br \/>/g,' ');
		}
		obj.title = text;
	}
}

/**
* orizne text vkladany do prvku
*/
function trimOnPaste(obj) {
	event.returnValue = false;
	var newText = trim(window.clipboardData.getData('Text'));
	var targetObj = obj.document.selection.createRange();
	targetObj.text = newText;
}

// ********************
// Funkce pro BrowseTrTag
// ********************

function trClickOpen(obj,href,target,win_features,e) {
	if(target=='_blank' || e.ctrlKey || e.shiftKey) {
		window.open(href,'_blank',win_features);
	} else window.open(href,target,win_features);
}

// ********************
// Funkce pro RowCheckbox, CheckAllNone
// ********************

/**
* OnClick metoda pro RowCheckbox
* - pri zmene zavola rowCheckboxChange (aktualizace rowcheck hiddenfieldu)
* - obsahuje funkcionalitu pro oznaceni vic rowcheckboxu najednou:
*	prvni klik pro zacatek
*	pak klik se shiftem na konec - oznaci se vsechny rowcheckboxy mezi
*/
var lastRowCheckboxClick_prefix = null; // globalni promenna pro 'zacatek oznaceni' - prefix prvku
var lastRowCheckboxClick_id = null; // globalni promenna pro 'zacatek oznaceni' - id prvku
function rowCheckboxClick(obj,val,field_prefix,e) {
	// listfield_id = prislusne 'rowcheckvalues'
	if (e && e.shiftKey && lastRowCheckboxClick_id && lastRowCheckboxClick_prefix==field_prefix) {
		// *** A) Klik se shiftem = oznaceni vyberu mezi poslednim normalnim klikem a timto zakoncovacim
		// - oznaci vsechny checkboxy se stejnym prefixem,
		// ktere jsou v HTML mezi lastRowCheckboxClickID (zacatek vyberu) a obj.id (konec vyberu - se shiftem)
		e.cancelBubble = true;
		// nejdrive zavolame rowCheckboxChange pro 'zakoncovaci checkbox'
		rowCheckboxChange(obj.checked,val,field_prefix+'rowcheckvalues');
		var selFirstId = null;
		var selLastId = null;
		// nastavujeme na hodnotu pocatecne zaskrtnuteho checkboxu
		var setValue = document.getElementById(lastRowCheckboxClick_id).checked;
		// prochazime vsechny checkboxy se stejnym prefixem
		// hledame prvni ze dvou checkboxu - prvni muze byt lastRowCheckboxClickID i obj.id
		$("input[id^='"+field_prefix+"rowcheck_']").each(function (i) {
			if(selFirstId==null) {
				// stale hledame zacatek oznaceni
				if(this.id==lastRowCheckboxClick_id) selFirstId = this.id;
				else if(this.id==obj.id) selFirstId = obj.id;
			} else if(selLastId==null) {
				// zacatek uz mame, az do nalezeni konce oznacime. niz dve varianty, podle toho jestli je v HTML prvni lastRowCheckboxClickID nebo obj.id
				if((selFirstId==lastRowCheckboxClick_id && this.id==obj.id) || (selFirstId==obj.id && this.id==lastRowCheckboxClick_id)) {
					// jsme na konci oznaceni, dalsi uz preskocime
					selLastId = this.id;
				}
				if((selFirstId==lastRowCheckboxClick_id && this.id!=obj.id) || (selFirstId==obj.id && this.id!=lastRowCheckboxClick_id)) {
					// nejsme na konci ani na zacatku => provedeme oznaceni podle hodnoty prvku lastRowCheckboxClick_id
					// pro kazdy checkbox provedeme click() - provadime jen pokud uz neni nastaven na setValue
					// diky tomu se zavola pripadna dalsi event pripojena na onlclick
					if(this.checked != setValue) {
						// ulozime si lastRowCheckboxClick_id a po clicku obnovime
						var rememberID = lastRowCheckboxClick_id;
						// MSIE ma pri zavolani click() porad platne event.shiftKey - diky nastaveni
						// lastRowCheckboxClick_id na null spadne spolehlive do 'standardni spodni' vetve
						lastRowCheckboxClick_id = null; 
						this.click();
						lastRowCheckboxClick_id = rememberID;
					}
				}
			}
		});
	} else {
		// *** B) bez shiftu - normalni klik na rowcheckbox
		// ulozime id na ktere se kliklo, pouzije se pri naslednem kliku se shiftem
		lastRowCheckboxClick_prefix = field_prefix;
		lastRowCheckboxClick_id = obj.id;
		rowCheckboxChange(obj.checked,val,field_prefix+'rowcheckvalues');
	}
}

/**
* Rowcheckbox - aktualizuje listfield_id(rowcheckvalues) pri zaskrtnuti/odskrtnuti rowcheckboxu
* state = nove nastavena .checked hodnota predmetneho rowcheckboxu
* value = hodnota checkboxu. pozn. hodnota je u checkboxu jako parametr volani rowCheckboxClick, jinak jde zjistit jen jako soucast ID
*/
function rowCheckboxChange(state, val, listfield_id) {
	//univerzalnejsi metoda pro explicitni check v radku, neni treba volat primo na checkboxu
	var listfield = document.getElementById(listfield_id);
	if(!listfield) return true;
	var str = new String(','+listfield.value); // na zacatek se prida carka kvuli hledani
	if (str.length>1) str = str.concat(','); //Bugfix: i na konec
	var found = str.search(','+val+',');
	if((state==true) && (found == -1)) {
		//if(str.length>1) str = str.concat(','); // pokud nejde o prvni hodnotu, prida se carka
		str = str.concat(val+','); // za carku se prida hodnota
	}
	if((state==false) && (found != -1)) {
		str = str.replace(','+val+',',',');
	}
	if (str == ',') str = '';
	else
	str = str.substring(1,str.length-1); // carka pridana na zacatek (bugfix: i na konec) se odstrani
	listfield.value = str;
}

function rowCheckboxInit(checkbox_id, val, listfield_id) {
	//nastaveni checkboxu dle hidden fieldu v zahlavi
	var listfield = document.getElementById(listfield_id);
	var str = new String(','+listfield.value); // na zacatek se prida carka kvuli hledani
	if (str.length>1) str = str.concat(','); //Bugfix: i na konec
	var found = str.search(','+val+',');
	var obj = document.getElementById(checkbox_id);
	if(found == -1)
		obj.checked = false;
	else
		obj.checked = true;
}

/**
* CtlCheckAllNone je specielni kontrolka pro zaskrtnuti vsech checkboxu zacinajici na field_prefix
*/
function ctlCheckAllNoneClick(obj,field_prefix,evt) {
	// obj je objekt vlastniho CtlCheckAllNone checkboxu
	var e = (window.event) ? window.event : evt;
	$("input[id^='"+field_prefix+"']:checkbox").each(function (i) {
		// nastaveni checked
		if(this.checked != obj.checked) {
			this.checked = obj.checked;
			this.onclick();
 		}
	});
}

function getSelectedMultiple(selObjId, txtSelectedValuesObjId) {
	return getSelectedMultipleObj(document.getElementById(selObjId), document.getElementById(txtSelectedValuesObjId));
}
function getSelectedMultipleObj(selObj, txtSelectedValuesObj) {
	var selectedArray = new Array();
	var i;
	var count = 0;
	for (i=0; i<selObj.options.length; i++) {
		if (selObj.options[i].selected) {
			selectedArray[count] = selObj.options[i].value;
			count++;
		}
  	}
	txtSelectedValuesObj.value = selectedArray;
}

// ********************
// Funkce ovladacich prvku DateField, DateTimeField
// ********************

function DateFieldBlur(obj,dateFormat,currentDateString) {
	// Doplneni castecne napsaneho datumu
	if(dateFormat=='d.m.Y' || dateFormat=='d.m.Y H:i' || dateFormat=='d.m.Y H:i:s') {
		var withTime = false;
		if(dateFormat=='d.m.Y H:i:s') withTime = true;
		var str = new String(obj.value);
		var str2 = new String(currentDateString);
		var strDay = str2.slice(0,2);
		var strMonth = str2.slice(3,5);
		var strYear = str2.slice(6,10);
		var lastCharDot = 0;
		var numDots = 0;
		var i = 0;
		while(i!=-1 && numDots<20) {
			i = str.indexOf('.',i);
			if(i!=-1) {
				numDots++;
				i++;
			}
		}
		if(str.slice(-1)=='.') lastCharDot = 1;
		if( (str.length-numDots==1) || ((str.length-numDots==2) && (numDots-lastCharDot==0)) ) {
			if(lastCharDot==0) obj.value = str.concat('.',strMonth,'.',strYear); // pouze den, prida se mesic a rok
			else obj.value = str.concat(strMonth,'.',strYear); // pouze den, prida se mesic a rok
			if(obj.onchange!=null) obj.onchange();
		} else if( ((str.length-numDots==2) && (numDots-lastCharDot==1)) || (str.length-numDots==3) || (str.length-numDots==4) ) {
			if(lastCharDot==0) obj.value = str.concat('.',strYear); // den a mesic, prida se rok
			else obj.value = str.concat(strYear); // den a mesic, prida se rok
			if(obj.onchange!=null) obj.onchange();
		}
		if ( (numDots==2) && (lastCharDot==0) ) {
			var pomYear = '';
			i = str.lastIndexOf('.')+1;
			pomYear=str.slice(i);
			pomYearNo = new Number(pomYear);
			if( ((pomYear.length==2) || (pomYear.length==1)) && (pomYearNo<99) && (pomYearNo>=0) ) {
				var strPom = str.slice(0,i);
				strPom = strPom.concat('20');
				strPom = strPom.concat(pomYear);
				obj.value = strPom; // naformatovani roku jako '20xx'
			}
		}
	}
}

// ********************
// Funkce ovladaciho prvku TimeField
// ********************

function TimeFieldBlur(obj,timeFormat,currentTimeString) {
	// Doplneni castecne napsaneho casu
	var str = new String(obj.value);
	if(timeFormat.indexOf(':s')==-1) {
		// cas bez sekund
		if (str.length==1 || str.length==2) {
			// 9  11
			obj.value = str.concat(':00');
			if(obj.onchange!=null) obj.onchange();
		}
	} else {
		// cas vcetne sekund
		if(str.length==4 || str.length==5) {
			// 9:30 11:05
			obj.value = str.concat(':00');
			if(obj.onchange!=null) obj.onchange();
		} else if (str.length==1 || str.length==2) {
			// 9  11
			obj.value = str.concat(':00:00');
			if(obj.onchange!=null) obj.onchange();
		}
	}
}

// ********************
// Funkce ovladaciho prvku Checkbox
// ********************

function checkboxClick(obj,allownullentry) {
	var objCheckboxValue = document.getElementById(obj.id.slice(0,obj.id.length-4));
	var ctlCheckboxNullImage = document.getElementById(objCheckboxValue.id+'_img');
	if(allownullentry==true) {
		// pri vychozi null hodnote a klikani to jde postupne - NULL,1,0,NULL..
	        if((obj.checked)&&(ctlCheckboxNullImage.style.visibility=='visible')) {
				ctlCheckboxNullImage.style.visibility='hidden';
				ctlCheckboxNullImage.style.display = 'none';
				obj.style.display = 'inline';
				obj.checked = true;
				objCheckboxValue.value='1';
				return;
	        }
	        if((!obj.checked)&&(ctlCheckboxNullImage.style.visibility=='hidden')) {
				obj.checked = false;
				objCheckboxValue.value='0';
				return;
			}
	        if((obj.checked)&&(ctlCheckboxNullImage.style.visibility=='hidden')) {
				// here is third state beeing set ('' = NULL)
				obj.checked = false;
				ctlCheckboxNullImage.style.visibility='visible';
				ctlCheckboxNullImage.style.display = 'inline';
				obj.style.display = 'none';
				objCheckboxValue.value='';
			return;
		}
	} else {
		ctlCheckboxNullImage.style.visibility='hidden';
		if(obj.checked)
			objCheckboxValue.value='1';
		else
			objCheckboxValue.value='0';
	}
}

/**
* CtlCheckbox zobrazuje pro simulaci null hodnoty span vypadajici jako sedivy checkbox - jeho onclick
*/
function checkboxNullImageClick(element){
	var objCheckboxValue = document.getElementById(element.id.slice(0,element.id.length-4));
	var objCheckbox = document.getElementById(element.id.slice(0,element.id.length-4)+'_chk');
	var objCheckboxImg = document.getElementById(objCheckboxValue.id+'_img');
	objCheckboxImg.style.display='none';
	objCheckboxImg.style.visibility='hidden';
	objCheckbox.checked='checked';
	objCheckboxValue.value='1';
	objCheckbox.style.display = 'inline';
}

// ********************
// Funkce ovladaciho prvku Radio
// ********************

function radioSetValue(obj,fieldname){
	// vola se na onclick a onkeyup
	// - nastavi hodnotu hiddenfieldu (pole s hodnotou radiosetu)
	var objVal = document.getElementById(fieldname);
	objVal.value = obj.value;
}

// ********************
// Funkce ovladaciho prvku FloatField
// ********************

function FloatFieldBlur(obj,decimalpoints,thousandSeparator,decimalPointSymbol) {
// Position kontroluje obsah Floatfieldu, prevadi spatne desetinne oddelovace na spravne a pripadne oddeluje tisice
	var str,n,i,badnumber=0,pointcount=0,pointlocation,isminus=0;
	// Nahradime spatne oddelovace spravnymi
	var badDecimalPointSymbol='';
	if(decimalPointSymbol==',') badDecimalPointSymbol='.';
	if(decimalPointSymbol=='.') badDecimalPointSymbol=',';
	if(badDecimalPointSymbol!='') {
		str=obj.value;
		obj.value=str.replace(badDecimalPointSymbol,decimalPointSymbol);
	}
	// Zkontrolujeme, zda je v poli korektni hodnota
	//if (checkFloat(obj.name,"")!="") return;
	var str2=""; // do str2 se postupne nacte cislo bez formatovacich znaku
	str=obj.value;
	if (str=="") return;
	n=str.length;
	for(i=0;i<n;i++){
		if (str.charAt(i)!=decimalPointSymbol && str.charAt(i)!=badDecimalPointSymbol && str.charAt(i)!=thousandSeparator && str.charAt(i)!="-") str2=str2+str.charAt(i);
		// Odstranujeme z retezce formatovaci znaky, aby bylo s nim bylo v js mozne pracovat jako s cislem
		if (str.charAt(i)==decimalPointSymbol) str2=str2+".";
		if (str.charAt(i)=="-") isminus=1;
	}
	str=str2; // str nyni obsahuje cislo bez formatovacich znaku
	afterpoint =( (str.slice(str.indexOf(".")+1,str.length)) ); // znaky za desetinnou teckou
	if (str.indexOf(".")!=-1) { // nalezena desetinna tecka - neni cele cislo
		if(decimalpoints!=='') {
			if (afterpoint.length>decimalpoints) afterpoint=afterpoint.slice(0,decimalpoints); // Desetinnych mist je vice nez ma byt - jsou oriznuta
			if (afterpoint.length<decimalpoints) afterpoint=afterpoint+multiplyString(decimalpoints-afterpoint.length,"0"); // Desetinnych mist je mene nez ma byt - jsou doplnena nulami
		}
		// zavolame SeparateThousands. Pozn. desetinna tecka se kontroluje na tecku, nikoliv na decimalPointSymbol (kontroluje se str, to uz je upravene)
		obj.value=SeparateThousands(str.slice(0,str.indexOf('.')),thousandSeparator,decimalPointSymbol)+decimalPointSymbol+afterpoint;
		if (isminus) obj.value="-"+obj.value;
		return;
	} else { // cele cislo - neni desetinna tecka
		if (str=="" || str==0) str="0";
		obj.value=SeparateThousands(str,thousandSeparator,decimalPointSymbol);
		if (isminus) obj.value="-"+obj.value;
		return;
	}
}

function SeparateThousands(str,thousandSeparator,decimalPointSymbol) {
// Position vytvori v str stringu (cislo) oddelovace tisicu
	var str2="",n,m;
	if(thousandSeparator=='') return str;
	n=str.length;
	for(i=0;i<n;i++) if (str.charAt(i)!=thousandSeparator) str2=str2+str.charAt(i);
	str=str2;
	str2="";
	n=str.length;
	m=n;
	for(i=0;i<n;i++) {
		if ((str.charAt(i)!=".") && (m%3==0 && i!=0) ) str2=str2+thousandSeparator;
		str2=str2+str.charAt(i);
		m--;
	}
	return str2;
}

// ********************
// Funkce ovladaciho prvku IntegerField
// ********************

function IntFieldBlur(obj) {
// Position zkontroluje obsah pole. Pokud je to cislo a obsahuje desetinna mista, odrizne je. Nahradi spatne oddelovace spravnymi
	var str,n,i,badnumber=0,pointcount=0,pointlocation,isminus=0
	// Nahradime spatne oddelovace spravnymi
	var decimalPointSymbol=REG_DECIMALPOINTSYMBOL;
	var badDecimalPointSymbol='';
	if(decimalPointSymbol==',') badDecimalPointSymbol='.';
	if(decimalPointSymbol=='.') badDecimalPointSymbol=',';
	if(badDecimalPointSymbol!='') {
		str=obj.value;
		obj.value=str.replace(badDecimalPointSymbol,decimalPointSymbol);
	}
	if (checkFloat(obj.name,"")!="") return;
	else {
		var str2="";
		str=obj.value;
		if (str=="") return;
		n=str.length;
		for(i=0;i<n;i++) {
			if (str.charAt(i)!="," && str.charAt(i)!="-") str2=str2+str.charAt(i);
			if (str.charAt(i)==",") str2=str2+".";
			if (str.charAt(i)=="-") isminus=1;
		}
		if (str2.indexOf(".")!=-1) str2 = str2.slice(0,str2.indexOf("."));
		if (isminus) str2="-" + str2;
		if (str2==0) str2="0";
		obj.value = str2;
		return;
	}
}

//************************************
// Funkce pro CtlIframePopup
//************************************

/**
* funkce pro otevreni (vytvoreni) popupu
* direction udava, jestli ma byt frame zobrazen pod objektem ('bottom') nebo napravo('right')
*/
function openPopupFrame(name, url, width, height, relativeobjid, direction, offsetx, offsety, show_delay){
	var relativeobj = document.getElementById(relativeobjid);
	return openPopupFrameObj(name,url,width,height,relativeobj,direction,offsetx,offsety,show_delay);
}
function openPopupFrameObj(name,url,width,height,relativeobj,direction,offsetx,offsety,show_delay) {
	if(direction == 'bottom') {
		var oy;
		if (document.getElementById(relativeobj.id+'_overflow_box')){
			oy = getElementTopObj(document.getElementById(relativeobj.id+'_overflow_box'))+document.getElementById(relativeobj.id+'_overflow_box').offsetHeight+2;
		}
		var x = getElementLeftObj(relativeobj);
		var y = getElementTopObj(relativeobj)+relativeobj.offsetHeight+2;
		if (oy)
			if (oy<y) y=oy;
	} else if(direction == 'right') {
		var x = getElementLeftObj(relativeobj)+relativeobj.offsetWidth+2;
		var y = getElementTopObj(relativeobj);
	} else if(direction == 'submenu') {
		var x = getElementLeftObj(relativeobj);
		var y = getElementTopObj(relativeobj)+relativeobj.offsetHeight;
	} else {
		alert('Unsupported direction in showPopupFrame');
		return true;
	}
	if(offsetx) x = x + offsetx;
	if(offsety) y = y + offsety;
	if (x<0) x=0;
	if (y<0) y=0;
	var s=document.getElementById(name);
	if(s) {
		ifrm=s;
	} else {
		ifrm = document.createElement("iframe");
	}
	ifrm.frameBorder='0';
	ifrm.name=name;
	ifrm.id=name;
	//ifrm.setAttribute("scrolling", 'no');
	ifrm.setAttribute("src", url);
	ifrm.className = 'clsPopupFrame';
	ifrm.style.backgroundColor = 'white';
	ifrm.style.position = 'absolute';
	ifrm.style.left = x + 'px';
	ifrm.style.top = y + 'px';
	ifrm.style.width = width+'px';
	ifrm.style.height = height+'px';
	if(show_delay) {
		ifrm.style.display = 'none';
	} else {
		ifrm.style.display = 'block';
	}
	ifrm.style.zIndex = 990;
	document.body.appendChild(ifrm);
	//window.focus();
	ifrm.opener = self;
	//ifrm.focus();
	//mozno pak volat idcko pres self.name
	ifrm.contentWindow.name=name;
	if(show_delay) {
		$('#'+name).show(show_delay);
	}
	return ifrm;
}

/**
* uzavreni popupu - zruseni z DOM. Vvola se primarne jako tlacitko Zavrit,
* na onblur se misto zavreni vola hide, aby nezmizely upravy provedene v Iframu
*/
function closePopupFrame(name) {
// 
	if(window.document.getElementById(name)!=null) { // volano z parent frame
		doc = window.frames[name].document;
		if(doc==null){
			docwnd=document.getElementById(name);
			if(docwnd) doc=docwnd.contentDocument;
			else doc=null;
		}
		docParent = document;
	} else return false;
	if(doc!=null) { // odstrani objekty (deti) v popupframe
		while (doc.childNodes.length > 0) {
	        doc.removeChild(doc.childNodes[0]);
	   	}
	}
   	var obj = docParent.getElementById(name); // odstrani vlastni popupframe(iframe)
	if (obj!=null) {
		if (obj.contentWindow.parent){
			w = obj.contentWindow.parent.document;
			if (!w.history_skip)
				w.history_skip = 0;
			w.history_skip = w.history_skip + (window.history.length-obj.init_history_length);
		}
		obj.parentNode.removeChild(obj);
	}
}

/** 
* hide popupu (vola se primarne pri onblur)
*/
function hidePopupFrame(name){
	if(window.document.getElementById(name)!=null) { // volano z parent frame
		window.document.getElementById(name).style.display='none';
	} else { // volano primo z daneho frame
		//neotestovano
		//self.style.display = 'none';
	}
}

/**
* Zavreni tohoto (this) popup framu a prehozeni onclick na danou kontrolku.
* Predpoklada definovani pozadovanych zaviracich funkci ve skriptu
*/
function closeThisPopupFrame(){
	eval("window.parent.closePopupFrame_"+self.name+"();");
	return false;
}

/**
* hide tohoto (this) popup framu a prehozeni onclick na danou kontrolku.
* Predpoklada definovani pozadovanych zaviracich funkci ve skriptu
*/
function hideThisPopupFrame(){
	//
	eval("window.parent.hidePopupFrame_"+self.name+"();");
	return false;
}

/**
* Nastavi ve window.parent hodnotu pole 
* - primarne nastaveni iframefieldu z iframe
*/
function setParentField(value,name){
	if (!window.parent) return false;
	if (!window.parent.document) return false;
	if (name==null){
		if (!window.name) return false;
		wname = new String(window.name);
		//odstranujeme Iframe_
		name = wname.substring(7);
	}
	if (!window.parent.document.getElementById(name)) return false;
	if (window.parent.document.getElementById(name).tagName=='INPUT'){
		prev_value = window.parent.document.getElementById(name).value;
		window.parent.document.getElementById(name).value=value;
		if (prev_value!=value && window.parent.document.getElementById(name).onchange)
			window.parent.document.getElementById(name).onchange();
		if (prev_value!=value && window.parent.document.getElementById(name).onblur)
			window.parent.document.getElementById(name).onblur();
	} else
		window.parent.document.getElementById(name).innerHTML=value;
	return true;
}

function setFromParentField(fieldname,parentfieldname){
	if (!document.getElementById(fieldname)) return false;
	if (!window.parent) return false;
	if (!window.parent.document) return false;
	if (parentfieldname==null){
		if (!window.name) return false;
		wname = new String(window.name);
		//odstranujeme Iframe_
		parentfieldname = wname.substring(7);
	}
	if (!window.parent.document.getElementById(parentfieldname)) return false;
	document.getElementById(fieldname).value = window.parent.document.getElementById(parentfieldname).value;
	return true;
}

function setParentFields(){
	fields = document.getElementsByTagName('INPUT');
	for(i=0;i<fields.length;i++){
		if (fields[i].onblur) fields[i].onblur();
	}
	fields = document.getElementsByTagName('SELECT');
	for(i=0;i<fields.length;i++){
		if (fields[i].onblur) fields[i].onblur();
	}
	fields = document.getElementsByTagName('TEXTAREA');
	for(i=0;i<fields.length;i++){
		if (fields[i].onblur) fields[i].onblur();
	}
	return false;
}

function setParentFieldMultiple(val, name, displayed_name, displayed_val){
	if (!window.parent) return false;
	if (!window.parent.document) return false;
	if (name==null){
		if (!window.name) return false;
		wname = new String(window.name);
		//odstranujeme Iframe_
		name = wname.substring(7);
	}
	if (!window.parent.document.getElementById(name)) return false;

	if (displayed_name==null){
		if (!window.name) return false;
		wname = new String(window.name);
		//odstranujeme Iframe_
		displayed_name = wname.substring(7);
	}
	if (!window.parent.document.getElementById(displayed_name)) return false;
	return setFieldMultipleObj(val,window.parent.document.getElementById(name), window.parent.document.getElementById(displayed_name), displayed_val);
}

function unsetFieldMultiple(val, name, displayed_name, displayed_val, unsetobj){
	return setFieldMultipleObj(val,document.getElementById(name),document.getElementById(displayed_name),displayed_val, unsetobj);
}

function setFieldMultipleObj(val, listfield, displayed_span, displayed_val, unsetobj){
	var str = new String(','+listfield.value); // na zacatek se prida carka kvuli hledani
	if (str.length>1) str = str.concat(','); //Bugfix: i na konec
	var found = str.search(','+val+',');
	if((found == -1)) {
		//if(str.length>1) str = str.concat(','); // pokud nejde o prvni hodnotu, prida se carka
		str = str.concat(val+','); // za carku se prida hodnota
	}
	if((found != -1)) {
		str = str.replace(','+val+',',',');
	}
	if (str == ',') str = '';
	else
	str = str.substring(1,str.length-1); // carka pridana na zacatek (bugfix: i na konec) se odstrani
	/*if (unsetobj==null){
		if (window.parent.document.getElementById(listfield.id+'_value_box'))
			window.parent.document.getElementById(listfield.id+'_value_box').innerHTML = str;
	} else {
		if (document.getElementById(listfield.id+'_value_box'))
			document.getElementById(listfield.id+'_value_box').innerHTML = str;
	}*/
	listfield.value = str;
	listfield.setAttribute("value",str);
	if((found == -1)){
		setParentSpan(displayed_span.id, val, displayed_val, listfield.name);
	} else {
		if (unsetobj==null)
			unsetobj = window.parent.document.getElementById(displayed_span.id+'_'+val);
		unsetobj.parentNode.removeChild(unsetobj);
		if (listfield.value==''){
			displayed_span.innerHTML='<table><tr><td></td><td>--nezadáno--</td></tr></table>';
		}
	}
	return true;
}

function setParentSpan(name, val, displayed_val, pkname){
	if (!window.parent) return false;
	if (!window.parent.document) return false;
	if (name==null){
		if (!window.name) return false;
		wname = new String(window.name);
		//odstranujeme Iframe_
		name = wname.substring(7);
	}
	if (!window.parent.document.getElementById(name)) return false;

	var listfield = window.parent.document.getElementById(name);
	var string = new String(listfield.innerHTML);
	if (window.parent.document.getElementById(pkname).value==val)
		string = new String('<table><tbody>');
	else{
		string = string.substr(0,string.length-16);
	}
	//string=string.concat('<a href="#" id="'+name+'_'+val+'" onclick="unsetFieldMultiple('+"'"+val+"','"+pkname+"','"+name+"','"+val+"',this"+');return false;">'+displayed_val+'<br /></a>');
	string=string.concat(displayed_val+'</tbody></table>');
	listfield.innerHTML=string;
	return true;
}

function getIframeHistorySkip(){
	//preskakovani historie zpusobene iframy
	if (typeof document.history_skip == 'undefined')
		document.history_skip=0;
	var history_iframes = document.getElementsByTagName('IFRAME');
	for (i=0;i<history_iframes.length;i=i+1){
		if (history_iframes[i].init_history_length)
			document.history_skip = document.history_skip + (window.history.length - history_iframes[i].init_history_length);
	}
	history_skip = document.history_skip;
	document.history_skip = null;
	return history_skip;
}

function MoveOptionFromLisbox(IdFrom,IdTo){
    var from = document.getElementById(IdFrom);
    var len = from.length;
    var to = document.getElementById(IdTo);
    for(var j=0; j<len; j++) {
        if(from.options[j]) if(from.options[j].selected) {
            var tmp = from.options[j].text;
            var tmp1 = from.options[j].value;
            from.remove(j);
            j--;
            var y=document.createElement('option');
            y.text=tmp;
            y.value=tmp1;
            try {
                to.add(y,null);
            }
            catch(ex) {
                to.add(y);
            }
        }
    }
}
function unselecetFromLisbox(idlistbox){
    var listbox=document.getElementById(idlistbox);
    for (i=0;i<listbox.length;i++) {
        listbox.options[i].selected=false;
    }
}
function MoveO(name,w){
    var sel=document.getElementsByName(name)[0];
    var opt=sel.options[sel.selectedIndex];
    if(w=='up'){
        var prev=opt.previousSibling;
        while(prev&&prev.nodeType!=1){
            prev=prev.previousSibling;
        }
        prev?sel.insertBefore(opt,prev):sel.appendChild(opt)
    }else{
        var next=opt.nextSibling;
        while(next&&next.nodeType!=1){
            next=next.nextSibling;
        }
        if(!next){sel.insertBefore(opt,sel.options[0])
        }else{
            var nextnext=next.nextSibling;
            while(next&&next.nodeType!=1){
                next=next.nextSibling;
            }
            nextnext?sel.insertBefore(opt,nextnext):sel.appendChild(opt);
        }
    }
}
function selectAllOptionsOfListbox(idlistbox){
    $("select[id^='"+idlistbox+"'] option").each(function(i){
        $(this).attr("selected", "selected");
    }) ;
}

/***********************
* jQuery popupy
* - vzdy se pracuje s jen jednim aktivne otevrenym popupem, viz promenne nize
* - pokud je na strance kontrolek vic a jedna je otevrena, pri otevreni dalsi se uzavre predchozi a otevre nova
* cely popup se inicializuje jako onclick="popupOpenClick(this,popupcontentid..);"
************************/

var activePopup; // po rozkliknuti popupu obsahuje objekt popupu (div se zobrazenym obsahem)
var activePopupOpener; // dtto, objekt ktery pres onclick rozbalil popup
var popupShowing; // true, pokud je nejaky popup rozbaleny
var popupOptions = new Array(); // parametry nastavene pri volani popupOpenerClick. typicky showdelay,hidedelay

/**
* popupOpenClick provede otevreni popupu - onclick pro rozbalujici prvek
* - to zcela staci pro funkcnost popupu, ostatni uz se zaridi zde
* 
* parametry:
* - openerobj je otevirajici prvek (pri volani z onclick =this)
* - popupcontentid je id prvku, ktery se rozbaluje jako popup
* 
* nepovinne parametry:
* - aligntoid je id prvku pod/vedle kterym se ma zobrazit
*   pokud neni predano, pouzije se otevirajici objekt
* - aligndirection urcuje, zda se ma popup zobrazit ('bottomleft','topright')
*   vychozi je 'bottomleft'
* - offsetx, offsety se pridava k pozici
* - showdelay, hidedelay je parametr pro zobrazeni (jquery show/hide)
*   vychozi je 100,0
* - effect je standardne 'show'. moznost zadat slideDown
*/
function popupOpenClick(openerobj,popupcontentid,aligntoid,aligndirection,offsetx,offsety,showdelay,hidedelay,effect) {
	if(popupShowing==true) {
		popupHide();
	} else {
		// vychozi hodnoty
		if(aligntoid==null) aligntoid = popupcontentid;
		if(aligndirection==null) aligndirection = 'bottomleft';
		if(showdelay==null) showdelay = 100;
		if(hidedelay==null) hidedelay = 0;
		if(effect==null) effect = 'show';
		
		// parametry ktere budou potreba jinde ulozime do pole popupOptions (globalni promenna)
		popupOptions['hidedelay']=hidedelay;
		
		activePopupOpener=openerobj;
		activePopup = $('#'+popupcontentid);
		// popup muze obsahovat:
		// A) normalni obsah - nijak dal neresime
		// B) iframe uvozeny do html komentaru (<!-- <iframe ..../> -->)
		//    pokud ano, 'odkomentujeme ho'.
		//    pozn. je to tak kvuli tomu, aby se obsah iframe zbytecne nenahraval predtim, nez uzivatel popup rozbali
		var popupContents = activePopup.html();
		if(popupContents.substring(0,12)=='<!-- <iframe') {
			// odstranime komentare a nacteme tak pozadovany zdroj popupu k aktivovani
			var hiddenIframe = popupContents.substring(5,popupContents.length-4);
			// nahradime obsah popupu 'odkomentovanym' iframe
			activePopup.html(hiddenIframe);
		}
		// konec kontroly pro obsah popupu
		
		// potrebujeme nastavit pozici popupu		
		//activePopup.css('top',$(activePopupOpener).offset().top + ($(activePopupOpener).outerHeight()));
		//activePopup.css('left',$(activePopupOpener).offset().left + ($(activePopupOpener).outerWidth()));
		if(aligndirection == 'absolute' || $(activePopupOpener).css('position')=='absolute' || $(activePopupOpener).css('position')=='relative') {
			var top = 0;
			var left = 0;
		} else if(aligndirection == 'bottomleft') {
			var top = $(activePopupOpener).offset().top + ($(activePopupOpener).outerHeight());
			var left = $(activePopupOpener).offset().left;
		} else if(aligndirection == 'topright') {
			var top = $(activePopupOpener).offset().top;
			var left = $(activePopupOpener).offset().left + ($(activePopupOpener).outerWidth());
		} else {
			alert('Unsupported direction in showPopupFrame');
			return true;
		}
		if(offsety) top = top + offsety;
		if(offsetx) left = left + offsetx;
		if(top<0) top = 0;
		if(left<0) left = 0;
		activePopup.css('top',top);
		activePopup.css('left',left);
		//activePopup.css('position','absolute');
		// druhy parametr show (callback po zobrazeni) provede focus na prvni textove pole v popupu
		popupShowing = true;
		
		if(showdelay==0) {
			activePopup.show();
			$('#'+popupcontentid+' input:text:first').focus();$('#'+popupcontentid+' input:text:first').focus();
		} else {
			if(effect=='slideDown') {
				activePopup.slideDown(showdelay,function () { $('#'+popupcontentid+' input:text:first').focus();$('#'+popupcontentid+' input:text:first').focus();} );
			} else {
				activePopup.show(showdelay,function () { $('#'+popupcontentid+' input:text:first').focus();$('#'+popupcontentid+' input:text:first').focus();} );
			}
		}
		$(document).bind('mousedown', popupDocumentMouseDown); // zavreni pri kliku mimo popup
		$(document).bind('keydown', popupDocumentKeyDown); // zavreni klavesou Escape
	}
}

/**
* patri k popupOpenClick
* - resi skryti popupu pri kliknuti mimo popup. funkce je nastavovana jako document.onmousedown v ramci popupOpenClick
*/
function popupDocumentMouseDown(event) {
    // zjistime, kam uzivatel klikl
    // - pokud nekam dovnitr popupu nebo na rozbalovaci prvek, nedelame nic
    // - jinak skryjeme popup
    // pozn. kliknuti na rozbalujici prvek si popup skruje samo pres onclick
    var clickedInside=false;
    // 1. klik je primo na objekt popupu
    if(event.target == $(activePopup)[0]) clickedInside=true;
    // 2. zkontrolujeme, jestli nejde o klik na nejaky objekt uvnitr popupu, pres $(event.target).parents()
    // pozn. $(event.target).parents(#idprvku) vraci vsechny rodice prvku "event.target", pokud maji id=idprvku
    if($(event.target).parents('#'+activePopup.attr('id')).length>0) clickedInside=true;
    if(clickedInside==false && event.target !== $(activePopupOpener)[0]) {
    	return popupHide();
	}
}

/**
* patri k popupOpenClick
* - provede skryti popupu pri stisku klavesy ESC
*/
function popupDocumentKeyDown(event) {
    if(event.keyCode==27 && popupShowing==true) popupHide();
}

/**
* skryje (zavre) popup
*/
function popupHide() {
    $(document).unbind("mousedown", popupDocumentMouseDown);
    $(document).unbind("keydown", popupDocumentKeyDown);
    $(activePopup).hide(popupOptions['hidedelay']);
    popupShowing = false;
    // popup muze mit uzivatelsky atribut destroyonhide="1", pokud ho ma, odstranime obsah z pameti
    if(activePopup.attr('destroyonhide')=='1') activePopup.html('');
}

/***********************
* funkce pro CtlPopupCombo
* popupcombo je opet otevrene pouze jedno (ostatne jde o jQuery popup viz vys)
************************/

var popupComboWhisperTimeout; // pouziva se v popupComboKeyDown pro ulozeni nastaveneho windows.setTimeout aby sel dal zrusit

function popupComboOpen(basehref,openerobj,popupcontentid,aligntoid,aligndirection,offsetx,offsety,showdelay,hidedelay,effect) {
	// funkce pro otevreni popupComba. Vola se jen jednou, otevira se s vychozi ajaxhref
	popupOpenClick(openerobj,popupcontentid,aligntoid,aligndirection,offsetx,offsety,showdelay,hidedelay,effect);
	$('#'+popupcontentid).load(basehref,null,function () {$('#'+popupcontentid+' input:text:first').focus();$('#'+popupcontentid+' input:text:first').focus();});
}

function popupComboSaveClose(ctlid,value,caption,onchangeparams) {
	// nastavi hlavni prvek (combo) na predanou value/caption a zavre popup
	// je volana z TrTag jednotlivych polozek
	$mainctl = $('#'+ctlid);
	$mainctl.html("<option value='"+value+"' selected>"+caption+"</option>");
	popupHide();
	$mainctl.trigger('change',onchangeparams);
	$mainctl.focus();
}

function popupComboKeyDown(ctlid,basehref,filtercolumn,whisperdelay,e) {
	// funkce se vola na pres onkeydown na searchfieldu (onkeydown = "return popupComboKeyDown(event)";
	// - odchytava akce pro sipky nahoru, dolu, enter a escape
	// - odchytava jine normalni klavesy, kdyz clovek prestane psat, zavola naseptavac - popupComboReload
	var active = $('#'+ctlid+'_popup .popupComboSelected');
	switch(e.keyCode) {
		case 40: { // sipka dolu
			if(active.length==0) {
				// zatim nic nezvoleno - vybereme prvni polozku
				$('#'+ctlid+'_popup tbody tr')[0].setAttribute('class','popupComboSelected');
			} else {
				var next = $('#'+ctlid+'_popup .popupComboSelected + tr');
				if(next.length>0) {
					next[0].setAttribute('class','popupComboSelected');
					active[0].setAttribute('class','clsHoverHighlight');
				}
			}
			return false;
		}
		case 38: { // sipka nahoru
			if(active.length>0 && active.prev().length>0) {
				active.prev()[0].setAttribute('class','popupComboSelected');
				active[0].setAttribute('class','clsHoverHighlight');
			}
			return false;
		}
		case 13: { // enter
			if(active.length>0) {
				active.trigger('click');
			}
			return false;
		}
		case 27: { // escape
			popupHide();
			document.getElementById(ctlid).focus();
			return false;
		}
	}
	// ostatni klavesy zde - naseptavac
	if(popupComboWhisperTimeout) window.clearTimeout(popupComboWhisperTimeout);
	popupComboWhisperTimeout = window.setTimeout('popupComboReload("'+ctlid+'","'+basehref+'","'+filtercolumn+'");',whisperdelay);
	return true;
}

function popupComboReload(ctlid,basehref,filtercolumn) {
	// provede obnoveni obsahu popupu (spolu s odeslanim hodnot)
	// funkce je volana z popupComboKeyDown
	var href = basehref+'&filtercolumn='+filtercolumn+'&filtervalue='+escape(document.getElementById(ctlid+'_filter').value);
	$('#'+ctlid+'_popup').load(href,function() {$('#'+ctlid+'_popup input:text:first').focus();$('#'+ctlid+'_popup input:text:first').focus();});
}


/***********************
* konec
************************/

