var EMap = {};
EMap.marar = {};
EMap.overlays = new Array();

GMarker.count = 0;
GMarker.bounds = null;
GMarker.prototype.html = '';
GMarker.prototype.name = '';
GMarker.prototype.displayed = false;
GMarker.prototype.overlayed = false;

function setupMap(a) {
    EMap.setUpMap(a);
}

var baseIcon = new GIcon();
baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
baseIcon.iconSize = new GSize(20, 34);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);

GMarker.create = 
	function(p, es, c, gs) {
		var m;
		if (EMap.overlays.length == 0)
			m = new GMarker(p);
		else {
			m = EMap.overlays.pop();
			m.setPoint(p);
			GEvent.clearListeners(m, "click");
			GEvent.clearListeners(m, "infowindowclose");
		}
		GEvent.addListener(m, "click", function() {
			EMap.map.savePosition();
			m.openInfoWindowHtml("<div id='markerdiv' style='font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.2; width: 300px;'>Loading...</div>");
			var r = GXmlHttp.create();
			r.onreadystatechange = function () { m.open(r) };
			r.open('GET', '/exploret?eids=' + m.zes + '&gids=' + m.gs, true);
			r.send(null);
		});
		GEvent.addListener(m, "infowindowclose", function() {
			EMap.map.returnToSavedPosition();
		});
		m.zes = es;
		m.gs = gs;
		return m;
	}

GMarker.prototype.open = 
	function(r) {
		if (r.readyState == 4  && (r.status == 200 || r.status == undefined)) {
			EMap.map.closeInfoWindow();
			var d = r.responseXML;
			var h = XML.getTagValue(d, 'h');
			var t = XML.getTagValue(d, 't');
			if (t.length > 1800)
	    		t = t.substring(0, 1800) + '...';
			this.html = "<div style='font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.2; width: 300px;'>";
			this.html += h + '<br/>' + t;
			this.html += '</div>';
			this.openInfoWindowHtml(this.html);
		}
	}

GMarker.prototype.addToolTip =
    function () {
    // will need to fix this
}

GMarker.prototype.overlay =
    function () {
		if (this.overlayed)
			this.show();
		else {
			EMap.map.addOverlay(this);
			this.overlayed = true;
		}
		this.addToolTip();
		GMarker.bounds.extend(this.getPoint());
		GMarker.count++;
	};

EMap.centroid =
    function(p, t) {
		if (EMap.center == null) {
			var icon = new GIcon(baseIcon);
			icon.image = 
			icon.printImage = 
			icon.mozPrintImage = 'http://zeemaps.cachefly.net/micons/c.png';
			icon.printShadow = null;
			EMap.center = new GMarker(p, icon);
			EMap.map.addOverlay(EMap.center);
    	} else {
			EMap.center.setPoint(p);
		GEvent.clearListeners(EMap.center, "click");
    	}
    	GMarker.bounds.extend(p);
    	GEvent.addListener(EMap.center, "click", function() {
	    	EMap.center.openInfoWindowHtml("<center><div style='font-family: Verdana sans-serif; font-size: 14px; color: #db3c58; width: 300px;'>"
				 + t + "</div></center>");
		});
	}

var embedded = false;

EMap.setUpMap = function(in_name) {
	EMap.map = new GMap2(document.getElementById("emap"));
	EMap.map.setCenter(new GLatLng(37.4419, -122.1419), 8);
	EMap.map.addControl(new GLargeMapControl());
	EMap.map.addControl(new GMapTypeControl());
	EMap.map.addControl(new GScaleControl());
	EMap.setWinHW();
	EMap.map.checkResize();
	window.onresize = function () {
		EMap.setWinHW();
		EMap.map.checkResize();
	}
	EMap.populate(in_name);
	Advertisements.init(true);
	Advertisements.setOnMap(EMap.map);
}

EMap.populate = function(n, d) {
	EMap.msg('Loading ...');
	var s = '/near';
	GMarker.bounds = new GLatLngBounds();
	if (n) {
		s += '?n=' + escape(n);
		if (d)
			s += '&d=' + d;
	} else {
		if (d)
			s += '?d=' + d;
	}
	var r = GXmlHttp.create();
	r.onreadystatechange = function () { EMap.post(r) };
	r.open('GET', s, true);
	r.send(null);
}

EMap.saveOverlays = function() {
    for (var e in EMap.marar) {
      EMap.overlays.push(EMap.marar[e]);
      EMap.marar[e].hide();
    }
    EMap.marar = {};
}

EMap.add  = function(entry) {
    var lat = parseFloat(entry.lat);
    var lng = parseFloat(entry.lng);
    var exists = false;
    var p   = new GLatLng(lat, lng);
    for (var e in EMap.marar) {
		var _m = EMap.marar[e];
		if (_m.getPoint().equals(p)) {
		    exists = true;
		    var es, gs;
		    _m.zes = _m.zes.substring(0, _m.zes.length - 1) + ',' + entry.id + ']';
		    _m.gs = _m.gs.substring(0, _m.gs.length - 1) + ',' + entry.gid + ']';
		    _m.name += ',' + entry.name;
		    _m.addToolTip();
		    break;
		}
    }
    if (!exists) {
		var es = '[' + entry.id + ']';
		var gs = '[' + entry.gid + ']';
		var m  = GMarker.create(p, es, entry.color, gs);
		m.name = entry.name;
		EMap.marar[entry.id] = m;
		m.overlay();
    }
}

GMap2.prototype.z_recenter = function (p) {
    var minZoom = this.getBoundsZoomLevel(GMarker.bounds);
    var c = GMarker.bounds.getCenter();
    this.setCenter(c, minZoom);
}

EMap.post = function(r) {
    if (r.readyState == 4 && r.status == 200) {
		EMap.saveOverlays();
		GMarker.count = 0;
		EMap.marar = {};
		var d = r.responseXML;
		var c = d.getElementsByTagName('count');
		var e = null;
		if (c.length == 1) {
		    var count = parseInt(c[0].getAttribute('v'));
		    if (count - EMap.overlays.length > 500) {
				alert('Your search has resulted in more than 500 additional markers. '
					+ ' This will slow the display of markers, so please try '
					+ ' again with smaller increments in distance or change '
					+ ' location and try again.');
				return;
			}
		}
		var el = d.getElementsByTagName('e');
		for (var j = 0; j < el.length; j++) {
		    e = el[j];
		    var entry = {};
		    entry.lat   = e.getAttribute('lat');
		    entry.lng   = e.getAttribute('lng');
		    entry.name  = XML.getTagValue(e, 'name');
		    entry.gid   = e.getAttribute('g');
		    entry.id    = e.getAttribute('id');
		    entry.color = e.getAttribute('c');
		    EMap.add(entry);
		}
		c = d.getElementsByTagName('l');
		var loc = '';
		if (c.length == 1) {
		    e = document.getElementById('exploren');
		    loc = c[0].getAttribute('n');
		    e.value = loc
		}
		c = d.getElementsByTagName('c');
		if (c.length == 1) {
		    e = c[0];
		    var p = new GLatLng(c[0].getAttribute('lat'), c[0].getAttribute('lng'));
		    EMap.map.z_recenter(p);
		    EMap.centroid(p, loc);
		}
		if (el.length == 200)
			EMap.msg("200 (MAX) entries in " + GMarker.count + " markers");
		else
			EMap.msg('' + el.length + ' entries in ' + GMarker.count + ' markers');
	}
}

EMap.update = function() {
    var d = document.getElementById('explore_d');
    if (d == null)
      dist = 10;
    else
      dist = d.value;
    var e = document.getElementById('exploren');
    if (e == null || e.value == null || e.value == '')
       EMap.populate('Sunnyvale', dist);
    else
    {
	EMap.populate(e.value, dist);
    }
}

EMap.msg = function(m) {
    var msg = document.getElementById('explore_msg');
    if (msg != null)
      msg.innerHTML = m;
}

EMap.deltaW = 50;
EMap.deltaH = 150;

EMap.setWinHW = function() {
    if (window.innerHeight) { 
		EMap.winW = window.innerWidth - EMap.deltaW ; 
		EMap.winH = window.innerHeight - EMap.deltaH;
    } else { 
		EMap.winW = document.documentElement.offsetWidth - EMap.deltaW ; 
		EMap.winH = document.documentElement.offsetHeight - EMap.deltaH;
    }
    var me = document.getElementById('emap');
    me.style.width= '' + EMap.winW + 'px';
    me.style.height= '' + EMap.winH + 'px';
}

var XML = {
    getTagValue : function(r, t) {
		var idl = r.getElementsByTagName(t);
		if (idl != null && idl.length == 1) {
		    var t = idl[0].lastChild;
		    if (t != null)
			return idl[0].lastChild.nodeValue;
		}
		return '';
    }
}

var Input = {
    explore : function(e) {
		var keycode;
		if (window.event) 
		   keycode = window.event.keyCode;
		else if (e) 
		   keycode = e.which;
		else
		   return true;
		if (keycode == 13) {
		    EMap.update();
			return;
		} else
			return;
    }
}
