var DOM_OK                  =   0;
var DOM_ELEMENT_NEEXISTUJE  =   1;
var DOM_CHYBA_ID_NEDEF      =   2;
var DOM_CHYBA_ELEM_EXIST    =   3;
var DOM_CHYBA_PARAMETRY     =   4;

var DOM_I_HTML_TAG          =   0;
var DOM_I_ID_ELEM           =   1;
var DOM_I_ATRIBUTY          =   2;
var DOM_I_ELEM_NAHRAD       =   3;
var DOM_I_ELEM_OBSAH        =   4;

var DOM_HTMLTAG_VSECHNY     =   -1;


function DOM_existujeHTMLElement(idElement)
{
    if (!DOM_definovanaHodnota(idElement))
    {
        return DOM_CHYBA_ID_NEDEF;
    }
    
    element = document.getElementById(idElement);
    
    if (element != null)
    {
        return element;
    }
    else
    {
        return DOM_ELEMENT_NEEXISTUJE;
    }
}

function DOM_pripojHTMLElement(idRodic, popis)
{
    if (DOM_definovanaHodnota(popis[DOM_I_ID_ELEM]) && 
        DOM_existujeHTMLElement(popis[DOM_I_ID_ELEM]))
    {
        if (popis[DOM_I_ELEM_NAHRAD])
        {
            DOM_zrusHTMLElement(idRodic, popis[DOM_I_ID_ELEM]);
        }
        else
        {
            return DOM_CHYBA_ELEM_EXIST; 
        }
    }
    
    var novyElement = DOM_vytvorHTMLElement(popis);
    document.getElementById(idRodic).appendChild(novyElement);
    
    return DOM_OK;
}

/*  
 *
 * [0] = typ HTML elementu (div, span, td, ...)
 * [1] = id elementu
 * [2] = objekt s atributy. Jméno vlastnosti objektu je jméno atributu a hodnota
 *       je hodnotou. Může to být buď základní datový typ nebo pole. 
 * [3] = řídící příznak pro nahrazování (elementu se stejným jménem)
 * [4] = obsah elementu (buď text nebo pole této struktury)
 *  
 */
function DOM_vytvorHTMLElement(popis)
{
    var element = document.createElement(popis[DOM_I_HTML_TAG]);
    
    if (DOM_definovanaHodnota(popis[DOM_I_ID_ELEM]))
    {
        element.setAttribute("id", popis[DOM_I_ID_ELEM]);
    }
    
    if (DOM_definovanaHodnota(popis[DOM_I_ATRIBUTY]))
    {
        for (nazev in popis[DOM_I_ATRIBUTY])
        {
            var hodnota = '';
        
            if (DOM_je_pole(popis[DOM_I_ATRIBUTY][nazev]))
            {
                hodnota = popis[DOM_I_ATRIBUTY][nazev].join(" ");
            }
            else
            {
                hodnota = popis[DOM_I_ATRIBUTY][nazev];
            }
            
            element.setAttribute(nazev, hodnota);
        }
    }
    
    if (popis[DOM_I_ELEM_OBSAH] != null)
    {
        var obsah = '';
    
        if (!DOM_je_pole(popis[DOM_I_ELEM_OBSAH]))
        {
            // Vytvoříme nový textový element.
            obsah = document.createTextNode(popis[DOM_I_ELEM_OBSAH]);
        }
        else
        {
            obsah = DOM_vytvorHTMLElement(popis[DOM_I_ELEM_OBSAH]);
        }
    
        element.appendChild(obsah);
    }
    
    return element; 
}

function DOM_zrusHTMLElement(idRodic, idElement)
{
    if (DOM_existujeHTMLElement(idElement) != DOM_ELEMENT_NEEXISTUJE)
    {
        document.getElementById(idRodic).removeChild(
            document.getElementById(idElement));
    }
}

function DOM_elementNastavCSSTridu(element_id, jmeno)
{
    document.getElementById(element_id).className += " " + jmeno;
}

function DOM_elementZrusCSSTridu(element_id, jmeno)
{
    //document.getElementById(element_id).className = "";
    
    css_tridy = document.getElementById(element_id).className;
        
    //alert(":" + css_tridy + ":");
        
    css_tridy = css_tridy.replace(jmeno, "");
        
    // Ořízeneme bílé znaky ze začátku řetězce.
    var maska = /^(\s)+/;
    css_tridy = css_tridy.replace(maska, "");
    
    // Ořízeneme bílé znaky z konce řetězce.
    maska = /(\s)+$/;
    css_tridy = css_tridy.replace(maska, "");
    
    // Všechny sekvencce bílých znaků uvnitř nahradíme jednou mezerou.
    maska = /(\s)+/g;
    css_tridy = css_tridy.replace(maska, " ");        
        
    //alert(":" + css_tridy + ":");
        
    document.getElementById(element_id).className = css_tridy;    
}

function DOM_vratElementyPodleAtributu(atributyJmena, atributyHodnoty, htmlTag, rodicId)
{
    if (!DOM_definovanaHodnota(atributyJmena) || 
        !DOM_definovanaHodnota(atributyHodnoty))
    {
        return DOM_CHYBA_PARAMETR;
    }

    atributyJmena = atributyJmena.split(",");
    atributyHodnoty = atributyHodnoty.split(",");
    
    if (atributyJmena.length != atributyHodnoty.length)
    {
        return DOM_CHYBA_PARAMETR;    
    }    

    var rodic = DOM_existujeHTMLElement(rodicId)
    
    if (rodic == DOM_CHYBA_ID_NEDEF || rodic == DOM_ELEMENT_NEEXISTUJE)
    {
        rodic = document.body;
    }
    
    var potomci;
    
    if (DOM_definovanaHodnota(htmlTag) && htmlTag != DOM_HTMLTAG_VSECHNY)
    {
        potomci = rodic.getElementsByTagName(htmlTag);
    }
    else
    {
        potomci = rodic.getElementsByTagName("*");
    }
    
    var elementy = new Array();
    
    for (i = 0; i < potomci.length; i++)
    {
        var vyhovuje = true;
        
        for (j = 0; j < atributyJmena.length; j++)
        {
            if (!DOM_definovanaHodnota(potomci[i].getAttribute(atributyJmena[j])) ||
                potomci[i].getAttribute(atributyJmena[j]).indexOf(atributyHodnoty[j]) == -1)
            {
                vyhovuje = false;
            }        
        }
        
        if (vyhovuje)
        {
            elementy.push(potomci[i]);
        }
    }
    
    return elementy;
    
}

/*****************************************************************************
 * Následující funkce jsou pouze pomocné                                     * 
 *****************************************************************************/
 
function DOM_definovanaHodnota(hodnota)
{
    return (hodnota != "" && hodnota != "undefined" && hodnota != null);
}

function DOM_je_pole(input)
{
    return (typeof (input) == 'object' && (input instanceof Array));
}
