dojo.provide("dojo.widget.QueMap");
dojo.provide("dojo.widget.QueMapMarker");
dojo.provide("dojo.widget.QueMapMarkerTab");
dojo.provide("dojo.widget.QueMapPolyline");

dojo.require("dojo.widget.*");
dojo.require("dojo.event.*");

dojo.widget.QueMap = function () {
	dojo.widget.HtmlWidget.call(this);
}

// Setup callback to hopefully prevent memory leaks
dojo.event.connect(window, 'onunload', 'GUnload');

// Enable SVG in browsers that support it.
_mSvgEnabled = true;
_mSvgForced  = true; 

dojo.inherits(dojo.widget.QueMap, dojo.widget.HtmlWidget);

dojo.lang.extend(dojo.widget.QueMap, {
	widgetType: "QueMap",
	isContainer: true,

	map: null,
	mtype: "",
	markers: [],
	lat: 38.024800,
	lng: -107.670543,
	zoom: 15,
	controls: "",
	overview: false,

	postCreate: function () {
		this.map = new GMap2(this.domNode);
		if (this.controls != "false") {
			if (this.controls == "small") {
				this.map.addControl(new GSmallMapControl());
				this.map.addControl(new GMapTypeControl(true));
			} else if (this.controls == "mini") {
				this.map.addControl(new GSmallMapControl());
			} else {
				this.map.addControl(new GLargeMapControl());
				if (this.maps)this.map.addControl(new GMapTypeControl());
			}
		}
		if (this.overview) {
			this.map.addControl(new GOverviewMapControl);
		}
		this.map.setCenter(new GLatLng(parseFloat(this.lat), parseFloat(this.lng)), parseFloat(this.zoom));
		if (this.mtype == "satellite") {
			this.map.setMapType(G_SATELLITE_MAP);
			this.map.removeMapType(G_HYBRID_MAP);
			this.map.removeMapType(G_NORMAL_MAP);
		}
		for (i=0; i<this.children.length; i++) {
			var child = this.children[i];
			if (child.widgetType == 'QueMapPolyline') {
				var polyline = this.newPolyline(child);
			}
			if (child.widgetType == 'QueMapMarker') {
				for (j=0; j<child.children.length; j++) {
					child._addTab(child.children[j]);
				}
				var marker = this.newMarker(child);
				this.markers.push(marker);
				if (child.status == "open") {
					GEvent.trigger(marker, "click");
				}
			}
		}
	},

	newMapType: function (name, shortname, urlfunc, levels, copyright) {
		var layer = new GTileLayer(new GCopyrightCollection("Map Data: " + copyright), levels[0], levels[1]);
		layer.getTileUrl = urlfunc;
		layer.getCopyright = function(a,b) { return { prefix: "Map Data: ", copyrightTexts: [copyright]}; }
		var newtype = new GMapType([layer], G_SATELLITE_MAP.getProjection(), name, {errorMessage: _mMapError, shortName: shortname});
		this.map.addMapType(newtype);
		this.map.addControl(new GMapTypeControl());
		return newtype;
	},

	setMapType: function (maptype) {
		this.map.setMapType(maptype);
	},

	newPolyline: function (info) {
		var polyline = new GPolyline(info.points, info.color, info.weight, info.opacity);
		this.map.addOverlay(polyline);
		return polyline;
	},

	newMarker: function (info) {
		var point = new GLatLng(info.lat, info.lng);
		if (info.icon == 'start') {
			var icon = new GIcon(G_DEFAULT_ICON, 'http://www.google.com/mapfiles/dd-start.png');
			var marker = new GMarker(point, icon);
		} else if (info.icon == 'end') {
			var icon = new GIcon(G_DEFAULT_ICON, 'http://www.google.com/mapfiles/dd-end.png');
			var marker = new GMarker(point, icon);
		} else if (info.icon == 'smpurple') {
			var icon = new GIcon(G_DEFAULT_ICON, 'http://www.mapbuilder.net/img/icons/marker_20_purple.png');
			icon.iconSize = new GSize(12, 20);
			icon.shadowSize = new GSize(20, 18);
			icon.iconAnchor = new GPoint(6, 20);
			icon.infoWIndowAnchor = new GPoint(5, 1);
			var marker = new GMarker(point, icon);
		} else {
			var marker = new GMarker(point);
		}
		if (info.directions) {
			var loc = point.lat()+','+point.lng();
			info.tabs.push(new GInfoWindowTab("Directions", '<div>to here from:</div><form action="http://maps.google.com/maps" method="get" target="directions"><input type="text" name="saddr" id="saddr" value="" /><br /><input type="hidden" name="daddr" value="'+loc+'" /></form><div>from here to:</div><form action="http://maps.google.com/maps" method="get" target="directions"><input type="text" name="daddr" id="daddr" value="" /><br /><input type="hidden" name="saddr" value="'+loc+'" /></form>'));
		}
		//info.tabs[0].contentElem = '<div style="min-width: '+info.tabs.length*90+'px;">'+info.tabs[0].contentElem+'</div>';
		//info.tabs.push(new GInfoWindowTab("test", 'my content'));
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowTabsHtml(info.tabs);
		});
		this.map.addOverlay(marker);
		if (info.status == "open") {
			GEvent.trigger(marker, "click");
		}
		return marker;
	}
});

dojo.widget.QueMapMarker = function () {
	dojo.widget.HtmlWidget.call(this);
}
dojo.inherits(dojo.widget.QueMapMarker, dojo.widget.HtmlWidget);

dojo.lang.extend(dojo.widget.QueMapMarker, {
	widgetType: "QueMapMarker",
	isContainer: true,

	lat: "",
	lng: "",
	label: "Info",
	html: "",
	status: "",
	directions: false,
	tabs: [],
	icon: "default",

	postCreate: function (args, frag) {
		this.tabs = [];
		var node = frag["dojo:"+this.widgetType.toLowerCase()]["nodeRef"];
		if (node.innerHTML) {
			this.html = node.innerHTML;
		}
		this.tabs.push(new GInfoWindowTab(this.label, this.html));
	},
	_addTab: function (tab) {
		this.tabs.push(new GInfoWindowTab(tab.label, tab.html));
	}
});

dojo.widget.QueMapMarkerTab = function () {
	dojo.widget.HtmlWidget.call(this);
}
dojo.inherits(dojo.widget.QueMapMarkerTab, dojo.widget.HtmlWidget);

dojo.lang.extend(dojo.widget.QueMapMarkerTab, {
	widgetType: "QueMapMarkerTab",

	label: "",
	html: "",

	postCreate: function (args, frag) {
		var node = frag["dojo:"+this.widgetType.toLowerCase()]["nodeRef"];
		node.parentNode.removeChild(node);
		this.html = node.innerHTML;
	}
});

dojo.widget.QueMapPolyline = function () {
	dojo.widget.HtmlWidget.call(this);
}
dojo.inherits(dojo.widget.QueMapPolyline, dojo.widget.HtmlWidget);

dojo.lang.extend(dojo.widget.QueMapPolyline, {
	widgetType: "QueMapPolyline",

	color: "#000000",
	opacity: ".5",
	weight: "1",
	points: "",

	postCreate: function (args, frag) {
		var node = frag["dojo:"+this.widgetType.toLowerCase()]["nodeRef"];
		node.parentNode.removeChild(node);
		eval("var pts = ["+this.points+"];");
		this.points = [];
		for (var i=0; i<pts.length; i++) {
			this.points.push(new GLatLng(pts[i][0], pts[i][1]));
		}
	}
});
