GoogleMap = function(options) {

	GoogleMap.instance = this;

	this.initialized = false;
	this.options = options;
	this.objects = {};
	this.not_map_clicked = false;

	if (!this.options) {
		this.options = {basehref : 'http://www.savaitgalis.lt'};
	}
	if (!this.options.center) {
		this.options.center = {lat : 30, lon : 10, zoom: 2};		
	}
	if (!this.options.container) {
		this.options.container = "__google_map__";
	}
	if (this.options.showInterface === undefined) {
		this.options.showInterface = true;
	}
	this.map = new GMap2($(this.options.container));
	if (this.options.showInterface) {
		this.map.setUIToDefault();
	}
	this.map.enableScrollWheelZoom();
	this.map.enableDragging();

	if (this.options.uri) {		
		this.map.disableScrollWheelZoom();
		this.map.disableDragging()
	}
	GEvent.bind(this.map, "click", this, this.onClick);
	GEvent.bind(this.map, "move", this, this.onMove);

	if (this.options.uri_onchange) {
		GEvent.bind(this.map, "moveend", this, this.onChange);
		this.onChange();
	}

	this.setLoading(1);

	if (this.options.center_by_title) {
		this.goToLocationByTitle(this.options.center_by_title);		
	} else {
		this.initialized = true;
		this.resetCenter();
		this.onInitialized();
	}
}

GoogleMap.__nextZIndex = 1000;
GoogleMap.prototype.loading = 0;
GoogleMap.prototype.nodePreloader = null;

GoogleMap.prototype.setLoading = function(delta) {
	var loadText = "";
	if (this.nodePreloader === null) {
		this.nodePreloader = $(this.options.container).parentNode.appendChild(document.createElement("DIV"));
		this.nodePreloader.className = "googlemaps_preloader";
		this.nodePreloader.style.visibility = "hidden";
		this.nodePreloader.innerHTML = "0";		
	}
	this.loading += delta;
	if (this.loading > 0) {
		this.nodePreloader.innerHTML = this.loading;
		this.nodePreloader.style.visibility = "";
	} else {
		this.nodePreloader.style.visibility = "hidden";
		this.loading = 0;
	}
}

GoogleMap.prototype.onInitialized = function() {
	this.setLoading(-1);
}

GoogleMap.prototype.onMove = function() {	
	if (GoogleMapInfoWindow.instanceShown && GoogleMapInfoWindow.instanceShown.getVisible()) {
		GoogleMapInfoWindow.instanceShown.redraw(true);
	}
}

GoogleMap.prototype.onClick = function() {
	if (this.options.uri) {
		document.location = this.options.uri;
	} else if (GoogleMapInfoWindow.instanceShown && !this.not_map_clicked) {
		GoogleMapInfoWindow.instanceShown.setVisible(false);
	}
	this.not_map_clicked = false;
}

GoogleMap.prototype.onGeoLocate = function(uri) {
	$("__map_message_error__").style.display = $("__map_message__").style.display = "none";
	$('__map_message_loading__').style.display = '';
	if (navigator.geolocation) {
		var listener = {};
		listener.success = function(position) {
			GoogleMap.instance.onGeoLocateComplete(
				position.coords.latitude, position.coords.longitude, 13,
				position.coords.latitude + ", " + position.coords.longitude
			);
		}
		listener.error = function() {
			GoogleMap.instance.onGeoLocateRemote(uri);
		}
		listener.error.uri = uri;
		navigator.geolocation.getCurrentPosition(listener.success, listener.error);
	} else {
		this.onGeoLocateRemote(uri);
	}
}

GoogleMap.prototype.onGeoLocateRemote = function(uri) {
	var request = new Request({url : uri});
	request.parent = this;
	request.onSuccess = function(responseText) {
		this.parent.removeObjects("myposition");
		if (responseText === "" || responseText === "[null]") {
			$('__map_message_loading__').style.display = $("__map_message__").style.display = "none";
			$("__map_message_error__").style.display = "";
			this.parent.setLoading(0);
			return false;
		}
		var data = eval(responseText);
		data = data[0];
		GoogleMap.instance.onGeoLocateComplete(
			data.latitude, data.longitude, data.zoom,
			data.city, "city"
		);
	}
	request.send();
}

GoogleMap.prototype.onGeoLocateComplete = function(lat, lon, zoom, title, type) {
	this.removeObjects("myposition");
	this.setCenter(lat, lon, zoom);
	this.removeObjects("myposition");	
	var elMessage = $("__map_message__");
	elMessage.style.display = "";
	$('__map_message_loading__').style.display = $("__map_message_error__").style.display = "none";
	var elLink = elMessage.getElementsByTagName("A")[0];
	elLink.href = "javascript:GoogleMap.instance.setCenter(" + lat + "," + lon + "," + zoom + ")";
	elLink.innerHTML = title;
	type = type === "city" ? 1 : 0;
	var nodes = elMessage.getElementsByTagName("SPAN");
	nodes[type].style.display = "";
	nodes[type === 1 ? 0 : 1].style.display = "none";
	if (type === 0) {
		this.addObject(
			{
				"info" : {
					"title" : "",
					"content" : "<b>" + nodes[type].innerHTML + "</b> " + elLink.innerHTML
				},
				"type" : "myposition", "position" : {"lat" : lat, "lon" : lon}
			}
		);
	}
	this.setLoading(0);
}

GoogleMap.prototype.onChange = function(full) {
	this.setLoading(1);
	var bounds = this.map.getBounds();
	var tr = bounds.getNorthEast();
	var bl = bounds.getSouthWest();
	var uri_prefix = "?ltl_lat=" + tr.lat() + "&ltl_lng=" + bl.lng() + "&lbr_lat=" + bl.lat() +
		"&lbr_lng=" + tr.lng();

	var elCategory = $("__map_filter_category__");
	var elDistrict = $("filter-district");
	var elCity = $("filter-city");
	var post = {
		form_id : $("__map_filter_id__").value,
		category : elCategory.value,
		subcategory : [],
		district : full ? elDistrict.value : elDistrict.getAttribute("currentvalue"),
		city : full ? elCity.value : elCity.getAttribute("currentvalue")
	};
	elCity.disabled = elDistrict.disabled = false;
	elCity.style.display = elDistrict.style.display = "";
	var elOption = elCategory.options[elCategory.selectedIndex];
	if (elOption.getAttribute("categorytype") === "travelabroad") {
		elCity.disabled = elDistrict.disabled = true;
		elCity.style.display = elDistrict.style.display = "none";
	}
	if (full) {
		elCategory.setAttribute("currentvalue", elCategory.value);
		elDistrict.setAttribute("currentvalue", elDistrict.value);
		elCity.setAttribute("currentvalue", elCity.value);
	}

	var elSubcategory = post.category ? $("__map_filter_subcategory__" + post.category) : null;
	var lastSubcategoryTitle = null;
	var lastSubcategoryUri = null;
	if (elSubcategory) {
		elSubcategory.style.display = "";
		nodes = elSubcategory.getElementsByTagName("INPUT");
		var l = nodes.length;
		for (var i = 0; i < l; i++) {
			var node = nodes[i];
			if (node.checked) {
				lastSubcategoryTitle = node.parentNode.innerHTML.split(">", 2)[1];
				lastSubcategoryUri = node.getAttribute("uri");
				post.subcategory.push(node.value);
			}
		}
		post.subcategory = post.subcategory.join(",");
	}

	var parts = [];
	var link = [];
	if (post.subcategory.split(",").length == 1 && lastSubcategoryTitle !== null) {
		parts.push(lastSubcategoryTitle);
		link.push(lastSubcategoryTitle);
		link.push(lastSubcategoryUri);
	} else if (elCategory.value > 0) {
		var elOption = elCategory.options[elCategory.selectedIndex];
		parts.push(elOption.innerHTML);
		link.push(elOption.innerHTML);
		if (elOption.getAttribute("uri")) {			
			link.push(elOption.getAttribute("uri"));
		}
	}
	if (elCity.value > 0) {
		var elOption = elCity.options[elCity.selectedIndex];
		parts.push(elCategory.value > 0 ? elOption.getAttribute("pagetitle") : elOption.innerHTML);
	} else if (elDistrict.value > 0) {
		var elOption = elDistrict.options[elDistrict.selectedIndex];
		parts.push(elOption.innerHTML);
		parts.push("apskrityje");
	}
	if (parts.length > 0) {
		parts.push("žemėlapyje");
	} else {
		parts.push("Žemėlapis");
	}
	try {
		$("__meta_title__").innerHTML = $("__page_title__").innerHTML = parts.join(" ");
	} catch (e) {}

	var elLink = $("__map_link__");
	if (link.length == 2) {
		elLink.style.display = "";
		elLink.getElementsByTagName("SPAN")[0].innerHTML = link[0];
		elLink.href = link[1];
	} else {
		elLink.style.display = "none";
	}
	
	var request = new Request(
		{url : this.options.uri_onchange + ",ajax.1" + uri_prefix, method : "post", data : post}
	);
	request.parent = this;
	request.uri_prefix = uri_prefix;
	request.onSuccess = function(responseText) {
		var parts = responseText.split("\n");
		var data = eval(parts[0]);
		var l = data[0].length;
		var keys = {};
		for (var i = 0; i < l; i++) {
			keys[this.parent.addObject(data[0][i]).key] = true;
		}
		this.parent.autoRemoveObjects(keys);
		var elDistrict = $("filter-district");
		var elCity = $("filter-city");
		if (elDistrict.getAttribute("lastvalue") != elDistrict.value || elCity.getAttribute("lastvalue") != elCity.value) {
			if (!data[1]) {
				this.parent.resetCenter();
			} else {
				this.parent.setCenter(data[1].latitude, data[1].longitude, data[1].zoom);
			}
		}
		elDistrict.setAttribute("lastvalue", elDistrict.value);
		elCity.setAttribute("lastvalue", elCity.value);
		this.parent.setLoading(-1);
	}
	request.send();

	var parts = [];
	for (var i in post) {
		if (i === "form_id") {
			continue;
		}
		var data = post[i];
		if (data.join !== undefined) {
			data = data.join(',');
		}
		parts.push(i + '=' + data);
	}
	parts.push(uri_prefix.substr(1));
	document.location.hash = parts.join('&');
}

GoogleMap.prototype.resetCenter = function() {
	if (this.options.bounds) {
		var bounds = new GLatLngBounds(
			new GLatLng(this.options.bounds.ltl_lat, this.options.bounds.ltl_lng),
			new GLatLng(this.options.bounds.lbr_lat, this.options.bounds.lbr_lng)
		);
		var center = bounds.getCenter();
		this.options.center = {
			"lat" : center.lat(), "lon" : center.lng(), "zoom" : this.map.getBoundsZoomLevel(bounds)
		};
	}
	this.setCenter(this.options.center.lat, this.options.center.lon, this.options.center.zoom);
}

GoogleMap.prototype.setCenter = function(lat, lon, zoom) {
	if (zoom === "max") {
		zoom = this.map.getCurrentMapType().getMaximumResolution();
	} else if (zoom === "min") {
		zoom = this.map.getCurrentMapType().getMinimumResolution();
	}
	if (zoom === undefined) {
		zoom = this.map.getZoom();
	}
	zoom = zoom ? Number(zoom) : 7;
	this.map.setCenter(new GLatLng(lat, lon), zoom);
	if (!this.initialized) {		
		this.options.center.lat = lat;
		this.options.center.lon = lon;
		this.options.center.zoom = zoom;
		this.initialized = true;
		this.onInitialized();
	}
}

GoogleMap.prototype.getCenter = function() {
	return this.map.getBounds().getCenter();
}

GoogleMap.prototype.removeObjects = function(type) {
	for (var key in this.objects) {
		if (this.objects[key].type === type) {
			var object = this.objects[key];
			if (object.__child__) {
				this.map.removeOverlay(object.__child__);
				object.__child__ = null;
			}
			this.map.removeOverlay(object);
			this.objects[key] = false;
		}
	}
}

GoogleMap.prototype.autoRemoveObjects = function(keys) {
	for (var key in this.objects) {
		if (this.objects[key].type !== "clickmarker" && this.objects[key].type !== "myposition" && !keys[key]) {
			var object = this.objects[key];
			if (object.__child__) {
				this.map.removeOverlay(object.__child__);
				object.__child__ = null;
			}
			this.map.removeOverlay(object);
			this.objects[key] = false;
		}
	}
}

GoogleMap.prototype.addObject = function(options) {
	if (options.type === undefined) {
		options.type = "spot";
	}

	if (options.position === undefined) {
		options.position = {lat : options[2], lon : options[3]};
		options.info = {id : options[0], title : options[1], icon : options[4]};
		options.shortdata = true;
	}

	var key = options.position ? options.position.lat + "_" + options.position.lon : "";
	if (this.objects[key]) {
		return this.objects[key];
	}
	var position = options.position ? new GLatLng(options.position.lat, options.position.lon) : this.getCenter();	

	var object = null;
	if (options.type === "positionmarker") {
		var marker = new GMarker(position, {draggable : true});
		var listener = {"marker" : marker, 'elLatitude' : $("latitude"), 'elLongitude' : $('longitude')};
		listener.onClick = function(overlay, position) {
			this.elLatitude.value = rountToPhpFloat(position.lat());
			this.elLongitude.value = rountToPhpFloat(position.lng());
			this.marker.setLatLng(position);
		}
		listener.onDragEnd = function(position) {
			this.onClick(this.marker, position);
		}
		GEvent.bind(this.map, "click", listener, listener.onClick);
		GEvent.bind(marker, "dragend", listener, listener.onDragEnd);
		if (listener.elLatitude.value != '' && listener.elLongitude.value) {
			listener.onClick(null, new GLatLng(listener.elLatitude.value, listener.elLongitude.value));
		}
		this.map.addOverlay(marker);
		object = marker;
	} else if (options.type === "myposition") {

		var iconCustom = new GIcon(G_DEFAULT_ICON);
		iconCustom.image = this.options.basehref + "images/you.png";
		iconCustom.shadow = null;
		iconCustom.iconSize = new GSize(23, 41);
		iconCustom.iconAnchor = new GPoint(12, 41);

		var marker = new GMarker(position, {title : options.info.title, "icon" : iconCustom});
		this.map.addOverlay(marker);

		var windowoptions = {
			"parent" : this,
			"position" : position,
			"title" : options.info.title,
			"visible" : false,
			"content_plain" : options.info.content,
			"y" : -44
		};
		var infowindow = new GoogleMapInfoWindow(windowoptions);
		this.map.addOverlay(infowindow);
		infowindow.onClick = function() {
			this.setVisible(!this.getVisible());
		}
		marker.__child__ = infowindow;
		GEvent.bind(marker, "click", infowindow, infowindow.onClick);		
		infowindow.onClick();
		
		object = marker;
	} else if (options.type === "clickmarker") {
		var marker = this.addObject(
			{
				"position" : position, "type" : options.markerType, info : {title : options.markerTitle},
				draggable : true
			}
		);
    var listener = {"marker" : marker, parent : this};		
		listener.onClick = function(overlay, position) {
			if (this.marker.isHidden()) {
				this.marker.show();
			}
			var el = $("location_latitude");
			if (el) {
				el.value = rountToPhpFloat(position.lat());
			}
			el = $("location_longitude");
			if (el) {
				el.value = rountToPhpFloat(position.lng());
			}
			this.marker.setLatLng(position);
			if (parent.onInitialized) {
				parent.onInitialized = null;
			}
		}
		listener.onDragEnd = function(position) {
			listener.onClick(this.marker, position);
		}
		GEvent.bind(this.map, "click", listener, listener.onClick);		

		GEvent.bind(marker, "dragend", listener, listener.onDragEnd);
		listener.onClick(marker, position);
		object = marker;
		this.__listener__ = listener;
		this.onInitialized = function() {
			this.__listener__.onClick(this.__listener__.marker, this.getCenter());
			this.__listener__.marker.hide();
			this.__listener__ = undefined;
		}
		marker.hide();
	} else if (options.type === "spot" || options.type === "spot_goto") {
		var iconCustom = new GIcon(G_DEFAULT_ICON);
		iconCustom.image = this.options.basehref + "images/flags/flag3.png";		
		iconCustom.shadow = null;
		iconCustom.iconSize = new GSize(36, 37);
		iconCustom.iconAnchor = new GPoint(10, 35);
		if (options.info && options.info.priority) {
			iconCustom.image = this.options.basehref + "images/flags/flag5.png";
		}
		if (options.info.id && this.options.expand_once == options.info.id) {
			options.main = true;
		}
		if (options.main) {
			iconCustom.image = this.options.basehref + "images/flags/flag4.png";
			iconCustom.iconSize = new GSize(49, 49);
			iconCustom.iconAnchor = new GPoint(13, 46);
		}
		var marker = new GMarker(
			position,
			{
				title : options.info.title,
				"icon" : iconCustom, draggable : options.draggable ? true : false
		}
		);
		if (options.info.icon) {
			marker = new GoogleMapIcon(
				{"position" : position, title : options.info.title, "icon" : options.info.icon, zIndexProcess : function(marker) {alert()}}
			);
		}
		if (options.type === "spot") {
			var listener = {
				"options" : options, "position" : position, "y" : -iconCustom.iconSize.height,
				"marker" : marker, "parent" : this
			};
			listener.onClick = function() {
				var windowoptions = {
					"parent" : this.parent,
					"position" : this.position,
					"title" : this.options.info.title,
					"y" : this.y,
					"visible" : this.options.main ? true : false
				};
				if (this.options.shortdata !== true) {
					windowoptions.image = this.options.info.image;
					windowoptions.description = this.options.info.description;
					windowoptions.exact_address = this.options.info.exact_address;
					windowoptions.uri = this.options.info.uri;
				} else if (this.parent.options.uri_item) {
					windowoptions.uri_load_data = this.parent.options.uri_item + this.options.info.id;
				}
				var infowindow = new GoogleMapInfoWindow(windowoptions);
				this.parent.map.addOverlay(infowindow);
				if (this.options.main) {
					this.parent.options.expand_once = null;
				}
				infowindow.onClick = function() {
					this.setVisible(!this.getVisible());
				}
				this.marker.__child__ = infowindow;
				GEvent.removeListener(this.listener);
				GEvent.bind(this.marker, "click", infowindow, infowindow.onClick);
				infowindow.onClick();
			}
			
			listener.listener = GEvent.bind(marker, "click", listener, listener.onClick);
			
			if (options.main) {
				listener.onClick();
			}
			
		} else {
			var listener = {"uri" : options.info.uri, "parent" : this};
			listener.onClick = function(overlay, position) {
				document.location = this.uri;
				this.parent.options.uri = null;
			}
			GEvent.bind(marker, "click", listener, listener.onClick);
		}

		this.map.addOverlay(marker);

		if (this.options.forceIconsFullyVisible) {
			this.forceObjectFullyShown(marker);
		}

		object = marker;
	}
	
	if (object) {
		object.type = options.type;
		object.key = key;
	}
	return this.objects[key] = object;
}

GoogleMap.prototype.forceObjectFullyShown = function(marker) {
	var icon = marker.getIcon();
	var point = this.map.fromLatLngToContainerPixel(marker.getLatLng());
	var minX = 10;
	var maxX = this.map.getSize().width - Math.ceil(icon.iconSize.width - minX);
	var minY = icon.iconSize.height - 2;
	var maxY = this.map.getSize().height;
	var changed = false;
	if (point.x < minX) {
		point.x = minX;
		changed = true;
	} else if (point.x > maxX) {
		point.x = maxX;
		changed = true;
	}
	if (point.y < minY) {
		point.y = minY;
		changed = true;
	} else if (point.y > maxY) {
		point.y = maxY;
		changed = true;
	}
	if (changed) {
		marker.setLatLng(this.map.fromContainerPixelToLatLng(point));
	}
}

GoogleMap.prototype.goToLocationByTitle = function(title) {
	var searcher = new google.search.LocalSearch();
	var listener = {"searcher" : searcher, "parent" : this}
	listener.onSearchComplete = function() {
		var result = this.searcher.results[0]
		if (result) {
			this.parent.setCenter(result.lat, result.lng);
		}
		this.setLoading(-1);
	}
	searcher.setResultSetSize(google.search.Search.SMALL_RESULTSET);
	searcher.setSearchCompleteCallback(listener, listener.onSearchComplete);
	searcher.execute(title);
}

GoogleMap.instance = null;

GoogleMapInfoWindow = function(options) {

	this.options = options;
	this.container = null;
	this.map = null;
	this.loading = false;

}

GoogleMapInfoWindow.instanceShown = null;

GoogleMapInfoWindow.prototype.__last_center__ = null;
GoogleMapInfoWindow.prototype = new GOverlay();

GoogleMapInfoWindow.prototype.zoom = function(elHandle) {
	var options = this.__last_center__;
	if (!options) {
		options = {position : this.options.position, zoom : 15};
	}	
	this.__last_center__ = !this.__last_center__ ? {position : this.map.getCenter(), zoom : this.map.getZoom()} : null;
	this.options.parent.setCenter(options.position.lat(), options.position.lng(), options.zoom);
	elHandle.firstChild.innerHTML = this.__last_center__ === null ? "Pritraukti arčiau" : "Atitraukti";
}

GoogleMapInfoWindow.onClickZoom = function(event) {
	event = new Event(event);
	var el = event.target;
	if (el.nodeName === "SPAN") {
		el = el.parentNode;
	}
	el.parentNode.parentNode.__parent_overlay__.zoom(el);
	GoogleMap.instance.not_map_clicked = true;
}

GoogleMapInfoWindow.prototype.initialize = function(map) {
	this.map = map;

  this.container = document.createElement("DIV");
	this.map.getPane(G_MAP_MAP_PANE).appendChild(this.container);
	this.container.className = "map_block";
	this.container.__parent_overlay__ = this;	
	this.renderContent();
	this.container = $(this.container);
	this.map.getPane(G_MAP_MAP_PANE).style.zIndex = 999;
	this.container.style.display = "none";
	if (this.options.visible) {
		this.setVisible(true);
	}
}

GoogleMapInfoWindow.prototype.renderContent = function() {
	var address = this.options.position.toUrlValue();
	if (this.options.exact_address) {
		address = this.options.description;
	}
	var parts = new Array();
	parts.push('<div class="top clearfix">');
	if (!this.options.content_plain) {
		parts.push('<div class="image"><a href="' + this.options.uri + '"><img alt="" src="' + (this.options.image ? this.options.image : this.options.parent.options.basehref + "images/no_foto_small.jpg") + '"></a></div>');
	}

	parts.push('<div class="details"' + (this.options.content_plain ? ' style="float: left;width:270px"' : '') + '><a href="javascript:void(0)" onclick="(new Event(event)).target.parentNode.parentNode.parentNode.style.display=\'none\'" class="close"><br></a>');
	if (this.options.content_plain) {
		parts.push(this.options.content_plain);
	} else {
		parts.push('<a href="' + this.options.uri + '" class="name"><span>' + this.options.title + '</span></a>');
		parts.push('<div class="adress">' + this.options.description + '</div>');
	}
	parts.push('</div>');
	parts.push('</div>');
	if (!this.options.content_plain) {
		parts.push('<div class="bottom">');
		parts.push('<a class="zoom" href="javascript:void(0)" onclick="GoogleMapInfoWindow.onClickZoom(event)"><span>Pritraukti arčiau</span></a>');
		parts.push('<a class="report" href="http://maps.google.com/maps?f=d&source=s_d&saddr=&daddr=' + address + '&hl=en&geocode=&mra=mi&mrsp=0&sz=11&sll=' + address + '&ie=UTF8&z=11" target="_blank"><span>Kaip atvykti?</span></a>');
		parts.push('</div>');
	}
	this.container.innerHTML = parts.join("");
}

GoogleMapInfoWindow.prototype.remove = function() {
	this.container.parentNode.removeChild(this.container);
}

GoogleMapInfoWindow.prototype.copy = function() {	
  return new GoogleMapInfoWindow(this.options);
}

GoogleMapInfoWindow.prototype.redraw = function(force) {
  if (!force) {
		return;
	}

  var size = this.container.getSize();
	var point = this.map.fromLatLngToContainerPixel(this.options.position);
	var point2 = this.map.fromLatLngToDivPixel(this.options.position);
	var deltaX = size.x - 10 + (this.options.x ? this.options.x : 0);
	if (point.x + deltaX > this.options.parent.map.getSize().width) {
		point2.x -= deltaX;
	} else {
		point2.x -= 10;
	}
	this.container.style.left = point2.x + "px";

	var deltaY = size.y + 3 - (this.options.y ? this.options.y : 0);
	if (point.y - deltaY < 0) {
		point2.y += 10;
	}	else {
		point2.y -= deltaY;
	}
	this.container.style.top = point2.y + "px";
}

GoogleMapInfoWindow.prototype.getVisible = function(visible) {
	return this.container.style.display !== "none";
}

GoogleMapInfoWindow.prototype.loadData = function(data) {	
	this.options.image = data.info.image;
	this.options.description = data.info.content;
	this.options.exact_address = data.info.exact_address;
	this.options.uri = data.info.uri;
	this.options.uri_load_data = null;
	this.loading = false;
	this.renderContent();	
	this.setVisible(true);
}

GoogleMapInfoWindow.prototype.setVisible = function(visible) {
	if (this.loading) {
		return false;
	} else if (this.options.uri_load_data) {
		this.loading = true;		
		var request = new Request({url : this.options.uri_load_data});
		request.parent = this;
		this.options.parent.setLoading(1);
		request.onSuccess = function(responseText) {
			if (responseText) {
				data = eval(responseText);
				this.parent.loadData(data[0]);
			}
			this.parent.options.parent.setLoading(-1);
		}		
		request.send();
		return false
	}
	this.container.style.display = visible ? "" : "none";	
	if (visible) {
		if (GoogleMapInfoWindow.instanceShown && GoogleMapInfoWindow.instanceShown !== this) {
			GoogleMapInfoWindow.instanceShown.setVisible(false);
		}
		GoogleMapInfoWindow.instanceShown = this;
		this.container.style.zIndex = GoogleMap.__nextZIndex++;		
		this.redraw(true);
	}
	this.options.parent.not_map_clicked = true;
}

GoogleMapIcon = function(options) {

	this.options = options;
	this.container = null;
	this.map = null;

}

GoogleMapIcon.prototype = new GOverlay();

GoogleMapIcon.prototype.initialize = function(map) {
  this.container = document.createElement("DIV");
	this.container.className = "map_icon_image";
	this.container.innerHTML = "<img src=\"" + this.options.icon + "\" />";
	this.container.title = this.options.title;

	GEvent.bindDom(this.container, "click", this, this.onClick);

	this.map = map;
  this.map.getPane(G_MAP_MAP_PANE).appendChild(this.container);
	this.container.parentNode.style.zIndex = 10000;
}

GoogleMapIcon.prototype.redraw = function(force) {
  if (!force) {
		return;
	}
	var point = this.map.fromLatLngToDivPixel(this.options.position);
	
  this.container.style.left = point.x + "px";
  this.container.style.top = point.y + "px";
}

GoogleMapIcon.prototype.remove = function() {
	this.container.parentNode.removeChild(this.container);
}

GoogleMapIcon.prototype.copy = function() {
  return new GoogleMapIcon(this.options);
}

GoogleMapIcon.prototype.onClick = function() {
	GEvent.trigger(this, "click");
}
