mediator

by Artem

HTML

<div id="results"></div>
<button id="home">Home</button>
<button id="guest">Guest</button>

JavaScript

'use strict';

/* Colleagues */

var Player = function(name) {
  this.points = 0;
  this.name = name;
};
Player.prototype.play = function() {
  this.points += 1;
  mediator.played();
};

/* ConcreteColleague */

var scoreboard = {

  // element of HTML, which should be updated
  element: document.getElementById('results'),

  // updates the score on the screen
  update: function(score) {
    var i, msg = '';
    for (i in score) {
      if (score.hasOwnProperty(i)) {
        msg += '<p><strong>' + i + '<\/strong>';
        msg += ' ' + score[i];
        msg += '<\/p>';
      }
    }
    this.element.innerHTML = msg;
  }
};

/* ConcreteMediator */

var mediator = {

  // all players
  players: {},

  // initialization
  setup: function() {
    var players = this.players;
    players.home = new Player('Home');
    players.guest = new Player('Guest');
    this.played();
  },

  // updates the score, if someone of the players made the move
  played: function() {
    var players = this.players,
      score = {
        Home: players.home.points,
        Guest: players.guest.points
      };

    scoreboard.update(score);
  },

  // handler of user actions
  keypress: function(e) {
    e = e || window.event; // IE
    if (e.which === 49) { // key "1"
      mediator.players.home.play();
      return;
    }
    if (e.which === 48) { // key "0"
      mediator.players.guest.play();
      return;
    }
    if (e.target.id === 'home') {
      mediator.players.home.play();
      return;
    }
    if (e.target.id === 'guest') {
      mediator.players.guest.play();
      return;
    }
  }
};

/* testing */

var Application = function() {
  this.run = function() {
    // Start!
    mediator.setup();
    window.onkeypress = mediator.keypress;
    window.onclick = mediator.keypress;

    // The game ends after 30 seconds
    //setTimeout(function() {
    //  window.onkeypress = null;
    //  alert('Game over!');
    //}, 30000);
  };
};

var game = new Application();
game.run();