event-driven JavaScript framework