var ptCurrent = false;
var curr = -1;
var max = 10;
var tries = 0;
var maxtries = 3;
var best = -1;
var topscore = -1;

function SetCookie(name, value, expires, path, domain, secure){
	var today = new Date();
	today.setTime(today.getTime());
	if (expires) expires = expires * 1000 * 60 * 60 * 24;
	else expires = 0;
	var expires_date = new Date(today.getTime() + (expires));
	document.cookie = name + "=" + escape(value) +
	((expires) ? ";expires=" + expires_date.toGMTString() : "") +
	((path) ? ";path=" + path : "") + 
	((domain) ? ";domain=" + domain : "") +
	((secure) ? ";secure" : "");
}

function getCookieVal (offset) {
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1)
	endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}

function GetCookie (name, DefaultVal) {
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;
	while (i < clen) {
		var j = i + alen;
		if (document.cookie.substring(i, j) == arg)
			return getCookieVal (j);
		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) break; 
	}
	return DefaultVal;
}

function showSelected(marker) {
	for (var i = 0; i < 10; i++) {
		if (q[i].marker == marker) {
			document.getElementById('qry' + i).className = 'qa';
		} else {
			document.getElementById('qry' + i).className = 'qia';
		}
	}
}

function displayAll() {
	var total = 0;
	for (var i = 0; i < 10; i++) {
		var pt = new GLatLng(q[i].l1, q[i].l2);
		var marker = new GMarker(pt, getIcon(5));
		map.addOverlay(marker);
		q[i].marker = marker;
		GEvent.addListener(marker, "click", function() {
			this.showMapBlowup({zoomLevel: 6, mapType: G_HYBRID_MAP});
		});
		GEvent.addListener(marker, "mouseover", function() {
			showSelected(this);
		});
		GEvent.addListener(marker, "mouseout", function() {
			showSelected(null);
		});		
		document.getElementById('q' + i).innerHTML = q[i].c + ' <span class="country">(' + q[i].ct + ')</span>';
		document.getElementById('qry' + i).className = 'qia';
		document.getElementById('qry' + i).onclick = function () {
			setPosition(parseInt(this.id.substring(3)));
		}
		total += q[i].br;
	}
	
	with (document.getElementById('total')) {
		style.borderTop = '1px solid #000000';
		if (total == 0)
			innerHTML = '~&nbsp;0&nbsp;km';
		else
			innerHTML = total + '&nbsp;km';
	}
	
	document.getElementById('gameover').style.display = 'block';
	document.getElementById('result').innerHTML = document.getElementById('total').innerHTML;
	
	if ((topscore == -1) || (total < topscore)) {
		topscore = total;
		SetCookie('caps_topscore', topscore, 30);
	}
	
	with (document.getElementById('bestresult')) {
		if (topscore == 0)
			innerHTML = '~&nbsp;0&nbsp;km';
		else
			innerHTML = topscore + '&nbsp;km';
	}
}

function setPosition(i) {
	var pt = new GLatLng(q[i].l1, q[i].l2);
	map.setCenter(pt, 3);
	map.showMapBlowup(pt, {zoomLevel: 6, mapType: G_HYBRID_MAP});
}

function setLocateText() {
	if (curr > 0) {
		document.getElementById('qry' + (curr - 1)).className = 'qia';
	}
	
	document.getElementById('n' + curr).innerHTML = (curr + 1) + '.&nbsp;';
	document.getElementById('q' + curr).innerHTML = q[curr].c;
	document.getElementById('r' + curr).innerHTML = '';
	
	document.getElementById('qry' + curr).className = 'qa';
	
	//if (curr < 9) document.getElementById('q' + (curr + 1)).innerHTML = '<span id="next"><a href="javascript:void(0)" onclick="getNext();">' + sNext + '</a></span>';
}

function getNext() {
	curr++;
	if (curr < max) {
		map.clearOverlays();
		ptCurrent = new GLatLng(q[curr].l1, q[curr].l2);
		tries = 0;
		setLocateText();
		best = -1;
		return true;
	} else {
		playing = false;
		displayAll();
		return false;
	}
}

var playing = true;
var map = false;
function load() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"), {draggableCursor: "crosshair"});
		map.addControl(new GSmallMapControl());
		map.setCenter(new GLatLng(30.6833, 23.3167), 1);
		var mt = map.getCurrentMapType();
		mt.getMaximumResolution = function() {return 3;}
		getNext();
		
		GEvent.addListener(map, "click", function(overlay, pt) {
			if (!playing) return;
			if (tries < maxtries) {
				if (!overlay) {
					putMarker(pt);
					tries++;
				}
			} else {
				map.clearOverlays();
				getNext();
			}
		});
	}
  
	topscore = GetCookie('caps_topscore', -1);
}

function distance(p1, p2) {
	var radlat1 = Math.PI * p1.lat()/180;
	var radlat2 = Math.PI * p2.lat()/180;
	var radlon1 = Math.PI * p1.lng()/180;
	var radlon2 = Math.PI * p2.lng()/180;
	var theta = p1.lng()-p2.lng();
	var radtheta = Math.PI * theta/180;
	var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
	dist = Math.acos(dist);
	dist = dist * 180/Math.PI;
	dist = dist * 60 * 1.1515;
	dist = dist * 1.609344;
	return dist;
}

var icons = [];

function getIcon(n) {
  if (!icons[n]) {
	var icon = new GIcon();
	icon.image = "imgs/pin" + n + ".png";
	icon.iconAnchor = new GPoint(5, 16);
	icon.infoWindowAnchor = new GPoint(5, 16);
	icon.iconSize = new GSize(20, 20);
	icon.shadow = "imgs/pinsh.png";
	icon.shadowSize = new GSize(35, 20);
	icons[n] = icon;
  }
  return icons[n];
}

function createMarker(point, icon, str) {
  var marker = new GMarker(point, icon, {clickable: false, title: str});
  return marker;
}

function putMarker(pt) {
	if (map) {
		var dist = Math.round(distance(pt, ptCurrent));
		var icon = getIcon(0);
		if (dist < 200) icon = getIcon(5);
		else if (dist < 500) icon = getIcon(4);
		else if (dist < 1000) icon = getIcon(3);
		else if (dist < 2000) icon = getIcon(2);
		else if (dist < 3000) icon = getIcon(1);
		if (dist > 200) {
			var info = dist.toString() + " km away (" + (tries + 1) + '/' + maxtries + ')';
			if ((best == -1) || (dist < best)) best = dist;
		} else {
			var info = "perfect";
			tries = maxtries;
			best = 0;
		}
		
		q[curr].br = best;
		
		with (document.getElementById('r' + curr)) {
			if (best == 0) innerHTML = '~&nbsp;0&nbsp;km';
			else innerHTML = best + '&nbsp;km';
		}
		
		var marker = createMarker(pt, icon, info);
		map.addOverlay(marker);
		//marker.openInfoWindowHtml(info);
		
		var label = new TFadingLabel(pt, '<div class="labelin">' + info + '</div>', 3, 'label', new GSize(-2, 2));
		map.addOverlay(label);
	}
}

var labels = [];
var bTimeout = false;

function fadeTO() {
	var n = labels.length;
	var i = 0;
	while (i < n) {
		labels[i].currentFade -= labels[i].fadeBy;
		if (labels[i].currentFade > 0) labels[i].setFade();
		else {
			var label = labels[i];
			map.removeOverlay(label);
			delete(label);
			//labels.splice(i, 1);
			//n--;
			n--;
			i--;
		}
		i++;
	}
	if (labels.length > 0) setTimeout('fadeTO()', 100);
	else bTimeout = false;
}

function startFade() {
	if (bTimeout) return;
	bTimeout = true;
	setTimeout('fadeTO()', 100);
}

function TFadingLabel(point, content, fadeFor, className, offset) {
	this.point = point;
	this.content = content;
	if (fadeFor <= 0) fadeFor = 1;
	this.fadeFor = fadeFor;
	if (className) this.className = className;
	if (offset) this.markerOffset = offset;
}

TFadingLabel.prototype = new GOverlay();

TFadingLabel.prototype.initialize = function(map) {
	this.parentMap = map;
	
	this.span = document.createElement('div');
	if (this.className) this.span.className = this.className;
	this.span.style.position = 'absolute';
	this.span.innerHTML = this.content;
	this.span.zIndex = 10000;
	
	this.mapTray = map.getPane(G_MAP_FLOAT_PANE);
	this.mapTray.appendChild(this.span);
	
	this.w = this.span.offsetWidth;
	this.h = this.span.offsetHeight;
	
	if (!this.markerOffset) {this.markerOffset=new GSize(0,0);}
	
	this.currentFade = 100;
	this.fadeBy = (100 / (this.fadeFor * 10));
	
	labels.push(this);
	startFade();
}

TFadingLabel.prototype.redraw = function(force) {
	if (!force) return;
	
	var pos = this.parentMap.fromLatLngToDivPixel(this.point);
	var x = parseInt(pos.x);
	var y = parseInt(pos.y);
	
	this.span.style.left = x - this.markerOffset.width + 'px';
	this.span.style.top = y - this.markerOffset.height - this.h + 'px';
}

TFadingLabel.prototype.setFade = function() {
	var opacity = this.currentFade;
	if (opacity < 0) opacity = 0;
	if (opacity > 100) opacity = 100;
	if (typeof(this.span.style.filter) == 'string') this.span.style.filter = 'alpha(opacity:'+ opacity +')';
	if (typeof(this.span.style.KHTMLOpacity) == 'string') this.span.style.KHTMLOpacity = opacity / 100;
	if (typeof(this.span.style.MozOpacity) == 'string') this.span.style.MozOpacity = opacity / 100;
	if (typeof(this.span.style.opacity) == 'string') this.span.style.opacity = opacity / 100;
}

TFadingLabel.prototype.remove = function() {
	for (var i = 0; i < labels.length; i++) {
		if (labels[i] == this) {
			labels.splice(i, 1);
			break;
		}
	}
	this.mapTray.removeChild(this.span);
	delete(this.span);
}

TFadingLabel.prototype.copy = function() {
	return new TFadingLabel(this.point, this.content, this.fadeFor, this.className, this.offset);
}