from xml.dom import minidom

def text_from_node(node):
    t = []
    for c in node.childNodes:
        if c.nodeType == 1:
            t.append(text_from_node(c))
        else:
            t.append(c.nodeValue)
    return ' '.join(t)

class NodeWrapper:
    def __init__(self, window, node):
        self._window = window
        self._node = node

    def __getattr__(self, name):
        if name == 'innerHTML':
            ret =[]
            for c in self._node.childNodes:
                ret.append(c.toxml())
            return ''.join(ret)
        elif name == 'innerText':
            return text_from_node(self._node)
        ret = getattr(self._node, name)
        if isinstance(ret, minidom.Node) or isinstance(ret, minidom.NodeList):
            return NodeWrapper(self._window, ret)
        elif callable(ret):
            return DOMFunctionWrapper(self._window, ret)
        return ret

    def addEventListener(self, name, handler, something):
        self._window.events.append((name, handler, something))


class DOMFunctionWrapper:
    def __init__(self, window, func):
        self._window = window
        self._func = func

    def __call__(self, *args, **kwargs):
        ret = self._func(*args, **kwargs)
        if isinstance(ret, minidom.Node) or isinstance(ret, minidom.NodeList):
            return NodeWrapper(self._window, ret)
        elif callable(ret):
            return DOMFunctionWrapper(self._window, ret)
        return ret


