﻿/****************************
 *          LAYOUT          *
 ****************************/

var expires;

var savegame = {
	current: 0,
	seal: false,
	player: 28,
	robber: 12,
	leader: 18
};

function save(key, value) {
	if (typeof savegame[key] != 'undefined') {
		savegame[key] = value;
		document.cookie = key + '=' + value + '; expires=' + expires;
		return true;
	}
}

function readCookie() {
	var values = document.cookie.split(/;\s*/);
	
	for (var val in values) {
		var pair = values[val].split(/=/);
		save(pair[0], pair[1]);
	}
	
	sealBroken = savegame.seal;
	player.addHP(savegame.player - player.getHP());
	robber.addHP(savegame.robber - robber.getHP());
	robberLeader.addHP(savegame.leader - robberLeader.getHP());
	
	load(savegame.current);
}

/*
 * Modell eines Charakter-Kastens
 */
function Fighter(obj) {
	var self = this;
	
	var lifebar;
	var message;
	var portrait;
	
	for (e in obj.childNodes) {
		var elem = obj.childNodes[e];
	
		switch (elem.className) {
			case 'portrait':
				portrait = elem;
				break;
			case 'msg':
				message = elem;
				break;
			case 'life':
				for (e2 in elem.childNodes) {
					if (elem.childNodes[e2].nodeName == 'SPAN') {
						lifebar = elem.childNodes[e2];
						break;
					}
				};
				break;
		}
	}
	
	this.hide = function() {
		obj.style.display = 'none';
	};
	
	this.show = function() {
		obj.style.display = 'block';
	};

	this.setMessage = function(str) {
		message.innerHTML = encode(str);
	};

	this.setCharacter = function(char, msg) {
		if (!char.attack) {
			return;
		}

		portrait.style.backgroundImage = 'url("./img/' + char.getImage() + '")';
		lifebar.style.width = (char.getHP() / char.getMaxHP() * 100) + '%';
		
		if (typeof msg != 'undefined') {
			self.setMessage(msg);
		}
		
		self.show();
	};
}
 
var current;
var textCon, linkCon, contentCon;
var leftFight, rightFight;

var motion = false, fading = false;
var pages = [];
var widths = [];
var heights = [];
var rad;
var threshold = Math.PI / 2;
var step = threshold / 8;

/*
 * Kodiert Sonderzeichen als HTML-Entities
 */
function encode(str) {
	var result = "";
	var code;

	for (var i = 0; i < str.length; i++) {
		code = str.charCodeAt(i);
		result += (code < 128) ? str.charAt(i) : '&#' + code + ';';
	}

	return result.replace(/\|/g, '&shy;');
}

/*
 * Wandelt das erste Zeichen eines Strings in eine Initiale um und kodiert den Rest
 */
function capitalize(str) {
	var i = 0;
	var result = str;
	
	for (; i < result.length;) {
		var char = result.charAt(i);
		i++;
		
		if (char >= 'A' && char <= 'Z') {
			result = '<img class="initial" alt="' + char + '" src="./caps/' + char + '.png">' + encode(result.substr(i));
			break;
		}
	}
	
	return result;
}

/*
 * Setzt die Deckkraft eines Elements
 */
function setOpacity(obj, value) {
	if (obj.style) {
		obj.style.opacity = value;
		obj.style.display = 'block';
	}
}

/*
 * Blendet ein Element langsam ein
 */
function fadeIn(obj) {
	if (obj.style) {
		var fadeStep = 0.1;
		var opac = 0;

		setOpacity(obj, opac);
	
		fading = window.setInterval(
			function() {
				opac += fadeStep;
				
				if (opac >= 1) {
					opac = 1;
					window.clearInterval(fading);
					fading = false;
				}
				
				setOpacity(obj, opac);
			},
			50
		);
	}
}

/*
 * Zeigt die Inhalte aus der Datenbank an
 */
function display() {
	fadeIn(contentCon);
}

/*
 * Blättert die rechte Seite von der Mitte bis zum Ende
 */
function foldOut() {
	if (pages[0].width >= widths[0]) {
		pages[0].width = widths[0];
		pages[1].width = widths[1];

		window.clearInterval(motion);
		motion = false;
		display();
	}
	else {
		rad -= step;
		pages[0].width = Math.ceil(widths[0] * Math.cos(rad));
		pages[0].height = heights[0];
	}
}

/*
 * Blättert die rechte Seite vom Anfang bis zur Mitte
 */
function foldIn() {
	if (pages[1].width <= 0) {
		pages[1].width = 0;

		foldOut();
	}
	else {
		rad += step;
		pages[1].width = Math.floor(widths[1] * Math.cos(rad));
		pages[1].height = heights[1];
	}
}

/*
 * Blättert eine Seite weiter
 */
function scrollForward() {
	if (!motion) {
		playSound(scrolling);
		
		contentCon.style.display = "none";
	
		pages[0].width = 0;
		rad = 0;

		motion = window.setInterval(foldIn, 100);
	}
}

/*
 * Lädt die Zeile mit der Nummer id aus der Datenbank
 */
function load(id) {
	var row;

	if (motion || fading) return;

	document.getElementById('pText').className = textCon.className;

	//Spezielle Seite
	if (typeof id == 'object') {
		row = id;
		textCon.className = 'text half';
	}
	//Normale Seite
	else {
		if (typeof id == 'function') {
			id = id();
		}

		/*TODO Temp*/	document.getElementById('debug').value = id;

		current = id;
	
		if (!db[id]) {
			return alert("Datenbank-Fehler bei Zeile " + id);
		}

		//Aktuelle Seite speichern
		save('current', id);
		
		row = db[id];
		textCon.className = 'text normal';
	}

	var links = row.getLinks();
	var linkText = "";

	document.getElementById('pText').innerHTML = textCon.innerHTML;
	document.getElementById('pLinks').innerHTML = linkCon.innerHTML;
	
	textCon.innerHTML = row.getText();

	for (var l in links)  {
		if (links[l].toListItem) {
			linkText += links[l].toListItem() + "\n";
		}
	}
	
	linkCon.innerHTML = linkText;
	leftFight.hide();
	rightFight.hide();
	
	playMusic(intro);	//Important: Before current.process!
	
	if (row.process) {
		row.process();
	}
	
	scrollForward();
}

/*
 * Initialisiert das Skript
 */
function init() {
	//Cookie
	expires = new Date((new Date()).getTime() + 720 * 3600 * 1000).toGMTString();
	
	//HTML-Container
	contentCon = document.getElementById("content");
	textCon = document.getElementById("text");
	linkCon = document.getElementById("links");
	pages[0] = document.getElementById("page_left").firstChild;
	pages[1] = document.getElementById("page_right").firstChild;
	
	//Debugging
	if (window.location.search.toLowerCase().indexOf('debug') !== -1) {
		document.getElementById('debugCon').style.display = 'block';
	}
	
	//Seitenmaße
	widths[0] = pages[0].width;
	heights[0] = pages[0].height;
	widths[1] = pages[1].width;
	heights[1] = pages[1].height;

	//Charakter-Kästen
	leftFight = new Fighter(document.getElementById("fighter_left"));
	rightFight = new Fighter(document.getElementById("fighter_right"));

	//XXX	Naht für IE und Opera maskieren
	if (typeof document.all != 'undefined') {
		contentCon.style.background = "url('./gfx/mask.jpg') center no-repeat";
		linkCon.background = "url('./gfx/mask.jpg') bottom center no-repeat";
	}
	
	//Initialisierungs-Funktionen
	start();
	initSWF();
	initDB();
	
	//Startseite laden
	current = begin;
	load(current);
}
