hex_mouseout = function (e) {
  if (GAME_STATE == GS_NORMAL) {
    if (this.state == HEX_ON) this.set_state(HEX_OFF);
  }
};


hex_mousemove = function (e) {
  if (!e) e = window.event;
  var x = e.layerX || e.offsetX;
  var y = e.layerY || e.offsetY;

  if (!in_hex(x,y)) {
    this.set_state(HEX_DROP);
    return;
  }

  this.set_state(HEX_ON);
  for (var j = 0; j < this.set.length; j++)
    if (this.set[j] != this) this.set[j].set_state(HEX_OFF);

  if (GAME_STATE == GS_NORMAL) {
    // nothing!
  }
  else if (GAME_STATE == GS_ADDROAD) {
    var h = get_hexant(x,y);
    var left, top, kind;
    switch (h) {
      case 0: left = -ROAD_W/2; top = 1; kind = "pos"; break;
      case 1: left = HEX_SIDE/2-1; top = -ROAD_W/2+1; kind = "flat"; break;
      case 2: left = HEX_SIDE*3/2 - ROAD_W/2; top = 0; kind = "neg"; break;
      case 3: left = HEX_SIDE*3/2 - ROAD_W/2; top = HEX_SIDE*SQRT_3/2 - 1; kind = "pos"; break;
      case 4: left = HEX_SIDE/2-1; top = HEX_SIDE*SQRT_3 - ROAD_W/2 + 1; kind = "flat"; break;
      case 5: left = -ROAD_W/2; top = HEX_SIDE*SQRT_3/2 - ROAD_W/2 + 2; kind = "neg"; break;
    }

    if (can_place_road(this, h)) {
      BOARD.new_road.src = "img/road-" + BOARD.new_road.color + "-" + kind + ".png";
      BOARD.new_road.style.left = parseInt(this.style.left) + left + "px";
      BOARD.new_road.style.top = parseInt(this.style.top) + top + "px";
      BOARD.new_road.hex = this;
      BOARD.new_road.side = h;
      BOARD.new_road.style.visibility = 'visible';
      BOARD.new_road.ok = true;
    }
    else {
      BOARD.new_road.style.visibility = 'hidden';
      BOARD.new_road.ok = false;
    }
  }
  else if (GAME_STATE == GS_ADDSETT) {
    var v = get_vertex(x,y);
    var left, top;

    switch (v) {
      case 0: left = HEX_SIDE/2 - SETT_W/2 - 2; top = -2*SETT_H/3; break;
      case 1: left = HEX_SIDE*3/2 - SETT_W/2 + 2; top = -2*SETT_H/3; break;
      case 2: left = HEX_SIDE*2 - SETT_W/2 - 2; top = HEX_SIDE*SQRT_3/2 - 2*SETT_H/3; break;
      case 3: left = HEX_SIDE*3/2 - SETT_W/2 + 2; top = HEX_SIDE*SQRT_3 - 2*SETT_H/3; break;
      case 4: left = HEX_SIDE/2 - SETT_W/2 - 2; top = HEX_SIDE*SQRT_3 - 2*SETT_H/3; break;
      case 5: left = -SETT_W/2 + 1; top = HEX_SIDE*SQRT_3/2 - 2*SETT_H/3 + 2; break;
    }

    if (can_place_sett(this, v)) {
      BOARD.new_sett.src = "img/sett-" + BOARD.new_sett.color + ".png";
      BOARD.new_sett.style.left = (parseInt(this.style.left) + parseInt(left)) + "px";
      BOARD.new_sett.style.top = (parseInt(this.style.top) + parseInt(top)) + "px";
      BOARD.new_sett.hex = this;
      BOARD.new_sett.vertex = v;
      BOARD.new_sett.style.visibility = 'visible';
      BOARD.new_sett.ok = true;
    }
    else {
      BOARD.new_sett.style.visibility = 'hidden';
      BOARD.new_sett.ok = false;
    }
  }
  else if (GAME_STATE == GS_ADDCITY) {
    var v = get_vertex(x,y);
    var left, top;

    switch (v) {
      case 0: left = HEX_SIDE/2 - CITY_W/2 - 2; top = -2*CITY_H/3; break;
      case 1: left = HEX_SIDE*3/2 - CITY_W/2 + 2; top = -2*CITY_H/3; break;
      case 2: left = HEX_SIDE*2 - CITY_W/2 - 2; top = HEX_SIDE*SQRT_3/2 - 2*CITY_H/3; break;
      case 3: left = HEX_SIDE*3/2 - CITY_W/2 + 2; top = HEX_SIDE*SQRT_3 - 2*CITY_H/3; break;
      case 4: left = HEX_SIDE/2 - CITY_W/2 - 2; top = HEX_SIDE*SQRT_3 - 2*CITY_H/3; break;
      case 5: left = -CITY_W/2 + 1; top = HEX_SIDE*SQRT_3/2 - 2*CITY_H/3 + 2; break;
    }

    if (can_place_city(this, v)) {
      BOARD.new_city.src = "img/city-" + BOARD.new_city.color + ".png";
      BOARD.new_city.style.left = (parseInt(this.style.left) + parseInt(left)) + "px";
      BOARD.new_city.style.top = (parseInt(this.style.top) + parseInt(top)) + "px";
      BOARD.new_city.hex = this;
      BOARD.new_city.vertex = v;
      BOARD.new_city.style.visibility = 'visible';
      BOARD.new_city.ok = true;
    }
    else {
      BOARD.new_city.style.visibility = 'hidden';
      BOARD.new_city.ok = false;
    }
  }
};


hex_click = function (e) {
  if (!e) e = window.event;
  var x = e.layerX || e.offsetX;
  var y = e.layerY || e.offsetY;

  if (GAME_STATE == GS_NORMAL) {
    hex_describe(this);
  }
  else if (GAME_STATE == GS_ADDROAD) {
    if (BOARD.new_road.ok) save_road();
  }
  else if (GAME_STATE = GS_ADDSETT) {
    if (BOARD.new_sett.ok) save_sett();
  }
  else if (GAME_STATE == GS_ADDCITY) {
    if (BOARD.new_city.ok) save_city();
  }
};


chit_mouseover = function (e) {
  if (!e) e = window.event;
  var x = e.layerX || e.offsetX;
  var y = e.layerY || e.offsetY;

  if (GAME_STATE == GS_NORMAL) {
    this.hex.set_state(HEX_ON);
    for (var j = 0; j < this.hex.set.length; j++) {
      if (this.hex.set[j] != this.hex) this.hex.set[j].set_state(HEX_OFF);
    }
  }
  else if (GAME_STATE == GS_ADDROAD) {
    BOARD.new_road.style.visibility = 'hidden';
    BOARD.new_road.ok = false;
  }
};


chit_click = function (e) {
  if (!e) e = window.event;
  var x = e.layerX || e.offsetX;
  var y = e.layerY || e.offsetY;

  if (GAME_STATE == GS_NORMAL) {
    hex_describe(this.hex);
  }
};


hex_state = function (st) {
  var z, o;

  switch (st) {
    case HEX_ON:
      z = 20;
      o = 1;
      break;

    case HEX_OFF:
      z = 15;
      o = 0.8;
      break;

    case HEX_DROP:
      z = 10;
      o = 0.8;
      break;
  }

  this.state = st;
  this.style.zIndex = z;
  // this.style.opacity = o;
  // this.style.filter = "alpha(opacity=" + (100*o) + ")";
};


hex_describe = function (h) {
  var roll = h.chit ? h.chit.roll : 7;
  alert("Hex #" + h.n + " (roll=" + roll + ") is " + h.res);
};


function place_chit (h_id, c_id) {
  var ldiv = $EL('DIV', '', 'chit');
  var lspan = $EL('SPAN');

  ldiv.hex = BOARD.zones[h_id];
  BOARD.zones[h_id].chit = CHITS[c_id];
  CHITS[c_id].div = ldiv;
  ldiv.style.left = parseInt(BOARD.zones[h_id].style.left) + HEX_SIDE - 13 + "px";
  ldiv.style.top = parseInt(BOARD.zones[h_id].style.top) + HEX_SIDE*SQRT_3/2 - 13 + "px";
  ldiv.style.color = (CHITS[c_id].roll == 6 || CHITS[c_id].roll == 8) ? 'red' : 'black';
  ldiv.onmouseover = chit_mouseover;
  ldiv.onclick = chit_click;

  lspan.appendChild( $TEXT(CHITS[c_id].roll) );
  ldiv.appendChild(lspan);
  BOARD.appendChild(ldiv);
}

