var startDate = new Date(); 

var mapPolylinesIDs = new Array();
mapPolylinesIDs.push(0);

var mapPolylines = new Array();

var mapTrains = new Array();
var mapTrainsIDs = new Array();
mapTrainsIDs.push(0);
mapTrains[0] = new geoTrain(0);

var mapStations = new Array();
var mapStationsOBJ = new Array();
var mapStationNames = new Array();

//tooltip
var tooltip = document.createElement('div');
tooltip.style.visibility = 'hidden';

//map 
var map_is_working = 0;
var ignorePan = 1;
var ignorePan2 = 0;
var trackTrainTimer = 0;

//minimum size from where ALL stations are drawn
var station_zoom_min_size = 11;

var trackTrainID = 0;
var popupTrainID = 0;

var mapZoom;

//hide polylines state
var zoomHidePolylines = 16;

//overlay message
var om;

//delays
var delayData;

function MapZoom(where) {
  if (map_is_working) {
    return;
  }
  switch (where)  {
    case 1:
      if (map.getZoom() >= 14)  {
        om.Set(OMAddMsg('Can\'t zoom further !', 2));
        break;
      }
      map.setZoom(map.getZoom()+1);
      break;
    case 2:
      if (map.getZoom() <= 11)  {
        om.Set(OMAddMsg('Can\'t zoom closer !', 2));
        break;
      }
      map.setZoom(map.getZoom()-1);
      break;
  }
  
  mapZoom = map.getZoom();
}

//initialize map 
function InitMap(start_x, start_y, zoom_level) {
	//map.addControl(new GSmallMapControl());
	//map.addControl(new GMapTypeControl());
	map.setCenter(new GLatLng(start_y, start_x), zoom_level);
	
	if (includeMode != 'iframe') {
    map.addControl(new GOverviewMapControl(new GSize(150,150)));
    map.addControl(new GScaleControl());
	}
	
	om = new OverlayMessage(mapDIV);
	
	mapZoom = map.getZoom();
  
  GEvent.addListener(map, 'moveend', function() {
    //log('bau');
    UpdateMapData();
    if (ignorePan)  {
      return;
    }
    DrawStationsOnMap(0);
  });
  
  map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip);
  
  map.setMapType(G_SATELLITE_MAP);
  
  //return;
  SetBackgroundCall(1);
  
  UpdateMapData();
 
  UpdateMapTime();
  
  FetchStations();
}

//fetch SBB stations
function FetchStations() {
  var mapStation;
  var mapStationData;

  for (var i=0;i<mapStationsData.length;i++)  {
    mapStationData = mapStationsData[i];
    mapStation = new geoStation(mapStationData[0]);
    mapStation.title = mapStationData[1];
    mapStation.geoPoint = new GLatLng(parseFloat(mapStationData[3]), parseFloat(mapStationData[2]));
    mapStation.size = mapStationData[4];
    mapStation.onMap = 0;
    mapStation.visible = 0;

    mapStations.push(mapStation);
    mapStationsOBJ[mapStation.id] = mapStation;
    mapStationNames[mapStation.id] = mapStation.title;
  }
  ignorePan = 0;
  DrawStationsOnMap(0);
}

function DrawStationsOnMap(startID)  {
  if (startID == 0) {
    SetBackgroundCall(1);
    WriteMapStatus('Fetch stations');
  }

  var mapStation;
  var markersPerSession = 10;
  var markersDrawn = 0;
  var mapBounds = map.getBounds();
  var drawStation = 0;
  for (var i=startID;i<mapStations.length;i++)  {
    if (markersDrawn >= markersPerSession)  {
      break;
    }
    mapStation = mapStations[i];
    if (!mapBounds.contains(mapStation.geoPoint)) {
      continue;
    }
    
    if (!mapStation.onMap)  {
      mapStation.marker = GetStationMarker(mapStation);
      map.addOverlay(mapStation.marker);
      mapStation.onMap = 1;
      mapStation.visible = 1;
      markersDrawn++;    
    }
    
    if (mapStation.visible && (map.getZoom() < station_zoom_min_size) && (mapStation.size == 0)) {
      mapStation.marker.hide();
      mapStation.visible = 0;
    }
    if (!mapStation.visible && (map.getZoom() >= station_zoom_min_size) && (mapStation.size == 0)) {
      mapStation.marker.show();
      mapStation.visible = 1;
    }
    if (!mapStation.visible && (map.getZoom() < station_zoom_min_size)) {
      continue;
    }
    
    mapStation = mapStations[i];
  }
  if (markersDrawn) {
    setTimeout(function() {
      DrawStationsOnMap(i);
    }, 1000);
  }
  else  {
    FetchLines();
  }
}

function FetchLines () {
  obj = XHG_map_pan;
	if (obj.readyState == 4 || obj.readyState == 0) 	{
    WriteMapStatus('Fetch polylines');
	
    var mapBounds = map.getBounds();
		map_bounds_ar = GetMapBoundsArray(mapBounds);
	
		url = XMLHTTPGetURL;
		url += '?cmd=fetch_data&bounds_str=' + map_bounds_ar.join(',') + '&hash=' + GetUniqueVal();
		//log('url lines ' + url);
		//return;
		obj.open('POST', url, true);
		obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    obj.onreadystatechange = function ()	{
			if (obj.readyState == 4)  {
        try {
          var xmldoc = obj.responseXML;
          
  				var db_nodes = xmldoc.getElementsByTagName('db_record'); 
  				var n_records = db_nodes.length;
  
  				var lineID, pXAr, pYAr, pointAr, polyline, gVDist, gVDistPart, gV, gVPrev;
  				for (var i = 0; i < n_records; i++) {
            lineID = parseInt(GetXMLValue(db_nodes[i].getElementsByTagName('line_id')));
            pXAr = GetXMLValue(db_nodes[i].getElementsByTagName('p_x')).split(',');
            pYAr = GetXMLValue(db_nodes[i].getElementsByTagName('p_y')).split(',');
            
            //log('linia ' + lineID + ' (' + pXAr.length + ' vertexes)')
            
            pointAr = new Array();
            gVDist = 0;
            gVDistPart = 0;
            for (var j = 0; j < pXAr.length; j++) {
              gV = new GLatLng(parseFloat(pYAr[j]), parseFloat(pXAr[j]))
              if (j > 0)  {
                gVDist = gV.distanceFrom(gVPrev);
              }
              gVDistPart += gVDist; 
              gV.distPartial = roundDec(gVDistPart/100, 2);
              gVPrev = gV;
              pointAr.push(gV);
            }
            
            //polyline = new GPolyline(pointAr, '#D50505', 2, 0.5);
            polyline = new GPolyline(pointAr, '#FFFF00', 2, 0.5);
            polyline.totalLength = roundDec(gVDistPart/100, 2);
            mapPolylines[lineID] = polyline;
            mapPolylineVertexes[lineID] = pointAr;
            
            if (map.getZoom() < zoomHidePolylines)  {
              map.addOverlay(mapPolylines[lineID]);
            }
            
            mapPolylinesIDs.push(lineID);
          }
          //log('polyline_ids=' + mapPolylinesIDs.join(','));
          //fetch next ?
          FetchTrains();
        }
        catch (e) {
          log(e);
          log(obj.responseText);
        }
      }
		}
		
		obj.send('polyline_ids=' + mapPolylinesIDs.join(','));	
	}
}

function FetchTrains () {
  var mapTrainsIDsNew = new Array();
  var mapTrain;

  for(var i=0;i<mapTrainsIDs.length;i++)  {
    trainID = mapTrainsIDs[i];
    if (mapTrains[trainID]) {
      mapTrain = mapTrains[trainID];
      if ((mapTrain.trainTypeZoom == 0) && (map.getZoom() < station_zoom_min_size) && (trainID != 0))  {
        mapTrains[trainID] = null;
      }
      else  {
        mapTrainsIDsNew.push(mapTrainsIDs[i]);
      }
    }
  }
  mapTrainsIDs = mapTrainsIDsNew;

  //SetBackgroundCall(0);
  //return;
  obj = XHG_map_train;
	if (obj.readyState == 4 || obj.readyState == 0) 	{
    WriteMapStatus('Fetch trains');
    var mapBounds = map.getBounds();
		map_bounds_ar = GetMapBoundsArray(mapBounds);

		url = XMLHTTPGetURL;
		url += '?cmd=fetch_trains&now_sec=' + nowSec + '&bounds_str=' + map_bounds_ar.join(',') + '&train_ids=' + mapTrainsIDs.join(',') + '&map_zoom=' + map.getZoom() + '&hash=' + GetUniqueVal();
	  //log('url trains ' + url);
		//return;
		obj.open('GET', url, true);
    obj.onreadystatechange = function ()	{
			if (obj.readyState == 4)  {
        try {
          var xmldoc = obj.responseXML;

  				var db_nodes = xmldoc.getElementsByTagName('db_record'); 
  				var n_records = db_nodes.length;
  
  				var mapTrain;
  				var trainID;
  				var oDIV;
  				
  				for (var i = 0; i < n_records; i++) {
  				  trainID = parseInt(GetXMLValue(db_nodes[i].getElementsByTagName('train_id')));
  				  mapTrain = new geoTrain(trainID);
  				  mapTrain.trainName = GetXMLValue(db_nodes[i].getElementsByTagName('train_name'));
  				  
  				  mapTrain.poly_ar = GetXMLValue(db_nodes[i].getElementsByTagName('lines_ar')).split('|');
            mapTrain.poly_is_opposite_ar = GetXMLValue(db_nodes[i].getElementsByTagName('lines_opposite_ar')).split('|');
            mapTrain.time_start_ar = GetXMLValue(db_nodes[i].getElementsByTagName('time_start_ar')).split('|');
            mapTrain.time_stop_ar = GetXMLValue(db_nodes[i].getElementsByTagName('time_stop_ar')).split('|');
            mapTrain.poly_length = GetXMLValue(db_nodes[i].getElementsByTagName('lines_length_ar')).split('|');
            mapTrain.next_station_ar = GetXMLValue(db_nodes[i].getElementsByTagName('station_ar')).split('|');
            mapTrain.segmentID = 0;
            mapTrain.stayIN = 0;
            mapTrain.trainSpeed = 0;
            
            mapTrain.trainType = parseInt(GetXMLValue(db_nodes[i].getElementsByTagName('train_type')));
            mapTrain.trainTypeZoom = parseInt(GetXMLValue(db_nodes[i].getElementsByTagName('train_type_zoom')));
            
            oDIV = document.createElement('div');
            oDIV.innerHTML = GetXMLValue(db_nodes[i].getElementsByTagName('html'));
            
            mapTrain.isDelayed = parseInt(GetXMLValue(db_nodes[i].getElementsByTagName('is_delayed')));
            mapTrain.time_start_orig_ar = GetXMLValue(db_nodes[i].getElementsByTagName('time_start_orig_ar')).split('|');
            mapTrain.time_stop_orig_ar = GetXMLValue(db_nodes[i].getElementsByTagName('time_stop_orig_ar')).split('|'); 
            
            mapTrain.divHTML = oDIV;
            mapTrain.geoPoint = new GLatLng(0, 0);
            mapTrain.marker = GetMarker(mapTrain);
            map.addOverlay(mapTrain.marker);
  				  
            mapTrain.segment_length_ar = GetXMLValue(db_nodes[i].getElementsByTagName('segment_length_ar')).split('|');
            mapTrain.heading_str = '';
            mapTrain.speed_str = '';
            
            ComputeTrainPosition(mapTrain);
            
            
            mapTrainsIDs.push(trainID);
            mapTrains[trainID] = mapTrain;
            //GLog.write(mapTrain.poly_ar);
          }
          SetBackgroundCall(0);
          WriteMapStatus('Map pan reenabled');
        }
        catch (e) {
          log(e);
          log('tranul cu probleme ii ' + mapTrain.id);
          log(obj.responseText);
        }
      }
		}
		obj.send(null);	
	}

}


function GetMapBoundsArray(bounds)  {
  var map_bounds = bounds;
	var swx = map_bounds.getSouthWest().lng() + 0.001;
  var swy = map_bounds.getSouthWest().lat() + 0.001;
  var nex = map_bounds.getNorthEast().lng() - 0.001;
  var ney = map_bounds.getNorthEast().lat() - 0.001;
  var retAr = new Array();
  retAr = [swx, ney, nex, swy];
  return retAr;
}

function ComputeTrainPosition(mapTrain) {
  //log (mapTrain.id);
  
  var currentSec = getServerDate();
  
  var segmentID = mapTrain.segmentID;
  var segmentSec = parseInt(mapTrain.time_stop_ar[segmentID]) - parseInt(mapTrain.time_start_ar[segmentID]);
  
  var segementSecNow = currentSec - parseInt(mapTrain.time_start_ar[segmentID]);
  var segmentPercent = roundDec(segementSecNow/segmentSec, 2);
  var segmentLength = parseInt(mapTrain.segment_length_ar[segmentID]);
  var segmentCount = mapTrain.segment_length_ar.length;
  var nearStation = 0;
  
  if ((segementSecNow == 1) && (mapTrain.id == popupTrainID))  {
    LoadTrainData(mapTrain.id, 0);
  }
  
  if ((segementSecNow < 6) || ((segmentSec - segementSecNow) < 6))  {
    nearStation = 1;
  }
  
  if (segmentID >= segmentCount)  {
    setTimeout(function (){
      map.removeOverlay(mapTrain.marker);
    }, 1000);
    return;    
  }
  
  
  if (parseInt(mapTrain.id) == 7995410)  {
    //log('secAB ' + segmentSec + ' AN ' + segementSecNow + ' sID ' + segmentID + '/' + segmentCount);
  }
  
  if ((mapTrain.trainTypeZoom == 0) && (map.getZoom() < station_zoom_min_size))  {
    map.removeOverlay(mapTrain.marker);
    return;
  }
  
  //daca a ajuns in statie, il tinem modulo de timp
  if ((segementSecNow < 0)) {
    //tre sa ii calculam pozitia
    if (!mapTrain.marker.getPoint().lng())  {
      var tempLinesAB = mapTrain.poly_ar[segmentID].split(',');
      var tempLinesABFirst = parseInt(tempLinesAB[0]);
      
      var tempLinesOppAB = mapTrain.poly_is_opposite_ar[segmentID].split(',');
      var tempLinesOppABFirst = parseInt(tempLinesOppAB[0]);
      
      var tempLineVertexes = mapPolylineVertexes[tempLinesABFirst];
      
      var trainPoint = tempLinesOppABFirst ? tempLineVertexes[tempLineVertexes.length-1] : tempLineVertexes[0];
      mapTrain.marker.setPoint(trainPoint);
    }
  
    if (mapTrain.segmentID > 0) {
      mapTrain.stayIN = mapTrain.next_station_ar[mapTrain.segmentID-1];
      
      mapTrain.trainSpeed = 0;
      AlterTrainStatus(mapTrain, 'stopping in ' + mapStationNames[mapTrain.stayIN] + ' (' + SecToHMS(mapTrain.time_start_ar[segmentID]).substr(0, 5) + ')', '');
    }
    setTimeout( function () {
      ComputeTrainPosition(mapTrain);
    }, 1000*Math.abs(segementSecNow));
    return;
  }
  
  //daca are viteza 0 (a fost in statie) ... il repunem pe sine
  if (mapTrain.trainSpeed == 0) {
    mapTrain.trainSpeed = (segmentLength*0.001)/((mapTrain.time_stop_ar[segmentID] - mapTrain.time_start_ar[segmentID])/3600);
    AlterTrainStatus(mapTrain, 'heading to ' + mapStationNames[mapTrain.next_station_ar[mapTrain.segmentID]] + ' (' + SecToHMS(mapTrain.time_stop_ar[segmentID]).substr(0, 5) + ')', '<br /><b>Speed</b> ' + Math.round(mapTrain.trainSpeed) + ' km/h');
      
  }
  
  
  
  try {
    var polyAr = mapTrain.poly_ar[segmentID].split(',');
  }
  catch (e) {
    log('Train ' + mapTrain.id + ' segment=' + segmentID + ' polylines=' + mapTrain.poly_ar +  ' ' + e);
    
  }
  
  
  
  var polyIsOppositeAr = mapTrain.poly_is_opposite_ar[segmentID].split(',');
  var polyLengthAr = mapTrain.poly_length[segmentID].split(',');
  
  
  var newPercentData = GetLineDataFromPolylines(polyLengthAr, segmentLength, segmentPercent);
  //log('polyyle ' + polyAr + ' length ' + polyLengthAr + ' segLength ' + segmentLength + ' segpercent ' + segmentPercent);
  
  var lineID = polyAr[newPercentData[0]];
  
  
  //log('linia ii ' + lineID + ' percentu ii ' + newPercentData[1]);
  
  var gVNew = ProjectPercentOnPolyline(lineID, newPercentData[1], polyIsOppositeAr[newPercentData[0]]);
  
  if (!mapTrain.marker.getPoint().equals(gVNew))  {
    mapTrain.marker.setPoint(gVNew);
  }
  
  if (mapTrain.id == trackTrainID)  {
    ignorePan = 1;
    if (ignorePan2) {
      map.setCenter(mapTrain.marker.getPoint());
      ignorePan2 = 0;
    }
    else  {
      map.panTo(mapTrain.marker.getPoint());
      trackTrainTimer++;
      if (trackTrainTimer > 10) {
        DrawStationsOnMap(0);
        trackTrainTimer = 0;
      }
    }
  }
  
  if (segmentPercent > 99.99) {
    mapTrain.segmentID++;
    AlterTrainStatus(mapTrain, 'heading to ' + mapStationNames[mapTrain.next_station_ar[mapTrain.segmentID]] + ' (' + SecToHMS(mapTrain.time_stop_ar[segmentID+1]).substr(0, 5) + ')', '<br /><b>Speed</b> ' + Math.round(mapTrain.trainSpeed) + ' km/h');
  }
  
  if (nearStation)  {
    BlinkMarker(mapTrain, 0);
  }
  else  {
    setTimeout( function () {
      ComputeTrainPosition(mapTrain);
    }, 1000);  
  }
}

function BlinkMarker(mapTrain, im)  {
  var markerIMG = im % 2 ? 'img/type_0.png' : mapTrain.marker.origImage; 
  mapTrain.marker.setImage(markerIMG);
  im++;
  if (im > 10) {
    ComputeTrainPosition(mapTrain);
  }
  else  {
    setTimeout(function () {
      BlinkMarker(mapTrain, im);
    }, 100);  
  }
}

function constructPoint(g1, g2, percent)  {
  var xa = g1.lng() + (g2.lng()-g1.lng())*percent/100;
  var ya = g1.lat() + (g2.lat()-g1.lat())*percent/100;
  return (new GLatLng(ya, xa));
}

function UpdateMapTime()  {
  if (includeMode == 'iframe') {
    return;
  }

  var spanTime = document.getElementById('timeServer');
  var timeSec = getServerDate();
  spanTime.innerHTML = SecToHMS(timeSec); 
  setTimeout( function () {
    UpdateMapTime();
  }, 1000);
}

function SecToHMS(timeSec) {
  var timeH = Math.floor(timeSec/3600);
  if (timeH < 10) {
    timeH = '0' + timeH; 
  }
  var timeM = Math.floor((timeSec-timeH*3600)/60);
  if (timeM < 10) {
    timeM = '0' + timeM; 
  }
  var timeS = timeSec-timeH*3600-timeM*60;
  if (timeS < 10) {
    timeS = '0' + timeS; 
  }
  
  var timeSecHTML = timeH + ':' + timeM + ':' + timeS;
  
  return timeSecHTML;
}

function GetMarker(mapTrain)  {
  var icon = new GIcon();
  icon.image = 'img/type_' + (mapTrain.isDelayed ? 'd' : '') + mapTrain.trainType + '.png';
  icon.iconSize = new GSize(20, 20);
	icon.iconAnchor = new GPoint(10, 10);

	//var marker = new GMarker(mapTrain.geoPoint, icon);
	var marker = new PdMarker(mapTrain.geoPoint, icon);
	marker.origImage = icon.image; 
	
	marker.tooltip = mapTrain.divHTML.innerHTML;
	
	GEvent.addListener(marker, 'mouseover', function() {
		showTooltip(marker, tooltip);
	});
	
  GEvent.addListener(marker, 'mouseout', function() {
		tooltip.style.visibility = 'hidden';
	});
  
	GEvent.addListener(marker, 'click', function() {
    switch (includeMode)  {
      case 'iframe' :
        var urlToFollow = mapTrain.trainName;
        urlToFollow = urlToFollow.replace(/\s/g, '');
        urlToFollow = 'http://cfr.webgis.ro/' + urlToFollow;
        //log(urlToFollow);
        top.location = urlToFollow; 
        break;
      default:
        LoadTrainData(mapTrain.id, 0);
        break; 
    }
	});
	
  return marker;
}

function AlterTrainStatus (mapTrain, statusStr, speedStr)  {
  var oTable = mapTrain.divHTML.childNodes[0].childNodes[1];
  if (!oTable)  {
    oTable = mapTrain.divHTML.childNodes[0].childNodes[0];
  } 
  var oSPANStatus = oTable.rows[2].cells[0].childNodes[2];
  var oSPANSpeed = oTable.rows[2].cells[0].childNodes[3];
  
  
  
  oSPANStatus.innerHTML = statusStr;
  oSPANSpeed.innerHTML = speedStr;
  
  //alert(mapTrain.divHTML);
  //GLog.write(mapTrain.divHTML.childNodes[0].childNodes[1].rows[2].cells[0].childNodes[3].innerHTML);
  //mapTrain.divHTML.innerHTML = 'Asta ma interesa';
  mapTrain.marker.tooltip = mapTrain.divHTML.innerHTML;
  //alert(mapTrain.html);
  //mapTrain.marker.tooltip = mapTrain.html;
  
  
}

function showTooltip(marker, current_tooltip) {

  mover_offset_x = -7;
  mover_offset_y = 7;
  
 	current_tooltip.innerHTML = marker.tooltip;
 	
	var point = map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true), map.getZoom());
	var offset = map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(), map.getZoom());
	var anchor = marker.getIcon().iconAnchor;
	var width = marker.getIcon().iconSize.width;
	var height = current_tooltip.clientHeight;
	var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width + mover_offset_x, offset.y - point.y -anchor.y -height + mover_offset_y)); 
	
	pos.apply(current_tooltip);
	current_tooltip.style.visibility = 'visible';

}

function LoadTrainData(mapOBJ, typeID, oP)  {
  if (!oP)  {
    oP = new Array();
  }
  //mapOBJ e de fapt object id
  obj = XHG_data_train;
  if (obj.readyState == 3)  {
    obj = getHTTPObject();
  }
	if (obj.readyState == 4 || obj.readyState == 0) 	{
		url = XMLHTTPGetURL;
		switch (typeID) {
		  //statii
      case 1:
        popupTrainID = 0;
      case 2:
        url += '?cmd=fetch_station_data&stationID=' + mapOBJ + '&now_sec=' + getServerDate() + '&hash=' + GetUniqueVal();
        break;
      //tren chemat din statie  
      case 3:
      //tren clickuit ca markar
      default:
        url += '?cmd=fetch_train_data&trainID=' + mapOBJ + '&now_sec=' + getServerDate() + '&hash=' + GetUniqueVal();
        popupTrainID = mapOBJ;
        break; 
    }
		//log('load train data url - ' + url);
		//return;
		obj.open('GET', url, true);
    obj.onreadystatechange = function ()	{
			if (obj.readyState == 4)  {
        var xmldoc = obj.responseXML;
        var trainHTML = GetXMLValue(xmldoc.getElementsByTagName('trainHTML'));
        var oTD = document.getElementById('tdTrainData');
        oTD.innerHTML = trainHTML;
        switch (typeID) {
          case 1:
            if (!oP[0])  {
              map.setCenter(mapStationsOBJ[mapOBJ].geoPoint);
            }
            ignorePan = 0;
            trackTrainID = 0;
            
            break;
          case 3:
            GetTrainPosition(mapOBJ, [1]);
            break;
        }
      }
		}
		obj.send(null);	
	}
}

function WriteMapStatus(statusText)  {
  if (includeMode == 'iframe') {
    return;
  }

  oStatusDIV = document.getElementById('mapStatusSpan');
  oStatusDIV.innerHTML = statusText;
}

function GetStationMarker(mapObj)  {
  var icon = new GIcon();
  icon.image = 'img/station2.png';
  icon.iconSize = new GSize(10, 10);
	icon.iconAnchor = new GPoint(5, 5);

	var marker = new GMarker(mapObj.geoPoint, icon);
	
	marker.tooltip = '<div class="stationTooltip">' + mapObj.title + '</div>';
	
	GEvent.addListener(marker, 'mouseover', function() {
		showTooltip(marker, tooltip);
	});
	
  GEvent.addListener(marker, 'mouseout', function() {
		tooltip.style.visibility = 'hidden';
	});
	
	GEvent.addListener(marker, 'click', function() {
    switch (includeMode)  {
      case 'iframe' :
        var urlToFollow = mapObj.title;
        urlToFollow = urlToFollow.replace(/\s/g, '');
        urlToFollow = urlToFollow.toLowerCase(); 
        urlToFollow = 'http://cfr.webgis.ro/' + urlToFollow;
        top.location = urlToFollow; 
        break;
      default:
        LoadTrainData(mapObj.id, 2);
        break; 
    }
	});
	
  return marker;
}

function SetBackgroundCall(value)  {
  //GLog.write(value);
  switch (value)  {
    case 1:
      map.disableDragging();
      om.Set(OMAddMsg('Loading...<br /><img src=\'img/map_loading.gif\' />', 1));
      break;
    case 0:
      map.enableDragging();
      om.Clear();
      break;
  }
  map_is_working = value;  
}

function UpdateMapData()  {
  if (includeMode == 'iframe') {
    return;
  }

  var oSPAN = document.getElementById('mapZoom');
  oSPAN.innerHTML = map.getZoom();
  
  var oSPAN = document.getElementById('mapCenter');
  oSPAN.innerHTML = map.getCenter().lat() + ', ' + map.getCenter().lng();
}

function closeTrainDataPanel()  {
  var oTD = document.getElementById('tdTrainData');
  oTD.innerHTML = ''; 
}

function followTrain(triggerOBJ, trainID)  {
  triggerOBJ.oldValue = triggerOBJ.value; 
  triggerOBJ.value = 'STOP';
  triggerOBJ.onclick = function() {
    stopFollowTrain(triggerOBJ, trainID);
  }
  trackTrainID = trainID;
  ignorePan2 = 1;
  trackTrainTimer = 0;
}

function stopFollowTrain(triggerOBJ)  {
  triggerOBJ.value = triggerOBJ.oldValue;
  triggerOBJ.onclick = function() {
    followTrain(triggerOBJ, trainID);
  }
  ignorePan = 0;
  trackTrainID = 0;
}

function goToStation()  {
  map.setCenter(new GLatLng(selectedStationCoords[1], selectedStationCoords[0]));
  //[1] se foloseste pt skip geolocare
  LoadTrainData(selectedStationCoords[2], 1, [1]);
}

function log(message)  {
  SetBackgroundCall(0);
  if (!debugerOn) {
    return;
  }
  var nowDate = new Date();
  var difDateSec = (nowDate.getTime() - startDate.getTime())/1000;
  GLog.write('Sec : ' + difDateSec + ' -- ' + message);
}

function ProjectPercentOnPolyline(lineID, percent, is_opposite) {
//log('si linia ii ' + lineID + ' objectu ii ' + mapPolylineVertexes[209]);
  var pointAr = mapPolylineVertexes[lineID];
  var pLength = pointAr[pointAr.length-1].distPartial;
  if (parseInt(is_opposite))  {
    percent = 100 - percent;
  }
  var pNLength = roundDec(pLength*percent/10000, 2);
  var gVNew;
  var percAN;
  //log(pLength + ' ' + percent + ' ' + pNLength);
  //log('ii oposit' + is_opposite);
  
  for (var v_i=1;v_i<pointAr.length;v_i++)  {
    gV = pointAr[v_i];
    //log (gV.distPartial + ' ' + pNLength);
    if (gV.distPartial >= pNLength)  {
      percAN = roundDec((pNLength-pointAr[v_i-1].distPartial)/(gV.distPartial-pointAr[v_i-1].distPartial), 2);
      gVNew = constructPoint(pointAr[v_i-1], gV, percAN);
      break;
    }
  }
  
  return gVNew;
}

function GetLineDataFromPolylines(arData, total, perc) {
  var lineLengthN = perc/100*total;
  var pTotal = 0;
  var lineLength;
  for (var i=0;i<arData.length;i++) {
    lineLength = parseFloat(arData[i]);
    if ((pTotal + lineLength) < lineLengthN)  {
      pTotal += lineLength;
      continue;
    }
    pNew = roundDec((lineLengthN - pTotal)/lineLength, 2);
    return [i, pNew];
  }
  return [arData.length-1, 100];
}

function ShowPolylines(direction)  {
  var lineID, polyline;
  for (var i=0;i<mapPolylinesIDs.length;i++)  {
    lineID = mapPolylinesIDs[i];
    if (!lineID)  {
      continue;
    }
    polyline = mapPolylines[lineID];
    if (direction)  {
      map.removeOverlay(polyline);
    }
    else  {
      map.addOverlay(polyline);  
    }
  }
}

function GetTrainPosition(trainID, oP)  {
  var mapTrain = mapTrains[trainID];
  if (mapTrain) {
    if (mapTrain.marker.getPoint().lng()) {
      map.setCenter(mapTrain.marker.getPoint());
      return;
    }
  }
  if (!oP[0]) {
    oP[0] = 0;
  }
  obj = getHTTPObject();
	if (obj.readyState == 4 || obj.readyState == 0) 	{
		url = XMLHTTPGetURL 
    url += '?cmd=get_train_position&trainID=' + trainID + '&now_sec=' + getServerDate() + '&hash=' + GetUniqueVal();
		//return;
		obj.open('GET', url, true);
    obj.onreadystatechange = function ()	{
			if (obj.readyState == 4)  {
        var xmldoc = obj.responseXML;
        var vX = parseFloat(GetXMLValue(xmldoc.getElementsByTagName('vX')))*1;
        var vY = parseFloat(GetXMLValue(xmldoc.getElementsByTagName('vY')))*1;
        if (!vX)  {
          om.Set(OMAddMsg('Train is not running yet !', 2));
          return;
        }
        map.setCenter(new GLatLng(vY, vX));
        mapTrain.marker.setPoint(new GLatLng(vY, vX));
        if (oP[0] != 1)  {
          LoadTrainData(trainID);
        }
      }
		}
		obj.send(null);	
	}
}

function OMCloseWindow()  {
  if (om) {
    om.Clear();
  }
  map_is_working = 1;
}

function OMAddMsg(msg, msgType)  {
  var msgToReturn;
  switch (includeMode)  {
    case 'iframe':
      switch (msgType)  {
        case 1:
          msg = 'wait...';
          break;
      }
      break;
  }
  msgToReturn = msg + '<br /><a href=\'javascript:OMCloseWindow()\'>Close x</a>'; 
  return (msgToReturn);
}
