/* No reproduction of contents without permission */

var linkBase = location.href;
if (linkBase.indexOf("?") >= 0) {
	linkBase = linkBase.substring(0, linkBase.indexOf("?"));
}
var iconPath = "gfx/icons/";
var maxLevel = 50;
var maxAdditionalAttributePoints = 92;
var classes = new Object();
classes[ 'blademaster' ] = "Schwertmeister";
classes[ 'guardian' ] = "Hueter";
classes[ 'evoker' ] = "Kampfmagier";
classes[ 'summoner' ] = "Beschwoerer";
classes[ 'marksman' ] = "Scharfschuetze";
classes[ 'engineer' ] = "Ingenieur";

var detailNode = null;
var currentSkill = null;

function getSkillNode( id ) {
	return document.getElementById( id );
}

function getAttributeDescriptionNode( id ) {
	var node = document.getElementById( id );
	for ( var i = 2; i < node.childNodes.length; i++ ) {
		if ( 1 == node.childNodes[ i ].nodeType && "description" == node.childNodes[ i ].className ) {
			node = node.childNodes[ i ];
			for ( var i = 1; i < node.childNodes.length; i++ ) {
				if ( 1 == node.childNodes[ i ].nodeType ) {
					var classAttribute = node.childNodes[ i ].className;
					if ( "mid" == classAttribute ) {
						return node.childNodes[ i ];
					}
				}
			}
		}
	}
	return null;
}

function getDetailNode( id ) {
	if ( null == detailNode ) {
		var node = document.getElementById( "skilldetails" );
		for ( var i = 1; i < node.childNodes.length; i++ ) {
			if ( 1 == node.childNodes[ i ].nodeType ) {
				var classAttribute = node.childNodes[ i ].className;
				if ( "mid" == classAttribute ) {
					detailNode = node.childNodes[ i ];
					break;
				}
			}
		}
	}
	return detailNode;
}

function getStatusNode( id ) {
	var statusNode = null;
	var node = document.getElementById( id );
	for ( var i = 2; i < node.childNodes.length; i++ ) {
		if ( 1 == node.childNodes[ i ].nodeType ) {
			var classAttribute = node.childNodes[ i ].className;
			if ( "status" == classAttribute ) {
				statusNode = node.childNodes[ i ];
				break;
			}
		}
	}
	return statusNode;
}

function clearNode( node ) {
	if ( null != node ) {
		while ( 0 < node.childNodes.length ) {
			var child = node.firstChild;
			node.removeChild( child );
		}
	}
}

function fillDetailNode( node, skill ) {
	// name
	var name = document.createElement( "span" );
	name.className = "name";
	name.appendChild( document.createTextNode( skill.name ) );
	node.appendChild( name );
	// group
	if ( '' != skill.group ) {
		var group = document.createElement( "span" );
		group.className = "group";
		group.appendChild( document.createTextNode( "Fähigkeitsgruppen: " + skill.group ) );
		node.appendChild( group );
	}
	// requirements
	var rankRequirement = "";
	if ( 0 < skill.requirements.length ) {
		for ( var i = 0; i < skill.requirements.length; i++ ) {
			var output = skill.requirements[ i ].output();
			if ( "" != output ) {
				var requirement = document.createElement( "span" );
				requirement.className = skill.requirements[ i ].type;
				if ( ! skill.requirements[ i ].complied() ) {
					var rankOutput = skill.requirements[ i ].rankOutput();
					if ( "" != rankOutput ) {
						rankRequirement = rankOutput;
					}
				}
				requirement.innerHTML = output;
				node.appendChild( requirement );
			}
		}
	}
	// constant properties
	if ( 0 < skill.constantProperties.length ) {
		for ( var i = 0; i < skill.constantProperties.length; i++ ) {
			var property = document.createElement( "span" );
			property.className = skill.constantProperties[ i ].type;
			property.innerHTML = skill.constantProperties[ i ].output( skill.rank );
			node.appendChild( property );
		}
	}
	// current rank
	if ( 0 < skill.rank ) {
		var rank = document.createElement( "div" );
		rank.className = "rank";
		rank.appendChild( document.createTextNode( "Jetziger Rang: " + skill.rank + "/" + skill.maxRank ) );
		if ( skill.rank >= skill.maxRank ) {
			rank.appendChild( document.createTextNode( " " ) );
			var max = document.createElement( "span" );
			max.className = "max";
			max.appendChild( document.createTextNode( "(Max)" ) );
			rank.appendChild( max );
		}
		for ( var i = 0; i < skill.variableProperties.length; i++ ) {
			var text = skill.variableProperties[ i ].output( skill.rank );
			if ( '' != text ) {
				var property = document.createElement( "span" );
				property.className = skill.variableProperties[ i ].type;
				property.innerHTML = text;
				rank.appendChild( property );
			}
		}
		node.appendChild( rank );
	}
	// next rank
	if ( skill.rank < skill.maxRank ) {
		var rank = document.createElement( "div" );
		rank.className = "rank";
		rank.appendChild( document.createTextNode( "Nächster Rang: " + ( skill.rank + 1 ) + "/" + skill.maxRank ) );
		if ( "" != rankRequirement ) {
			rank.appendChild( document.createTextNode( " " ) );
			var requirement = document.createElement( "span" );
			requirement.className = "requirement";
			requirement.appendChild( document.createTextNode( "(" + rankRequirement + ")" ) );
			rank.appendChild( requirement );
		}
		for ( var i = 0; i < skill.variableProperties.length; i++ ) {
			var text = skill.variableProperties[ i ].output( skill.rank + 1 );
			if ( '' != text ) {
				var property = document.createElement( "span" );
				property.className = skill.variableProperties[ i ].type;
				property.innerHTML = text;
				rank.appendChild( property );
			}
		}
		node.appendChild( rank );
	}
}

function updateAttribute( id ) {
	var attribute = getCharacter().getAttribute( id );
	var node = document.getElementById( id );
	node.className = "attribute";
	if ( attribute.isIncreasable() ) {
		node.className += " increasable";
	}
	if ( attribute.isDecreasable() ) {
		node.className += " decreasable";
	}
	document.forms[ "attributes" ].elements[ id ].selectedIndex = attribute.value - attribute.defaultValue;
	if ( "accuracy" == id ) {
		updateCritical();
	} else if ( "stamina" == id ) {
		updateHealth();
	} else if ( "willpower" == id ) {
		updatePower();
	}
}

function updateHealth() {
	var character = getCharacter();
	var node = document.getElementById( "maxhealthvalue" );
	clearNode( node );
	node.appendChild( document.createTextNode( character.getHealth() ) );
	node = document.getElementById( "currenthealthvalue" );
	clearNode( node );
	node.appendChild( document.createTextNode( character.getHealth() ) );
	node = document.getElementById( "regenvalue" );
	clearNode( node );
	node.appendChild( document.createTextNode( character.getHealthRegenRate() + "/min" ) );
}

function updatePower() {
	var character = getCharacter();
	var node = document.getElementById( "maxpowervalue" );
	clearNode( node );
	node.appendChild( document.createTextNode( character.getPower() ) );
	node = document.getElementById( "currentpowervalue" );
	clearNode( node );
	node.appendChild( document.createTextNode( character.getPower() ) );
	node = document.getElementById( "rechargevalue" );
	clearNode( node );
	node.appendChild( document.createTextNode( character.getPowerRechargeRate() + "/min" ) );
}

function updateCritical() {
	var character = getCharacter();
	var node = document.getElementById( "critical" );
	for ( var i = 0; i < node.childNodes.length; i++ ) {
		if ( "damagevalue" == node.childNodes[ i ].className ) {
			clearNode( node.childNodes[ i ] );
			node.childNodes[ i ].appendChild( document.createTextNode( character.getCriticalDamage() + "%" ) );
		}
	}
}

function updateSkill( id ) {
	var skill = getCharacter().getSkill( id );
	if ( id == currentSkill ) {
		// update details of current skill
		var node = getDetailNode( id );
		clearNode( node );
		fillDetailNode( node, skill );
	}
	// update status
	var node = getStatusNode( id );
	clearNode( node );
	if ( 0 < skill.rank ) {
		node.appendChild( document.createTextNode( skill.rank + "/" + skill.maxRank ) );
	}
	node = document.getElementById( id );
	node.className = "skill";
	if ( skill.isIncreasable() ) {
		node.className += " increasable";
	}
	if ( skill.isDecreasable() ) {
		node.className += " decreasable";
	}
	if ( 0 < skill.rank ) {
		node.className += " skilled";
	}
}

function updateAttributes() {
	for ( var attributeId in getCharacter().attributes ) {
		updateAttribute( attributeId );
	}
}

function updateSkills() {
	for ( var skillId in getCharacter().skills ) {
		updateSkill( skillId );
	}
}

function updateLink() {
	var params = new Object();
	var character = getCharacter();
	var show = false;

	// character level
	if (character.level < maxLevel ) {
		params[ 'l' ] = character.level;
	}

	// additional attribute points
	if ( character.additionalAttributePoints < maxAdditionalAttributePoints ) {
		params[ 'aa' ] = character.additionalAttributePoints.toString( 32 );
	}

	// attribute values
	var attributeValues = "";
	for ( attributeId in character.attributes ) {
		var attribute = character.getAttribute( attributeId );
		var value = ( attribute.value - attribute.defaultValue );
		if ( value < 32 ) {
			attributeValues += "0";
		}
		attributeValues += value.toString( 32 );
		if ( value > 0 ) {
			show = true;
		}
	}
	if ( show ) {
		params[ 'a' ] = attributeValues;
		show = false;
	}

	// skill ranks
	var skillRanks = "";
	for ( skillId in character.skills ) {
		var skill = character.getSkill( skillId );
		if ( 0 < skill.maxRank ) {
			var value = ( skill.rank - skill.defaultRank );
			skillRanks += value.toString( 16 );
			if ( value > 0 ) {
				show = true;
			}
		}
	}
	if ( show ) {
		params[ 's' ] = skillRanks;
		show = false;
	}

	// update link
	var link = linkBase;
	var first = true;
	for ( name in params ) {
		if ( first ) {
			link += "?" + name + "=" + params[ name ];
			first = false;
		} else {
			link += "&" + name + "=" + params[ name ];
		}
	}
	var node = document.getElementById( "skilltreelink" );
	clearNode( node );
	node.setAttribute( "href", link );
	node.appendChild( document.createTextNode( link ) );
}

function updateAttributePoints() {
	// points
	var pointNode = null;
	var node = document.getElementById( "attributepoints" );
	for ( var i = 1; i < node.childNodes.length; i++ ) {
		if ( 1 == node.childNodes[ i ].nodeType ) {
			if ( "points" == node.childNodes[ i ].className ) {
				pointNode = node.childNodes[ i ];
				break;
			}
		}
	}
	clearNode( pointNode );
	pointNode.appendChild( document.createTextNode( getCharacter().attributePoints ) );
	// attributes
	for ( var attributeId in getCharacter().attributes ) {
		var attribute = getCharacter().getAttribute( attributeId );
		var currentMaxValue = document.forms[ "attributes" ].elements[ attributeId ].options.length + attribute.defaultValue;
		var newMaxValue = attribute.value + getCharacter().attributePoints + 1;
		for ( var i = currentMaxValue; i < newMaxValue; i++ ) {
			var newOption = new Option( i, i, false, false );
			document.forms[ "attributes" ].elements[ attributeId ].options[ i - attribute.defaultValue ] = newOption;
		}
		document.forms[ "attributes" ].elements[ attributeId ].options.length = newMaxValue - attribute.defaultValue;
	}
}

function updateSkillPoints() {
	var pointNode = null;
	var node = document.getElementById( "skilltreepoints" );
	for ( var i = 1; i < node.childNodes.length; i++ ) {
		if ( 1 == node.childNodes[ i ].nodeType ) {
			if ( "points" == node.childNodes[ i ].className ) {
				pointNode = node.childNodes[ i ];
				break;
			}
		}
	}
	clearNode( pointNode );
	pointNode.appendChild( document.createTextNode( getCharacter().skillPoints ) );
}

function showAttributeDescription( attributeId ) {
	var attribute = getCharacter().getAttribute( attributeId );
	var node = getAttributeDescriptionNode( attributeId );
	node.appendChild( document.createTextNode( attribute.description ) );
	node.parentNode.style.visibility = "visible";
}

function hideAttributeDescription( attributeId ) {
	var node = getAttributeDescriptionNode( attributeId );
	clearNode( node );
	node.parentNode.style.visibility = "hidden";
}

function showSkillDetails( skillId ) {
	currentSkill = skillId;
	// fill details with skill informations
	var skill = getCharacter().getSkill( skillId );
	var detailNode = getDetailNode( skillId );
	fillDetailNode( detailNode, skill );
	// position details
	var skillNode = document.getElementById( skillId );
	var top = skillNode.style.top;
	top = top.substring( 0, top.length - 2 );
	var left = skillNode.style.left;
	left = left.substring( 0, left.length - 2 );
	detailNode = detailNode.parentNode;
	if ( 250 > top) {
		top = top - 1 + 45;
		detailNode.style.bottom = "auto";
		detailNode.style.top = top + "px";
	} else {
		top = 614 - top - 52 + 8;
		detailNode.style.top = "auto";
		detailNode.style.bottom = top + "px";
	}
	if ( 330 > left ) {
		if ( "skill" == skillNode.className ) {
			left = left - 1 + 48 + 5;
		} else {
			left = left - 1 + 68 + 5;
		}
		detailNode.style.left = left + "px";
	} else {
		left = left - 297 - 5;
		detailNode.style.left = left + "px";
	}
	// show details
	detailNode.style.visibility = "visible";
}

function hideSkillDetails( skillId ) {
	var node = getDetailNode( skillId );
	clearNode( node );
	currentSkill = null;
	getDetailNode( skillId ).parentNode.style.visibility = "hidden";
}

function increaseAttribute( attributeId ) {
	var attribute = getCharacter().getAttribute( attributeId );
	if ( attribute.isIncreasable() ) {
		attribute.increase();
		if ( 0 == getCharacter().attributePoints ) {
			updateAttributes();
		} else {
			updateAttribute( attributeId );
		}
	}
	updateAttributePoints();
	updateLink();
}

function decreaseAttribute( attributeId ) {
	var attribute = getCharacter().getAttribute( attributeId );
	if ( attribute.isDecreasable() ) {
		attribute.decrease();
		if ( 1 == getCharacter().attributePoints ) {
			updateAttributes();
		} else {
			updateAttribute( attributeId );
		}
	}
	updateAttributePoints();
	updateLink();
}

function changeAttribute( attributeId ) {
	var updateAll = false;
	if ( 0 == getCharacter().attributePoints ) {
		updateAll = true;
	}
	var attribute = getCharacter().getAttribute( attributeId );
	attribute.setValue( document.forms[ "attributes" ].elements[ attributeId ].value );
	if ( updateAll || 0 == getCharacter().attributePoints ) {
		updateAttributes();
	} else {
		updateAttribute( attributeId );
	}
	updateAttributePoints();
	updateLink();
}

function increaseSkill( skillId ) {
	var skill = getCharacter().getSkill( skillId );
	if ( skill.increase() ) {
		if ( 0 == getCharacter().skillPoints ) {
			updateSkills();
		} else {
			updateSkill( skillId );
			for ( var i = 0; i < skill.dependentSkills.length; i++ ) {
				updateSkill( skill.dependentSkills[ i ].id );
			}
			for ( var i = 0; i < skill.requirements.length; i++ ) {
				if ( skill.requirements[ i ] instanceof SkillRequirement ) {
					updateSkill( skill.requirements[ i ].prevSkill.id );
				}
			}
		}
		updateSkillPoints();
		updateLink();
	}
}

function decreaseSkill( skillId ) {
	var skill = getCharacter().getSkill( skillId );
	if ( skill.decrease() ) {
		if ( getCharacter().skillPoints == 1 ) {
			updateSkills();
		} else {
			updateSkill( skillId );
			for ( var i = 0; i < skill.dependentSkills.length; i++ ) {
				updateSkill( skill.dependentSkills[ i ].id );
			}
			for ( var i = 0; i < skill.requirements.length; i++ ) {
				if ( skill.requirements[ i ] instanceof SkillRequirement ) {
					updateSkill( skill.requirements[ i ].prevSkill.id );
				}
			}
		}
		updateSkillPoints();
		updateLink();
	}
}

function setClass() {
	window.location.href = "de-" + document.forms.character.elements.characterclass.value + ".html";
}

function setLevel() {
	var character = getCharacter();
	character.setLevel( document.forms['character'].elements['level'].value );
	document.forms['character'].elements['level'].selectedIndex = character.level - 1;
	updateSkills();
	updateSkillPoints();
	updateAttributes();
	updateAttributePoints();
	updateLink();
}

function setAdditionalAttributePoints() {
	var character = getCharacter();
	character.setAdditionalAttributePoints( document.forms['character'].elements['addattrpoints'].value );
	document.forms['character'].elements['addattrpoints'].selectedIndex = character.additionalAttributePoints;
	updateAttributePoints();
	updateAttributes();
	updateLink();
}

function reset() {
	var character = getCharacter();
	character.level = 1;
	character.skillPoints = 0;
	character.attributePoints = 0;
	for ( var attributeId in character.attributes ) {
		var attribute = character.getAttribute( attributeId );
		attribute.value = attribute.defaultValue;
	}
	for ( var skillId in character.skills ) {
		var skill = character.getSkill( skillId );
		skill.rank = skill.defaultRank;
		// update status
		var node = getStatusNode( skillId );
		clearNode( node );
		if ( 0 < skill.rank ) {
			node.appendChild( document.createTextNode( skill.rank + "/" + skill.maxRank ) );
		}
	}
	document.forms.character.elements.level.value = 1;
	updateAttributes();
	updateAttributePoints();
	updateSkills();
	updateSkillPoints();
	updateLink();
}

function createCharacterPlaner() {
	var charplaner = '';

	// reset, link and language
	charplaner += '<div class="utility"><a class="reset" href="javascript:reset()"></a></div>';

	// character facts
	charplaner += '<form name="character" id="character">';
	charplaner += '<span><input name="name" id="name" type="text" value="' + character.name + '" /></span><br />';
	charplaner += '<label>Klasse</label>';
	charplaner += '<select name="characterclass" id="characterclass" onchange="setClass()">';
	for ( var name in classes ) {
		charplaner += '<option value="' + name + '"';
		if ( character.characterClass == classes[ name ] ) {
			charplaner += ' selected="selected"';
		}
		charplaner += '>' + classes[ name ] + '</option>';
	}
	charplaner += '</select><br />';
	charplaner += '<label>Stufe</label>';
	charplaner += '<select name="level" id="level" onchange="setLevel()">';
	for ( var i = 1; i <= maxLevel; i++ ) {
		charplaner += '<option value="' + i + '"';
		if ( character.level == i ) {
			charplaner += ' selected="selected"';
		}
		charplaner += '>' + i + '</option>';
	}
	charplaner += '</select><br />';
	charplaner += '<label>Zusätzliche Punkte:</label><select name="addattrpoints" onchange="setAdditionalAttributePoints()">';
	for ( var i = 0; i <= maxAdditionalAttributePoints; i++ ) {
		charplaner += '<option value="' + i + '"';
		if ( i == character.additionalAttributePoints ) {
			charplaner += ' selected="selected"';
		}
		charplaner += '>' + i + '</option>';
	}
	charplaner += '</select><br />';
	//charplaner += '<label>Erfahrung</label><br />';
	charplaner += '</form>';

	// skills
	charplaner += '<div class="skilltree"><div class="skills">';
	for ( var id in character.skills ) {
		var skill = character.skills[ id ];
		var style = 'top: ';
		style += ( skill.row >= 8 ) ? 553 : Math.ceil( ( skill.row - 1 ) * 75.5 + 10 );
		style += 'px; left: ';
		style += ( skill.row >= 8 ) ? ( skill.column - 1 ) * 51 + 4 : Math.floor( ( skill.column - 1 ) * 75.6 + 31 );
		style += 'px;';
		charplaner += '<div class="skill' + ( skill.isIncreasable() ? ' increasable' : '' ) + ( skill.isDecreasable() ? ' decreasable' : '' ) + ( skill.rank > 0 ? ' skilled' : '' ) + '" id="' + id + '" style="' + style + '" onmouseover="showSkillDetails(\'' + id + '\')" onmouseout="hideSkillDetails(\'' + id + '\')">';
		charplaner += '<div class="buttons"><a class="increase" href="javascript:increaseSkill(\'' + id + '\')"></a><a class="decrease" href="javascript:decreaseSkill(\'' + id + '\')"></a></div>';
		charplaner += '<img class="icon" src="' + iconPath + id + '.gif" />';
		charplaner += '<div class="status"></div></div>';
	}
	charplaner += '<div id="skilltreepoints">übrige Fähigkeitspunkte: <span class="points"></span></div>';
	charplaner += '<div class="details" id="skilldetails"><div class="top"></div><div class="mid"></div><div class="bottom"></div></div>';
	charplaner += '</div></div>';

	// attributes
	charplaner += '<div class="attributes">';
	charplaner += '<div id="attributepoints">punkte: <span class="points"></span></div>';
	charplaner += '<form name="attributes" id="attributeform">';
	for ( var id in character.attributes ) {
		var attribute = character.attributes[ id ];
		charplaner += '<div id="' + id + '" class="attribute' + ( attribute.isIncreasable() ? ' increasable' : '' ) + ( attribute.isDecreasable() ? ' decreasable' : '' ) + '" onmouseover="showAttributeDescription(\'' + id + '\')" onmouseout="hideAttributeDescription(\'' + id + '\')">';
		charplaner += '<div class="buttons"><a class="decrease" href="javascript:decreaseAttribute(\'' + id + '\')"></a><a class="increase" href="javascript:increaseAttribute(\'' + id + '\')"></a></div>';
		charplaner += '<select class="value" name="' + id + '" onchange="changeAttribute(\'' + id + '\')"><option value="' + attribute.defaultValue + '">' + attribute.defaultValue + '</option></select>';
		charplaner += '<label>' + attribute.name + '</label>';
		charplaner += '<div class="description"><div class="top"></div><div class="mid"></div><div class="bottom"></div></div></div>';
	}
	charplaner += '</form></div>';

	// statistics
	charplaner += '<div class="statistics"><div id="health">';
	charplaner += '<div class="values"><div id="maxhealthvalue"></div><div id="currenthealthvalue"></div></div>';
	charplaner += '<div class="label">Gesundheit<div id="regen">Gesamt-<br />Regeneration: <span id="regenvalue"></span></div></div>';
	charplaner += '</div><div id="power">';
	charplaner += '<div class="values"><div id="maxpowervalue"></div><div id="currentpowervalue"></div></div>';
	charplaner += '<div class="label">Energie<div id="recharge">Gesamt-<br />Aufladung: <span id="rechargevalue"></span></div></div>';
	charplaner += '</div><div id="movement"><div class="value">100</div><div class="label">Bewegungstempo</div></div>';
	charplaner += '<div id="critical">';
	charplaner += '<div class="left">Links</div><div class="right">Rechts</div><br />';
	charplaner += '<div class="chancevalue">1%</div><div class="chancevalue">1%</div><div class="chancelabel">KT-Chance</div>';
	charplaner += '<div class="damagevalue"></div><div class="damagevalue"></div><div class="damagelabel">KT-Schaden</div>';
	charplaner += '</div></div>';

	// additional character information
	/*charplaner += '<div class="additional"><form name="additional"><label>Zus&auml;tzliche Punkte:</label><select name="addattrpoints" onchange="setAdditionalAttributePoints()">';
	for ( var i = 0; i <= maxAdditionalAttributePoints; i++ ) {
		charplaner += '<option value="' + i + '"';
		if ( i == character.additionalAttributePoints ) {
			charplaner += ' selected="selected"';
		}
		charplaner += '>' + i + '</option>';
	}
	charplaner += '</select></form></div>';*/

	// stuff: link, hidden form, print
	charplaner += '<div class="stuff"><div class="inner"><div class="skilltreelink">Link: <a id="skilltreelink" href=""></a></div>';
	charplaner += '<a class="printlink" href="javascript:showPrintVersion()">Druckversion</a></div></div>';

	var charplanerNode = document.getElementById( "charplaner" );
	charplanerNode.className = character.characterClass.toLowerCase() + " charplaner";
	charplanerNode.innerHTML = charplaner;

	// update
	updateAttributePoints();
	updateAttributes();
	updateSkillPoints();
	updateSkills();
	updateLink();
}

function showPrintVersion() {
	var character = getCharacter();
	var printVersion = window.open( "", "", "width=350,height=600,location=no,resizable=yes,scrollbars=yes" );
	printVersion.document.write( "<html><head><title>" + character.characterClass + "</title>" );
	printVersion.document.write( "<style type=\"text/css\">@media print { .noprint { display: none; } }</style>" );
	printVersion.document.write( "</head><body style=\"font-family: Verdana,Arial,serif;font-size: 16px;\">" );
	printVersion.document.write( "<p class=\"noprint\" style=\"text-align: center;\"><a href=\"javascript:window.print()\">Drucken</a></p>" );
	printVersion.document.write( "<h1>" + character.name + "</h1><p>" );
	printVersion.document.write( "<strong>Klasse:</strong> " + character.characterClass + "<br />" );
	printVersion.document.write( "<strong>Stufe:</strong> " + character.level + "<br />" );
	printVersion.document.write( "<strong>übrige Attributspunkte:</strong> " + character.attributePoints + "<br />" );
	printVersion.document.write( "<strong>übrige Fähigkeitspunkte:</strong> " + character.skillPoints + "<br />" );
	printVersion.document.write( "</p><h2>Attribute</h2><p>" );
	for ( var id in character.attributes ) {
		var attribute = character.getAttribute( id );
		printVersion.document.write( "<strong>" + attribute.name + ":</strong> " + attribute.value + "<br />" );
	}
	printVersion.document.write( "</p><h2>Fähigkeiten</h2><p>" );
	for ( id in character.skills ) {
		var skill = character.getSkill( id );
		if ( skill.defaultRank < skill.rank ) {
			printVersion.document.write( "<strong>" + skill.name + ":</strong> " + skill.rank + "/" + skill.maxRank + "<br />" );
		}
	}
	printVersion.document.write( "</p></body></html>" );
	printVersion.document.close();
}

var parameters = new Object();
var query = window.location.search;
if (query.indexOf('?') >= 0) {
	query = query.substr(query.indexOf('?') + 1);
}
var keyValuePairs = query.split('&');
for (var i = 0; i < keyValuePairs.length; i++) {
	var keyValuePair = keyValuePairs[i].split('=');
	if (keyValuePair.length >= 2) {
		parameters[ keyValuePair[0] ] = keyValuePair[1];
	}
}

function getParameter(name, defaultValue) {
	if (typeof parameters[name] == "undefined") {
		return defaultValue;
	}
	return parameters[name];
}

var level = getParameter("l", 50);
var additionalAttributePoints = getParameter("aa", 92);
var skillRankString = getParameter("s", "");
var attributeValueString = getParameter("a", "");
var skillRanks = new Array();
for (var i = 0; i < skillRankString.length; i++) {
	var rank = parseInt(skillRankString.charAt(i), 16);
	if (isNaN(rank)) {
		rank = 0;
	}
	skillRanks[i] = rank;
}
var attributeValues = new Array();
for (var i = 0; i < attributeValueString.length; i++) {
	var value = parseInt(attributeValueString.substr(2*i, 2), 32);
	if (isNaN(value)) {
		value = 0;
	}
	attributeValues[i] = value;
}

function getSkillRank(skillRanks, index) {
	if (skillRanks.length > index) {
		return skillRanks[index];
	}
	return 0;
}

function getAttributeValue(attributeValues, index) {
	if (attributeValues.length > index) {
		return attributeValues[index];
	}
	return 0;
}

createCharacter(level, additionalAttributePoints, skillRanks, attributeValues);
createCharacterPlaner();
