var epsg4326=new OpenLayers.Projection("EPSG:4326");
var ol_map;
var ol_map_markers;
var ol_popup;

function ol_map_init(mapname)
{
/*
olmap=new OpenLayers.Map(mapname, { 
	controls: [],
	units: 'm',
	projection: new OpenLayers.Projection("EPSG:900913"),
	displayProjection: new OpenLayers.Projection("EPSG:4326") });
*/

olmap=new OpenLayers.Map(mapname,{ 
	maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
	maxResolution: 156543,
	controls: [],
	units: 'm',
	displayProjection: "EPSG:4326",
	projection: "EPSG:900913" });

olmap.events.register("moveend", olmap, function() { ol_map_update_position(olmap); } );
olmap.addControl(new OpenLayers.Control.MouseDefaults());
return olmap;
}

function ol_map_add_control(olmap, ctl)
{
switch (ctl) {
	case "keyboard":
		olmap.addControl(new OpenLayers.Control.KeyboardDefaults());
	break;
	case "panzoom":
		olmap.addControl(new OpenLayers.Control.PanZoom());
	break;
	case "panzoombar":
		olmap.addControl(new OpenLayers.Control.PanZoomBar());
	break;
	case "zoombox":
		olmap.addControl(new OpenLayers.Control.ZoomBox());
	break;
	case "layer":
		olmap.addControl(new OpenLayers.Control.LayerSwitcher());
	break;
	case "navigation":
		olmap.addControl(new OpenLayers.Control.Navigation());
	break;
	case "mousetoolbar":
		olmap.addControl(new OpenLayers.Control.MouseToolbar());
	break;
	case "scale":
		olmap.addControl(new OpenLayers.Control.ScaleLine());
	break;
	case "permalink":
		olmap.addControl(new OpenLayers.Control.Permalink('permalink'));
	break;
	case "mouseposition":
		olmap.addControl(new OpenLayers.Control.MousePosition());
	break;
	case "overview":
		olmap.addControl(new OpenLayers.Control.OverviewMap());
	break;
	default:
		return false;
}
return true;
}

function getMapCenter(olmap)
{
return olmap.getCenter().clone().transform(olmap.getProjectionObject(), epsg4326);
}

function setMapCenter(olmap, center, zoom)
{
olmap.setCenter(center.clone().transform(epsg4326, olmap.getProjectionObject()), zoom);
}

function getMapExtent(olmap)
{
return olmap.getExtent().clone().transform(olmap.getProjectionObject(), epsg4326);
}

function ol_map_goto(olmap, lat, lon, zoom)
{
if (zoom<0)
	zoom=olmap.getZoom();
setMapCenter(olmap, new OpenLayers.LonLat(lon, lat), zoom);
}

function ol_map_update_position(olmap)
{
var center=getMapCenter(olmap);
var ext=getMapExtent(olmap);
var zoom=olmap.getZoom();

}

function ol_map_debug_ext(e)
{
alert(e.left);
alert(e.bottom);
alert(e.right);
alert(e.top);
}

function ol_map_add_simple_layer(olmap, lname)
{
layer=ol_map_get_new_layer(lname);
if (!layer)
	return false;

olmap.addLayer(layer);
return layer;
}

function ol_map_set_event(olmap)
{
olmap.events.register("zoomend", olmap, updateKey);
olmap.events.register("changelayer", olmap, updateLocation);
}

function ol_map_get_icon(image, w, h, ox, oy)
{
var size=new OpenLayers.Size(w, h);
var offset=new OpenLayers.Pixel(ox, oy);
return new OpenLayers.Icon(image, size, offset);
}

function ol_map_add_simple_marker(olmap, lat, lon, icon, data)
{
if (!olmap.ol_map_markers) {
	olmap.ol_map_markers=new OpenLayers.Layer.Markers('Markers');
	olmap.addLayer(olmap.ol_map_markers);
	olmap.ol_map_markers.setVisibility(true);
}
position=new OpenLayers.LonLat(lon,lat);
icon=ol_map_get_icon(icon, 21, 25, -21/2, -25/2);
m=new OpenLayers.Marker(position.clone().transform(epsg4326, olmap.getProjectionObject()), icon);
m.setOpacity(0.8);
if (data && data!='') {
	m.data=data;
	m.marker=m;
	m.events.register("click", m, 
		function(evt) {
			ol_marker_simple_popup(olmap, this.marker, this.data, icon);
			OpenLayers.Event.stop(evt); 
		}
	);
}
olmap.ol_map_markers.addMarker(m);
return m;
}

function ol_map_remove_marker(olmap, marker)
{
if (!olmap.ol_map_markers)
	return false;
return olmap.ol_map_markers.removeMarker(marker);
}

function ol_map_add_marker_file(olmap, title, uri, popups)
{
var mlayer;

l=uri.length;
if (l<8)
	return false;
e=uri.substr(l-4);
switch (e) {
	case ".kml":
		mlayer=ol_map_get_marker_layer_kml(title, uri);
	break;
	case ".gpx":
		mlayer=ol_map_get_marker_layer_gpx(title, uri);
	break;
	case ".txt":
		mlayer=ol_map_get_marker_layer_txt(title, uri);
	break;
	case ".json":
		mlayer=ol_map_get_marker_layer_json(title, uri);
	break;
	case ".rss":
		mlayer=ol_map_get_marker_layer_georss(title, uri);
	break;
	default:
		return false;
	break;
}
return ol_map_add_marker_layer(olmap, mlayer, popups);
}

function ol_map_add_marker_layer(olmap, mlayer, popups)
{
olmap.addLayer(mlayer);
if (!popups)
	return true;
sc=new OpenLayers.Control.SelectFeature(mlayer, 
	{
	onSelect: function(feature) { ol_marker_feature_popup(olmap, feature, sc); }, 
	onUnselect: function(feature) { ol_marker_feature_clear(olmap, feature); }
	});
olmap.addControl(sc);
sc.activate();
return true;
}

function ol_map_get_marker_layer_txt(title, uri)
{
return new OpenLayers.Layer.Test(title, uri,
	{format: OpenLayers.Format.Text,
	projection: new OpenLayers.Projection("EPSG:4326"),
	style: {strokeColor: "red", strokeWidth: 5, strokeOpacity: 0.7},
	formatOptions: {
		extractStyles: true, 
		extractAttributes: true
    }
	});
}

function ol_map_get_marker_layer_json(title, uri)
{
return new OpenLayers.Layer.GML(title, uri,
	{format: OpenLayers.Format.GeoJSON,
	projection: new OpenLayers.Projection("EPSG:4326"),
	style: {strokeColor: "red", strokeWidth: 5, strokeOpacity: 0.7},
	formatOptions: {
		extractStyles: true, 
		extractAttributes: true
    }
	});
}

function ol_map_get_marker_layer_georss(title, uri)
{
return new OpenLayers.Layer.GML(title, uri,
	{format: OpenLayers.Format.GeoRSS,
	projection: new OpenLayers.Projection("EPSG:4326"),
	style: {strokeColor: "red", strokeWidth: 5, strokeOpacity: 0.7},
	formatOptions: {
		extractStyles: true, 
		extractAttributes: true
    }
	});

}

function ol_map_get_marker_layer_gpx(title, uri)
{
return new OpenLayers.Layer.GML(title, uri,
	{format: OpenLayers.Format.GPX,
	projection: new OpenLayers.Projection("EPSG:4326"),
	style: {strokeColor: "red", strokeWidth: 5, strokeOpacity: 0.7},
	formatOptions: {
		extractStyles: true, 
		extractAttributes: true
    }
	});
}

function ol_map_get_marker_layer_kml(title, uri)
{
return new OpenLayers.Layer.GML(title, uri,
               {format: OpenLayers.Format.KML,
				projection: new OpenLayers.Projection("EPSG:4326"),
				internalProjection: new OpenLayers.Projection("ESPG:900913"),
				externalProjection: new OpenLayers.Projection("ESPG:4326"),
                formatOptions: {
                 extractStyles: true, 
                 extractAttributes: true
                }
               });
}

function ol_popup_clear(olmap)
{
if (olmap.current_popup==null)
	return;
/*
olmap.removePopup(ol_popup);
olmap.current_popup.destroy();
olmap.current_popup=null;
*/
}

function ol_marker_feature_clear(olmap, marker)
{
marker.popup.hide();
}

function ol_marker_feature_popup(olmap, marker, sc)
{
if (marker.popup==null) {
	data="";
	doload=false;
	if (marker.attributes.name)
		data+="<h2>"+marker.attributes.name+"</h2>";
	if (marker.attributes.description)
		data+=marker.attributes.description;
	else {
		doload=true;
		data+='<div class="olmap_popup" style="width: 400px; height: 220px;"></div>';
	}

	marker.popup=new OpenLayers.Popup.FramedCloud(null, 
		marker.geometry.getBounds().getCenterLonLat(),
		new OpenLayers.Size(150,100), data, null, true, function() { sc.unselect(marker); });
	marker.popup.autoSize=true;
	marker.popup.minSize=new OpenLayers.Size(240, 160);
	marker.popup.maxSize=new OpenLayers.Size(480, 320);
	olmap.addPopup(marker.popup);
	marker.popup.show();
	if (doload) {
		var pu=url+baseurl+'ajax.php/'+marker.attributes.ns.value+':'+marker.attributes.pn.value;
		var id=marker.popup.contentDiv;
		load_url(id, pu);
	}
} else {
	marker.popup.toggle();
}
/* olmap.current_marker_popup=marker.popup; */
}

function ol_marker_simple_popup(olmap, marker, data, icon) 
{
if (marker.popup==null) {
	marker.popup=new OpenLayers.Popup.FramedCloud(null, marker.lonlat, new OpenLayers.Size(220, 120), data, icon, true);
	marker.popup.setOpacity(0.9);
	marker.popup.panMapIfOutOfView=true;
	marker.popup.autoSize=true;
	marker.popup.minSize=new OpenLayers.Size(200, 80);
	olmap.addPopup(marker.popup);
	marker.popup.show();
} else {
	marker.popup.toggle();
}
}

function ol_map_get_new_layer(lname)
{
switch (lname) {
	case "vmap0":
		layer=new OpenLayers.Layer.WMS("OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
	break;
	case "osm_osma":
   		layer=new OpenLayers.Layer.OSM.Osmarender("Osmarender", {
      		displayOutsideMaxExtent: true,
      		wrapDateLine: true
   		});		
	break;
	case "custom":
		layer=new OpenLayers.Layer.TMS("Custom", ol_custom_url,{ type: 'png', getURL: getTileURL, displayOutsideMaxExtent: true });
	break;
	case "google":
		alert("Google maps are not yet supported.");
		return false;
	break;
	case "osm_mapnik":
	default:
	  layer = new OpenLayers.Layer.OSM.Mapnik("Mapnik", {
	      displayOutsideMaxExtent: true,
    	  wrapDateLine: true
   		});
	break;
	}
return layer;
}

function getTileURL(bounds)
{
var res=this.map.getResolution();
var x=Math.round((bounds.left-this.maxExtent.left)/(res*this.tileSize.w));
var y=Math.round((this.maxExtent.top-bounds.top)/(res*this.tileSize.h));
var z=this.map.getZoom();
var limit=Math.pow(2, z);

if (y < 0 || y >= limit)
	return null;
x=((x % limit) + limit) % limit;
return this.url+z+"/"+x+"/"+y+"."+this.type;
}

function getEventPosition(map, event)
{
return map.getLonLatFromViewPortPx(event.xy).clone().transform(map.getProjectionObject(), epsg4326);
}
