/* Wir benutzen var statt const, weil Opera 6 const noch nicht kann. */

/* Anzahl der Richtungen */
var NUM_DIRECTIONS = 4;

/* Konstanten fuer die Richtungen */
var NORTH = 0;
var EAST  = 1;
var SOUTH = 2;
var WEST  = 3;

/* aktueller Zustand */
var currentRoom = null;
var currentDirection = 0;

/* Start: erzeugen und  anzeigen */
function initView() {
  preloadNavigation();
  createMaze();
  updateView();
}

/* Karte erzeugen und initialisieren */
function createMaze() {
  var room = new Array();
  
  room[1] = new Room("01-n", "01-e", "01-s", "01-w", "Im Fahrstuhl.");
  room[2] = new Room("02-n", "02-e", "02-s", "02-w", "Vor dem linken Fahrstuhl.");
  room[3] = new Room("03-n", "03-e", "03-s", "03-w", "Vor dem rechten Fahrstuhl.");
  room[4] = new Room("04-n", "04-e", "04-s", "04-w", "Vor der Nachbarwohnung.");
  room[5] = new Room("05-n", "05-e", "05-s", "05-w", "Zwischen den beiden Wohnungen.");
  room[6] = new Room("06-n", "06-e", "06-s", "06-w", "Vor der Haustür.");
  room[7] = new Room("07-n", "07-e", "07-s", "07-w", "An der Brüstung.");
  room[8] = new Room("08-n", "08-e", "08-s", "08-w", "Direkt hinter der Haustür.");
  room[9] = new Room("09-n", "09-e", "09-s", "09-w", "Im Bad.");
  room[10] = new Room("10-n", "10-e", "10-s", "10-w", "Beim Telefon-Kabelsalat im Flur.");
  room[11] = new Room("11-n", "11-e", "11-s", "11-w", "Vor dem Klo.");
  room[12] = new Room("12-n", "12-e", "12-s", "12-w", "Im Klo.");
  room[13] = new Room("13-n", "13-e", "13-s", "13-w", "In Lauras Zimmer, direkt hinter der Tür.");
  room[14] = new Room("14-n", "14-e", "14-s", "14-w", "In Lauras Zimmer, vor dem Sofa.");
  room[15] = new Room("15-n", "15-e", "15-s", "15-w", "In Lauras Zimmer, zwischen Sofa und Bett.");
  room[16] = new Room("16-n", "16-e", "16-s", "16-w", "In Lauras Zimmer, vor dem Fernseher.");
  room[17] = new Room("17-n", "17-e", "17-s", "17-w", "In Lauras Zimmer, vor dem Schreibtisch.");
  room[18] = new Room("18-n", "18-e", "18-s", "18-w", "Auf dem Balkon.");
  room[19] = new Room("19-n", "19-e", "19-s", "19-w", "Vor der Küche.");
  room[20] = new Room("20-n", "20-e", "20-s", "20-w", "Vor der Spielesammlung im Flur.");
  room[21] = new Room("21-n", "21-e", "21-s", "21-w", "Vor der Bücherregal im Flur.");
  room[22] = new Room("22-n", "22-e", "22-s", "22-w", "Vor dem Kabuff.");
  room[23] = new Room("23-n", "23-e", "23-s", "23-w", "Im Kabuff.");
  room[24] = new Room("24-n", "24-e", "24-s", "24-w", "In Danis Zimmer, direkt hinter der Tür.");
  room[25] = new Room("25-n", "25-e", "25-s", "25-w", "In Danis Zimmer, vor dem Klavier.");
  room[26] = new Room("26-n", "26-e", "26-s", "26-w", "In Danis Zimmer, vor dem Schreibtisch.");
  room[27] = new Room("27-n", "27-e", "27-s", "27-w", "In Danis Zimmer, vor dem Schrank.");
  room[28] = new Room("28-n", "28-e", "28-s", "28-w", "In der Küche, am Geschirrschrank.");
  room[29] = new Room("29-n", "29-e", "29-s", "29-w", "In der Küche, vor dem Kühlschrank.");
  room[30] = new Room("30-n", "30-e", "30-s", "30-w", "In der Küche, vor der Spüle.");
  room[31] = new Room("31-n", "31-e", "31-s", "31-w", "In der Küche, im Kühlschrank.");
  room[32] = new Room("32-n", "32-e", "32-s", "32-w", "In Olis Zimmer, direkt hinter der Tür.");
  room[33] = new Room("33-n", "33-e", "33-s", "33-w", "In Olis Zimmer, vor dem Bücherregal.");
  room[34] = new Room("34-n", "34-e", "34-s", "34-w", "In Olis Zimmer, vor dem Futon.");
  room[35] = new Room("35-n", "35-e", "35-s", "35-w", "In Olis Zimmer, vor dem Schrank.");
  room[36] = new Room("36-n", "36-e", "36-s", "36-w", "In Olis Zimmer, vor dem Schreibtisch.");
  room[37] = new Room("", "37-e", "", "", "Zwischen Brüstung und Erdboden.");
  room[38] = new Room("38-n", "", "", "", "Zwischen Balkon und Erdboden.");

  makeWayY(room[2], room[1]);
  makeWayY(room[6], room[7]);
  makeWayY(room[8], room[6]);
  makeWayY(room[10], room[8]);
  makeWayY(room[11], room[10]);
  makeWayY(room[13], room[11]);
  makeWayY(room[16], room[13]);
  makeWayY(room[15], room[14]);
  makeWayY(room[17], room[16]);
  makeWayY(room[18], room[17]);
  makeWayY(room[38], room[18]);
  makeWayY(room[36], room[35]);
  makeWayY(room[33], room[34]);
  makeWayY(room[32], room[33]);
  makeWayY(room[19], room[32]);
  makeWayY(room[20], room[19]);
  makeWayY(room[21], room[20]);
  makeWayY(room[22], room[21]);
  makeWayY(room[24], room[22]);
  makeWayY(room[25], room[24]);
  makeWayY(room[26], room[27]);
  makeWayY(room[31], room[29]);
  makeWayY(room[29], room[28]);

  makeWayX(room[3], room[2]);
  makeWayX(room[2], room[4]);
  makeWayX(room[4], room[5]);
  makeWayX(room[5], room[6]);
  makeWayX(room[7], room[37]);
  makeWayX(room[9], room[8]);
  makeWayX(room[33], room[36]);
  makeWayX(room[34], room[35]);
  makeWayX(room[12], room[11]);
  makeWayX(room[11], room[19]);
  makeWayX(room[19], room[28]);
  makeWayX(room[29], room[30]);
  makeWayX(room[22], room[23]);
  makeWayX(room[24], room[27]);
  makeWayX(room[25], room[26]);
  makeWayX(room[14], room[13]);
  makeWayX(room[15], room[16]);

  currentRoom = room[1];
  currentDirection = NORTH;
}

/* Konstruktor */
function Room(view0, view1, view2, view3, description) {
  this.description = description;

  this.view = new Array(NUM_DIRECTIONS);

  this.view[NORTH] = expandFileName(view0);
  this.view[EAST]  = expandFileName(view1);
  this.view[SOUTH] = expandFileName(view2);
  this.view[WEST]  = expandFileName(view3);
  
  this.way = new Array(NUM_DIRECTIONS);

  this.way[NORTH] = null;
  this.way[EAST]  = null;
  this.way[SOUTH] = null;
  this.way[WEST]  = null;
}

/* Macht aus nicht-leeren Bildernummern die Filenamen. *
 * Leere Strings bleiben aber leer.                    */
function expandFileName(shortName) {
  if (shortName !== "") { 
    return  "tour/" + shortName + ".jpg";
  } else {
    return "";
  }
}

/* schafft eine Verbindung in Ost-West-Richtung */
function makeWayX(westernRoom, easternRoom) {
  if ((westernRoom !== null) && (easternRoom !== null)) {
    westernRoom.way[EAST] = easternRoom;
    easternRoom.way[WEST] = westernRoom;
  }
}

/* schafft eine Verbindung in Nord-Sued-Richtung */
function makeWayY(northernRoom, southernRoom) {
  if ((northernRoom !== null) && (southernRoom !== null)) {
    northernRoom.way[SOUTH] = southernRoom;
    southernRoom.way[NORTH] = northernRoom;
  }
}

/* Koennen wir uns in diese Richtung drehen? */
function canTurn(direction) {
  return (currentRoom.view[direction] !== "");
}

/* Koennen wir in diese Richtung gehen? */
function canGo(direction) {
  // Ist da ein Weg?
  if (currentRoom.way[direction] !== null) {
    // Und sieht man auch etwas?
    return(currentRoom.way[direction].view[currentDirection] !== "");
  } else {
    return false;
  }
}

/* dreht in die angegebene Richtung, wenn moeglich */
function turnNow(direction) {
  if (canTurn(direction)) {
    currentDirection = direction;
    updateView();
  }
}

/* geht in die angegebene Richtung, wenn moeglich */
function goNow(direction) {
  if (canGo(direction)) {
    currentRoom = currentRoom.way[direction];
    updateView();
  }
}

/* geht vorwaerts */
function goForward() {
  goNow(getForwardDirection());
}

/* geht rueckwaerts */
function goBack() {
  goNow(getBackDirection());
}

/* geht nach links (ohne Drehung) */
function goLeft() {
  // Links- und Rechts-Pfeile sind erst mal ausgeschaltet, weil die zu sehr verwirren
  goNow(getLeftDirection());
}

/* geht nach rechts (ohne Drehung) */
function goRight() {
  // Links- und Rechts-Pfeile sind erst mal ausgeschaltet, weil die zu sehr verwirren
  goNow(getRightDirection());
}

/* dreht um 90 Grad nach links */
function turnLeft() {
  turnNow(getLeftDirection());
}

/* dreht um 90 Grad nach rechts */
function turnRight() {
  turnNow(getRightDirection());
}

/* liefert die Richtung, in die wir schauen */
function getForwardDirection() {
  return currentDirection;
}

/* liefert die Richtung, in die unser Ruecken zeigt */
function getBackDirection() {
  return (currentDirection + (NUM_DIRECTIONS / 2)) % NUM_DIRECTIONS;
}

/* liefert die Richtung, in die wir bei einer Linksdrehung schauen wuerden */
function getLeftDirection() {
  return (currentDirection + (NUM_DIRECTIONS -1 )) % NUM_DIRECTIONS;
}

/* liefert die Richtung, in die wir bei einer Rchtsdrehung schauen wuerden */
function getRightDirection() {
  return (currentDirection + 1) % NUM_DIRECTIONS;
}

/* updatet die komplette Darstellung */
function updateView() {
  showText("Lade Bild ...");
  showImage();
  showDescription();
  styleLinks();
}

/* zeigt die aktuelle Raumbeschreibung an */
function showDescription() {
  showText(currentRoom.description);
}

/* zeigt einen Text an */
function showText(text) {
  var parentNode = document.getElementById("description");

  // unterstuetzen wir die notwendigen Standards?
  if (!(document.createTextNode && parentNode.replaceChild && parentNode.appendChild)) {
    return;
  }

  var newTextNode = document.createTextNode(text);

  if (parentNode.hasChildNodes()) {
    var oldTextNode = parentNode.firstChild;
    parentNode.replaceChild(newTextNode, oldTextNode);
  }
  else {
    parentNode.appendChild(newTextNode);
  }
}

/* zeigt das aktuelle Foto an */
function showImage() {
  if (currentRoom.view[currentDirection] !== "") {
    document.getElementById("view-picture").src = currentRoom.view[currentDirection];
  }
}

/* zeigt die aktuellen Richtungspfeile an */
function styleLinks() {
  document.getElementById("goForward").src = canGo(getForwardDirection()) ? "go-forward.png" : "blank.png";
  document.getElementById("goBack").src    = canGo(getBackDirection())    ? "go-back.png"    : "blank.png";
  // Links- und Rechts-Pfeile sind erst mal ausgeschaltet, weil die zu sehr verwirren
  /*
  document.getElementById("goLeft").src    = canGo(getLeftDirection())    ? "go-left.png"    : "blank.png";
  document.getElementById("goRight").src   = canGo(getRightDirection())   ? "go-right.png"   : "blank.png";
  */
  document.getElementById("turnLeft").src  = canTurn(getLeftDirection())  ? "turn-left.png"  : "blank.png";
  document.getElementById("turnRight").src = canTurn(getRightDirection()) ? "turn-right.png" : "blank.png";
}

/* lädt die Navigationsgrafiken */
function preloadNavigation() {
  showText("Lade Navigationsgrafiken ...");
  
  var pic1 = new Image();
  var pic2 = new Image();
  var pic3 = new Image();
  var pic4 = new Image();
  
  pic1.src = "go-forward.png";
  pic2.src = "go-back.png";
  pic3.src = "turn-left.png";
  pic4.src = "turn-right.png";
}