/**
* Soubor s JavaScript funkcemi pro automaticky generované formuláře
*
* @package		sllibs3
* @subpackage	slForm
* @version		$Id: slForm.js 8435 2009-04-06 15:39:58Z filip $
* @encoding		utf-8
* @author		Michal Kouďa <michal.kouda@e4you.cz>
* @copyright	(c) e4you spol. s r.o. 2002-2008, <design@e4you.cz>
*
* Obsah tohoto souboru je majetkem e4you spol. s r.o. Jeho kopírování,
* pozměňování, šíření a jakékoli další využití je možné výhradně
* se souhlasem e4you spol. s r.o.
*
* @see slLib.js - vyžaduje include knihovny slLib.js
*/


/// promenna zachycuji aktualni stav formularovch zalozek
/// pouziva se pri otvirani/zavirani vsech zalozek formulare
var form_is_opened = true;


/// skryje vsechny sekce formulare
/// !!! přejmenovat na sl...  !!!
function hideFormSections() {
	try {
		for(var i=0; i<formSections.length; i++) {
			var obj = getObject(formSections[i]);
			obj.style.height = '0';
			obj.style.display = 'none';
			var tab = getObject(formTabs[i]);
			tab.className = '';
		}
	} catch(error) {
	}
}

/// zobrazi vsechny sekce formulare
/// !!! přejmenovat na sl...  !!!
function showAllFormSections() {
	try {
		if (!form_is_opened) {
			for(var i=0; i<formSections.length; i++) {
				var obj = getObject(formSections[i]);
				obj.style.height = '';
				obj.style.display = 'block';
			}
		form_is_opened = true;
		} else {
			initFormSections();
		}
	} catch(error) {
	}
}

/// zobrazi sekci s indexem sectionIndex
/// !!! přejmenovat na sl...  !!!
function showFormSection(sectionIndex) {
	hideFormSections();
	try {
		var obj = getObject(formSections[sectionIndex]);
		obj.style.height = '';
		obj.style.display = 'block';
		var tab = getObject(formTabs[sectionIndex]);
		tab.className = 'selected';
		form_is_opened = false;
	} catch(error) {
	}
}

/// inicializuje zobrazeni jednotlivych sekci formulare
/// !!! přejmenovat na sl...  !!!
function initFormSections(showAllTabs) {
	/// pokud je nastaveno že se namají zobrazovat všechny taby
	if(showAllTabs === false) {
		/// zobrazíme jen první
		showFormSection(0);
		form_is_opened = false;
	}
	return true;
}

/// funkce inicializuje formular typu slForm
function slInitForm(showAllTabs) {
	showAllTabs = showAllTabs!='undefined' ? showAllTabs : true ;
	initFormSections(showAllTabs);
}

/// funkce nacte nahled do prvku typu photo
/// !!! přejmenovat na sl...  !!!
function setFormPhoto(objname) {
	var img = getObject(objname + 'img');
	var fname = getObject(objname);
	img.src = 'file:///' + fname.value;
}

/// funkce zobrazi nahled obrazku v novem okne
/// !!! přejmenovat na sl...  !!!
function viewFormPhoto(objname) {
	var fname = getObject(objname);
	var imgpath = 'file:///' + fname.value;
	viewFullImg(imgpath);
}


/// !!! přejmenovat na sl...  !!!
function viewFullImg(src) {
	PicWin = window.open('','fullpicture','width=10,height=10,resizable=no,location=no,status=no,scrollbars=no');
	with(PicWin) {
		document.open();
		document.write('<head><title>Plná velikost obrázku</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>');
		document.write('<html><body style="margin: 10px 0 0 0; padding: 0px; text-align:center;">');
		document.write('<a href="javascript: window.close();" title="Zavřít okno"><img src="'+src+'" alt="'+name+'" border="0" onLoad="window.resizeTo(this.width+20,this.height+60); window.innerWidth=this.width+6; window.innerHeight=this.height+40; return true;"/></a>');
		document.write('</body></html>');
		document.close();
		focus();
	};
};



/// funkce označí všechny volby v multi selektu
/// aby se poslaly pri odeslani formulare
/// !!! přejmenovat na sl...  !!!
function selectAllChoices(obj) {
	for(var i=0; i<obj.length; i++) {
		obj.options[i].selected = true;
	}
}

/// funkce, která předá objekt option z jednoho selectu do jiného
/// !!! přejmenovat na sl...  !!!
function adoptOption(selectObject,option) {
	if(runningInGecko) {
		selectObject.options[selectObject.length] = option;
		return true;
	}

	if(selectObject.options.add) {
		newoption = document.createElement('OPTION');
		newoption.text=option.text;
		newoption.value=option.value;
		selectObject.options.add(newoption);
		/// odstraneni z predchoziho selectu
		option.parentElement.options[option.index] = null;
		return true;
	}
	return false;
}

/// !!! přejmenovat na sl...  !!!
function dualMultiselectAddOptions(objectname) {
	var source = getObject('source'+objectname);
	var target = getObject(objectname);
	for(var i = source.length-1; i>=0; i--) {
		if(source.options[i].selected) {
			adoptOption(target,source.options[i]);
		}
	}
}

/// !!! přejmenovat na sl...  !!!
function dualMultiselectRemoveOptions(objectname) {
	source = getObject(objectname);
	target = getObject('source'+objectname);
	for(var i = source.length-1; i>=0; i--) {
		if(source.options[i].selected) {
			adoptOption(target,source.options[i]);
		}
	}
}

/// funkce pro kontrolu spravneho vyplneni pole formulare
/// @todo - nefunguje pro elementy typu date, ktere maji jmeno napr. 'nnnn[field]['year']'
function slFormFieldIsFilled(checked_form, field) {

	var filled = false;
	var field_object = checked_form.elements[field];

	/// pokud nejde primo o prvek formulare (tj je to checkbox nebo
	/// neco podobneho tvoreneho vice inputy)
	if(field_object && field_object.item && field_object.length) {

		/// pokud jde o combobox
		if(field_object.type && (field_object.type == 'select-one')) {
			filled = (field_object.value != '');
		} else {
			/// jde zrejme o radiogroup nebo skupinu checkboxu
			/// projedeme jednotlive inputy a zjistime jestli je alespon jeden
			/// z nich zvolen - bude to asi checked
			for(var j=0; j < field_object.length; j++) {
				if(field_object.item(j).checked) {
					filled = true;
				}
			}
		}
	} else {
		filled = (field_object && field_object.value != '');
	}

	return filled;
}

/// funkce pro kontrolu formulare
/// POZOR na krizeni mezi validated a required pri nastavovani css trid !!!
/// @todo dodelat lokalizaci
function slCheckForm(checkedForm) {

	var errors='';

	with(checkedForm) {

		/// kontrola spravneho formatu poli
		for(var counter=0; counter < validated.length; counter++) {

			var validated_element = slGetElementDetails(validated[counter]);

			/// proste predani hodnoty pole nefunguje napr. pro checkboxy
			/// bylo by vhodne nejak doresit - zatim pouze volame funkci bez parametru
			if (eval('elements[validated[' + counter + ']]')) {
				eval('var element_is_valid = '+ validateFunctions[counter] + '(elements[validated[' + counter + ']].value);');
			} else {
				eval('var element_is_valid = '+ validateFunctions[counter] + '();');
			}

			if(element_is_valid) {
				slRemoveValidatedErrorCssClass(validated_element)
			} else {
				/// z názvu pole odstraníme html tagy
				var field_name = validateTitles[counter].replace(/<[^>]+>/g,'');
				errors = errors + sl.localization.messages.Field + " " + field_name + " " + sl.localization.messages.is_not_properly_filled + " !\n";
				slSetValidatedErrorCssClass(validated_element);
			}
		}

		/// kontrola zadání povinných polí
		for(var counter=0; counter < required.length; counter++) {

			var required_element = slGetElementDetails(required[counter]);

			if(slFormFieldIsFilled(checkedForm, required[counter])) {
				slRemoveRequiredErrorCssClass(required_element)
			} else {
				/// z názvu pole odstraníme html tagy
				var field_name = requiredTitles[counter].replace(/<[^>]+>/g,'');
				errors = errors + sl.localization.messages.Field_is_not_filled + ": " + field_name + " !\n";
				slSetRequiredErrorCssClass(required_element)
			}
		}
	}

	if(errors!='')  {

		alert(sl.localization.messages.Following_errors_occured_while_submiting_form + ":\n" + errors);

		/// nastavime informaci o stavu formulare na zavreny,
		///jinak se bude stridave otevirat a zavirat...
		form_is_opened = false;

		showAllFormSections()
		return false;

	} else {

		return true;

	}
}

/// Nastaví elementu chybovou css třídu pro nezadané inputy
/// (parametr je objekt získaný pomocí funkce slGetElementDetails)
function slSetRequiredErrorCssClass(element) {
	/// změníme bežnou třídu titulku na chybovou
	setCssClass(element.title_id, element.title_css_class.replace('slFormRequiredValue','slFormRequiredErrorValue'));
	/// pokud input ještě nemá nastavenu chybovou třídu přidáme ji
	if(element.input_css_class.indexOf('slFormInputRequiredError') == -1) {
		setCssClass(element.input_id, element.input_css_class + ' slFormInputRequiredError');
	}
}

/// Odstraní z elementu chybovou css třídu pro nezadané inputy
/// (parametr je objekt získaný pomocí funkce slGetElementDetails)
function slRemoveRequiredErrorCssClass(element) {
	setCssClass(element.title_id, element.title_css_class.replace('slFormRequiredErrorValue','slFormRequiredValue'));
	setCssClass(element.input_id, element.input_css_class.replace('slFormInputRequiredError',''));
}

/// Nastaví elementu chybovou css třídu pro nevalidní inputy
/// (parametr je objekt získaný pomocí funkce slGetElementDetails)
function slSetValidatedErrorCssClass(element) {
	/// pokud titulek nemá nastavenu chybovou třídu přidáme ji
	if(element.title_css_class.indexOf('slFormValueError') == -1) {
		setCssClass(element.title_id, element.title_css_class + ' slFormValueError');
	}
	/// pokud input ještě nemá nastavenu chybovou třídu přidáme ji
	if(element.input_css_class.indexOf('slFormInputValueError') == -1) {
		setCssClass(element.input_id, element.input_css_class + ' slFormInputValueError');
	}
}

/// Odstraní z elementu chybovou css třídu pro nevalidní hodnoty
/// (parametr je objekt získaný pomocí funkce slGetElementDetails)
function slRemoveValidatedErrorCssClass(element) {
	setCssClass(element.title_id, element.title_css_class.replace('slFormValueError',''));
	setCssClass(element.input_id, element.input_css_class.replace('slFormInputValueError',''));
}


/// Zjistí informace o elementu formuláře potřebné k nastavení
/// css tříd při validaci formuláře
function slGetElementDetails(element_name) {
	var element = new Object();

	/// zjisteni objektu s textovym popisem inputu
	var title_id = 'sl_label_' + element_name.replace('[','_').replace(']','_').slice(0,-1);
	element.title_id = getObject(title_id);

	/// zjisteni objektu s vlastnim inputem
	var input_id = 'sl_input_' + element_name.replace('[','_').replace(']','_').slice(0,-1);
	element.input_id = getObject(input_id);

	/// zjisteni aktualnich css trid
	element.title_css_class = getCssClass(element.title_id);
	element.input_css_class = getCssClass(element.input_id);

	return element
}

/// funkce starajici se o spravne odeslani formulare
function slFormOnSubmit(submitedForm) {

	/// projdeme vsechny prvky a pro multiple provedeme oznaceni vsech voleb
	/// odkaz na elementy  pomoci promenne submited_form_elements umozni nasobne rychlejsi
	/// pristup k elementum v IE6/7 (16s versus 0.05s) nez pri pouziti submitedForm.elements
	var form_elements = submitedForm.elements;
	var elements_length = form_elements.length;
	for(var counter=0; counter < elements_length; counter++) {
		if(form_elements[counter] && form_elements[counter].type && form_elements[counter].type == 'select-multiple') {
			selectAllChoices(form_elements[counter]);
		}
	}

    var user_function_result = true;

	/// pokusíme se vykonat všechny zaregistované onsubmit handlery
	for(var counter=0; counter < slOnSubmitFunctions.length; counter++) {
		try {
			user_function_result = user_function_result && eval(slOnSubmitFunctions[counter] + '();');
		} catch(error) {}
	}

	/// zjistime jestli je formular spravne vyplnen a vrátíme výsledek
	return user_function_result && slCheckForm(submitedForm);


}

/// Je-li input v poli povinných prvků, vrací jeho index
/// jinak vrací null
function slGetRequiredIndex(input_name) {
	try {
		for (item_index in required) {
			if (required[item_index]==input_name) {
				return item_index;
			}
		}
	} catch (error) {}
	return null;
}

/// Pokud input není v poli povinných prvků přidá ho tam
/// parametry: jmeno elementu, text pro zobrazeni v chybove hlasce
function slSetRequired(input_name, input_title) {
	if (slGetRequiredIndex(input_name) == null) {
		required.push(input_name);
		requiredTitles.push(input_title);
	}
}

/// Pokud je input v poli povinných prvků, odstraní ho
///  z tohoto pole a a zruší chybovou css třídu
function slSetNotRequired(input_name) {
	var input_index = slGetRequiredIndex(input_name);
	if (input_index) {
		required.splice(input_index, 1);
		requiredTitles.splice(input_index, 1);
		slRemoveRequiredErrorCssClass(slGetElementDetails(input_name));
	}
}

/// funkce ktera nastavi vsechny inputy ktere jsou soucasti
/// FormElementDateTime
/// !!! přejmenovat na slSetDateInputState() !!!
function setDateInputState(objectName) {
	myCheckBox = getObject(objectName + '[enabled]');
	myForm = myCheckBox.form
	myForm.elements[objectName + '[year]'].disabled = ! myCheckBox.checked;
	myForm.elements[objectName + '[month]'].disabled = ! myCheckBox.checked;
	myForm.elements[objectName + '[day]'].disabled = ! myCheckBox.checked;
	return true;
}

/// funkce ktera nastavi vsechny inputy ktere jsou soucasti
/// FormElementDateTime
/// !!! přejmenovat na slSetDateTimeInputState() !!!
function setDateTimeInputState(objectName) {
	setDateInputState(objectName);
	myCheckBox = getObject(objectName + '[enabled]');
	myForm = myCheckBox.form
	myForm.elements[objectName + '[hour]'].disabled = ! myCheckBox.checked;
	myForm.elements[objectName + '[minute]'].disabled = ! myCheckBox.checked;
	return true;
}

/// funkce ktera vraci hodnotu inputu typu datum jako Date
/// @deprecated nahrazeno sl.form.getDateValue()
function slGetDateInputValue(object_name) {
	year_select = getObject('sl_input_' + object_name + '_year');
	month_select = getObject('sl_input_' + object_name + '_month');
	day_select = getObject('sl_input_' + object_name + '_day');
	return new Date(parseInt(year_select.value), parseInt(month_select.value)-1, parseInt(day_select.value));
}


/**
* Otevře v popup okně uri a předá mu id elementu s multiselectem
* @param string uri - uri dokumentu se selektorem
* @param string element_id - id elementu select
* @param integer width - sirka otevreneho popup okna
* @param integer height - vyska otevreneho popup okna
*
* @deprecared nahrazeno metodou sl.form.openPopUp
* @todo odstranit
*/
function loadPopUpMultiSelectItems(uri, element_id, width, height) {
	var selectWin = open(escape(uri) + '?element_id='+escape(element_id), 'Selektor', 'left=5,width='+width+',height='+height+',toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizeable=yes');
};



/// funkce pro zapsani hodnot do multiselectu z formulare v popupokne
/// @deprecated nahrazeno metodou sl.form.addOption
/// @todo nahradit v kodu a odstranit
function multiSelectAddOption(elementName,optionValue,optionName) {
	var myElement = window.opener.document.getElementById(elementName);
	var inS=false;

	for(var i=0;i<myElement.length;i++) {
		if(myElement.options[i].value==optionValue) inS=true;
	}

	if(!inS && runningInGecko) {
		myElement.options[myElement.length] = new Option(optionName,optionValue);
	}

	if(!inS && runningInMSIE) {
		newoption = window.opener.document.createElement('OPTION');
		newoption.text=optionName;
		newoption.value=optionValue;
		myElement.options.add(newoption);
	}
};

/// funkce pro vymazani hodnot z multiselectu
/// !!! přejmenovat na sl...  !!!
/// @deprecated nahrazeno metodou sl.form.removeSelectedOptions
/// @todo odtranit
function multiSelectRemoveOptions(objectName) {
	var myElement = getObject(objectName);
	if (checkSelectedOptions(myElement)) {
	   for(var i = myElement.length-1; i>=0; i--) {
			if(myElement.options[i].selected) {
				myElement.options[i] = null;
			}
		}
	}
};

/// funkce, ktera otevre okno na adrese zadane parametrem path a preda hodnoty pro editaci
/// !!! přejmenovat na sl...  !!!
function loadPopUpMultiSelectEditItem(uri, elementname, edit, width, height) {
	var selectWin = open(escape(uri)+'?element='+escape(elementname)+'&edit='+edit,'select','left=5,width='+width+',height='+height+',toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizeable=yes');
};

// funkce ktera kontroluje, kolik je v multiselectu vybrano polozek
// neni-li vybrano nic, ohlasi chybu, jinak vrati pocet vybranych polozek
/// !!! přejmenovat na sl...  !!!
function checkSelectedOptions(myElement) {
	var selected_count = 0;
	for(var i = myElement.length-1; i>=0; i--) {
		if(myElement.options[i].selected) {
			selected_count++;
		}
	}
	if (selected_count==0) {
		alert (sl.localization.messages.To_use_this_button_please_select_item_in_list + '!');
		return false;
	} else {
		return selected_count;
	}

}

/// funkce pro editaci hodnoty z multiselectu v popupokne
/// !!! přejmenovat na sl...  !!!
function multiSelectEditOption(path,objectName) {
	myElement = getObject(objectName);
   selected=checkSelectedOptions(objectName);

   if (selected==1) {
		for(var i=myElement.length-1; i>=0; i--) {
			if(myElement.options[i].selected) {
				oldvalue=myElement.options[i].value;
				myElement.options[i] = null;
				loadPopUpMultiSelectEditItem(path,objectName,oldvalue,600,500);
			}
		}
	} else if (selected>1) {
		alert (sl.localization.messages.Please_select_only_one_item);
	}
};


/// Zobrazí/schová irame s kalendářem
function slToggleCalendar(iframeid) {
	var my_iframe = getObject(iframeid);
	var coordinates = slGetObjectOffset(my_iframe.parentNode);

	if(my_iframe.style.display=='block') {
		my_iframe.style.display='none';
	} else {
		my_iframe.style.display='block';
		var add_offset = runningInMSIE ? my_iframe.parentNode.offsetWidth-15 : my_iframe.parentNode.offsetWidth+2;
		my_iframe.style.left = coordinates.offsetLeft + add_offset + 'px';
		my_iframe.style.top = coordinates.offsetTop + 'px';

		/// zkusíme zjistit z jména iframe jméno formulářového prvku s datumem
		/// a vyplnit zjištěné hodnoty do grafického kalendáře
		try {
			/// zjistíme objekt s dokumentem, obsažený v iframe (IE|Gecko)
			var _document = my_iframe.contentWindow? my_iframe.contentWindow.document: my_iframe.contentDocument;
			sl.form.setDateValueToCalendar(iframeid.match(/(.+)(_iframe)$/)[1],_document );
		} catch (e) {}
	}

}

/// Nastaví/zruší výběr všech checkboxů pro element předaného jména
function slSelectAllCheckboxes(button_object, element_name) {
	var checkboxes = button_object.form.elements[element_name];
	if (checkboxes) {
		for (i=0;i<checkboxes.length;i++) {
			checkboxes[i].checked = !button_object.checked;
		}
		button_object.checked = !button_object.checked;
	}
}

/// vygeneruje řetězec znaků použitelný jako heslo
/// ve vstupnim poils slFormElementPasswd
/// v hesle bude minimalne jedno cislo
function slGeneratePasswd(requested_len) {
	if(requested_len) {
		var passwd_len = requested_len;
	} else {
		try {
			var passwd_len = sl.validator.PASSWORD_MIN_LENGTH;
		} catch(exception) {
			var passwd_len = 10;
		}
	}

	var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789-';
	var numbers = '123456789';
	var number_position = Math.round(Math.random()*(passwd_len-1))
	var result = '';
	for(var i=0; i<passwd_len; i++) {
		if (i == number_position) {
			result += numbers.charAt(Math.round(Math.random()*(numbers.length-1)));
		} else {
			result += chars.charAt(Math.round(Math.random()*(chars.length-1)));
		}
	}
	return result;
}

