var XML_NODE = {
  HTML:      1,
  ATTRIBUTE: 2,
  TEXT:      3,
  COMMENT:   8,
  ROOT:      9,
  DOCTYPE:   10
};

var GMaps = function()
{
  this.ZoomLevel = 12;
  this.EndPoints = [];
  this.isInit    = false;
  // Due to the fact that MS-damn-fucking-shitty-browser Internet Exploder
  // doesn't have any methods for looping over attribute nodes...!!!!
  this.collectableAttributes = [ 'lng', 'lat' ];
  this.map = null;
  this.OnLoaded = null;
};

GMaps.prototype =
{
  Load: function(target, xmlfile)
  {
    if (GBrowserIsCompatible()) {
      var map = new GMap2(document.getElementById(target));
      map.addControl(new GLargeMapControl());
      map.addControl(new GMapTypeControl());
      this.map = map;

      var obj = this;

      GDownloadUrl(xmlfile, function(data, responseCode)
      {
	var xml = GXml.parse(data);
	var endpoints = xml.documentElement.getElementsByTagName("endpoint");

	for (var i = 0; i < endpoints.length; i++) {
	  var endpoint = endpoints[i];
	  var id       = endpoint.getAttribute('id');
	  var oxml     = obj.xml2obj(endpoint, {});
	  var point = new GLatLng(
	    parseFloat(oxml.marker.attributes.lat),
	    parseFloat(oxml.marker.attributes.lng)
	  );

	  var marker = new GMarker(point);
	  oxml.id = id;
	  oxml.point = point;
	  oxml.gmarker = marker;
	  oxml.infoWindow = obj.infoWindow(oxml);
	  marker.info = oxml;

	  if (i == 0) {
	    map.setCenter(point, obj.ZoomLevel);
	    map.openInfoWindowHtml(map.getCenter(), oxml.infoWindow);
	  }

	  GEvent.addListener(marker, "click", function() {
	    var html = this.info.infoWindow;
	    map.openInfoWindowHtml(this.info.point, html);
	  });

	  map.addOverlay(marker);
	  obj.EndPoints.push(oxml);
	}

	if (STATIC.EDITAREA) {
	  GEvent.addListener(map, "dblclick", function(overlay, point) {
	    document.getElementById("dbg").innerHTML = point.toString();
	  });
	}
	
	obj.RenderNavigation();

	if (obj.OnLoaded)
	  obj.OnLoaded();
      });
    }
  },

  infoWindow: function(obj)
  {
    //trace(obj.point);
    var s = '<div class="wrp">';
    if (obj.title)   s += '<h2 class="title">' + obj.title + '</h2>\n';
    if (obj.address) s += '<div>' + obj.address + '</div>';
    if (obj.phone)   s += '<div><strong>Tel:</strong> ' + obj.phone + '</div>';
    else if (obj.phones) {
      s += '<div><strong>Tel:</strong></div>';
      for (var i = 0; i < obj.phones.length; i++) {
	var m = obj.phones[i].phone;
	s += '<div>&nbsp; ' + m + '<br/></div>';
      }
    }
    if (obj.mail) { 
      s += '<div><strong>E-post:</strong> <a href="mailto:' + 
	   obj.mail + '">' + obj.mail + '</a></div>';
    }
    else if (obj.mails) {
      s += "<div><strong>E-post:</strong></div>";
      for (var i = 0; i < obj.mails.length; i++) {
	var m = obj.mails[i].mail;
	s += '<div>&nbsp; <a href="mailto:' + m + '">' + m + '</a></div>';
      }
    }

    if (obj.open) s+= '<div><strong>Öppettider:</strong> ' + obj.open + '</div>';

    s += "<div><strong>GPS-koordinater</strong>:" +
         "<pre style='margin:0 0 5px 0;padding:0'>" +
         "  Longitud: " + obj.point.x + "\n" +
	 "  Latitud:  " + obj.point.y + "</pre></div>";
    
    if (obj.instances) {
      for (var i = 0; i < obj.instances.length; i++) {
	var ins = obj.instances[i];
	s += '<dl><dt>' + ins.name + '</dt>';
	if (ins.phone) s+= '<dd><strong>Tel:</strong> ' + ins.phone + '</dd>';
	if (ins.fax) s+= '<dd><strong>Fax:</strong> ' + ins.fax + '</dd>';
	if (ins.mail)  s+= '<dd><strong>E-post:</strong> <a href="mailto:' + ins.mail + '">' + ins.mail + '</a></dd>';
	if (ins.open)  s+= '<dd><strong>Öppettider:</strong> ' + ins.open + '</dd>';
	s += '</dl>';
      }
    }

    if (obj.www) s += '<div><a class="read-more" href="' + obj.www + '">Webbsida</a></div>';
    
    var tail = '';
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
      tail = '';
    }
    else {
      if (window.ie) {
      	console.log("kaka");
	if (!obj.instances) 
	  tail = '<br/>';
      }
      else tail = '<br/>&nbsp;';
    }
    return s + "</div>" + tail;
  },

  xml2obj: function(xml, obj)
  {
    var children = xml.childNodes;

    for (var i = 0; i < children.length; i++) {
      var node = children[i];
      var name = node.nodeName;

      if (node.nodeType == XML_NODE.TEXT && node.nodeValue.match(/^\s*$/)) 
	continue;

      if (node.hasChildNodes()) {
	var cncnt = 0;
	for (var j = 0; j < node.childNodes.length; j++) {
	  var cn = node.childNodes[j];
	  if (cn.nodeType == XML_NODE.TEXT && cn.nodeValue.match(/^\s*$/))
	    continue;

	  if (cn.hasChildNodes()) {
	    if (!obj[name])
	      obj[name] = [];

	    obj[name][cncnt] = {};
	    this.xml2obj(cn, obj[name][cncnt]);
	    cncnt++;
	  }
	  else
	    obj[name] = cn.nodeValue;

	  if (cn.attributes) {
	    if (typeof obj[name] != 'object') {
	      var v = obj[name];
	      obj[name] = {};
	      obj[name].value = v;
	    }

	    obj[name].attributes = {};

	    for (var k = 0; k < cn.attributes.length; k++) {
	      obj[name].attributes[cn.attributes[k].nodeName] =
		cn.attributes[k].nodeValue;
	    }
	  }
	}
      }
      else {
	if (node.nodeType == XML_NODE.TEXT)
	  name = xml.nodeName;
	else
	  name = node.nodeName;

	obj[name] = node.nodeValue||null;

	if (node.attributes) {
	  if (typeof obj[name] != 'object') {
	    var v = obj[name];
	    obj[name] = {};
	    obj[name].value = v;
	  }

	  try {
	    obj[name].attributes = {};
	  }
	  catch (e) {
	    obj[name] = {};
	    obj[name].attributes = {};
	  }

	  for (var k = 0; k < node.attributes.length; k++) {
	    obj[name].attributes[node.attributes[k].nodeName] = 
	      node.attributes[k].nodeValue;
	  }
	}
      }
    }

    return obj;
  },

  getAttributes: function(node)
  {
    var attr = {};
    for (var i = 0; i < this.collectableAttributes.length; i++) {
      var a = this.collectableAttributes[i];
      var v = null;
      if (v = node.getAttribute())
	attr[a] = v;
    }
    return attr ? attr : false;
  },

  RenderNavigation: function()
  {
    var t = document.getElementById('navigation');
    var map = this.map;
    var menues = {};

    var query = document.location.search;
    var initSelect = null;
    var initClick = null;
    if (query) {
      if (initSelect = query.match(/show=(.[^&]*)/))
	initSelect = initSelect[1];
    }

    for (var i = 0; i < this.EndPoints.length; i++) {
      var o = this.EndPoints[i];
      if (!(menues[o.menugroup])) {
	var m = menues[o.menugroup] = document.createElement('dl');
	var dt = document.createElement('dt');
	dt.appendChild(document.createTextNode(o.menugroup));
	m.appendChild(dt);
      }

      var menu  = menues[o.menugroup];
      var li    = document.createElement('dd');

      var title = o.title;
      var a     = document.createElement('a');
      a.href    = "index.xml?show=" + o.id;
      a.gObj    = o;
      a.onclick = function() {
	map.panTo(this.gObj.point, map.getZoom());
	map.openInfoWindowHtml(this.gObj.point, this.gObj.infoWindow);
	return false;
      };
      var tn = document.createTextNode(title);
      a.appendChild(tn);
      li.appendChild(a);
      menu.appendChild(li);
      
      if (initSelect && initSelect == o.id)
	initClick = a;
    }

    for (var name in menues)
      t.appendChild(menues[name]);

    var br = document.createElement('br');
    br.className = 'clear';
    t.appendChild(br);

    initClick && $(initClick).click();
  }
};

function initLoad()
{
  var gmap = new GMaps();
  var lc = document.createElement('div');
  lc.id = 'map-loader';
  var loadimg = document.createElement('img');
  loadimg.src = '/internal-roxen-spinner-ffffff';
  lc.appendChild(loadimg);
  var sp = document.createElement('span');
  sp.appendChild(document.createTextNode('Laddar karta...'));
  lc.appendChild(sp);
  document.getElementById('navigation').appendChild(lc);
  gmap.OnLoaded = function() {
    document.getElementById('navigation').removeChild(lc);
  };
  gmap.Load("gmap", "endpoints.xml");
}

$(document).ready(function() {
  initLoad();

  $(window).unload(function() {
    GUnload();
  });
});