/**
*
* JavaScript knihovna s metodami pro práci s DOM
*
* @package		sllibs3
* @subpackage	jslibs
* @version		$Id: sl.dom.js 7845 2009-03-05 09:04:32Z michal $
* @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 = {} };


/**
* Modul pro práci s DOM elementy
*/
sl.dom = {

	/**
	* Vrací DOM element identifikovaný předaným id nebo null pokud takový neexistuje
	*
	* @param string ID hledaného elementu
	* @param document _document objekt dokumentu v němž id hledáme (není-li zadán použije se aktuální document)
	* @return Object
	*/
	getElement: function(element_name, _document) {
		try {
			/// není-li zadán dokument bereme ho z aktuální kontextu
			if(!_document) _document = document;

			if(_document.getElementById) {
				return _document.getElementById(element_name);
			} else if(_document.all) {
				return eval("_document.all['" + element_name + "']");
			}
		} catch(exception) {}
		return null;
	},


	/**
	* Vrací seznam tříd (odělený mezerami) předaného DOM elementu
	*
	* @param Object DOM element jehož třídy chceme zjistit
	* @return string
	*/
	getClass: function(element) {
		try {
			return element.className;
		} catch(exception) {};
		return '';
	},


	/**
	* Vrací true pokud má předaný DOM element danou třídu
	*
	* @param Object DOM element u něhož chceme zjistit má-li danou třídu
	* @param string jméno třídy, kterou na elementu testujeme
	* @return boolean
	*/
	hasClass: function(element, class_name) {
		var all_classes = ' ' + sl.dom.getClass(element) + ' ';
		return (all_classes.indexOf(' ' + class_name + ' ') != -1);
	},


	/**
	* Nastaví předanému DOM elementu danou třídu (ostatní třídy budou zrušeny)
	*
	* @param Object DOM element jemuž chceme třídu nastavit
	* @param string jméno třídy
	*/
	setClass: function(element, class_name) {
		try {
			element.className = class_name;
		} catch(exception) {}
	},


	/**
	* Přidá předanému DOM elementu danou třídu (ostatní třídy budou zachovány)
	*
	* @param Object DOM element jemuž chceme třídu nastavit
	* @param string jméno třídy
	*/
	addClass: function(element, class_name) {
		if(!sl.dom.hasClass(element, class_name)) {
			var new_class_name = sl.dom.getClass(element) + ' ' + class_name;
			sl.dom.setClass(element, new_class_name);
		}
	},


	/**
	* Odebere předanému DOM elementu danou třídu (ostatní třídy budou zachovány)
	*
	* @param Object DOM element jemuž chceme třídu nastavit
	* @param string jméno třídy
	*/
	removeClass: function(element, class_name) {
		if(sl.dom.hasClass(element, class_name)) {
			var new_class_name = sl.dom.getClass(element).replace(new RegExp(class_name),'');
			sl.dom.setClass(element, new_class_name);
		}
	},


	/**
	* Vrací pole DOM elementů, které mají předanou třídu nebo prázdné pole pokud takové neexistují
	*
	* @param string class_name název CSS třídy, kterou mají hledané elementy mít
	* @param string tag_name název HTML elementu na nějž omezíme vyhledávání (není-li zadán prohledáváme všechny HTML elementy)
	* @param document _document objekt dokumentu v němž elementy hledáme (není-li zadán použije se aktuální document)
	* @return Array
	*/
	getElementsByClass: function(class_name, tag_name, _document) {
		try {
			var result = [];

			/// není-li zadán název HTML tagu bereme všechny
			if(!tag_name) tag_name = '*';

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

			/// načteme všechny elementy daného typu
			var _elements = _document.getElementsByTagName(tag_name);
			for(var i=0 ; i<_elements.length ; i++) {
				/// pokud má danou třídu
				if(sl.dom.hasClass(_elements[i], class_name)) {
					/// přidáme ho do výsledku
					result.push(_elements[i]);
				}
			}
			return result;
		} catch(exception) {}
		return null;
	},


	/**
	* Vrací následující DOM element daného typu, nebo null pokud takový neexistuje
	*
	* @param HTMLElement element v dokumentu po němž hledáme následujcí element
	* @param string tag_name název HTML elementu který hledáme
	* @return HTMLElement
	*/
	nextElementAfter: function (element, tag_name) {
		var result = element.nextSibling;
		while(result) {
			if(result.tagName == tag_name.toUpperCase()) {
				return result;
			}
			result = result.nextSibling;
		}
		return null;
	},


	/**
	* Vytvoří xml parser, aplikuje ho na předaná data a vrátí XML DOM objekt
	*
	* @param xml_data string text ve formátu xml
	* @returns object Objekt s xml
	*/
	getXmlDomObjectFromString: function(xml_data) {
		var xml_doc = null;
		/// pokusíme se inicializovat parser pomocí DOM modelu
		try  {
			var parser=new DOMParser();
			xml_doc=parser.parseFromString(xml_data,"text/xml");
		/// pokud se to nepodaří, zkusíme IE model
		} catch(e) {
			try {
				xml_doc=new ActiveXObject("Microsoft.XMLDOM");
				xml_doc.async="false";
				xml_doc.loadXML(xml_data);
			}catch(e) {}
		}
		return xml_doc;
	}

}
