self-implemented MVC & Observer pattern - no JS DOM libraries