/* -----


   ---- */

/* -----  ----- */

/**
 *
 *
 * @param
 * @return
 */
function dom_ist_knoten ( knoten ) {
    if ( typeof knoten !="object" || knoten==null ) {
        return false;
    }
    return ( knoten.nodeType == 1 );
}

/**
 *
 *
 * @param
 * @param
 *
 * @return
 */
function dom_ist_typ ( knoten, typ ) {
    if ( !dom_ist_knoten(knoten) ) {
        return false;
    }
    if ( typ==false || typ=="" ) {
        return true;
    }
    return ( dom_get_typ(knoten) == typ.toLowerCase() );
}

/**
 *
 *
 * @param
 * @return
 */
function dom_get_typ ( knoten ) {
    if ( !dom_ist_knoten(knoten) ) {
        return false;
    }
    return knoten.nodeName.toLowerCase();
}

/**
 *
 *
 * @param
 * @param
 * @return
 */
function dom_ist_klasse ( knoten, klasse ) {
    if ( !dom_ist_knoten(knoten) ) {
        return false;
    }
    if ( klasse==false || klasse=="" ) {
        return true;
    }
    var istwert = ( knoten.className )
        ? knoten.className
        : knoten.getAttribute("class");
    return ( klasse==istwert );
}

/**
 *
 *
 *
 * @param
 * @return
 */
function dom_get_klasse ( knoten, klasse ) {
    if ( !dom_ist_knoten(knoten) ) {
        return false;
    }
    if ( knoten.className ) {
        return knoten.className;
    }
    var klasse = knoten.getAttribute("class");
    if ( klasse==null ) {
        return false;
    }
    return klasse;
}

/**
 *
 *
 * @param
 * @param
 * @param
 * @return
 */
function dom_hat_attribut ( knoten, attribut, sollwert ) {
    if ( !dom_ist_knoten(knoten) ) {
        return false;
    }
    var istwert = knoten.getAttribute(attribut);
    if ( attribut.toLowerCase()=="class" ) {
        return dom_ist_klasse(knoten,sollwert);
    } else if ( typeof istwert=="string" ) {
        return ( istwert==sollwert );
    } else if ( typeof istwert=="number" ) {
        return ( istwert==eval(sollwert) );
    } else {
        return false;
    }
}

/**
 *
 *
 * @param
 * @param
 *
 *
 *
 *
 *
 *
 * @return
 */
function dom_hat_attribute ( knoten, attribute ) {
    if ( !dom_ist_knoten(knoten) ) {
        return false;
    }
    if ( attribute==false || attribute=="" ) {
        return true;
    }
    if ( typeof attribute == "string" ) {
        var teile = attribute.split("=",2);
        attribute = new Array();
        attribute[teile[0]] = teile[1];
    }
    for ( var attribut in attribute ) {
        var sollwert = attribute[attribut];
        if ( !dom_hat_attribut(knoten,attribut,sollwert) ) {
            return false;
        }
    }
    return true;
}

/**
 *
 */
function dom_get_attribut ( knoten, attribut ) {
    if ( !dom_ist_knoten(knoten) ) {
        return false;
    }
    if ( attribut.toLowerCase()=="class" ) {
        return dom_get_klasse( knoten );
    }
    return knoten.getAttribute( attribut );
}


/**
 *
 */
function dom_get_text ( knoten ) {
    if ( !dom_ist_knoten(knoten) ) {
        return false;
    }
    for ( var i=0; i<knoten.childNodes.length; i++ ) {
        var kind = knoten.childNodes[i];
        if ( kind.nodeType==3 ) {
            alert( kind.nodeValue );
        }
    }
}


/**
 *
 *
 *
 * @param
 * @param
 * @param
 *
 */
function dom_erfuellt ( knoten, typ, attribute ) {
    return ( dom_ist_typ(knoten,typ) && dom_hat_attribute(knoten,attribute) );
}

/* ----- ----- */

/**
 *
 *
 *
 * @param
 * @param
 * @param
 *
 * @param
 *
 *
 * @return
 */
function dom_suche_kind ( knoten, typ, attribute, kindeskinder ) {
    var treffer = new Array();
    var kinder = knoten.childNodes;
    for ( var i=0; i<kinder.length; i++ ) {
        var kind = kinder[i];
        if ( dom_erfuellt( kind, typ, attribute ) ) {
            return kind;
        } else if ( kindeskinder && kind.hasChildNodes() ) {
            var enkel = dom_suche_kinder(kind,typ,attribute,true);
            if ( typeof enkel != "boolean" ) {
                return enkel;
            }
        }
    }
    return false;
}

/**
 *
 *
 *
 * @param
 * @param
 * @param
 *
 * @param
 *
 *
 * @return
 */
function dom_suche_kinder ( knoten, typ, attribute, kindeskinder ) {
    var treffer = new Array();
    var kinder = knoten.childNodes;
    for ( var i=0; i<kinder.length; i++ ) {
        var kind = kinder[i];
        if ( dom_erfuellt( kind, typ, attribute ) ) {
            treffer.push(kind);
        } else if ( kindeskinder && kind.hasChildNodes() ) {
            var enkel = dom_suche_kinder(kind,typ,attribute,true);
            treffer = treffer.concat(enkel);
        }
    }
    return treffer;
}

/**
 *
 *
 *
 * @param
 * @param
 * @param
 *
 * @return
 */
function dom_suche_ahn ( knoten, typ, attribute ) {
    knoten = knoten.parentNode;
    while ( dom_ist_knoten(knoten) ) {
        if ( dom_erfuellt(knoten,typ,attribute) ) {
            return knoten;
        }
        knoten = knoten.parentNode;
    }
    return false;
}

/**
 *
 *
 * @param
 * @param
 *
 * @return
 */
function dom_eingabebereiche ( knoten, hidden ) {
    var liste = new Array();
    if ( hidden ) {
        liste = liste.concat( dom_suche_kinder(knoten,"input","type=hidden",true) );
    }
    liste = liste.concat( dom_suche_kinder(knoten,"input","type=text",true) );
    liste = liste.concat( dom_suche_kinder(knoten,"input","type=checkbox",true) );
    liste = liste.concat( dom_suche_kinder(knoten,"input","type=radio",true) );
    liste = liste.concat( dom_suche_kinder(knoten,"input","type=file",true) );
    liste = liste.concat( dom_suche_kinder(knoten,"textarea","",true) );
    liste = liste.concat( dom_suche_kinder(knoten,"select","",true) );
    return liste;
}

/* -----  ----- */

/**
 *
 */
function dom_setze_attribut ( knoten, attribut, wert ) {
    if ( attribut=="class" ) {
        dom_setze_klasse( knoten, wert );
    }
    knoten.setAttribute( attribut, wert );
}

/**
 *
 */
function dom_setze_klasse ( knoten, klassenname ) {
    if ( typeof knoten.className == "string" ) {
        knoten.className = klassenname;
    } else {
        knoten.setAttribute( "class", klassenname );
    }
}

/**
 *
 */
function dom_entferne_attribut ( knoten, attribut ) {
    knoten.removeAttribute( attribut );
}


/**
 *
 *
 * @param
 */
function dom_knoten_loeschen ( knoten ) {
    knoten.parentNode.removeChild(knoten);
}

/**
 *
 */
function dom_attribut_loeschen ( knoten, attribut ) {
    knoten.removeAttribute(attribut);
}

/* ----- ----- */