/* $Id: map-version-3.js,v 1.4 2008/10/17 13:01:00 wnagele Exp $ */

function Markers() {
  this.markers = new Array();
}
Markers.prototype.addMarker = function(server, instance) {
  var point = new GLatLng(parseFloat(instance.getAttribute('lat')),
                          parseFloat(instance.getAttribute('lon')));

  var done = false;
  for (var i = 0; i < this.markers.length; i++) {
    if (this.markers[i].point.toString() == point.toString()) {
      this.markers[i].addInstance(server, instance);
      done = true;
      break;
    }
  }
  if (!done) this.markers.push(new AdvancedMarker(point, server, instance));
}

function AdvancedMarker(point, server, instance) {
  this.point = null;
  this.letters = new Array();
  this.infotexts = new Array();

  this.point = point;
  this.addInstance(server, instance);
}
AdvancedMarker.prototype.addInstance = function(server, instance) {
  this.letters.push(server.getAttribute('letter'));
  this.infotexts.push(createInfoText(server, instance));
}
AdvancedMarker.prototype.getConcatenatedInfoText = function() {
  var concatInfotext = '';
  if (this.letters.length > 1) concatInfotext += '<i>Note: This location has multiple instances.</i><p>';
  concatInfotext += this.infotexts.join('<hr/>');
  return concatInfotext;
}

function createIcon(label, color) {
  var icon = MapIconMaker.createLabeledMarkerIcon({width: 21, height: 34, label: label, primaryColor: color});
  icon.shadow = '';
  icon.iconSize = new GSize(21, 34);
  icon.iconAnchor = new GPoint(10, 34);
  icon.infoWindowAnchor = new GPoint(10, 34);
  return icon;
}

function drawIcon(icon, htmlElement) {
  var img = document.createElement('img');
  img.setAttribute('src', icon.image);
  document.getElementById(htmlElement).appendChild(img);
}

function getIcon(letters) {
  var length = letters.length;
  if (length == 1) {
    switch (letters[0]) {
      case 'A':
        return createIcon('A', '#638def');
      case 'B':
        return createIcon('B', '#cb9c7b');
      case 'C':
        return createIcon('C', '#96ec7c');
      case 'D':
        return createIcon('D', '#fd8d08');
      case 'E':
        return createIcon('E', '#bbe3ff');
      case 'F':
        return createIcon('F', '#c89aff');
      case 'G':
        return createIcon('G', '#ff3300');
      case 'H':
        return createIcon('H', '#ef6f63');
      case 'I':
        return createIcon('I', '#01be00');
      case 'J':
        return createIcon('J', '#cccccc');
      case 'K':
        return createIcon('K', '#ffce00');
      case 'L':
        return createIcon('L', '#0099cc');
      case 'M':
        return createIcon('M', '#cc9933');
      default:
        return createIcon('', '#f48179');
    }
  } else {
    if (length >= 0 && length <= 99) return createIcon('' + length + '', '#f48179');
    return createIcon('', '#f48179');
  }
}

function createMarker(point, letters, infotext) {
  var icon = getIcon(letters);
  var marker = new GMarker(point, icon);
  marker.bindInfoWindowHtml(infotext);
  return marker;
}

function createInfoText(server, instance) {
  var infoText = '<table class="infoText">';
  infoText += '<tr><th>Letter:</th><td>' + server.getAttribute('letter') + '</td></tr>';
  if (server.getAttribute('operator')) infoText += '<tr><th>Operator:</th><td>' + server.getAttribute('operator') + '</td></tr>';
  if (instance.getAttribute('ipv4') == 'true' || (!instance.getAttribute('ipv4') && server.getAttribute('ipv4'))) infoText += '<tr><th>IPv4:</th><td>' + server.getAttribute('ipv4') + '</td></tr>';
  if (instance.getAttribute('ipv6') == 'true' || (!instance.getAttribute('ipv6') && server.getAttribute('ipv6'))) infoText += '<tr><th>IPv6:</th><td>' + server.getAttribute('ipv6') + '</td></tr>';
  if (server.getAttribute('asn')) infoText += '<tr><th>ASN:</th><td>' + server.getAttribute('asn') + '</td></tr>';
  if (instance.getAttribute('town')) infoText += '<tr><th>Location:</th><td>' + instance.getAttribute('town');
  if (instance.getAttribute('state')) infoText += ', ' + instance.getAttribute('state');
  if (instance.getAttribute('country')) infoText += ', ' + instance.getAttribute('country');
  infoText += '</td></tr>';
  if (instance.getAttribute('type') == 'global') infoText += '<tr><th>Type:</th><td> Global</td></tr>';
  if (instance.getAttribute('type') == 'local') infoText += '<tr><th>Type:</th><td> Local</td></tr>';
  infoText += '</table>';
  return infoText;
}

function renderMap() {
  var queryStringLetter = queryString('letter');
  if (typeof queryStringLetter != 'undefined') {
    document.getElementById('legend').style.visibility = 'hidden';
  }

  window.map = new GMap2(document.getElementById('map'));
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.setCenter(new GLatLng(30, 15), 2);

  var request = GXmlHttp.create();
  request.open('GET', '/meta/version-1.xml', true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      var xmlDoc = request.responseXML;
      if (xmlDoc) {
        var markers = new Markers();

	var servers = xmlDoc.documentElement.getElementsByTagName('server');
        for (var i = 0; i < servers.length; i++) {
          if (typeof queryStringLetter == 'undefined' || servers[i].getAttribute('letter') == queryStringLetter) {
	    var instances = servers[i].getElementsByTagName('instance');
	    for (var j = 0; j < instances.length; j++) {
              markers.addMarker(servers[i], instances[j]);
            }
          }
        }

        for (var i = 0; i < markers.markers.length; i++) {
          var marker = createMarker(markers.markers[i].point, markers.markers[i].letters, markers.markers[i].getConcatenatedInfoText());
          map.addOverlay(marker);
        }
      } else {
        alert('Couldn\'t load server details');
      }
    }
  }
  request.send(null);
}

function queryString(key) {
  queryStringParts = window.location.search.substring(1).split('&');
  for (i = 0; i < queryStringParts.length; i++) {
    queryStringPartArray = queryStringParts[i].split('=');
    if (queryStringPartArray[0] == key) {
      return queryStringPartArray[1];
    }
  }
}

