/*
 * $Id: domnode.js 53607 2008-11-11 22:46:26Z kbaxter $
 * $URL: https://build/subversion/DestinationSearch/ds-core-web/tags/ds-core-web-2.0.115/src/main/webapp/js/domnode.js $
 */
function DOMNode(){}

/* find the nearest next previous by node name */
DOMNode.findPrevSibling = function( node, siblingName ) {
    var n = siblingName.toUpperCase();
    for( node = node.previousSibling; node && node.nodeName != n; node = node.previousSibling ) {}
    return node;
};
/* find the nearest next sibling by node name */
DOMNode.findNextSibling = function( node, siblingName ) {
    var n = siblingName.toUpperCase();
    for( node = node.nextSibling; node && node.nodeName != n; node = node.nextSibling ) {}
    return node;
};
/* find the nearest ancestor by node name */
DOMNode.findAncestor = function( node, ancestorName ) {
    var n = ancestorName.toUpperCase();
    for( node = node.parentNode; node && node.nodeName != n; node = node.parentNode) {}
    return node;
};
/* return if the node has the second parameter as an ancestor */
DOMNode.isAncestor = function( node, ancestorNode ) {
    for( node = node.parentNode; node && node != ancestorNode; node = node.parentNode) {}
    if ( node === ancestorNode ) {
        return true;
    } else {
        return false;
    }
};
/* find the nearest ancestor by node name and class */
DOMNode.findAncestorByClass = function( node, ancestorName, clazz ) {
    var n = ancestorName.toUpperCase();
    for( node = node.parentNode; node && ( node.nodeName != n || ! LMI.StyleSheet.isClass( node, clazz ) ); node = node.parentNode ) {}
    return node;
};
/* find the first text node */
DOMNode.findFirstTextChild = function( elem ) {
    var t, n;
    if( ! elem ) {
        return null;
    }
    if( elem.nodeType === 3 ) {
        return elem;
    } else {
        for( n = elem.firstChild; n; n = n.nextSibling ) {
            t = DOMNode.findFirstTextChild( n );
            if( t ) {
                return t;
            }
        }
    }
    return null;
};

DOMNode.truncate = function( elem ) {
    for( ; elem.firstChild; elem.removeChild( elem.firstChild ) ) {}
};

DOMNode.checkAttribute = function( elem, attribute, value ) {
    var attr;
    if( ! elem ) { return false; }
    switch( attribute ) {
        case 'class':
            attr = elem.className;
            break;
        default:
            attr = elem.getAttribute( attribute );
    }
    return ( attr && attr.match( '\\b' + value + '\\b' ) == value );
};

DOMNode.appendAfter = function( newEl, sib ) {
    if( sib.nextSibling ) {
        sib.parentNode.insertBefore( newEl, sib.nextSibling );
    } else {
        sib.parentNode.appendChild( newEl );
    }
};
/**
 * @method getByTagAndClass
 * @deprecated use LMI.Element.getOne or LMI.Element.getAll
 */
DOMNode.getByTagAndClass = function( base, tagname, className ) {
    if( arguments.length < 3 ) { throw( 'DOMNode.getByTagAndClass: insufficient number of arguments' ); }
    return LMI.Lang.filter( base.getElementsByTagName( tagname ),
                ( className
                  ? function( o ) { return LMI.StyleSheet.isClass( o, className ); }
                  : function() { return true; } ) );
};
