lots of caching DOM lookups