__getElementsByTagNameNSRecursive__ = function(elem, namespaceURI, localName, nodeList) {
    if (elem.nodeType == Node.ELEMENT_NODE || elem.nodeType == Node.DOCUMENT_NODE) {

        if (((elem.namespaceURI == namespaceURI) || (namespaceURI == "*")) &&
            ((elem.localName == localName) || (localName == "*"))) {
            // add matching node to nodeList
            __appendChild__(nodeList, elem);
        }

        // recurse childNodes
        for(var i = 0; i < elem.childNodes.length; i++) {
            nodeList = __getElementsByTagNameNSRecursive__(
                elem.childNodes.item(i), namespaceURI, localName, nodeList);
        }
    }

    return nodeList;
}
@method __getElementsByTagNameNSRecursive__
     implements getElementsByTagName()

@param  elem     : Element  - The element which are checking and then recursing into
@param  namespaceURI : string - the namespace URI of the required node
@param  localName    : string - the local name of the required node
@param  nodeList     : NodeList - The accumulating list of matching nodes

@return : NodeList