/**
*
* JavaScript knihovna s metodami pro práci s formuláři
*
* @package		sllibs3
* @subpackage	jslibs
* @version		$Id: sl.form.js 8456 2009-04-07 09:57:38Z 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.
*
*/

/// pokud neexistuje jmenný prostor sl. vytvoříme ho
if(!sl) { var sl = {} };

/// definujeme modul a jeho metody
sl.form = {


	/**
	* Otevře v okně předané uri a okno nastaví na požadovanou velikost
	*
	* @param string uri - uri dokumentu se selektorem
	* @param integer width - sirka otevreneho popup okna
	* @param integer height - vyska otevreneho popup okna
	*
	* @todo přemístit jinam - zjistit kam (zřejmě do sl.js)
	*/
	openPopUp: function(uri, _width, _height, _left, _top) {
		/// okno otevřeme jen pokud je zadáno uri
		if(uri) {
			/// pokud nejsou zadány rozměry a poloha nastavíme defaultní
			if(!_width) _width = 760;
			if(!_height) _height = 600;
			if(!_left) _left = 5;
			if(!_top) _top = 5;

			var _window = open(uri, 'popup', 'left=' + _left + ',top=' + _top + ',width=' + _width + ',height=' + _height + ',toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizeable=yes');
			_window.focus();
		}
	},


	/**
	* Přidá novou option do selectu
	*
	* @param string element_id - id formulářového prvku typu select
	* @param string _value - hodnota atributu value pro nový element option
	* @param string _text - text nového elementu option (není-li zadán použije se hodnota)
	* @param document _document objekt dokumentu v němž id hledáme (není-li zadán použije se aktuální document)
	*/
	addOption: function(element_id, _value, _text, _document) {

		/// není-li zadán dokument bereme ho z aktuální kontextu
		if(!_document) _document = document;

		var element = sl.dom.getElement(element_id, _document);

		/// přidání provedeme jen v případě že je zadána hodnota a jde o select
		if(_value && element && element.options) {
			if(!_text) _text = _value;
			try {
				/// předpokládáme funkčnost gecka
				element.options[element.length] = new Option(_text, _value);
			} catch(exception) {
				/// pokud nastala výjimka zkusíme funkčnost IE
				try {
					var option = _document.createElement('OPTION');
					option.value = _value;
					option.text = _text;
					element.options.add(option);
				} catch(IEexception) {}
			}
		}
	},


	/**
	* Odstraní označené hodnoty ze selectu typu multiple
	*
	* @param string element_id - id formulářového prvku typu select multiple
	*/
	removeSelectedOptions: function(element_id) {
		var element = sl.dom.getElement(element_id);
		/// odstranění provedeme jen v případě že jde o select s nějakými options
		if(element && element.length && element.options) {
			for(var i = element.length-1; i>=0; i--) {
				if(element.options[i].selected) {
					element.options[i] = null;
				}
			}
		}
	},


	/**
	* Vrací hodnotu inputu typu datum jako Date
	*
	* @param string input_name jméno inputu typu slFormInputDate
	* @return Date
	*/
	getDateValue: function(input_name) {
		try {
			var year = parseInt(sl.dom.getElement('sl_input_' + input_name + '_year').value);
			var month = parseInt(sl.dom.getElement('sl_input_' + input_name + '_month').value);
			var day = parseInt(sl.dom.getElement('sl_input_' + input_name + '_day').value);
			var date = new Date(year, month-1, day);
			/// pokud se liší zadaný den ode dne v datumu - není datum platné
			/// (např. 31.2.20xx se převede na 3.3.200x)
			if(day != date.getDate()) {
				return null;
			}
			return date;
		} catch(exception) {
			return null;
		}
	},


	/**
	* Nastaví hodnotu z inputu typu slFormInputDate do grafického kalendáře (který je typicky v iframe)
	*
	* @param string date_element_name Jméno inputu typu slFormInputDate
	* @param document _document objekt dokumentu v němž id hledáme (není-li zadán použije se aktuální document)
	* @return void
	*/
	setDateValueToCalendar: function(input_name,_document) {

		try {
			/// není-li zadán dokument bereme ho z aktuální kontextu
			if(!_document) _document = document;

			/// zjistíme datum aktuálně nastavené v kombobobxu
			var selected_date = sl.form.getDateValue(input_name);

			/// načteme prvky formuláře s třídou inCalendarForm
			var calendar_elements =  sl.dom.getElementsByClass('inCalendarForm','form',_document)[0].elements;

			/// nastavíme do formuláře hodnotu pro rok
			calendar_elements['year'].value = selected_date.getFullYear();

			/// zjistíme a zformátujeme hodnotu pro měsíc (je ve formátu 01, 02, ...)
			var month_value = (selected_date.getMonth()+1).toString();
			month_value =  (month_value.length == 1) ? '0' + month_value : month_value;
			/// nastavíme do formuláře hodnotu pro měsíc
			calendar_elements['month'].value = month_value;

			/// zjistíme si jednotlivé buňky tabulky se zobrazenými dny
			var day_cells = sl.dom.getElementsByClass('slCalendarContent','td',_document)
			/// projdeme je
			for (var i=0; i<day_cells.length; i++) {
				/// pokud je obsah buňky shodný s hodnotou zjištěnou z komboboxu
				/// nastavíme mu zvýrazňující css třídu
				if (parseInt(day_cells[i].firstChild.innerHTML) ==  selected_date.getDate() ) {
					sl.dom.addClass(day_cells[i],'today');
				/// pokud nejsou shodné, třídu odstraníme
				} else {
					sl.dom.removeClass(day_cells[i],'today');
				}
			}

			/// opravíme url odkazující na předcházející a následující datum
			var previous = sl.dom.getElementsByClass('slCalendarPrevious','a',_document);
			for (var i=0; i<previous.length; i++) {
				previous[i].href = previous[i].href.replace(/&caldate=[0-9]{4}-[0-9]{2}-[0-9]{2}/,'&caldate='+selected_date.getPreviousMonth().getIsoDate() ) ;
			}
			var next = sl.dom.getElementsByClass('slCalendarNext','a',_document);
			for (var i=0; i<next.length; i++) {
				next[i].href = next[i].href.replace(/&caldate=[0-9]{4}-[0-9]{2}-[0-9]{2}/,'&caldate='+selected_date.getNextMonth().getIsoDate() ) ;
			}

		} catch(exception) {alert (exception)}
	}

}

