// Copyright 2003 Sven Neuhaus <sven@ping.de>. All rights reserved.
// Copyright 2004 Ben Craig and Ryan Stocks. All rights reserved.

var txts = { // texts (for translation)
	// Appears in empty table
	pick_class     : "Choisissez une classe dans la liste ci-dessus",
	// Appears in select box
	pick_class_sel : "Choisissez une classe",
	// Must match "N/A" string in abilities.html include file
	not_applicable : "N/A",
	// Appears in alert popup when you click an ability
	class_ability  : "Classes ayant accès à cette compétence:\n",
	// Alert popup
	no_dom1        : "Votre navigateur ne supporte pas DOM1.\n" +
		"Désolé, cette page ne fonctionnera pas sur votre navigateur.\n" +
		"Veuillez réessayer avec Mozilla, Konqueror 3+, Opera 7+, " +
		"Safari, Galeon, Netscape 6+ or IE 5.5+...",
	// Appears on configurator page if there was no referrer
	no_referrer    : "",
	// Display if foreign referrer is detected (deep linking)
	bad_referrer   : ""
	};

if (!window.Node)
	var Node = {
		ELEMENT_NODE: 1,
		ATTRIBUTE_NODE: 2,
		TEXT_NODE: 3,
		COMMENT_NODE: 8,
		DOCUMENT_NODE: 9,
		DOCUMENT_FRAGMENT_NODE: 11
	};

var realm;
var class_choice;
var abilities = new Object();
var level = 30;
var extra_level = 0;
var used = 0;
var popupw;
var start_time = new Date().getTime();

function realm_change () { 
	var choice = document.getElementById("realm").selectedIndex;
	realm = document.getElementById("realm").options[choice].value;
	create_class_options(realm);
	class_change();
}

function class_change () { 
	var choice = document.getElementById("classes").selectedIndex;
	class_choice = document.getElementById("classes").options[choice].value;
	remove_children(document.getElementById("abtbody"));
	compute_usage();
	var t = document.getElementById("abtbody");

	if (class_choice == "") {
		var tr = document.createElement("tr");
		t.appendChild(tr);	// New row
		var td = document.createElement("td");
		td.colSpan = 5;
		td.setAttribute("text-align", "center");
		var tx = document.createTextNode(txts.pick_class);
		tr.appendChild(td);
		td.appendChild(tx);
		return;
	}

	for (var ability in classes[realm][class_choice]) {
		var tr = document.createElement("tr");
		t.appendChild(tr);	// New row
		tr.appendChild(class_realm_ability(ability));
		tr.appendChild(class_ability_cost(ability));

		var td, tx;

		var ability_level = classes[realm][class_choice][ability]-1;
		if(ability_level == -1)
		{
			for(var i = 0; i<3; ++i)
			{
				td = document.createElement("td");
				tx = document.createTextNode("N/A");
				tr.appendChild(td);
				td.appendChild(tx);
			}	
			continue;
		}

		// Effect
		td = document.createElement("td");
		tx = document.createTextNode(abilities[ability]["Effect"][ability_level]);
		tr.appendChild(td);
		td.appendChild(tx);

		// Duration
		td = document.createElement("td");
		tx = document.createTextNode(abilities[ability]["Duration"][ability_level]);
		tr.appendChild(td);
		td.appendChild(tx);

		// Re-Use Timer
		td = document.createElement("td");
		tx = document.createTextNode(abilities[ability]["Timer"][ability_level]);
		tr.appendChild(td);
		td.appendChild(tx);
	}
}

function class_realm_ability (ability) { // Realm Ability
	var td = document.createElement("td");
	var tx = document.createTextNode(ability);
	if (ability in abilities) {
		td.className = "type_" + abilities[ability]["Type"];
		td.onmouseover = balloon_help;
		td.onmouseout = balloon_help_off;
	} else { // inconsistency
		alert("Error: ability '" + ability + "' missing");
	}
	td.appendChild(tx);	// Text in cell
	return(td);
}

// Levels of individual Abilities
function class_ability_cost (ability) {
	td = document.createElement("td");

	// Special case: level 0
	var zero;
	var num_levels = abilities[ability]["Cost"].length;
	var tx = document.createTextNode("0");
	if (classes[realm][class_choice][ability] == 0 || abilities[ability]["Cost"][0] == 0) {
		var zero = document.createElement("b");
		zero.className = "current";
	} else {
		var zero = document.createElement("a");
		zero.className = "points";
		zero.setAttribute("href", 
			'javascript:set_ability_level("' + ability + '",0)' );
	}
	td.appendChild(zero);
	zero.appendChild(tx);

	// Ability Levels 1-5
	var my_cost = 0;

	for(var i=0; i < num_levels; i++) {
		var abcost = abilities[ability]["Cost"][i];
		if (abcost == 0) break;
		if (classes[realm][class_choice][ability] <= i)
			my_cost += abcost - 0;

		var item;
		if (classes[realm][class_choice][ability]-1 == i) {
			item = document.createElement("b");
			item.className = "current";
		} else if ( check_requirements(ability) && 
				(classes[realm][class_choice][ability] > i ||
				my_cost <= (level + extra_level - used)) ) {
			item = document.createElement("a");
			item.className = "points";
			item.setAttribute("href", 'javascript:set_ability_level("' + 
				ability + '",' + (i+1) + ")" );
			if (my_cost != abcost) // improve this: it's always >= 0
				item.setAttribute("title", "additional cost: " + my_cost);
		} else { // Not enough points
			item = document.createElement("span");
			item.className = "off";
		}
		var tx = document.createTextNode(abcost);
		td.appendChild(item);
		item.appendChild(tx);
	}
	return(td);
}

function check_requirements (ability) {
	return true;
	/*
	var req_ab = abilities[ability]["Req_Skill"];
	if (req_ab == txts.not_applicable) return true;
	var req_lvl = abilities[ability]["Req_Lvl"];
	if (req_ab in classes[realm][class_choice]) {
		if (req_lvl > classes[realm][class_choice][req_ab])
			return false;
		else
			return true;
	} else { // Prerequisite ability missing
		// alert("Prerequisite '"+req_ab+"' for '"+ability+"' missing in list");
		return false;
	}
	*/ //UNDONE: Frontiers RA's have no pre-reqs
}

function set_ability_level (ability, ablevel) {
	//var old = classes[realm][class_choice][ability];
	classes[realm][class_choice][ability] = ablevel;
	/*if (ablevel < old) { // level was reduced, check requirements
		for (var i in abilities) { // look through all abilities
			if (abilities[i]["Req_Skill"] != ability) continue;
			if (abilities[i]["Req_Lvl"] <= ablevel) continue;
			if (i in classes[realm][class_choice]) {
				set_ability_level(i, 0); // recursion, might occur again
			} // else: required skill missing from class (!)
		}
	}*/  //UNDONE: Frontiers RA's have no pre-reqs
	class_change(); // refresh - TWEAKME
}

function compute_usage() {
	used = 0;
	if (class_choice != "") 
	{
		for (var ability in classes[realm][class_choice]) 
		{
			for (var i=0; i < classes[realm][class_choice][ability]; i++) 
			{
				var abcost = abilities[ability]["Cost"][i];
				used += abcost - 0;
			}
		}
	}
	var r = document.getElementById("remaining").firstChild;
	r.data = level + extra_level - used;
	r = document.getElementById("used").firstChild;
	r.data = used;
}

// Compute realm points for a given realm level.
function realmpoints_level (level) {
	var result = new Number(1);
	if(level == 1)
	{
		result = 1;
	}
	//if((level > 1) && (level <= 100))
	//{
		//result = Math.round(25/3 * Math.pow(level,3) - 
			//		 25/2 * Math.pow(level,2) + 
				//	 25/6 * level);
	//}
	if((level >1) && (level <= 120))
	{
		switch(level)
		{
			case 1 : result =  '1 / 1L1';
			break;
			case 2 : result = '25 / 1L2';
			break;
			case 3 : result = '125 / 1L3';
			break;
			case 4 : result = '350 / 1L4';
			break;
			case 5 : result = '750 / 1L5';
			break;
			case 6 : result = '1375 / 1L6';
			break;
			case 7 : result = '2275 / 1L7';
			break;
			case 8 : result = '3500 / 1L8';
			break;
			case 9 : result = '5100 / 1L9';
			break;
			case 10 : result = '7125 / 2L0';
			break;
			case 11 : result = '9625 / 2L1';
			break;
			case 12 : result = '12650 / 2L2';
			break;
			case 13 : result = '16250 / 2L3';
			break;
			case 14 : result = '20475 / 2L4';
			break;
			case 15 : result = '25375 / 2L5';
			break;
			case 16 : result = '31000 / 2L6';
			break;
			case 17 : result = '37400 / 2L7';
			break;
			case 18 : result = '44625 / 2L8';
			break;
			case 19 : result = '52725 / 2L9';
			break;
			case 20 : result = '61750 / 3L0';
			break;
			case 21 : result =  '71750 / 3L1';
			break;
			case 22 : result = '82775 / 3L2';
			break;
			case 23 : result = '94875 / 3L3';
			break;
			case 24 : result = '108100 / 3L4';
			break;
			case 25 : result = '122500 / 3L5';
			break;
			case 26 : result = '138125 / 3L6';
			break;
			case 27 : result = '155025 / 3L7';
			break;
			case 28 : result = '173250 / 3L8';
			break;
			case 29 : result = '192850 / 3L9';
			break;
			case 30 : result = '213875 / 4L0';
			break;
			case 31 : result = '236375 / 4L1';
			break;
			case 32 : result = '260400 / 4L2';
			break;
			case 33 : result = '286000 / 4L3';
			break;
			case 34 : result = '313225 / 4L4';
			break;
			case 35 : result = '342125 / 4L5';
			break;
			case 36 : result = '372750 / 4L6';
			break;
			case 37 : result = '405150 / 4L7';
			break;
			case 38 : result = '439375 / 4L8';
			break;
			case 39 : result = '475475 / 4L9';
			break;
			case 40 : result = '513500 / 5L0';
			break;
			case 41 : result = '553500 / 5L1';
			break;
			case 42 : result = '595525 / 5L2';
			break;
			case 43 : result = '639625 / 5L3';
			break;
			case 44 : result = '685850 / 5L4';
			break;
			case 45 : result = '734250 / 5L5';
			break;
			case 46 : result = '784875 / 5L6';
			break;
			case 47 : result = '837775 / 5L7';
			break;
			case 48 : result = '893000 / 5L8';
			break;
			case 49 : result = '950600 / 5L9';
			break;
			case 50 : result = '1010625 / 6L0';
			break;
			case 51 : result = '1073125 / 6L1';
			break;
			case 52 : result = '1138150 / 6L2';
			break;
			case 53 : result = '1205750 / 6L3';
			break;
			case 54 : result = '1275975 / 6L4';
			break;
			case 55 : result = '1348875 / 6L5';
			break;
			case 56 : result = '1424500 / 6L6';
			break;
			case 57 : result = '1502900 / 6L7';
			break;
			case 58 : result = '1584125 / 6L8';
			break;
			case 59 : result = '1668225 / 6L9';
			break;
			case 60 : result = '1755250 / 7L0';
			break;
			case 61 : result = '1845250 / 7L1';
			break;
			case 62 : result = '1938275 / 7L2';
			break;
			case 63 : result = '2034375 / 7L3';
			break;
			case 64 : result = '2133600 / 7L4';
			break;
			case 65 : result = '2236000 / 7L5';
			break;
			case 66 : result = '2341625 / 7L6';
			break;
			case 67 : result = '2450525 / 7L7';
			break;
			case 68 : result = '2562750 / 7L8';
			break;
			case 69 : result = '2678350 / 7L9';
			break;
			case 70 : result = '2797375 / 8L0';
			break;
			case 71 : result = '2919875 / 8L1';
			break;
			case 72 : result = '3045900 / 8L2';
			break;
			case 73 : result = '3175500 / 8L3';
			break;
			case 74 : result = '3308725 / 8L4';
			break;
			case 75 : result = '3445625 / 8L5';
			break;
			case 76 : result = '3586250 / 8L6';
			break;
			case 77 : result = '3730650 / 8L7';
			break;
			case 78 : result = '3878875 / 8L8';
			break;
			case 79 : result = '4030975 / 8L9';
			break;
			case 80 : result = '4187000 / 9L0';
			break;
			case 81 : result = '4347000 / 9L1';
			break;
			case 82 : result = '4511025 / 9L2';
			break;
			case 83 : result = '4679125 / 9L3';
			break;
			case 84 : result = '4851350 / 9L4';
			break;
			case 85 : result = '5027750 / 9L5';
			break;
			case 86 : result = '5208375 / 9L6';
			break;
			case 87 : result = '5393275 / 9L7';
			break;
			case 88 : result = '5582500 / 9L8';
			break;
			case 89 : result = '5776100 / 9L9';
			break;
			case 90 : result = '5974125 / 10L0';
			break;
			case 91 : result = '6176625 / 10L1';
			break;
			case 92 : result = '6383650 / 10L2';
			break;
			case 93 : result = '6595250 / 10L3';
			break;
			case 94 : result = '6811475 / 10L4';
			break;
			case 95 : result = '7032375 / 10L5';
			break;
			case 96 : result = '7258000 / 10L6';
			break;
			case 97 : result = '7488400 / 10L7';
			break;
			case 98 : result = '7723625 / 10L8';
			break;
			case 99 : result = '7963725 / 10L9';
			break;
			case 100 : result = '8208750 / 11L0';
			break;
			case 101 : result =  '9111713 / 11L1';
			break;
			case 102 : result = '10114001 / 11L2';
			break;
			case 103 : result = '11226541 / 11L3';
			break;
			case 104 : result = '12461460 / 11L4';
			break;
			case 105 : result = '13832221 / 11L5';
			break;
			case 106 : result = '15353765 / 11L6';
			break;
			case 107 : result = '17042680 / 11L7';
			break;
			case 108 : result = '18917374 / 11L8';
			break;
			case 109 : result = '20998286 / 11L9';
			break;
			case 110 : result = '23308097 / 12L0';
			break;
			case 111 : result = '25871988 / 12L1';
			break;
			case 112 : result = '28717906 / 12L2';
			break;
			case 113 : result = '31876876 / 12L3';
			break;
			case 114 : result = '35383333 / 12L4';
			break;
			case 115 : result = '39275499 / 12L5';
			break;
			case 116 : result = '43595804 / 12L6';
			break;
			case 117 : result = '48391343 / 12L7';
			break;
			case 118 : result = '53714390 / 12L8';
			break;
			case 119 : result = '59622973 / 12L9';
			break;
			case 120 : result = '66181501 / 13L0';
			break;
		}
		
		}
	return result;
}

function coop_level_change () {
	extra_level = parseInt(document.getElementById("coop").value);
	if (isNaN(extra_level)) extra_level = 0;
	if (extra_level > 31) extra_level = 31;
	if (extra_level < 0) extra_level = 0;
	document.getElementById("coop").value = extra_level;
	var r = document.getElementById("remaining").firstChild;
	r.data = level + extra_level - used;

	class_change(); // refresh available levels - TWEAKME
}

function level_change (x) { 
	if (x == 0) { // manual input field change
		level = parseInt(document.getElementById("level").value);
		if (isNaN(level)) level = 0;
	} else {
		level += x - 0;
	}
	if (level > 120) level = 120;
	if (level < 0) level = 0;
	document.getElementById("level").value = level;
	var r = document.getElementById("remaining").firstChild;
	r.data = level + extra_level - used;

	document.getElementById("rp").firstChild.data = realmpoints_level(level);

	class_change(); // refresh available levels - TWEAKME
}

function create_class_options (realm) {
	var cls = document.getElementById("classes");
	cls.length = 0;
	var count = 0;
	var opt = new Option(txts.pick_class_sel, "");
	cls.options[count++] = opt;
	for (var i in classes[realm]) {
		opt = new Option(i,i);
		cls.options[count++] = opt;
	}
}

function remove_children(n) {
	for (var i = n.childNodes.length; i > 0; i--)
		n.removeChild(n.childNodes[0]);
}

function parse_abilities () {
	var x = document.getElementById("ablist");
	for (var a=0; a < x.childNodes.length; a++) {
		var y = x.childNodes[a];		// TR
		if (y.nodeType == Node.TEXT_NODE) continue;

		var cols = new Array(19);
		for (var b=0, c=0; b < y.childNodes.length; b++) {
			var z = y.childNodes[b];	// TD
			if (z.nodeType == Node.TEXT_NODE) continue;
			var t = z.firstChild;		// text
			if (t.nodeType != Node.TEXT_NODE) { // No Text??
				alert("text node missing..");
				continue;
			}
			cols[c] = t.data;
			if (c == 0) insert_search_link(t);
			c++;
		}
		abilities[cols[0]] = {
			Type:			cols[1],
			Cost:			cols.slice(2,7),
			Effect:		cols.slice(7,12),
			Duration:	cols.slice(12,15),
			Timer:		cols.slice(15,18),
			Description:cols[18]
		};
	}
}

function insert_search_link (node) {
	var a = document.createElement("a");
	a.setAttribute("href", 
		'javascript:find_class("' + node.data + '")' );
	var parent = node.parentNode;
	parent.replaceChild(a, node);
	a.appendChild(node);
}

function find_class (search_skill) {
	var x = txts.class_ability;
	for (var cl_realm in classes) {
		for (var cls in classes[cl_realm]) {
			for (var skill in classes[cl_realm][cls]) {
				if (skill == search_skill) {
					x += cl_realm + ": " + cls + "\n";
					break; // done with this class
				}
			}
		}
	}
	alert(x);
}

function balloon_help (e) {
	var node;
	if (!e) { // IE
		e = window.event;
		node = e.srcElement;
	} else {
		node = e.target;
	}
	if (node.firstChild) node = node.firstChild; // get textnode inside td
	var b = document.getElementsByTagName("body")[0];
	if (popupw) balloon_help_off();
	popupw = document.createElement("div");
	popupw.className = "popup";
	var scr_left =
		window.pageXOffset ? // NS6
			window.pageXOffset :
			document.body && document.body.scrollLeft ? // IE 5
				document.body.scrollLeft :
				document.documentElement.scrollLeft; // IE 6
	var scr_top =
		window.pageYOffset ?
			window.pageYOffset :
			document.body && document.body.scrollTop ?
				document.body.scrollTop :
				document.documentElement.scrollTop;
	popupw.style.left = (scr_left + e.clientX + 8 - 0) + "px";
	popupw.style.top = (scr_top + e.clientY + 10 - 0) + "px";
	var tx = document.createTextNode(
		abilities[node.data]["Description"]);
	popupw.appendChild(tx);
	b.appendChild(popupw);
}

function balloon_help_off () {
	if (!popupw) return;
	popupw.parentNode.removeChild(popupw);
	popupw = void 0;
}

function check_referrer () {
	var out = '';
	if (document.referrer == undefined ||
		document.referrer == '') {
		out = txts.no_referrer;
	} else if (document.referrer.indexOf("//www.ping.de/") == -1) {
		out = txts.bad_referrer;
	}
	return(out);
}

function init () {
	if (!document.getElementById) {
		alert(txts.no_dom1);
		return;
	}
	parse_abilities();
	realm_change();
}

function good_bye() {
    var b = new Date();
    var stayed = Math.floor((b.getTime() - start_time) / 1000);
    var x = new Image(1,1);
    x.src="../pics/pixel.gif?"+stayed;
}
window.onunload = good_bye;

// Usage:
//	document.getElementById("ausgabe").innerHTML += "<PRE>" + 
//		dump_tree(document.getElementById("ablist"),0) + "</PRE>";
function dump_obj (x) {
	var out="<HR>Object " + x.id + " Properties:\n";
	for (var i in x) {
		if (typeof(x[i]) == "function" || i.indexOf("_NODE") != -1)
			continue;
		out += i + "(" + typeof(x[i]) + ")=" + x[i] + "\n";
	}
	document.getElementById("ausgabe").innerHTML += "<PRE>" + out + "</PRE>";
}

function dump_tree (m,n) {
	var out = m.nodeName + " (" + m.nodeType + ")";
	if (m.id) 
		out += ' ID="' + m.id + '"';
	if (m.nodeType == Node.TEXT_NODE && m.data != "\n\n") {
		var t = new String(m.data);
		out += " = '" + t.replace(/\n/g, "") + "'";
	}
	if (m.firstChild)
		out += " contains:\n";
	else
		out += "\n";
	for (var m = m.firstChild; m != null; m = m.nextSibling) {
		for (var o = 0; o <= n; o++) 
			out += " ";
		out += dump_tree(m,n+1);
	}
	return out;
}

//eof. This file has not been truncate

