prototype: dom + callbacks