var autocomplete_text;
var autocomplete_skippos
var citydata_loaded;
var citydata_updated;
var dbs_updated;
var map_updated;
var mouseX;
var mouseY;
var mySound;
var playerstats;

var basiclayers = new Array;
var citydata = new Array;
var db_buildings = new Array;
var db_spells = new Array;
var db_units = new Array;
var db_science = new Array;
var map = new Array;

var diplomacy = new Hash();
var ifrs = new Hash;
var last_played = new Hash();
var mycity = new Hash();
var registry = new Hash();
var science = new Hash();
var skill = new Hash();
var gof_info = new Hash();

var autocompleting = 0;
var fitTextInBox_maxWidth = false;
var fitTextInBox_maxHeight = false;
var fitTextInBox_currentWidth = false;
var fitTextInBox_currentBox = false;
var fitTextInBox_currentTextObj = false;
var history_n = 0;
var IE = document.all ? true : false;
var lastplay = 0;
var lastpos = 0;
var logerror_phase = "";
var now = 0;
var onlyown2 = 0;
var origtitle = document.title;
var showless2 = 0;
var soundmanager_loaded = 0;
var sounds = 1;
var travel_res = 1;

var unit_tip_str_localised;



// only functions below

function mouseposition (e) {
	mouseX = Event.pointerX(e);
	mouseY = Event.pointerY(e);
}

function nospam(text, nolink) {
	if (!nolink) {
		document.write("<a href=\"mailto:");
	}
	document.write(text);
	if (!nolink) {
		document.write("\">" + text + "</a>");
	}
}

function setsounds(togle) {
	document.cookie = 'sounds=' + togle + ';expires=Thu, 01-Jan-2020 00:00:01 GMT';
	sounds = togle;
	if (sounds == 1) {
		soundManager.reboot();
		document.getElementById('soundson').style.fontWeight = "bold";
		document.getElementById('soundsoff').style.fontWeight = "normal";
	} else {
		mySound.stop();
		if (document.getElementById('ifr')) { ifr.mySound.stop(); }
		document.getElementById('soundson').style.fontWeight = "normal";
		document.getElementById('soundsoff').style.fontWeight = "bold";
	}
}

function gofPoll (skip, setsounds) {

	try {

		var d = new Date();
		var now = d.getTime();
		var pollurl = baseurl + '/engine.cgi';
		pollurl+= '?rand=' + Math.round(100000*Math.random());
	
		if (setsounds == undefined) {
		} else {
			pollurl+= "&sounds=" + setsounds;
			sounds = setsounds;
			console.log('setsounds', setsounds);
		}
	
		mycity.each(function(key) {
			mycity.unset(key);
		});
	
		science.each(function(key) {
			science.unset(key);
		});
	
		diplomacy.each(function(key) {
			diplomacy.unset(key);
		});
	
		gof_info.each(function(key) {
			gof_info.unset(key);
		});

		parent.document.getElementById('statusinfo').innerHTML = "Connecting...";
		parent.document.getElementById('connectioninfo').innerHTML = "";
		console.log('Connecting', pollurl);
		
		new Ajax.Request(pollurl, {
			method: 'get',
			onSuccess: function(gofPolltransport) {
				console.log('Connected ok');
				parent.document.getElementById('statusinfo').innerHTML = "Response got";
				var errcount = 0;
				var tmp_gofPoll = gofPolltransport.responseText;
				var data_gofPoll = tmp_gofPoll.split('\n');
				for (var ig = 0; ig < data_gofPoll.length - 1; ig++) {
					var info_gofPoll = data_gofPoll[ig].split('|');
					if (info_gofPoll[0] == '1') {
	
						if (document.getElementById(info_gofPoll[2]) == null) {
							console.log('create event element', info_gofPoll[1], info_gofPoll[2]);
							divelement = document.createElement('div');
							divelement.setAttribute('id', info_gofPoll[2]);
							document.getElementById('events').appendChild(divelement);
							divelement.style.display = 'none';
							divelement.innerHTML = info_gofPoll[1];
							new Effect.Appear(info_gofPoll[2]);
							new Effect.Pulsate(info_gofPoll[2], { queue: 'end'});
							setTimeout('flashtitle(0);', 1000);
							console.log('created event element');
						}
	
					}
					else if (info_gofPoll[0] == '2') {
						flashscreen();
	
					}
					else if (info_gofPoll[0] == '3') {
						console.log("Attempt to play sound " + info_gofPoll[1] + " (" + info_gofPoll[2] + ")");
						playsound(info_gofPoll[1], info_gofPoll[2]);
	
					}
					else if (info_gofPoll[0] == '4') {
						console.log('show', info_gofPoll[1]);
						new Effect.Appear(info_gofPoll[1]);
	
					}
					else if (info_gofPoll[0] == '5') {
						alert(info_gofPoll[1]);
						logerror('Show message ' + info_gofPoll[1], "debug");
	
					}
					else if (info_gofPoll[0] == '6') {
						info_gofPoll[2] = info_gofPoll[2].replace(/\\n/g, "\n");
						registry.set(info_gofPoll[1], info_gofPoll[2]);
	
					}
					else if (info_gofPoll[0] == '7') {
						info_gofPoll[2] = info_gofPoll[2].replace(/\\n/g, "\n");
						skill.set(info_gofPoll[1], info_gofPoll[2]);
					}
					else if (info_gofPoll[0] == '8') {
						info_gofPoll[2] = info_gofPoll[2].replace(/\\n/g, "\n");
						gof_info.set(info_gofPoll[1], info_gofPoll[2]);						
					}
					else if (info_gofPoll[0] == '-1') {
						console.log('not logged in');
						parent.document.getElementById('connectioninfo').innerHTML = "Not logged in";
						skip = 1;
	
					}
					else if (info_gofPoll[0] == '0') {
						document.getElementById('statusinfo').innerHTML = info_gofPoll[1];
	
					}
					else if (info_gofPoll[0] == 'Server too busy, try again later.') {
						console.log('Server busy');
	
					}
					else {
						errcount++;
						console.log('Unknown command', info_gofPoll[0]);
						if (errcount < 3) {
							logerror('Unknown gofPoll command "' + info_gofPoll[0] + '"', "error");
						}
					}
				}
	
				var data_cities = registry.get('cities').split(',');
				for (var ig = 0; ig < data_cities.length - 1; ig++) {
					mycity.set(data_cities[ig], 1);
				}
	
				var data_science = registry.get('science_known').split(',');
				for (var ig = 0; ig < data_science.length - 1; ig++) {
					science.set(data_science[ig], 1);
				}
	
				var data_diplomacy = registry.get('diplomacy').split(',');
				for (var ig = 0; ig < data_diplomacy.length - 1; ig++) {
					var diplomacy_part = data_diplomacy[ig].split('=');
					var diplomacy_treaties = diplomacy_part[1].split(';');
					diplomacy.set(diplomacy_part[0], diplomacy_treaties[0]);
				}
	
			},
			onFailure: function(transport) {
				console.log('Connection error');
				parent.document.getElementById('connectioninfo').innerHTML = "Connection error";
			}
		});
		
		if (!skip) {
			console.log('Done, new gofPoll after 1min');
			setTimeout("gofPoll(0)", 60000);
		}
	}
	
	catch(e) {
		logerror('gofPoll error ' + e, "error");
	}
}

function chatwindow (account, id) {
	var winname = account;
	if (id) {
		new Effect.Fade(id);
		setTimeout('removeevent("' + id + '");', 2000);
	}
	else {
		winname = Math.round(100000*Math.random());
	}
	status = window.open(baseurl + '/chat.cgi?account=' + account, 'friend' + winname, 'width=650,height=470,scrollbars=no,resizable=yes,toolbar=no,directories=no,status=no,location=no,menubar=no,copyhistory=no');
}

function eventgo (url, id, id2, noupdate, width, action, actionparam) {
	console.log('eventgo', url, id, id2);
	if (url != '') {
		if (document.getElementById('ifr')) {
			var rand_string = "rand=" + Math.round(100000*Math.random());
            var regexp = /\?/;
            if ( url.match( regexp ) ) {
				rand_string = '&' + rand_string;
			} else {
				rand_string = '?' + rand_string;
			}
			document.getElementById('ifr').src = url + rand_string;
		}
		else {
			if (id2 == '' || id2 == undefined) {
				logerror("id2 is not defined for " + id + ", " + url, "error");
			}
			else {
				openlayer(url, id2, noupdate, width, action, actionparam);
			}
		}
	}
	new Effect.Fade(id);
	setTimeout('removeevent("' + id + '");', 2000);
}

function eventgo2 (url, id, noupdate, width, action, actionparam) {
	openlayer(url, id, noupdate, width, action, actionparam);
}

function removeevent(id) {
	console.log('remove element', id);
	var divelement = document.getElementById(id);
	document.getElementById('events').removeChild(divelement);
}

function calc_strength() {
	if (document.getElementById('nomove5')) {
		document.getElementById('nomove5').style.visibility = 'hidden';
		document.getElementById('nomove5').style.display = 'none';
	}
	if (document.getElementById('moveunits')) {
		document.getElementById('moveunits').style.visibility = 'visible';
		document.getElementById('moveunits').style.display = 'block';
	}
	if (parent.dbs_updated > 0) {
	} else {
		logerror("Parent databases are not updated", "info");
		parent.getdbs();
		return;
	}
	travel_res = 1;

	var type;
	var mycity = 1;
	var tax = 1;
	if (document.getElementById('type')) { type = document.getElementById('type').value; }
	if (document.getElementById('mycity')) { mycity = document.getElementById('mycity').value; }
	if (document.getElementById('tax')) { tax = Math.floor(document.getElementById('tax').value); }
	
	var attack = 0;
	var slowest = 10000;
	var res_c = [0,0,0,0,0,0,0,0];
	for (var i = 1; i < 1000; i++) {
		if (document.getElementById('unit_pcs' + i) != null && document.getElementById('unit_pcs' + i).value > 0) {
			if (document.getElementById('attack' + i)) {
				attack+= (document.getElementById('unit_pcs' + i).value * document.getElementById('attack' + i).value);
			}
			logerror_phase = "unit loop " + i + ": " + document.getElementById('unit' + i).value;
			info_u = document.getElementById('unit' + i).value.split('=');
			parent.console.log('unit', document.getElementById('unit' + i).value);
			parent.console.log('unit.', info_u[0], parent.db_units[info_u[0]][1]);
			parent.console.log(i, parent.db_units[info_u[0]][1], document.getElementById('unit' + i).value, ', going', document.getElementById('unit_pcs' + i).value);
			if (Math.floor(parent.db_units[info_u[0]][23]) < slowest) {
				slowest = Math.floor(parent.db_units[info_u[0]][23]);
				parent.console.log('-> slowest', parent.db_units[info_u[0]][23]);
			}

			for (var r = 0; r < 8; r++) {
				if (Math.floor(parent.db_units[info_u[0]][13 + r]) < 0) {
					var val = -Math.floor(parent.db_units[info_u[0]][13 + r] * document.getElementById('unit_pcs' + i).value + 0);
					res_c[r] = Math.floor(res_c[r]) + val;
					/* parent.console.log('->', res_c[r], Math.floor(res_c[r]), res_c, val); */
					/* parent.console.log(r, parent.db_units[info_u[0]][13 + r], res_c[r], document.getElementById('unit_pcs' + i).value, val); */
				}
				if (mycity == 0 && type == 1 && Math.floor(parent.db_units[info_u[0]][5 + r]) > 0) {
					var val2 = Math.floor(parent.db_units[info_u[0]][5 + r] * info_u[1] * tax * Math.floor(document.getElementById('unit_pcs' + i).value) / 100 / 100 + 0);
					parent.console.log('culture cost for unit swapping for', document.getElementById('unit' + i).value, ' is ', val2);
					res_c[4] = Math.floor(res_c[4]) + val2;
				}
			}
			res_c[0]+= (parent.db_units[info_u[0]][3] / 100 * document.getElementById('unit_pcs' + i).value);
		}
	}
	if (document.getElementById('spells') && document.getElementById('spells').value != '') {
		var spells = document.getElementById('spells').value.split(',');
		for (var i = 0; i < spells.length - 1; i++) {
			var info = spells[i].split('=');
			var regex = new RegExp("(.*)%");
			var match = regex.exec(parent.db_spells[info[0]][21]);
			if (match != null) {
				var val = 1 + (match[1] * info[2] / 100 / 100);
				if (val < 0.01) {
					parent.console.log('slow goes below zero', info[0], info[2], 'movement change', val, match[1], parent.db_spells[info[0]][21]);
					slowest*= 0.01;
				} else {
					slowest*= val;
					parent.console.log('spell', info[0], 'movement change', val, match[1], parent.db_spells[info[0]][21]);
				}
			}
		}
	}

    var speed = 20 * 60;

    if (parent.realm_version >= 1.62)
    {
        speed = 10 * 60;
    }
    
	if (document.getElementById('speedbonus') && document.getElementById('speedbonus').value != '') {
		speed = speed / document.getElementById('speedbonus').value;
		parent.console.log('speed default 1200, speedbonus', document.getElementById('speedbonus').value, ', now speed is', speed);
	}
	var squares = Math.floor(document.getElementById('squares').innerHTML);
	if (slowest < 0.01) { slowest = 0.01; }
	var time = squares / slowest;
	parent.console.log('time: ', squares, ' / ', slowest, ' = ', time);
	time = time * speed;
	parent.console.log('time: ', document.getElementById('squares').innerHTML, ' / ', slowest, " * ", speed, ' = ', time);

    if (parent.realm_version >= 1.62)
    {
        time += (60 * 5);
    }
    
	var travel = "";
	var traveldebug = "";
	if (document.getElementById('res')) {
		var res = document.getElementById('res').value.split(',');
		var count = 0;
		for (var r = 0; r < 8; r++) {
			var val = res_c[r] * (time / 60 / 60 * 12);
			val*= 1.2;
			if (document.getElementById('type').value != 1) { val*= 2; }
			/* parent.console.log(r, val, res[r], res_c[r], time); */
			if (res[r] < val && val > 0) {
				document.getElementById('nomove5').style.visibility = 'visible';
				document.getElementById('nomove5').style.display = 'block';
				/* document.getElementById('moveunits').style.visibility = 'hidden'; */
				/* document.getElementById('moveunits').style.display = 'none'; */
				travel_res = 0;
			}
			if (val) {
				if (count) { travel+= ", "; }
				travel+= "<img style=\"margin: 0px;\" src=\"pics/city/res" + r + ".png\" height=\"20\" width=\"20\" /> ";
				travel+= Math.floor(val);
				traveldebug+= r + ": " + val + ", ";
				count = 1;
			}
		}
	}
	parent.console.log('travel', travel);
	if (traveldebug) {
		logerror("Required for travel " + traveldebug, "debug");
	}
	if (document.getElementById('strength2')) {
		document.getElementById('strength2').innerHTML = Math.floor(attack / 100);
	}
	if (document.getElementById('arrive')) {
		document.getElementById('arrive').innerHTML = '';
		if (slowest != 10000) {
			document.getElementById('arrive').innerHTML = parent.wdhm(time);
		}
	}
	if (document.getElementById('travel')) {
		document.getElementById('travel').innerHTML = travel;
	}
}

function operationplan(id) {
	document.getElementById('person' + id).style.visibility = 'hidden';
	document.getElementById('person' + id).style.display = 'none';
	document.getElementById('sabotage' + id).style.visibility = 'hidden';
	document.getElementById('sabotage' + id).style.display = 'none';

	var operation = document.getElementById('operation' + id).value;
	var start = 1;
	if (operation == 'assassination' || operation == 'kidnap') {
		if (document.getElementById('nopersons' + id)) {
			start = 0;
		} else {
			document.getElementById('person' + id).style.visibility = 'visible';
			document.getElementById('person' + id).style.display = 'block';
		}
	} else if (operation == 'sabotage') {
		if (document.getElementById('nosabotage' + id)) {
			start = 0;
		} else {
			document.getElementById('sabotage' + id).style.visibility = 'visible';
			document.getElementById('sabotage' + id).style.display = 'block';
		}
	}
	if (document.getElementById('spy_risk' + id)) {
		document.getElementById('spy_risk' + id).style.visibility = 'visible';
		document.getElementById('spy_risk' + id).style.display = 'block';
	}
	if (operation) {
		var caught = document.getElementById('see_spy' + id).value * document.getElementById('risk' + id).value * 2;
		caught-= document.getElementById('spy_level' + id).value * 2;
		caught+= 10;
		if (caught < 0) { caught = 0; }
		if (caught > 100) { caught = 100; }
		document.getElementById('caught' + id).innerHTML = caught + "%";

		var success = document.getElementById('spy_level' + id).value * document.getElementById('risk' + id).value;
		parent.console.log('success', document.getElementById('spy_level' + id).value, " * ", document.getElementById('risk' + id).value, " = ", success);
		document.getElementById('success' + id).innerHTML = success + "%";
		document.getElementById('chance' + id).style.visibility = 'visible';
		document.getElementById('chance' + id).style.display = 'block';
		if (start == 1) {
			document.getElementById('start' + id).style.visibility = 'visible';
			document.getElementById('start' + id).style.display = 'block';
		} else {
			document.getElementById('start' + id).style.visibility = 'hidden';
			document.getElementById('start' + id).style.display = 'none';
		}
	} else {
		document.getElementById('chance' + id).style.visibility = 'hidden';
		document.getElementById('chance' + id).style.display = 'none';
	}
}

function updatetype () {
	calc_strength();

	var type = document.getElementById('type').value;
	parent.console.log('updatetype', play_attack_plan, type);
	var canSee;
	if (IE) {
		canSee = 'block'
	} else {
		canSee = 'table-row';
	}
	if (document.getElementById('withdraw') != null) {
		if (type == 0) {
			document.getElementById('withdraw').style.visibility = 'visible';
			document.getElementById('withdraw').style.display = canSee;
		} else {
			document.getElementById('withdraw').style.visibility = 'hidden';
			document.getElementById('withdraw').style.display = 'none';
		}
	}
	if (document.getElementById('risk') != null) {
		if (type == 0) {
			document.getElementById('risk').style.visibility = 'visible';
			document.getElementById('risk').style.display = canSee;
		} else {
			document.getElementById('risk').style.visibility = 'hidden';
			document.getElementById('risk').style.display = 'none';
		}
	}
	if (document.getElementById('strength') != null) {
		if (type == 0) {
			document.getElementById('strength').style.visibility = 'visible';
			document.getElementById('strength').style.display = canSee;
		} else {
			document.getElementById('strength').style.visibility = 'hidden';
			document.getElementById('strength').style.display = 'none';
		}
	}
	if (document.getElementById('spy_mission') != null) {
		if (type == 3) {
			document.getElementById('spy_mission').style.visibility = 'visible';
			document.getElementById('spy_mission').style.display = canSee;
		} else {
			document.getElementById('spy_mission').style.visibility = 'hidden';
			document.getElementById('spy_mission').style.display = 'none';
		}
	}

	var noattack = -1;
	if (document.getElementById('noattack')) {
		noattack = document.getElementById('noattack').value;
	}
	if (noattack < 1 && document.getElementById('noattackb')) {
		noattack = document.getElementById('noattackb').value;
	}

	parent.console.log('play_attack_plan?', type, play_attack_plan, noattack);
	if (type == 0 && !play_attack_plan && !noattack) {
		parent.console.log('playsound attackplan...');
		play_attack_plan = 1;
		parent.playsound('attack_plan');
	} else if (type == 3 && !play_spy) {
		play_spy = 1;
		parent.playsound('spy');
	}
	attackplan(1, 1);
}

function attackplan (update_from, update_target) {
	if (document.getElementById('target_own').value) {
		document.getElementById('target').value = document.getElementById('target_own').value;
	}
	var type = document.getElementById('type').value;

	parent.console.log("type", type);

	document.getElementById('autocomplete_choices').style.visibility = 'hidden';
	
	if (update_from) { loadinfo('from'); }
	if (update_target) { loadinfo('target'); }

}

function loadinfo (city) {

	var id = document.getElementById(city).value;
	if (id == '') { return; }

	var type = document.getElementById('type').value;

	var location = "";
	var url = baseurl + '/getinfo.cgi?city=' + id + "&type=" + type;
	url+= '&rand=' + Math.round(100000*Math.random()) + "&origin=" + city;

	if (city == 'from') {
		parent.console.log('get units to getinfo');
		for (var i = 1; i < 1000; i++) {
			var id2 = 'unit_pcs' + i;
			var id = 'unit' + i;
			if (document.getElementById(id) && document.getElementById(id2)) {
				url+= "&unit" + i + "=" + escape(document.getElementById(id).value);
				url+= "&unit_pcs" + i + "=" + escape(document.getElementById(id2).value);
			}
		}
	}

	new Ajax.Request(url, {
		method: 'get',
		onSuccess: function(transport) {
			document.getElementById(city + '_div').innerHTML = transport.responseText;
			if (document.getElementById('coords_target') != null && document.getElementById('coords_from') != null) {
				var coords1 = document.getElementById('coords_from').value.split(',');
				var coords2 = document.getElementById('coords_target').value.split(',');
				var x = Math.abs(coords1[0] - coords2[0]);
				var y = Math.abs(coords1[1] - coords2[1]);
				var len = Math.round(Math.sqrt(Math.pow(x, 2) + Math.pow(y,2)));
				document.getElementById('squares').innerHTML = len;
			}
			
			canmoveattack(city);

			if (city == 'target' && document.getElementById('strength_d') && document.getElementById('defence_strength') ) {
				document.getElementById('strength2_d').innerHTML = document.getElementById('defence_strength').value;
			}

			calc_strength();
			adjustframesize(100);
			parent.document.getElementById('connectioninfo').innerHTML = "";
		},

		onFailure: function(transport) {
			parent.document.getElementById('connectioninfo').innerHTML = "Connection error";
			adjustframesize(100);
		}
	});
}

function canmoveattack (origin) {
	parent.console.log('canmoveattack', origin, document.getElementById('autocomplete').value, document.getElementById('nomoves'));
	if ((document.getElementById('target').value == '' && document.getElementById('nomoves') == null && document.getElementById('autocomplete').value == '') || document.getElementById('noattackb') == null || travel_res == 0) {
		document.getElementById('moveunits').style.visibility = 'hidden';
		document.getElementById('moveunits').style.display = 'none';
		return;
	}

	for (var n = 1; n <= 8; n++) {
		document.getElementById('nomove' + n).style.visibility = 'hidden';
		document.getElementById('nomove' + n).style.display = 'none';
		document.getElementById('noattack' + n).style.visibility = 'hidden';
		document.getElementById('noattack' + n).style.display = 'none';
	}

	var type = document.getElementById('type').value;
	var noattack = document.getElementById('noattack').value;
	var noattackb = document.getElementById('noattackb').value;
	var nomove = 0;
	if (document.getElementById('nomove')) {
		nomove = document.getElementById('nomove').value;
	}
	parent.console.log("noattack/noattackb/nomove/type/play_attack_plan", noattack, noattackb, nomove, type, play_attack_plan)
	if (noattack < 1) {
		noattack = noattackb;
	}

	if (document.getElementById('honor2') != null) {
		var canSee;
		if (IE) {
			canSee = 'block'
		}
		else {
			canSee = 'table-row';
		}
		if (type == 0 && document.getElementById('honor') != null) {
			document.getElementById('honor2').style.visibility = 'visible';
			document.getElementById('honor2').style.display = canSee;
			document.getElementById('honor3').innerHTML = document.getElementById('honor').value;
		}
		else {
			document.getElementById('honor2').style.visibility = 'hidden';
			document.getElementById('honor2').style.display = 'none';
		}
	}

	if (noattack > 0 && type == 0) {
		document.getElementById('noattack' + noattack).style.visibility = 'visible';
		document.getElementById('noattack' + noattack).style.display = 'block';
		document.getElementById('moveunits').style.visibility = 'hidden';
		document.getElementById('moveunits').style.display = 'none';
	}
	else if (nomove > 0 && (type == 1 || type == 2)) {
		document.getElementById('nomove' + nomove).style.visibility = 'visible';
		document.getElementById('nomove' + nomove).style.display = 'block';
		document.getElementById('moveunits').style.visibility = 'hidden';
		document.getElementById('moveunits').style.display = 'none';
	}
	else {
		document.getElementById('moveunits').style.visibility = 'visible';
		document.getElementById('moveunits').style.display = 'block';
	}

	if (type == 0 && play_attack_plan == 0 && noattack == 0) {
		parent.console.log('playsound attackplan..');
		play_attack_plan = 1;
		parent.playsound('attack_plan');
	}
	adjustframesize(100);
}

function loadhistory (secs, coords, range, account, city, fulldate) {
	console.log('loadhistory', secs, coords, range, account, city, fulldate, lastpos);
	for (var n = 1; n <= history_n - max_history; n++) {
		var id = 'history' + n;
		divelement = document.getElementById(id);
		if (divelement != null) {
			document.getElementById('historydiv').removeChild(divelement);
		}
	}

	var url = baseurl + '/gethistory.cgi?coords=' + coords + "&lastpos=" + lastpos + "&range=" + range;
	url+= '&account=' + account + '&max=' + max_history + '&city=' + city + '&fulldate=' + fulldate + '&rand=' + Math.round(100000*Math.random());

	new Ajax.Request(url, {
		method: 'get',
		onSuccess: handlehistory,
		onFailure: function(transport) {
			console.log(transport.responseText);
		}
	});

	secs+= 1;
	setTimeout("loadhistory(" + secs + ",'" + coords + "','" + range + "','" + account + "','" + city + "','" + fulldate + "');", secs * 1000);
}

function handlehistory(transport) {
	console.log('handlehistory');
	if (transport.responseText == 'Server too busy, try again later.') {
		console.log('Server busy');
		return;
	}
	var data = transport.responseText.split('\n');
	var err = 0;
	for (var i = 0; i < data.length - 1; i++) {
		var info = data[i].split('|');
		if (info[0] == 0) {
			lastpos = info[1];
		} else if (info[0] == 1) {
			var lastid;
			if (history_n > 0) { lastid = 'history' + history_n; }
			history_n+= 1;
			var id = 'history' + history_n;
			var divelement = document.createElement('div');
			divelement.setAttribute('id', id);
			document.getElementById('historydiv').appendChild(divelement);
			if (lastid) {
				
				var lastelement = document.getElementById(lastid);
				var parentdiv = lastelement.parentNode;
				parentdiv.insertBefore(divelement, lastelement);
			}
			divelement.style.display = 'none';
			divelement.style.float = 'top';
			divelement.innerHTML = info[1];
			new Effect.Appear(id);
			if (history_n > max_history) {
				var id2 = 'history' + (history_n - max_history);
				new Effect.Fade(id2);
			}
			adjustframesize(98);
		} else {
			if (info[0] == 'Server too busy, try again later.') {
				console.log('Server busy');
			} else {
				err++;
				console.log('unknown command', info[0]);
				if (err < 3) { logerror('Handlehistory: Unknown command ' + info[0], "error"); }
			}
		}
	}
	console.log('handlehistory done', data.length);
}

function getstatusraport (onlyown, showless, skip) {
	console.log('getstatusraport', onlyown, showless, " -- ", skip);
	if (onlyown === undefined || onlyown === '') { onlyown = onlyown2; }
	if (showless === undefined || showless === '') { showless = showless2; }

	console.log('getstatusraport...', onlyown, showless, " --- ", onlyown2, showless2);

	var url = baseurl + '/getstatusraport.cgi?onlyown=' + onlyown + "&showless=" + showless;
	url+= '&rand=' + Math.round(100000*Math.random());
	if (document.getElementById('getstatusraport_history')) {
		url+= "&history=" + document.getElementById('getstatusraport_history').value;
	}

	new Ajax.Request(url, {
		method: 'get',
		onSuccess: function(transport) {
			if (transport.responseText == 'Server too busy, try again later.') {
			} else if (transport.responseText == '') {
				skip = 1;
				document.getElementById('statusraport').innerHTML = "";
			} else {
				document.getElementById('statusraport').innerHTML = transport.responseText;
				if (document.getElementById('music_file')) {
					playsound(document.getElementById('music_file').value, document.getElementById('music_level').value);
				}
			}
		},
		onFailure: function(transport) {
			console.log(transport.responseText);
		}
	});
	if (onlyown === '' || onlyown === undefined) {
	} else {
		onlyown2 = onlyown;
		showless2 = showless;
	}
	console.log('getstatusraport new values', onlyown2, showless2);

	if (skip != 1) {
		setTimeout("getstatusraport('', '');", (1000 * 60 * 4));
	}
}

function picktarget () {
	var from = document.getElementById('from').value;
	var type = document.getElementById('type').value;
	var target = "";
	var location = "";
	if (document.getElementById('location') != null) {
		location = document.getElementById('location').value;
	}
	window.location = "world.cgi?from=" + from + "&type=" + type + "&target=" + target + "&location=" + location;
}

function getmapdata2(force) {

	var url = baseurl + '/getmapdata.cgi?rand=' + Math.round(100000*Math.random());

	var d = new Date();
	var now = d.getTime();

	if (force == 1) {
		var none = 0;
	} else if (now - map_updated < 1000 * 60 * 10) {
		console.log('too soon to update mapdata2', (now - map_updated) / 1000);
		return;
	}

	document.getElementById('statusinfo').innerHTML = "getmapdata2...";
	map_updated = now;

	console.log('getmapdata query', url);

	new Ajax.Request(url, {
		method: 'get',
		onSuccess: function(transport) {
			console.log('getmapdata2 ok, parsing data');
			if (transport.responseText == 'Server too busy, try again later.') {
				console.log('Server busy');
				return;
			}
			var data = transport.responseText.split('\n');
			var to_y = data.length;
			for (var yyy = 0; yyy < to_y; yyy++) {
				var info = data[yyy].split('|');
				var to_x = info.length;
				map[yyy] = new Array;
				for (var xxx = 0; xxx < to_x; xxx++) {
					var maptile = info[xxx].split(',');
					map[yyy][xxx] = new Array(maptile[0], maptile[1], maptile[2], maptile[3]);
				}
			}
			document.getElementById('statusinfo').innerHTML = "getmapdata2 ok (y: " + to_y + ")";
			console.log('getmapdata2 ok, lines', to_y);
		},
		onFailure: function(transport) {
			document.getElementById('statusinfo').innerHTML = "getmapdata2 failed";
			console.log('getmapdata2 failed');
			setTimeout('getmapdata2()', (60 * 1000));
			logerror('getmapdata2 failed', "info");
		}
	});
}

function getcitydata2 (id, force) {
	
	var d = new Date();
	var now = d.getTime();

	if ( citydata_loaded && (now - citydata_updated) < 1000*60*50 && force != 1) {
		console.log('too soon to update getcitydata', (now-citydata_updated) / 1000);
		return;
	}

	document.getElementById('statusinfo').innerHTML = "getcitydata2...";
	console.log('getcitydata2 query', url);
	citydata_updated = now;
	citydata_loaded = 0;
	
	var loadingstatus = "";
	
	var url = baseurl + '/getcitydata.cgi?rand=' + Math.round(100000*Math.random());
	if ( id 			) url+= "&cities=" + id;
	if ( getplayerstats	) url+= "&getplayerstats=" + getplayerstats;
	
	new Ajax.Request(url, {
		method: 'get',
		onLoading: function(transport) {
			loadingstatus = "Length: " + transport.getResponseHeader('content-length') + "B";
		},
		onFailure: function(transport) {
			console.log('getcitydata failed');
			document.getElementById('statusinfo').innerHTML = "getcitydata2 failed";
			document.getElementById('connectioninfo').innerHTML = "Get citydata2 failed";
			setTimeout('getcitydata2()', 60000);
			logerror('getcitydata2 failed: ' + transport.status + ' "' + loadingstatus + '"', "info");
		},
		onSuccess: function(transport) {
			if (transport.responseText == 'Server too busy, try again later.') {
				console.log('Server busy');
				return;
			}
			
			var newdata = transport.responseText.split('\n');
			var citycount = newdata.length;
			var phase = 1;
			
			console.log('getcitydata2 ok, parsing data, entries', citycount, newdata.length);
			
			for (var i = 0; i < citycount - 1; i++) {
				var info = newdata[i].split('|');
				
				if ( !info[0] && getplayerstats ) {
					phase = 2;
					continue;
				}
				
				if (phase == 1) {
					citydata[info[0]] = info;
				}
				else {
					playerstats += newdata[i] + "\n";
				}
			}
			
			console.log('getcitydata2 done, cities', newdata.length, "playerstats", playerstats);
			document.getElementById('statusinfo').innerHTML = "getcitydata2 ok";
			document.getElementById('connectioninfo').innerHTML = "";
			citydata_loaded = 1;
		}
	});
}

function getdbs () {

	var url = baseurl + '/getdbs.cgi?science=1&rand=' + Math.round(100000*Math.random());

	var d = new Date();
	var now = d.getTime();

	if (now - dbs_updated < 1000 * 60 * 3) {
		console.log('too soon to update dbs', (now-dbs_updated) / 1000);
		return;
	}

	document.getElementById('statusinfo').innerHTML = "getdbs...";
	console.log('getdbs query', url);

	var nomore = 0;
	new Ajax.Request(url, {
		method: 'get',
		onSuccess: function(transport) {
			if (transport.responseText == 'Server too busy, try again later.') {
				console.log('Server busy');
				return;
			}
			var data = transport.responseText.split('\n');
			console.log('getdbs ok, parsing data, entries', data.length);
			var phase = 1;
			for (var i = 0; i < data.length - 1; i++) {
				var info = data[i].split('|');
				if (info[0] == '') {
					phase++;
				} else {
					if (phase == 1) {
						db_buildings[info[0]] = info;
					} else if (phase == 2) {
						db_units[info[0]] = info;
					} else if (phase == 3) {
						db_spells[info[0]] = info;
					} else if (phase == 4) {
						db_science[info[0]] = info;
					} else if (phase == 5) {
						console.log('skip data, invalid phase', phase);
						if (nomore == 0) {
							logerror('getdbs invalid phase ' + phase, "error");
							nomore = 1;
						}
					}
				}
			}
			console.log('getdsb done, entries', data.length);
			console.log('building 1', db_buildings[1]);
			console.log('unit 1', db_units[1]);
			console.log('spell 1', db_spells[1]);
			console.log('science 1', db_science[1]);
			document.getElementById('statusinfo').innerHTML = "getdbs ok";
			document.getElementById('connectioninfo').innerHTML = "";
			dbs_updated = now;
		},
		onFailure: function(transport) {
			console.log('dbs failed');
			document.getElementById('statusinfo').innerHTML = "getdbs failed";
			document.getElementById('connectioninfo').innerHTML = "Get dbs failed";
			setTimeout('getdbs()', 60000);
			logerror('getdbs failed', "warning");
		}
	});
}

function wheel(event){
	console.log('mousewheel on:', mousewheel);
	if (mousewheel == 0) { return; }
	var delta = 0;
	if (!event) event = window.event;
	if (event.wheelDelta) {
		delta = event.wheelDelta/120; 
		if (window.opera) delta = -delta;
	} else if (event.detail) {
		delta = -event.detail/3;
	}
	if (delta) {
		handlemousewheel(delta);
		if (event.preventDefault) {
			event.preventDefault();
		} else {
			event.returnValue = false;
		}
	}
}

function handlemousewheel(delta) {
	if (delta < 0) {
		zoom+= 1;
		if (zoom > max_zoom) {
			zoom = max_zoom;
		} else {
			visible_x-= (Math.floor(show_map_size_x[zoom] / 2) - Math.floor(show_map_size_x[zoom-1] / 2));
			visible_y-= (Math.floor(show_map_size_y[zoom] / 2) - Math.floor(show_map_size_y[zoom-1] / 2));
			if (updatingmap == 0) { setTimeout('updatemap(0, 1);', 200); updatingmap = 1; }
		}
	}
	if (delta > 0) {
		zoom-= 1;
		if (zoom < 1) {
			zoom = 1;
		} else {
			visible_x-= (Math.floor(show_map_size_x[zoom] / 2) - Math.floor(show_map_size_x[zoom+1] / 2));
			visible_y-= (Math.floor(show_map_size_y[zoom] / 2) - Math.floor(show_map_size_y[zoom+1] / 2));
			if (updatingmap == 0) { setTimeout('updatemap(0, 1);', 200); updatingmap = 1; }
		}
	}
	if (!disable_nav) {
		if (zoom == max_zoom) {
			document.getElementById('zoom_out').className = 'gray';
		} else {
			document.getElementById('zoom_out').className = 'normal';
		}
		if (zoom == 1) {
			document.getElementById('zoom_in').className = 'gray';
		} else {
			document.getElementById('zoom_in').className = 'normal';
		}
	}
}


function catchmousewheel() {
	if (window.addEventListener) {
		window.addEventListener('DOMMouseScroll', wheel, false);
	}
	else {
		window.onmousewheel = document.onmousewheel = wheel;
	}
	console.log('catch mouse wheel');
}

function playsound(file, level) { 
	console.log('Try to play sound', sounds, file, " level", level);
	if (level === undefined || level == undefined) { level = 0; }
	if (sounds == 0) {
		parent.console.log('sounds off');
		return;
	}

	var d = new Date();
	var now = d.getTime();
	if (level != -1) {
		if (now - lastplay < 3 * 60 * 1000 * (level + 1)) {
			parent.console.log('too soon to play anything yet: ', now, lastplay);
			return;
		}
		if (mySound && mySound.playState == 1) {
			parent.console.log('playState=1, too soon to play anything yet');
			return;
		}
		if (file != 'attack' && file != 'newquest' && file != 'questdone') {
			if (now - last_played.get(file) < 10 * 60 * 1000 * (level + 1)) {
				parent.console.log(file, ' played lately, skip', last_played.get(file), 'now: ', now);
				return;
			}
		}
	}

	var audioURL = baseurl + "/mp3/" + file + ".mp3";
	soundManager.url = '../';
	soundManager.useConsole = true;
	soundManager.consoleOnly = true;
	soundManager.wmode = 'transparent';

	soundManager.onerror = function() {
		logerror('SoundManager failed to load', 'info');
		document.getElementById('statusinfo').innerHTML = "Playing sound failed: " + mySound;
	}

	mySound = soundManager.createSound({
		id: file,
		url: audioURL,
		autoLoad: true,
		autoPlay: true,
		volume: 0
	});

	if (mySound) {
		mySound.play();
		fadeInSound(file, 3); // fade a sound in
		last_played.set(file, now);
		lastplay = now;
	}
	else {
		parent.console.log('mySound failed', mySound);
		document.getElementById('statusinfo').innerHTML = "Playing sound failed: " + mySound;
	}

	return;
}

function fadeInSound(soundID,amount) {
	var s = soundManager.getSoundById(soundID);
	var vol = s.volume;
	if (vol == 100) return false;
	s.setVolume(Math.min(100,vol+amount));
	setTimeout(function(){fadeInSound(soundID,amount)},20);
	
	return 1;
}

function fadeOutSound(soundID,amount) {
	var s = soundManager.getSoundById(soundID);
	var vol = s.volume;
	if (vol == 0) return false;
	s.setVolume(Math.max(0,vol+amount));
	setTimeout(function(){fadeOutSound(soundID,amount)},20);
	
	return 1;
}

function maxtrade(res_i) {
	var carry = 5000 * document.getElementById('trademen').value;

	console.log('maxtrade: carry, res_i', carry, res_i);

	document.getElementById('res_' + res_i).value = 0;

	var carrying = 0;
	for (var i = 1; i <= 8; i++) {
		var id = 'res_' + i;
		if (document.getElementById(id) && document.getElementById(id).value > 0) {
			if (i == 8) {
				carrying+= (document.getElementById(id).value / 10);
			}
			else {
				carrying+= (document.getElementById(id).value - 0);
			}
		}
	}
	console.log('maxtrade: carrying', carrying);

	var carry_more = carry - carrying;
	console.log('carry_more (carry, carrying)', carry_more, carry, carrying);
	if (carrying < carry) {
		console.log('carrying is less than carry');
		if (res_i == 8) { carry_more*= 10; }		
		console.log('max:', document.getElementById('res_max_' + res_i).value);
		if (carry_more > document.getElementById('res_max_' + res_i).value && document.getElementById('res_max_' + res_i).value > 0) {
			carry_more = document.getElementById('res_max_' + res_i).value;
		}
	}
	else {
		carry_more = 0;
	}
	if (res_i == 8) {
		carrying+= carry_more / 10;
	}
	else {
		carrying+= carry_more;
	}

	document.getElementById('res_' + res_i).value = Math.floor(carry_more);
	console.log('carry_more', carry_more);
	count_trademen();
}

function count_trademen() {
	var carrying = 0;
	for (var i = 1; i <= 8; i++) {
		var id = 'res_' + i;
		if (document.getElementById(id)) {
			if (i == 8) {
				carrying+= (document.getElementById(id).value / 10);
			}
			else {
				carrying+= (document.getElementById(id).value - 0);
			}
		}
	}
	console.log('carrying', carrying);

	console.log('trademen_id', document.getElementById('trademen_id').value);
	document.getElementById(document.getElementById('trademen_id').value).value = Math.floor(((carrying - 0) + 4999) / 5000);

	calc_strength();
}

function select_all_units(f) {
    var i = 1;

    var u = document.getElementById('unit_pcs' + i);
    while (u != null) {
        u.value = document.getElementById('unit_pcs' + i + "_max").value;

        i++;
        u = document.getElementById('unit_pcs' + i);
    }
}

function deselect_all_units(f) {
    var i = 1;

    var u = document.getElementById('unit_pcs' + i);
    while (u != null) {
        u.value = 0;

        i++;
        u = document.getElementById('unit_pcs' + i);
    }
}

function flashtitle(flastitlemode, count) {
	count++;
	if (flastitlemode == 0) {
		document.title = '                           ';
		setTimeout('flashtitle(1)', count);
	}
	else {
		document.title = origtitle;
		if (count < 6) {
			setTimeout('flashtitle(0)', count);
		}
	}
}

function adjustframesize(n) {
	if (n == 1) {
		parent.window.scroll(0, 0);
	}
	n++;
	if (!parent.document.getElementById('ifr') && !document.getElementById('ifr')) { return; } /* GoF2 layout */

	var val = parent.document.getElementById('ifr').scrollHeight - 20;
	if (val != document.body.scrollHeight && parent.document.getElementById('ifr').scrollHeight != document.body.scrollHeight) {
		parent.document.getElementById('ifr').style.height = document.body.scrollHeight + 20 + 'px';
	}
	if (n < 5) {
		setTimeout('adjustframesize(' + n + ');', 200);
	}
	else if (n < 10) {
		setTimeout('adjustframesize(' + n + ');', 500);
	}
	else if (n < 100) {
		setTimeout('adjustframesize(' + n + ');', 1000);
	}
}

function hautocomplete (id, id2, minlen, now, leftalign, params, url2) {
	if (!now) {
		autocompleting+= 1;
		console.log('autocomplete soon, not now', autocompleting);
		setTimeout('hautocomplete("' + id + '","' + id2 + '",' + minlen + ',1,' + leftalign + ',"' + params + '","' + url2 + '");', 300);
	}
	else {
		autocompleting-= 1;
		if (autocompleting > 0) {
			console.log('autocomplete exit, still rolling', autocompleting);
			return;
		}
		var text = document.getElementById(id).value;
		if (text.length > minlen - 1) {
			if (autocomplete_text == text) {
				var url;
				if (url2 == undefined || url2 == '' || url2 === undefined || url2 == 'undefined') {
					url = baseurl + "/getcitynames.cgi?value=" + text + params;
				} else {
					url = url2 + text + params;;
				}
				console.log('autocomplete request', url);
				new Ajax.Request(url, {
					method: 'get',
					onSuccess: function(transport) {
						if (transport.responseText == 'Server too busy, try again later.') {
							console.log('Server busy');
							return;
						}
						document.getElementById(id2).innerHTML = transport.responseText;
						var x = findPosX(document.getElementById(id));
						var y = findPosY(document.getElementById(id));
						console.log('autocomplete ok', x, leftalign);
						if (leftalign != undefined) { x = x + leftalign; }
						if (autocomplete_skippos == 2) {

						} else if (autocomplete_skippos) {
							document.getElementById(id2).style.left = 0 + "px";
							document.getElementById(id2).style.top = -(document.getElementById(id2).offsetHeight) + "px";
						} else {
							document.getElementById(id2).style.left = x + "px";
							document.getElementById(id2).style.top = (y + 24) + "px";
						}
						document.getElementById(id2).style.visibility = 'visible';
						document.getElementById(id2).style.display = 'block';
						console.log('autocompleted');
						parent.document.getElementById('connectioninfo').innerHTML = "";
					},
					onFailure: function(transport) {
						console.log('autocomplete failed');
						parent.document.getElementById('statusinfo').innerHTML = "autocomplete failed";
						parent.document.getElementById('connectioninfo').innerHTML = "Autocomplete failed";
					}
				});
			} else {
				console.log('autocomplete soon, now typing', autocomplete_text, text, now);
				autocomplete_text = text;
				if (now == 1) {
					setTimeout('hautocomplete("' + id + '","' + id2 + '",' + minlen + ',2,' + leftalign + ',"' + params  + '","' + url2 + '");', 300);
					autocompleting+= 1;
				}
			}
		} else {
			console.log('autocomplete: too short text', text.length, minlen);
			document.getElementById(id2).style.visibility = 'hidden';
			document.getElementById(id2).style.display = 'none';
		}
	}
}

function findPosX(obj)  {
    var curleft = 0;
    if(obj.offsetParent)
        while(1)         {
          curleft += obj.offsetLeft;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
}

function findPosY(obj)  {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
}

function selectcheckboxes (name, max) {
	for (var i = 1; i <= max; i++) {
		var id = name + i;
		document.getElementById(id).checked = 'true';
	}
}

function flashscreen() {
	id = 'flashscreen';
	console.log('flashscreen');
	document.getElementById(id).style.visibility = 'visible';
	document.getElementById(id).innerHTML = " ";
	document.getElementById(id).style.height = '500%';
	new Effect.Appear(id, { duration:0.3, from:0.0, to:0.9 } );
	new Effect.Fade(id, { duration:4, queue: 'end'});
}

function wdhm(min) {
	min = min / 60;

	if (Math.abs(min) > 60) {
		var hour = min / 60;
		if (Math.abs(hour) > 24) {
			var day = hour / 24;
			if (Math.abs(day) > 7) {
				return (Math.round(day / 7 * 10) / 10 + "&nbsp;" + lang_w);
			}
			else {
				return (Math.round(day * 10) / 10 + "&nbsp;" + lang_d);
			}
		}
		else if (Math.abs(hour) < 5) {
			return (Math.round(hour * 10) / 10 + "&nbsp;" + lang_h);
		}
		else {
			return (Math.round(hour + 0.5) + "&nbsp;" + lang_h);
		}
	}
	else {
		return (Math.round(min + 0.5) + "&nbsp;" + lang_min);
	}
}

function wdhm2(min) {
	min = min / 60;

	if (Math.abs(min) > 60) {
		var hour = min / 60;
		if (Math.abs(hour) > 24) {
			var day = hour / 24;
			if (Math.abs(day) > 7) {
				return (Math.round(day / 7 * 10) / 10 + "&nbsp;" + lang.get('w'));
			}
			else {
				return (Math.round(day * 10) / 10 + "&nbsp;" + lang.get('d'));
			}
		}
		else if (Math.abs(hour) < 5) {
			return (Math.round(hour * 10) / 10 + "&nbsp;" + lang.get('h'));
		}
		else {
			return (Math.round(hour + 0.5) + "&nbsp;" + lang.get('h'));
		}
	}
	else {
		return (Math.round(min + 0.5) + "&nbsp;" + lang.get('min'));
	}
}

function logerror (txt, level) {

	var regex = new RegExp("(gloryoffellowland.com|rybattle.com)");
	var match = regex.exec(txt);
	if (match == null) {
		var regex = new RegExp("(:\/\/)");
		var match = regex.exec(txt);
		if (match != null) {
			return;
		}
	}

	var regex = new RegExp("script stack space quota is exhausted|out of memory|Muisti ei riit|NS_ERROR_OUT_OF_MEMORY");
	var match = regex.exec(txt);
	if (match != null) {
		alert('JavaScript error probably regarding insufficient memory, please restart your browser/computer to free memory, or close other programs.');
		return;
	}

	txt+= " (" + logerror_phase + ")";
	logerror_phase = "";
	parent.document.getElementById('statusinfo').innerHTML = level + ": " + txt;

	var url = baseurl + '/logerror.cgi?rand=' + Math.round(100000*Math.random());
	url+= "&level=" + level + "&txt=" + escape(txt);

	new Ajax.Request(url, {
		method: 'get',
		onSuccess: function(transport) {
			console.log('logerror ok', txt, level);
		},
		onFailure: function(transport) {
			console.log('logerror failed', txt, level);
		}
	});
}

function handleerror(msg, url, line) {
	logerror("Unknown error " + msg + " at \"" + url + "\" line " + line, "warning");

	if (admin) {
		return true;
	}
	else {
		return false;
	}
}

function windowsize() {
	var viewportwidth;
	var viewportheight;
 
	// the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
 
	if (typeof window.innerWidth != 'undefined') {
		viewportwidth = window.innerWidth;
		viewportheight = window.innerHeight;
 
	}
	else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) {
		// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
		viewportwidth = document.documentElement.clientWidth,
		viewportheight = document.documentElement.clientHeight

	}
	else {
		// older versions of IE
		viewportwidth = document.getElementsByTagName('body')[0].clientWidth;
		viewportheight = document.getElementsByTagName('body')[0].clientHeight;
	}
	return [viewportwidth, viewportheight];
}

function fitTextInBox(boxID,maxHeight)	{
	console.log('fitTextInBox', boxID, maxHeight);
	
	if (maxHeight) fitTextInBox_maxHeight = maxHeight;
	else fitTextInBox_maxHeight = 10000;
	
	var obj = document.getElementById(boxID);
	fitTextInBox_maxWidth = obj.offsetWidth;	
	fitTextInBox_currentBox = obj;
	fitTextInBox_currentTextObj = obj.getElementsByTagName('SPAN')[0];
	fitTextInBox_currentTextObj.style.fontSize = '1px';
	fitTextInBox_currentWidth = fitTextInBox_currentTextObj.offsetWidth;
	fitTextInBoxAutoFit(obj);
}	
	
function fitTextInBoxAutoFit(fitTextInBox_currentBox)	{
	var tmpFontSize = fitTextInBox_currentTextObj.style.fontSize.replace('px','')/1;
	fitTextInBox_currentTextObj.style.fontSize = tmpFontSize + 1 + 'px';
	var tmpWidth = fitTextInBox_currentTextObj.offsetWidth;
	var tmpHeight = fitTextInBox_currentTextObj.offsetHeight;
	if(tmpWidth < fitTextInBox_maxWidth && tmpHeight < fitTextInBox_maxHeight && tmpFontSize < 100){		
		fitTextInBox_currentWidth = fitTextInBox_currentTextObj.offsetWidth;	
		fitTextInBoxAutoFit();
	}
	else{
		fitTextInBox_currentTextObj.style.fontSize = fitTextInBox_currentTextObj.style.fontSize.replace('px','')/1 - 1 + 'px';
	}		
}	

function textsupport() {

	var text = (document.all) ? ifr.document.selection.createRange().text : ifr.document.getSelection();
	console.log(text);
	if (text) {
		status = window.open(baseurl + '/support/index.cgi?category=12&text=' + escape(text), '_blank');
		return;
	}

	selectedText = ifr.document.selection;
	console.log(selectedText);
	if (selectedText && selectedText.type == 'Text') {
		var newRange = selectedText.createRange();
		if (newRange.text != '') {
			status = window.open(baseurl + '/support/index.cgi?category=12&text=' + escape(newRange.text), '_blank');
		}
	}
}

function notepad() {
	if (document.getElementById('notepad').style.visibility == 'visible') {
		document.getElementById('notepad').style.visibility = 'hidden';
	}
	else {
		document.getElementById('notepad').style.visibility = 'visible';
	}
}

function savenotepad () {

	var location = "";
	var url = baseurl + '/notepad.cgi?text=' + escape(document.getElementById('notepadcontent').value);

	new Ajax.Request(url, {
		method: 'get',
		onSuccess: function(transport) {
			document.getElementById('notepad').style.visibility = 'hidden';
		},

		onFailure: function(transport) {
			parent.document.getElementById('connectioninfo').innerHTML = "Connection error";
			alert('Connection error');
		}
	});
}

/* call always parent */
function openlayer (url, id, noupdate, width, action, actionparam, html, nobasiclayer, hidden) {
	console.log('openlayer', url, id, noupdate, width, action, actionparam);
	
	if (document.getElementById('ifr')) {
		document.getElementById('ifr').src = url;
		return;
	}
	
	if (parent.document.getElementById('ifr')) {
		parent.document.getElementById('ifr').src = url;
		return;
	}

	if ( id == '' || id == undefined || id === undefined ) {
		/*id = document.getElementById(id.parentNode);*/
		console.log('missing id, got parentNode:', id);
		return;
	}

	if (width == '' || width == undefined || width === undefined) { width = 700; }
	var initlayer = 0;
	var container;
	if (document.getElementById(id)) {
		console.log(id, 'layer open already');
		var frame = document.getElementById(id + "_frame");
		if (hidden != 1) {
		frame.style.visibility = "visible";
		frame.style.display = "block";
		}
		container = document.getElementById(id);
		container.style.overflowY = null;
		container.style.height = null;
		
	}
	else {
		console.log('open layer', url, id, width);

		container = createbasiclayer(id, width, nobasiclayer, hidden);

		initlayer = 1;
		console.log('open layer done', url, id);
	}
	var top = document.body.scrollTop
	? document.body.scrollTop
	: (
		window.pageYOffset
		? window.pageYOffset
		: (
			document.body.parentElement	? document.body.parentElement.scrollTop	: 0
		)
	);
	var winsize = windowsize();
	var left = Math.floor(winsize[0] / 2 - width / 2);
	if (left < 240) { left = 240; }
	document.getElementById(id + "_frame").style.width = width + "px";
	document.getElementById(id + "_frame").style.left = left + "px";

	if (action == "city_build" || action == "city_train" || action == "city")  {
		cityaction('&poll=1', 1, actionparam);
	}

	document.getElementById(id + '_frame').style.top = (top + 40) + "px";

	if (noupdate == 1 || url == undefined || url === undefined || url == '') {
		console.log('no layer update');
		if (html != undefined) {
			container.innerHTML = basiclayer_navi(id) + html;
			setTimeout("new Draggable('" + id + "_frame', { handle: 'title_" + id + "' });", 1000);
		}
	}
	else {
		if (nobasiclayer != 1) { html = basiclayer_navi(id, width); }
		if (initlayer) { container.innerHTML = html; }

		url+= "&gof2=none";
		url+= "&gof2_layer=" + id;
		if (noupdate == 2) { url+= "&cache=1"; }

		console.log('update layer', id, url);
		new Ajax.Request(url, {
			method: 'get',
			onSuccess: function(transportlayer) {
				container.innerHTML = html + transportlayer.responseText;
				console.log('layer updated', id, url, action, actionparam);

				if (action == "city_build" || action == "city_train" || action == "city" ) {
					cityinit(actionparam, 0, action);
				}

				setTimeout("new Draggable('" + id + "_frame', { handle: 'title_" + id + "' });", 1000);
				console.log('draggable', id, "title_" + id);

			},
			onFailure: function(transport) {
				console.log("can't update layer", id, url);
				container.innerHTML = html + '<div class="error">' + lang.get('err_connection') + " " + transportlayer.responseText + "</div>";
			}
		});
	}
	
	basiclayer_focus(id);
}

function createbasiclayer(id, width, nobasiclayer, hidden) {
	if (width == '' || width == undefined || width === undefined) { width = 700; }
	var minwidth = width - 100;
	
	var frame = document.createElement('div');
	document.getElementById('content').appendChild(frame);
	frame.setAttribute('class', 'basiclayerframe');
	frame.setAttribute('className', 'basiclayerframe');
	frame.setAttribute('id', id + '_frame');
	frame.setAttribute('width', width + 'px');
	if (hidden == 1) {
		frame.style.visibility = "hidden";
		frame.style.display = "none";
	}
	frame.onmousedown = new Function('e', "basiclayer_focus('" + id + "');");

	if (nobasiclayer == 1) {
		frame.innerHTML = "<div id=\"" + id + "\">";
	} else {
	var html = "<table class=\"basiclayer\">";
	html+= "<tr><td class=\"basiclayer1\"></td><td class=\"basiclayer2\"></td><td class=\"basiclayer3\"></td></tr>";
	html+= "<tr><td class=\"basiclayer4\"></td><td class=\"basiclayer5\" style=\"min-height: 150px; min-width: " + minwidth + "px\"><div id=\"" + id + "\"></div></td><td class=\"basiclayer6\"></td></tr>";
	html+= "<tr><td class=\"basiclayer7\"></td><td class=\"basiclayer8\"></td><td class=\"basiclayer9\"></td></tr>";
	html+= "</table>";
	frame.innerHTML = html;
	}

	var container = document.getElementById(id);
	basiclayers.push(id);
	return container;
}

function basiclayer_navi(id, width) {
	var navi = "";
	navi+= "<div id=\"basiclayer_options" + id + "\" class=\"basiclayer_options\">\n";
	/* navi+= "<span class=\"link\" onclick=\"minimizelayer('" + id + "')\">" + lang.get('minimize') + "</span>\n"; */
	/* navi+= "<span class=\"link\" onclick=\"openlayer('', '" + id + "', '', " + width + ")\">" + lang.get('maximize') + "</span>\n"; */
	navi+= "<span class=\"link\" onclick=\"hidelayer('" + id + "')\">" + lang.get('hide') + "</span>\n</div>\n";
	return navi;
}

function basiclayer_focus (focus_id) {
	console.log('amount of basiclayers', basiclayers.length, 'set focus to', focus_id);
	document.getElementById(focus_id + '_frame').style.zIndex = "600";
	for (var j = 0; j < basiclayers.length; j++) {
		if (basiclayers[j] == '') { continue; }
		if (basiclayers[j] == focus_id) {
			console.log('top layer is', focus_id, 'set to top');
		}
		else {
			document.getElementById(basiclayers[j] + '_frame').style.zIndex = "500";
		}
	}
}

function hidelayer (id) {
	if (document.getElementById(id + '_frame')) {
		console.log('hidelayer', id);
		document.getElementById(id + '_frame').style.visibility = "hidden";
		document.getElementById(id + '_frame').style.display = "none";
	} else {
		console.log('layer', id, 'do not exist, can not hide');
	}
}

function minimizelayer (id) {
	if (document.getElementById(id + '_frame')) {
		document.getElementById(id + '_frame').style.overflowY = "hidden";
		document.getElementById(id + '_frame').style.width = "160px";
		document.getElementById(id + '_frame').style.height = "60px";
	}
}

function openvillages () {
	console.log('cities', registry.get('cities'));
	if (registry.get('cities') == '') {
		openlayer('city3.cgi?', "city", 0, 750);
	}
	else {
		var cities = registry.get('cities').split(/,/);
		openlayer('city3.cgi?view=' + cities[0], "city" + cities[0], 0, 750, "city", cities[0]);
	}
}

function postform (id, layer, contenttype) {
	console.log('attempt to post form', id, 'in', layer);

	if (parent.document.getElementById('ifr') || document.getElementById('ifr')) {
		console.log('ifr, submit form');
		document.getElementById(id).submit();
		return;
	}

	if (id == '' || id == undefined || id === undefined) {
		id = document.getElementById(id.parentNode);
		console.log('missing id, got parentNode:', id);
	}

	if (!document.getElementById(layer)) {
		createbasiclayer(layer);
	}

	$(id).request({
		parameters: {
			gof2: 'none'
		},
		onSuccess: function(transportlayer) {
			console.log('form posted ok, update content');
			document.getElementById(layer).innerHTML = basiclayer_navi(layer) + transportlayer.responseText;;
		},
		onFailure: function(transport) {
			console.log('form post failed');
			document.getElementById(layer).innerHTML = basiclayer_navi(layer) + transportlayer.responseText;;
		}
	})
	console.log('form post completed');
}

/** Upload a file using AJAX **/
AIM = {
 
	frame : function(c) {
 
		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '<iframe style="display:none" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
		document.body.appendChild(d);
 
		var i = document.getElementById(n);
		if (c && typeof(c.onComplete) == 'function') {
			i.onComplete = c.onComplete;
		}
 
		return n;
	},
 
	form : function(f, name) {
		f.setAttribute('target', name);
	},
 
	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c && typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},
 
	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}
 
		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}
 }

function photoStart() {
	if (parent.document.getElementById('ifr')) {
		parent.playsound("photo");	
	} else {
		playsound("photo");	
	}
}
function photoComplete(response) {
	if (parent.document.getElementById('ifr')) {
		parent.document.getElementById('photo').src = parent.document.getElementById('photo').src + '?rand=' + Math.round(100000*Math.random());
	} else {
		document.getElementById('photo').src = document.getElementById('photo').src + '?rand=' + Math.round(100000*Math.random());
		document.getElementById('profile_photo').innerHTML = basiclayer_navi('profile_photo', '') + response;
	}
}
function flagStart() {
	if (parent.document.getElementById('ifr')) {
		parent.playsound("flag");
	} else {
		playsound("flag");
	}
}
function flagComplete(response) {
	if (parent.document.getElementById('ifr')) {
		document.location = baseurl + "/profile/profile.cgi?step=9";
	} else {
		document.getElementById('flag').innerHTML = basiclayer_navi('flag', '') + response;
	}
}

function realmchange() {
	var realm = document.getElementById('realm').value;
	baseurl = 'http://' + realmkey.get(realm) + '.gloryoffellowland.com';
	target = baseurl + '/profile/profile.cgi';
	document.getElementById('loginform').action = baseurl + '/login/login.cgi';
	lastpos = 0;
	document.getElementById('historydiv').innerHTML = '';
	loadhistory(60, '', 15, '', '', 0);

	new Ajax.Request('/api/realminfo.cgi?project=' + realm, {
		method: 'get',
			   
		onSuccess: function(transportlayer, oJSN) {
			console.log('realm data got', transportlayer.responseText);
			try {
				var data = transportlayer.responseText.evalJSON();
				console.log('realm data got 2');
				document.getElementById('realminfo').innerHTML = data.description;
			} catch (e) {
				console.log(e);
			}
			document.getElementById('realmname').innerHTML = data.title;
			console.log('realm data got 3');
			document.getElementById('leader_name').innerHTML = data.most_name;
			document.getElementById('most_title').innerHTML = data.most_title;
			document.getElementById('photo').src = data.most_photo;
			console.log('realm data got 4');
			document.getElementById('realmprogress2').style.width = (Math.floor(data.progress) * 10 + 5) + "px";
			console.log('realm data got 5');
			document.getElementById('realmprogress3').innerHTML = data.progress + " / 10";
		},
		onFailure: function(transport) {
			document.getElementById('realminfo').innerHTML = "";
			document.getElementById('realmname').innerHTML = "";
			document.getElementById('leader_name').innerHTML = "";
			document.getElementById('most_title').innerHTML = "";
			document.getElementById('photo').src = '';
			document.getElementById('realmprogress2').style.width = "0px";
			document.getElementById('realmprogress3').innerHTML = "";
		}
	});
	console.log('realmchange done');
}

function support_changeshowinfo() {
	for (var i = 0; i < 20; i++) {
		if (document.getElementById('support_showinfo' + i)) {
			document.getElementById('support_showinfo' + i).style.visibility = 'hidden';
			document.getElementById('support_showinfo' + i).style.display = 'none';
		}
	}
	var id = document.getElementById('support_showinfo').value;
	if (document.getElementById('support_showinfo'+ id)) {
		document.getElementById('support_showinfo' + id).style.visibility = 'visible';
		document.getElementById('support_showinfo' + id).style.display = 'block';
	}
}

function updategraphstat(stat, account) {
	var image_id  = "graph_stat_picture_"+account;
	var legend_id = "graph_stat_legend_"+account;
    if(document.getElementById(image_id)) {
        document.getElementById(image_id).src = "../graphstatsengine.cgi?stat="+stat+"&account="+account;
    }
    if(document.getElementById(legend_id)) {
		document.getElementById(legend_id).innerHTML = '';
		lang_get_string("www-gof/profile/view", "position_"+stat, legend_id);
    }
}

function lang_get_string(module,str,id) {
    new Ajax.Request("/api/lang.cgi?module=" + escape(module) + "&string=" + escape(str),
    {
		onSuccess: function(oReq, oJSN) {
			var data = oReq.responseText.evalJSON();

			if (typeof id == "string") {
				$(id).innerHTML += data.string;
			}
			else if  (typeof id == "function") {
				id(data.string);
			}
		}
    });
}

function substitute() {
    var args=substitute.arguments;
    var Base=args[0];

    if ( Base == '' || Base == undefined || Base === undefined || Base == 'undefined' ) {
        return '';
    }

    var Seek,Len,ix1,ix2,ix3;
    for (ix1=1; ix1<args.length; ix1++) {
        ix2=ix1-1;
        Seek='[['+ix2+']]';
        if ((ix3=Base.indexOf(Seek)) > -1) {
            Len=Seek.length;
            Base=Base.substring(0,ix3)+args[ix1]+Base.substring(ix3+Len);
        }
    }
    return Base;
}

function unit_tip(u1,u21,u22,u23,u25) {
	
	if ( !unit_tip_str_localised ) {
		var unit_tt_tpl = document.getElementById('unit_tooltip_html_template');
		unit_tip_str_localised = document.getElementById('unit_tooltip_html_template').innerHTML;
	}
	
    var textstr = substitute(unit_tip_str_localised,u1,u21,u22,u23,u25);
    ddrivetip(textstr);
}
