/*
    AUTHOR: Paolo Ardoino [ paolo.ardoino@gmail.com ]
    VERSION: 1.0-rc01
    LICENSE: Creative Commons Attribution-Noncommercial-No Derivative Works 2.5 Italy License
*/
var dictionary = {
    names: ["paul", "lucas", "mark", "antony", "milo", "mike", "john", "jack", "filo", "simon", "andrew", "daniel", "david", "tony", "micheal", "legolas", "leonida", "massimo", "arthur", "giusy", "warwide", "jonny", "motocarota", "hiro", "sonny", "isaac"]
};

var bqobd = {
  ctx: null,
  size: {width: 0, height: 0},
  game_status: false,
  player: {img: null, pos: {x: 0, y: 0}, points: 0},
  enemies: { queue: [], speed_mul: 0.5},

  init: function(ctx, size) {
    bqobd.ctx = ctx;
    bqobd.size = size;
    bqobd.ctx.clear();
    bqobd.ctx.createImage({width: 350, height: 350, src: "images/map.png"});
  }, makeGame: function() {
    bqobd.game_status = true;
    bqobd.ctx.createImage({width: 350, height: 350, src: "images/map.png"});
    bqobd.player.points = 0;
    bqobd.enemies.speed_mul = 0.5;
    bqobd.player.img = bqobd.ctx.createImage({width: 39, height: 43, src: "images/wizard.png"});
    bqobd.player.pos.x = bqobd.size.width / 2 - 18;
    bqobd.player.pos.y = bqobd.size.height / 2 - 21;
    bqobd.enemies.queue = [];
    setTimeout(bqobd.draw, 50);
    setTimeout("bqobd.enemies_make()", 100);
  }, stopGame: function() {
    bqobd.game_status = false;
  }, enemies_make:function() {
    var player = bqobd.player;
    if(bqobd.enemies.queue.length < 5) {
      enemy = {
        pos: {x: 0, y: bqobd.size.height * Math.random()},
        speed: {x: 0, y: 0},
        name: dictionary.names[Math.floor(Math.random() * 100 % dictionary.names.length)],
        img: bqobd.ctx.createImage({width: 35, height: 35, src: "images/enemy.png"}),
        text: null,
        status: 1
      };
      enemy.speed.x = (player.pos.x - enemy.pos.x) / player.pos.x;
      enemy.speed.y = (player.pos.y - enemy.pos.y) / player.pos.y;
      enemy.text = bqobd.ctx.createText({text: enemy.name}).setFont({family: "Helvetica", style: "bold", size: "12pt", rotated: true}).setFill("black");
      enemy.text.setShape({x: enemy.pos.x, y: enemy.pos.y});
      bqobd.enemies.queue.push(enemy);
    }
    if(bqobd.game_status == true) setTimeout("bqobd.enemies_make()", 1000);
  }, draw:function() {
    var player = bqobd.player;
    player.img.setShape({x: player.pos.x, y: player.pos.y});
    var enemies_queue = [];
    for(var t = 0; t < bqobd.enemies.queue.length; t++) {
      enemy = bqobd.enemies.queue[t];
      enemy.pos.x += enemy.speed.x * bqobd.enemies.speed_mul;
      enemy.pos.y += enemy.speed.y * bqobd.enemies.speed_mul;
      if((enemy.pos.x < bqobd.size.width) && (enemy.pos.y < bqobd.size.height) && enemy.status == 1) {
        enemy.img.setShape({x: enemy.pos.x, y: enemy.pos.y});
        enemy.text.setShape({x: enemy.pos.x, y: enemy.pos.y});
        enemies_queue.push(enemy);
      } else {
        if(enemy.status == 1) {
          bqobd.ctx.remove(enemy.img, 1);
          bqobd.ctx.remove(enemy.text, 1);
        } else enemies_queue.push(enemy);
      }
    }
    bqobd.enemies.queue = enemies_queue;

    var player = bqobd.player;
    for(var t = 0; t < bqobd.enemies.queue.length; t++) {
      enemy = bqobd.enemies.queue[t];
      if(enemy.status == 1) {
        if(enemy.pos.x > player.pos.x - 18) {
       	  bqobd.game_status = false;
          var text_game_over = bqobd.ctx.createText({text: "GAME OVER"}).setFont({family: "Helvetica", style: "bold", size: "16pt", rotated: true}).setFill("red");
          text_game_over.setShape({x: 120, y: 100});
        }
      }
    }
    if(bqobd.game_status == true) setTimeout(bqobd.draw, 50);
  }, shot:function() {
    if(bqobd.game_status == false) return;
    var enemy_name = document.getElementById("enemy_name").value;
    for(var t = 0; t < bqobd.enemies.queue.length; t++) {
      enemy = bqobd.enemies.queue[t];
      if(bqobd.enemies.queue[t].name == enemy_name) {
        enemy.img.setShape({width: 35, height: 28, src: "images/enemy_die.png"}),
        enemy.status = 0; 
        bqobd.player.points++;
        document.getElementById("div_game_points").innerHTML = bqobd.player.points;
        bqobd.enemies.speed_mul = 0.5 + bqobd.player.points / 20;
      }
    }
    document.getElementById("enemy_name").value = "";
    setTimeout("bqobd.enemies_clear();", 2000);
  }, enemies_clear: function() {
    var enemies_queue = [];
    for(var t = 0; t < bqobd.enemies.queue.length; t++) {
      enemy = bqobd.enemies.queue[t];
      if(enemy.status == 0) {
        bqobd.ctx.remove(enemy.img, 1);
        bqobd.ctx.remove(enemy.text, 1);
      } else enemies_queue.push(enemy);
    }
    bqobd.enemies.queue = enemies_queue;
  }, key_handler: function(e) {
    var code;
    if (!e) e = window.event;
    if(e.keyCode || e.charCode) {
      if(e.keyCode) code = e.keyCode;
      else code = e.charCode;
      switch(code) {
        case 13:
          bqobd.shot();
          return false;
        default:
          break;
       }
    }
    return false;
  }
};

function init() {
  bqobd.init(ctx, {width: 350, height: 350});
};

window.onload = init;
