/**
* Inicializace stranky v backendu (volano v HtmlPageClass)
* - provede focusFirstField,
* - v pripade BrowseFormu provede roztahnuti modulemenu podle sirky formu (musi byt javascriptove, nejde pres css)
*/
var scrollWidth;
function appWindowLoad() {
	// nejdriv se postarame o zobrazeni/skryti main menu
	var loc = new String(window.location);
	if(loc.indexOf('&initmainwindow')>0) {
		// pokud je v url parametr initmainwindow, nastavi se window.name na mainwindow_xxx (xxx je aktualni timestamp, aby byl nazev unikatni)
		// a zobrazi se menu
		var timestamp=new Date().getTime();
		window.name='mainwindow'+timestamp;
		document.getElementById('mainWindowTop').style.display = 'block';
		document.getElementById('mainwindowicon').style.display = 'none';
	} else {
		// jinak se zobrazi hlavni menu na zaklade window.name
		if(window.name.substr(0,10)!='mainwindow') {
			var mainw = document.getElementById('mainWindowTop');
			if(mainw!=null) {
				mainw.style.display = 'none';
				document.getElementById('mainwindowicon').style.display = 'inline';
			}
		};
	}
	
	// onscroll handler - aktualizuje pozici menu tak, aby bylo vzdy na celou sirku
	window.onscroll = function (e) {
		var scrollX = document.documentElement.scrollLeft;
		if(scrollX == 0) {
			$('#mainWindowTop').css('width','auto');
			$('.mmenu').css('width','auto');
			$('.mmenu-append').css('width','auto');
		} else {
			var setWidth = document.documentElement.scrollWidth;
			$('#mainWindowTop').css('width',setWidth);
			$('.mmenu').css('width',setWidth-16);
			$('.mmenu-append').css('width',setWidth);
		}
  	}
  	// v pripade browseformu nastavime prvky .clsBrowsePreviewText podle renderovane sirky tabulky
	browseRecalculate();
	
	// focus prvniho fieldu na strance
	focusFirstField();
	// window.setTimeout("focusFirstField();",100); // pro jistotu jeste jednou po 100ms, kdyby neco formulari vzalo focus (iframe)
}

function browseRecalculate(){
	// nastavime sirku .clsBrowsePreviewText
  	$('table.clsFormTableBrowse').add('table.clsFormTableBrowseSubform').each(function (i) {
		calcwidth = this.offsetWidth;
		firstcell = $(this).find('thead td:first');
		if(firstcell.size()==1) {
			calcwidth = calcwidth - $(this).find('thead td:first')[0].offsetWidth - 11;
			$(this).find('.clsBrowsePreviewText').css('width',calcwidth+'px');
		}
	});
	// nastavime sirku pripadneho .clsGroupByHeaderTitle podle sirek prvnich trech sloupcu. minus padding tdcka
	ie7 = (navigator.appVersion.indexOf("MSIE 7.")==-1) ? false : true;
	if(ie7==false) fixwidth = -15; else fixwidth = -30;
	if($('table.clsFormTableBrowse div.clsGroupByHeaderTitle').size()>0) {
		$('table.clsFormTableBrowse div.clsGroupByHeaderTitle').css('width',
			(parseInt($('table.clsFormTableBrowse thead td:eq(0)')[0].clientWidth)
			+parseInt($('table.clsFormTableBrowse thead td:eq(1)')[0].clientWidth)
			+parseInt($('table.clsFormTableBrowse thead td:eq(2)')[0].clientWidth)+fixwidth)+'px'
		);
	}
}

/**
* 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
*/
var focusFirstFieldName;
function focusFirstField() {
	// nejdriv kontrolujeme, jestli neni definovana globalni javascriptovou promenna focusFirstFieldName
	// (pouziva se pri postbacku, pro obnoveni focusu)
	if(focusFirstFieldName!=null) {
		$('#'+focusFirstFieldName).focus();
	} else {
		// 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 hiddenfield "action", volitelne hiddenfield "actionparam"
* 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,newactionparam) {
	if($('input:hidden[name=action]').val(newaction).size()==0) {
		alert('Cannot set action');
		return false;
	}
	if(newactionparam) {
		if($('input:hidden[name=actionparam]').val(newactionparam).size()==0) {
			alert('Cannot set actionparam');
			return false;
		}
	}
	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;
	}
}

/**
* Nastavi span id='formMessage', ktery je normalne skryty
* - zobrazi v nem danou zpravu
* - nastavi class podle parametru 'spanclass' (standardne 'formMessageNormal')
* - v pripade nastaveni duration, tato zprava po danem poctu milisekund zmizi
* - moznost urcit add2style
* - moznost urcit jine ID spanu
*/
function setFormMessage(htmlmessage,spanclass,style,duration) {
	if(spanclass==null) spanclass = 'formMessageNormal';
	$('#formMessage').html(htmlmessage).attr('class',spanclass);
	if(duration>0) {
		window.setTimeout(function() {$('#formMessage').attr('class','formMessageHidden')}, duration);
	}
}

/**
* provede submit formulare s tim, ze zavola stejnou tridu a akci, s pridanim URL parametru &eqPostback
* - puvodni GET parametry zustavaji stejne
* - vsechny POST parametry (formularova pole) doatnou zduplikovany hiddenfield s prefixem 'eqPostback'
* - pribyde parametr eqPostback=..  (srcobject.name)
* srcfield je nazev pole, ktere iniciuje zmenu
*/
function postbackForm(srcfield,action) {
	var frm = document.forms.item(0);
	// pridame hiddenfield eqPostbackCaller
	$(frm).append("<input type='hidden' name='eqPostbackCaller' value='"+srcfield+"'/>");
	// zrusime target formu (POSTuje se tedy do hlavniho 'Edit' okna, nikoliv do iframe - standardniho targetu pro Save)
	$(frm).attr('target','');
	
	setAction(action,''); // todo - zjistit z getu
	disableFormUI('clsForm');
	window.ispostbacked = true;
	
	// zrusime changeWatcher, at se nas nepta, jestli chceme odejit ze stranky
	changeWatcherDisable();
	frm.submit();
}

function disableFormUI(tableclass) {
	$('#disableFormUI').remove();
	var shade = $('#disableFormUI');
	var table = $('table.'+tableclass)[0];
	var left = getElementLeftObj(table);
	var top = getElementTopObj(table);

	shade = $('<div class="clsDisableFormUI"></div></div>');
	shade.css('position','absolute');
	shade.css('z-index',999);
	shade.css('left',left+'px');
	shade.css('top',top+'px');
	shade.css('width',table.offsetWidth+'px');
	shade.css('height',table.offsetHeight+'px');
	shade.css('line-height',table.offsetHeight+'px');
	shade.css('display','block');
	shade.appendTo(document.body);
	/*
	loading = $('<div style="width:100px;height:22px;"><img src="img/ajax-loading.gif" style="" /></div>');
	loading.css('position','absolute');
	loading.css('z-index',1999);
	loading.css('left',(left+3)+'px');
	loading.css('top',(top+5)+'px');
	loading.appendTo(document.body);*/
}

function enableFormUI() {
	$('.clsDisableFormUI').remove();
}

// umozni submit formulare na Enter (s buttony typu <span>)
// typicke volani jako form onkeypress="return formSubmitOnEnter(event);"
function formSubmitOnEnter(e) {
	var target = e.target;
	if(target==null) target = e.srcElement;
	if(e.keyCode==13 && target.tagName=='INPUT') {
		$("span[entersubmit=1]:first").click();
	}
}

// ********************
// Obecne funkce
// ********************

/**
* orizne text..
*/
function trim(str) {
   return str.replace(/^\s*|\s*$/g,"");
}

/**
* Provede URL encode specialnich znaku
*/
function urlencode (str) {
	var ret = str;
	ret = ret.toString();
	ret = encodeURIComponent(ret);
	ret = ret.replace(/%20/g, '+');
	return ret;
}

/**
* 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+")");
}

function rgbStringToHex(str) {
   if(str.substring(0,1)=='#') return str;
   str = str.replace(/rgb\(|\)/g, "").split(",");
   str[0] = parseInt(str[0], 10).toString(16).toLowerCase();
   str[1] = parseInt(str[1], 10).toString(16).toLowerCase();
   str[2] = parseInt(str[2], 10).toString(16).toLowerCase();
   str[0] = (str[0].length == 1) ? '0' + str[0] : str[0];
   str[1] = (str[1].length == 1) ? '0' + str[1] : str[1];
   str[2] = (str[2].length == 1) ? '0' + str[2] : str[2];
   return ('#' + str.join(""));
}


/**
* 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();
}

/**
* 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;
}

// ********************
// 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+1) || obj.clientHeight > 0 && obj.scrollHeight > (obj.clientHeight+1)) {
		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,' ');
			text = text.replace(/<div[^>]*>/g,' ');
			text = text.replace(/<\/div[^>]*>/g,' ');
			text = text.replace(/<a[^>]*>/g,' ');
			text = text.replace(/<\/a[^>]*>/g,' ');
		}
		obj.title = text;
	}
}

/**
* orizne text vkladany do prvku. MSIE only (osetreno pred volanim)
*/
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)
* 	pozn. hiddenfield ma id = field_prefix+"_rowcheckvalues"
* - obsahuje funkcionalitu pro oznaceni vic rowcheckboxu najednou:
*	prvni klik pro zacatek
*	pak klik se shiftem na konec - oznaci se vsechny rowcheckboxy mezi
* - propagate=true umozni, aby se kliknuti zavolalo i pro trko pod rowcheckboxem
*/
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,evt) {	
	var e = (window.event) ? window.event : evt;
	e.cancelBubble = true;
	// 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)
		// 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 predmeneho 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;
	// budeme potrebovat pro vyzobani hodnoty checkboxu z name
	var prefixlength = new String(field_prefix+"rowcheck_").length;
	$("input[id^='"+field_prefix+"rowcheck_']:checkbox").each(function (i) {
		// nastaveni checked
		if(this.checked != obj.checked) {			
			this.checked = obj.checked;
			var chkval = new String(this.id).substring(prefixlength);
			this.onclick(this,chkval,evt);
			//$(this).trigger('click');
 		}
	});
}

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) {
	// 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();
		}
	}
}

function TimeFieldDblclick(obj,timeFormat) {
	// Vyplni aktualni cas
	var d = new Date();
	var hr = new String(d.getHours());
	var min = new String(d.getMinutes());
	var sec = new String(d.getSeconds());
	if(min.length==1) min = '0' + min;
	if(sec.length==1) sec = '0' + sec;
	var str = new String(timeFormat);
	str = str.replace('H',hr);
	str = str.replace('i',min);
	str = str.replace('s',sec);
	obj.value = str;
}

// ********************
// Funkce ovladaciho prvku Checkbox
// ********************

/**
* udalost pro klik na checkbox. vyplneni null hodnoty je ZAKAZANE
* (ale muze byt predvyplnena jako default - pouze nejde znovu vybrat)
* ctlid = $ctl->name (tedy idcko hiddenfieldu s hodnotou)
*/
function checkboxClick(ctlid) {
	var objCheckbox = document.getElementById(ctlid+'_chk');
	var objValue = document.getElementById(ctlid);
	var objNullImage = document.getElementById(ctlid+'_img');
	if(objNullImage!=null) objNullImage.style.display='none';
	if(objCheckbox.checked) {
		objValue.value='1';
	} else {
		objValue.value='0';
	}
}

/**
* udalost pro klik na checkbox. vyplneni null hodnoty je POVOLENE
* ctlid = $ctl->name (tedy idcko hiddenfieldu s hodnotou)
*/
function checkboxClickNullable(ctlid) {
	var objCheckbox = document.getElementById(ctlid+'_chk');
	var objValue = document.getElementById(ctlid);
	var objNullImage = document.getElementById(ctlid+'_img');
	// pri vychozi null hodnote a klikani to jde postupne - NULL,1,0,NULL..
	if(objCheckbox.checked == true && objNullImage.style.display!='none') {
		// NULL => 1
		// jde o onclick udalost, zavolanou z checkboxNullImageClick (nullimage je stale zobrazeny)
		objNullImage.style.display = 'none'; // skryjeme nullimg
		objCheckbox.style.display = 'inline'; // zobrazime checkbox
		objCheckbox.checked = true;
		objValue.value='1';
		return;
	} else if(objCheckbox.checked == false && objNullImage.style.display=='none') {
		// 1=>0
		objCheckbox.checked = false;
		objValue.value='0';
		return;
	} else if(objCheckbox.checked == true && objNullImage.style.display=='none') {
		// 0=>NULL
		objCheckbox.checked = false;
		objValue.value='';
		objCheckbox.style.display = 'none'; // skryjeme checkbox
		objNullImage.style.display = 'inline'; // zobrazime nullimg		
	}
	return;
}

/**
* CtlCheckbox zobrazuje pro simulaci null hodnoty span vypadajici jako sedivy checkbox - jeho onclick
*/
function checkboxNullImageClick(ctlid){
	var objCheckbox = document.getElementById(ctlid+'_chk');
	var objValue = document.getElementById(ctlid);
	var objNullImage = document.getElementById(ctlid+'_img');
	// po kliknuti na 'null hodnotu' se prepina do stavu 'checked'
	objCheckbox.checked='checked';
	// pak zavolame onclick - tam se i nastavi hiddenfield, a provede se pripadny uzivatelsky add2onclick
	objCheckbox.onclick();
}

/**
* checkboxSetVal je jedina korektni moznost, jak nastavit hodnotu pro CtlCheckbox
* odjinud z javascriptu
* 
* val muze byt 0 nebo 1 (null neni podporovano)
* zajisti provedeni onclick udalosti na cilovem checkboxu
*/
function checkboxSetVal(ctlid,val) {
	var objCheckbox = document.getElementById(ctlid+'_chk');
	var objValue = document.getElementById(ctlid);
	var objNullImage = document.getElementById(ctlid+'_img');
	// nejdriv si poradime s pripadnou aktualni null hodnotou
	if(objNullImage!=null) objNullImage.style.display='none';
	objCheckbox.style.display = 'inline';
	if(val==1) {
		// nejdriv nahradime skutecne kliknuti, ktere predchazi onclick udalosti
		// hodnotu hiddenfieldu ale nenastavujeme
		objCheckbox.checked=true;
		// pak zavolame onclick - tam se i nastavi hiddenfield, a provede se pripadny uzivatelsky add2onclick
		objCheckbox.onclick();
	} else {
		objCheckbox.checked=false;
		objCheckbox.onclick();
	}
}

// ********************
// 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;
	}
}

/***********************
* 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 popupScrollbarClicked; // slouzi pro odliseni kliku na scrollbar (aby se pri naslednem MouseUp nezavrel popup)
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 == 'bottomleft') {
			var top = getElementTopObj(aligntoid) + ($(aligntoid).outerHeight());
			var left = getElementLeftObj(aligntoid);
		} else if(aligndirection == 'bottomright') {
			var top = getElementTopObj(aligntoid) + ($(aligntoid).outerHeight());
			var left = $(aligntoid).offset().left + ($(aligntoid).outerWidth()) - $(activePopup).outerWidth();
		} else if(aligndirection == 'topleft') {
			var top = $(aligntoid).offset().top;
			var left = $(aligntoid).offset().left;
		} else if(aligndirection == 'topright') {
			var top = $(aligntoid).offset().top;
			var left = $(aligntoid).offset().left + ($(aligntoid).outerWidth());
		} else {
			alert('Unsupported direction in popupOpenClick: '+aligndirection);
			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();
		} 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();} );
			}
		}
		popupScrollbarClickDetect = 0;
		//window.onmouseup = popupDocumentMouseUp; // zavreni pri kliku mimo popup
		$(document).bind('mouseup', popupDocumentMouseUp); // zavreni pri kliku mimo popup
		$(document).bind('keydown', popupDocumentKeyDown); // zavreni klavesou Escape
		$(document).bind('scroll', popupScrollDetect); // detekce onscroll. 
	}
}

/**
* patri k popupOpenClick
* - resi skryti popupu pri kliknuti mimo popup. funkce je nastavovana jako document.onmouseup v ramci popupOpenClick
*/
function popupDocumentMouseUp(event) {
	// nejdriv zjistime, jestli uzivatel neklikl na scrollbar
	// to je nutne zjistovat zvlast - promenna popupScrollbarClicked je nastavena pri onscroll
	// s cilem ignorovani nejblizsi mouseup udalosti
    if(popupScrollbarClicked && event.target.tagName == 'HTML') {
    	popupScrollbarClicked = false;
    	return false;
	} else popupScrollbarClicked = false;
    // 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 hidePopup=true;
    
    // 1. jde o klik je na rozbalujici prvek
    if($(event.target)[0] == activePopupOpener) hidePopup = false;
    if($(event.target).parent()[0] == activePopupOpener) hidePopup = false;
    
    // 2. klik je primo na objekt popupu
    if(event.target == activePopup[0]) hidePopup=false;    
    
    // 3. klik na nejaky objekt uvnitr popupu
    // pozn. $(event.target).parents(#idprvku) vraci vsechny rodice prvku "event.target", pokud maji id=idprvku
    if($(event.target).parents('#'+activePopup.attr('id')).length>0) hidePopup = false;
    
   
    if(hidePopup == true) return popupHide();
}

function popupScrollDetect(event) {
	// pokud behem otevreni popupu doslo ke scrollu okna, nastavime popupScrollbarClicked
	// a pri pristim popupDocumentMouseUp tento klik ignorujeme
	popupScrollbarClicked = true;
}

/**
* 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("mouseup",popupDocumentMouseUp);
    $(document).unbind("keydown", popupDocumentKeyDown);
    $(document).unbind("scroll",popupScrollDetect);
    $(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('');
    activePopup = null;
    activePopupOpener = null;
}

/***********************
* funkce pro CtlPopupCombo, CtlPopupListbox
* pozn. 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,mainctlid,popupcontentid,aligntoid,aligndirection,offsetx,offsety,showdelay,hidedelay,effect) {
	// funkce pro otevreni popupComba. Vola se jen jednou, otevira se s vychozi ajaxhref
	var openerobj = document.getElementById(mainctlid);
	var maindiv = document.getElementById(mainctlid+'_div');
	popupOpenClick(maindiv,popupcontentid,aligntoid,aligndirection,offsetx,offsety,showdelay,hidedelay,effect);
	var href = basehref;
	if(openerobj.tagName=='INPUT' || openerobj.tagName=='SELECT') {
		// k adrese pridame aktualni selected, aby bylo mozne vysvitit aktualni polozku
		// - kontrola na input/select je kvuli popupcombobutton (tem neni predavani aktualni hodnoty buttonu zadouci)
		 href = href + '&selected=' + urlencode(openerobj.value); 
	}
	$('#'+popupcontentid).load(href,null,function () {$('#'+popupcontentid+' input:text:first').focus();$('#'+popupcontentid+' input:text:first').focus();});
}

function popupListboxOpen(basehref,popupcontentid) {
	$('#'+popupcontentid).load(basehref,null,function () {focusFirstField();});
}

var popupComboReloading = false;
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
	if(popupComboReloading == true) return false;
	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 37: { // sipka doleva - preskocime naseptavac
			return true;
		}
		case 39: { // sipka doprava - preskocime naseptavac
			return true;
		}
		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 popupListboxKeyDown(ctlid,basehref,filtercolumn,whisperdelay,e) {
	// funkce se vola na pres onkeydown na searchfieldu (onkeydown = "return popupComboKeyDown(event)";
	// - odchytava akce pro sipky nahoru, dolu - vzdycky rovnou provede select akci
	var active = $('#'+ctlid+'_popup .popupComboSelected');
	switch(e.keyCode) {
		case 40: { // sipka dolu - navigace v listboxu
			if(active.length==0) {
				// zatim nic nezvoleno - vybereme prvni polozku
				$('#'+ctlid+'_popup tbody tr')[0].setAttribute('class','popupComboSelected');
				$('#'+ctlid+'_popup tbody tr')[0].onclick();
			} else {
				var next = $('#'+ctlid+'_popup .popupComboSelected + tr');
				if(next.length>0) {
					next[0].setAttribute('class','popupComboSelected');
					next[0].onclick();
					active[0].setAttribute('class','clsHoverHighlight');
				}
			}
			return false;
		}
		case 38: { // sipka nahoru - navigace v listboxu
			if(active.length>0 && active.prev().length>0) {
				active.prev()[0].setAttribute('class','popupComboSelected');
				active.prev()[0].onclick();
				active[0].setAttribute('class','clsHoverHighlight');
			}
			return false;
		}
		case 37: { // sipka doleva - preskocime naseptavac
			return true;
		}
		case 39: { // sipka doprava - preskocime naseptavac
			return true;
		}
		case 13: { // enter - klavesu ignorujeme
			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
	popupComboReloading = true;
	var href = basehref+'&filtercolumn='+filtercolumn+'&filtervalue='+urlencode(document.getElementById(ctlid+'_filter').value);
	$('#'+ctlid+'_popup').load(href,function() {$('#'+ctlid+'_popup input:text:first').focus();$('#'+ctlid+'_popup input:text:first').focus(); popupComboReloading=false;});
}

/***********************
* funkce pro VYBER ZAZNAMU (selectitemfunction) pro CtlPopupCombo, CtlPopupListbox, CtlRelationPicker
************************/

/**
* nastavi hlavni prvek (combo) na predanou value/caption
* a zavre popup
*/
function popupComboSaveClose(ctlid,value,caption) {
	$mainctl = $('#'+ctlid);
	$mainctl.html("<option value='"+value+"' selected>"+caption+"</option>");
	popupHide();
	$mainctl.focus();
}

/**
* nastavi hlavni prvek (displayedfield a hiddenfield) na predanou value/caption
*/
function popupListboxSelect(ctlid,value,caption) {
	$('#'+ctlid+'_caption').html(caption);
	$('#'+ctlid).val(value);
	$('#'+ctlid+'_popup tr.popupComboSelected').attr('class','clsHoverHighlight'); // zrusime pripadnou radku vybranou pomoci sipek
	$('#'+ctlid+'_filter').focus();
}

/**
* provadi select polozky CtlPopupListboxu s $multiple=true,
* - "zaskrtava jednotlive radky" (zobrazuje tucne)
*/
function popupListboxMultipleSelect(ctlid,value,caption) {
	if($('input#'+ctlid+'_selected_'+value).size()==0) {
		// A) polozka zatim neni vybrana, pridavame ji
		$("<input type=\"hidden\" id=\""+ctlid+"_selected_"+value+"\" name=\""+ctlid+"[]\" value=\""+value+"\" autocomplete=\"off\">").appendTo($('#'+ctlid+'_captiondiv'));
		// predmetnou radku oznacime tucne
		$('#'+ctlid+'_row_'+value+' td').css('font-weight','bold');
		// zaskrtneme rowcheckbox
		document.getElementById(ctlid+'_rowcheck_'+value).checked=true;
		// aktualizujeme 'Vybrano X polozek' v zahlavi
		if($('#'+ctlid+'_selectedcount').size()==1) {
			$('#'+ctlid+'_selectedcount').html(parseInt($('#'+ctlid+'_selectedcount').html())+1);
			//$('#'+ctlid+'_selectedcount').html($('#'+ctlid+'_captiondiv input[value!=]').size());
		}
	} else {
		// B) polozka uz je vybrana, odebirame ji
		// zrusime HIDDEDFIELD odpovidajici polozce z popupListboxCaption
		$("input#"+ctlid+"_selected_"+value).remove();
		// zrusime oznaceni prislusne radky v popupu
		$('#'+ctlid+'_row_'+value+' td').css('font-weight','normal');
		// odskrtneme rowcheckbox
		document.getElementById(ctlid+'_rowcheck_'+value).checked=false;
		// aktualizujeme 'Vybrano X polozek' v zahlavi
		if($('#'+ctlid+'_selectedcount').size()==1) {
			$('#'+ctlid+'_selectedcount').html(parseInt($('#'+ctlid+'_selectedcount').html())-1);
			//$('#'+ctlid+'_selectedcount').html($('#'+ctlid+'_captiondiv input[value!=]').size());
		}
	}
}

/**
* zarizuje vyber/zruseni polozky CtlRelationPicker
* (pridavani/odebirani polozky z oblasti ctlid_caption)
*/
function relationPickerSelect(ctlid,value,caption) {
	// provadi select polozky multiple listboxu formou,
	// kdy pridava zvolene polozky do zvlast seznamu (jako v aktivitach)
	if($('#'+ctlid+'_selected_'+value).size()==0) {
		//$('#'+ctlid+'_nothingselected').hide();
		// pridame aktualni polozku do popupListboxCaption (vcetne hiddenfieldu s hodnotou)
		$("<span class=\"item\" id=\""+ctlid+"_selected_"+value+"\" onclick=\"relationPickerSelect('"+ctlid+"','"+value+"','"+caption+"')\">"+caption+"<input type=\"hidden\" name=\""+ctlid+"[]\" value=\""+value+"\"></span>").appendTo($('#'+ctlid));
		$('#'+ctlid+'_row_'+value+' td').css('font-weight','bold');
		//$('#'+ctlid+'_row_'+value).hide();
		
	} else {
		// B) polozka uz je vybrana
		// zrusime polozku z popupListboxCaption (vcetne hiddenfieldu s hodnotou)
		$("#"+ctlid+"_selected_"+value).remove();
		$('#'+ctlid+'_row_'+value+' td').css('font-weight','normal');
		// pokud jsme tim odstranili vsechny dosavadne vybrane polozky,
		//     obnovime pripadnou polozku '-nic nevybrano-'
		//if($('#'+ctlid+'_caption input').size()==0) {
		//	$('#'+ctlid+'_nothingselected').show();
		//}
	}
}

/************************
* funkce pro hlidani zmenenych dat pri opusteni stranky
* pouziva se na Edit a Add Formularich (vola se z RenderChangeWatcher v AutoFormEdit)
* - vraci hlasku (message), ktera se zacleni do standardniho onunload dialogu,
*   nebo false (normalne se pokracuje)
* pozn. standardni podoba onunload dialogu se NEDA nijak obejit, kvuli bezpecnosti. jde jen doplnit zpravu
************************/
function changeWatcherBeforeUnload(checklist,originalData,message,default_changed) {
	if(changeWatcherBypass) return; // changeWatcherBypass je globalni
	if(default_changed==true) {
		// v pripade postbacku je default_changed nastaveno na true
		// (uzivatel zmeny provedl uz driv, ale puvodni data jsou ted prepsana reloadem, tak dame changewatcheru vedet timto zpusobem)
		changed = true;
	} else {
		changed = false;
		$.each(checklist,function(index) {
			if($('#'+checklist[index]).val()!== undefined) {
				if($('#'+checklist[index]).attr('type')!='textarea') {
					if(originalData[index] != $('#'+checklist[index]).val()) { changed = true; }
				} else {
					if(isdefined('tinyMCE') && tinyMCE.get(checklist[index])){
						if(tinyMCE.get(checklist[index]).isDirty()) { changed = true; }
					} else {
						if(originalData[index] != $('#'+checklist[index]).val()) { changed = true; }
					}
				}
			}
		});
	}
	if(changed) return message;
	else return;
}

function changeWatcherDisable() {
	changeWatcherBypass = true;
}
function changeWatcherEnable() {
	changeWatcherBypass = false;
}


/***********************
* konec
************************/

