	var map, layer, wms_sigma;
	var myMarkers = new Array();
	var locData;
	var recentMarkerLayer;
	var nonRecentMarkerLayer;
	var t;
	var update_timeout_ms = 20000; //20s
	
	var basedir='./';
	var fleetID = 0;
	
	var maxLevelOfZoom = 13;
	var smallIconsBelowZoom = 4;
	
	var imgNames = new Array('man', 'balloon', 'car', 'plane', 'ship','truck','bus','bike');
	var imgSizes = new Array(new OpenLayers.Size(34,58), new OpenLayers.Size(28,36), new OpenLayers.Size(52,46), new OpenLayers.Size(50,52), new OpenLayers.Size(48,50), new OpenLayers.Size(61,32), new OpenLayers.Size(66,31), new OpenLayers.Size(70,47));
	var imgRelativeOffsets = new Array(new OpenLayers.Pixel(0.6,0.6), new OpenLayers.Pixel(0.6,0.9), new OpenLayers.Pixel(0.6,0.6), new OpenLayers.Pixel(0.6,0.6), new OpenLayers.Pixel(0.6,0.6), new OpenLayers.Pixel(0.6,0.6), new OpenLayers.Pixel(0.6,0.6), new OpenLayers.Pixel(0.6,0.6)); //TODO wyznaczyc dokladnie srodki

 var sourcePrj,destPrj;
   if (typeof Proj4js != 'undefined') //Proj4js included, mozna reprojektowac
   {	
    Proj4js.defs["EPSG:900913"] = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs";
    	  Proj4js.defs["EPSG:32612"] = "+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ";
	  //Proj4js.defs["EPSG:2956"] = "+proj=utm +zone=12 +ellps=GRS80 +units=m +no_defs ";
	  sourcePrj = new Proj4js.Proj("EPSG:4326");
	  destPrj = new Proj4js.Proj("EPSG:900913");
   }
	
	var translateCoords = false;
	
	AutoSizeFramedCloudMaxSize = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
            'autoSize': true,
            initialize:function(id, lonlat, size, contentHTML, anchor, closeBox, closeBoxCallback) {
            	this.imageSrc = basedir + 'cloud-popup-relative3.png';
            	OpenLayers.Popup.Framed.prototype.initialize.apply(this, arguments);
            	this.contentDiv.className = "olFramedCloudPopupContent";
            }
        });
	
	
	function getFormattedDescription(name, lastseen, lonlat)
	{		
		return "<B>User:</B> "+name+"<BR /><B>Last seen:</B> "+lastseen;
		// + "<BR/><B><I>Longitude:</I></B> " + lonlat.lon+ "<BR/><B><I>Latitude:</I></B> " + lonlat.lat;
	}
	
	function cyclicUpdate()
	{
		retrieveLocationData();
	}
					
	function onMouseDownHandler(evt)
 	{
		if(this.popup == null || this.popup.visible() == false)
		{
		    //popup = new OpenLayers.Popup(this.index,
			//   this.lonlat,
			//   new OpenLayers.Size(250,100),
			//   getFormattedDescription(this.name, this.lastseen, this.lonlat),
			//   true);
			popup = new AutoSizeFramedCloudMaxSize(this.index,
			   this.lonlat,
			   new OpenLayers.Size(0,0),
			   getFormattedDescription(this.name, this.lastseen, this.lonlat),
			   this.icon,
			   true);
		    popup.setBorder("2px");
		    popup.markerIndex = this.index;
		   
		    this.popup = popup;
	
		    map.addPopup(popup);
	    }
	}
	
	var size = new OpenLayers.Size(28,36); 
	var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
	var size_small = new OpenLayers.Size(size.w/2,size.h/2); 
	var offset_small = new OpenLayers.Pixel(-(size_small.w/2), -size_small.h);
	
	function adjustIconForZoom(icon, recent, index)
	{
		var divisor = map.zoom < smallIconsBelowZoom ? 2 : 1;
		divisor = divisor * (recent ? 1 : 2);

		icon.size = new OpenLayers.Size(imgSizes[index].w / divisor, imgSizes[index].h / divisor);
		icon.offset = new OpenLayers.Pixel(-imgSizes[index].w * imgRelativeOffsets[index].x / divisor,-imgSizes[index].h * imgRelativeOffsets[index].y / divisor);
	}
	
	function onZoom()
	{
		for(y=0; y < myMarkers.length; ++y)
		{
			//alert(myMarkers[y].roleIndex);
			adjustIconForZoom(myMarkers[y].icon, myMarkers[y].isRecent,myMarkers[y].roleIndex );
			myMarkers[y].icon.draw();
		}
	}

	function getIcon(role, recent)
	{
		var foundIndex = 0;
		
		for(i = 1; i < imgNames.length; ++i)
		{
			if(imgNames[i] == role)
				foundIndex = i;
		}

		var name = imgNames[foundIndex] + ".png";
		var divisor = recent ? 1 : 2;
		
		return new OpenLayers.Icon(basedir+name,new OpenLayers.Size(imgSizes[foundIndex].w / divisor, imgSizes[foundIndex].h / divisor) ,new OpenLayers.Pixel(-imgSizes[foundIndex].w * imgRelativeOffsets[foundIndex].x / divisor,-imgSizes[foundIndex].h * imgRelativeOffsets[foundIndex].y / divisor));
	}

	function getRoleIndex(role)
	{
		for(i = 1; i < imgNames.length; ++i)
			if(imgNames[i] == role) return i;
		return 0;
	}
	
	function internalAdd()
	{
		var x;
		var lat;
		var lon;
		var split;
		var role;
		var prevname = '';
		
		var columns;
		var name;
		var recent;
		var roleInd;
		
		if(locData.length > 0)
			columns = locData[0].split("\t");

		for(x=1;x < locData.length;++x)
		{  
		    if(locData[x].length > 0)
		    {
			    split=locData[x].split("\t");
			    
			    if(split.length >= 5)
			    {
			    	for(z=0;z<split.length; ++z)
				{
					if(columns[z] == 'lat')
						lat = split[z];
					else if(columns[z] == 'lon')
						lon = split[z];
					else if(columns[z] == 'role')
						role = split[z];
					else if(columns[z] == 'name')
						name = split[z];
				}
				
				if(lat.length > 0 && lon.length > 0)
				{
					recent = (prevname == name ? false : true);
					roleInd = getRoleIndex(role);
					//var icon = new OpenLayers.Icon(basedir+'redmark.png',size,offset);
					var icon = getIcon(role, recent);
					adjustIconForZoom(icon, recent, roleInd);					
					
					if(translateCoords)
					{
   					var ll_transformed = new Proj4js.Point(lon, lat);
						Proj4js.transform(sourcePrj, destPrj, ll_transformed);
						lon=ll_transformed.x;
						lat=ll_transformed.y;
					}
					var marker = new OpenLayers.Marker(new OpenLayers.LonLat(lon, lat), icon);
					marker.events.register('mousedown', marker, onMouseDownHandler);
					marker.isRecent = recent;
					marker.roleIndex = roleInd;
					
					for(z=0;z<split.length; ++z)
					{
						if(columns[z] != 'lat' && columns[z] != 'lon')
							marker[columns[z]] = split[z];
					}
					
					marker.index=x;				
									
					myMarkers[myMarkers.length] = marker;
					if(recent)
						recentMarkerLayer.addMarker(marker);
					else
						nonRecentMarkerLayer.addMarker(marker);
				}

				prevname = name;
			   }
		   }
		}
	}

	function getAjaxRequestObject()
	{
	  var xmlHttp;
	  var file;
		
	  try
	  {    // Firefox, Opera 8.0+, Safari    
	    	xmlHttp=new XMLHttpRequest();    
	  }
	  catch (e)
	  {    // Internet Explorer    
	  try
	  {      
	  	xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");      
	  }
	  catch (e)
	  {     
	    try
	    {        
	    	xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");        
	    }
	    catch (e)
	    {        
		alert("Your browser does not support AJAX!");
		return false;        
	    }      
	  }    
	  }  
	  
	  return xmlHttp;
	}
	

	function add()
	{
  		
		
		if(typeof recentMarkerLayer == 'undefined')
		{
			var xmlHttp = getAjaxRequestObject();
	  
	  		xmlHttp.onreadystatechange=function()
	  		{
		   		 if(xmlHttp.readyState==4)
		   		 {
					recentMarkerLayer = new OpenLayers.Layer.Markers( xmlHttp.responseText, {'numZoomLevels': maxLevelOfZoom} );
					nonRecentMarkerLayer = new OpenLayers.Layer.Markers( "Previous locations", {'numZoomLevels': maxLevelOfZoom} );
					map.addLayer(recentMarkerLayer);
					map.addLayer(nonRecentMarkerLayer);
					internalAdd();
		    	 }
	 	 	}
		
	  	 	file=basedir+"getfleetinfo.php?fleetID="+fleetID;
		
	  	 	xmlHttp.open("GET",file,true);
	 	 	xmlHttp.send(null);
		}
		else
		{
			recentMarkerLayer.clearMarkers();
			nonRecentMarkerLayer.clearMarkers();
			
			for(y=0; y < myMarkers.length; ++y)
			{
				if(typeof myMarkers[y].popup != 'undefined')
				{
					myMarkers[y].popup.hide();
					myMarkers[y].popup.destroy();
				}
				myMarkers[y].destroy();
			}
			
			myMarkers.length = 0;

			internalAdd();
		}		
	}
	
	function isNoPng()
	{
		//Get version for IE, as below 7 has no good png transparency
		version=0;
		if (navigator.appVersion.indexOf("MSIE")!=-1)
		{
			temp=navigator.appVersion.split("MSIE");
			version=parseFloat(temp[1]);
		}
		if( navigator.appName.indexOf("Microsoft")!=-1 && version < 7 )
			return true;
		else
			return false;
	}

	function retrieveLocationData()
	{  
	  var xmlHttp = getAjaxRequestObject();
	  
	  xmlHttp.onreadystatechange=function()
	  {
	    if(xmlHttp.readyState==4)
	    {
			locData=xmlHttp.responseText.split("\n");
			add();
			t=setTimeout("cyclicUpdate()",update_timeout_ms);
	    }
	  }
		
	  file=basedir+"listall.php?fleetID="+fleetID+"&format=txt";
		
	  xmlHttp.open("GET",file,true);
	  xmlHttp.send(null);
	  
	  return true;
	}


  	function init(base_dir)
  	{
    	basedir=typeof base_dir != 'undefined'? base_dir : './';
    
    	map = new OpenLayers.Map('map',{'controls': [], 'maxZoomLevel': 17});
    		
    	if ( isNoPng() ) 
    	{                        wms_sigma = new OpenLayers.Layer.WMS( "USA",
                    ["http://sigma.openplans.org/tilecache/tilecache.py?",
                    "http://sigma1.openplans.org/tilecache/tilecache.py?",
                    "http://sigma2.openplans.org/tilecache/tilecache.py?"],
                    {layers: 'sigma-gif' }, {numZoomLevels: 17});

    	}
    	else
    	{                         wms_sigma = new OpenLayers.Layer.WMS( "USA",
                  ["http://sigma4.openplans.org/geowebcache/service/wms",
                   "http://sigma3.openplans.org/geowebcache/service/wms",
                   "http://sigma2.openplans.org/geowebcache/service/wms",
                   "http://sigma1.openplans.org/geowebcache/service/wms"],
                   {layers: 'sigma',format: 'image/png' }, {numZoomLevels: 17});
    	}
		
    	map.addLayer(wms_sigma);

    	layer = new OpenLayers.Layer.WMS( "World", 
           "http://labs.metacarta.com/wms-c/Basic.py?", {layers: 'basic', format: 'image/png'}, {isBaseLayer: false, reproject: false, numZoomLevels: 17}  );

		wms_satellite_bkg = new OpenLayers.Layer.WMS( "Satellite", "http://sigma.openplans.org/geoserver/gwc/service/wms?", {layers: 'bluemarble'}, {isBaseLayer: false, reproject: false, numZoomLevels: 11}  );
 
     	map.addLayers([layer,wms_satellite_bkg]);
    	layer.setZIndex(90);
		wms_satellite_bkg.setZIndex(90);
		wms_satellite_bkg.setVisibility(false); //domyslnie wylaczone



		
		
    	map.setCenter(new OpenLayers.LonLat(0, 0), 0);

    	retrieveLocationData();

    	map.addControl(new OpenLayers.Control.LayerSwitcher());
    	map.addControl(new OpenLayers.Control.PanZoomBar());
    	map.addControl(new OpenLayers.Control.MouseDefaults());
    	//map.addControl(new OpenLayers.Control.MouseToolbar());
    	//map.addControl(new OpenLayers.Control.MousePosition());

	    map.events.register('zoomend', map, onZoom );
	    map.zoomToMaxExtent();
  }
