var minZoom;
var zoom1;
var zoom2;
var zoom3;
var defaultZoom;
var centreLat;
var centreLong;
var mapLogoFile;
var mapLogoSpecs;

var map;
var manager;
var manager2;
var activeMarker;

var tileLayers = G_NORMAL_MAP.getTileLayers();
var projection = G_NORMAL_MAP.getProjection();
//var tileLayers = G_PHYSICAL_MAP.getTileLayers();
//var projection = G_PHYSICAL_MAP.getProjection();
var MyMapType;
var refreshMarkerTimeout;
var theBus;
var serviceBuses = new Array();
var serviceID = "1";
var UpdateToggle = 0;
var selectedStop = false;
var helpWindow;
var mapLoading;

var mapLoadingPreload = new Image(); 
mapLoadingPreload.src="/images/map-loading.png"; 

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    map.setCenter(new GLatLng(centreLat,centreLong), defaultZoom);
	map.addControl(new GLargeMapControl());
	map.setMapType(MyMapType);
	map.enableDoubleClickZoom();
	map.enableScrollWheelZoom();
	map.enableContinuousZoom();
	var logoSize = mapLogoSpecs.split(',');
	var left = parseInt(logoSize[0]);
	var bottom = parseInt(logoSize[1]);
	var right = parseInt(logoSize[2]);
	var top = parseInt(logoSize[3]);
//	var logo = new GScreenOverlay(mapLogoFile, new GScreenPoint(70,0),  new GScreenPoint(0,10),  new GScreenSize(145,43));
	var logo = new GScreenOverlay(mapLogoFile, new GScreenPoint(70,0),  new GScreenPoint(left,bottom),  new GScreenSize(right,top));
	map.addOverlay(logo);
	helpWindow = new GScreenOverlay("/images/help-text.png",  new GScreenPoint(60,50),  new GScreenPoint(0,0),  new GScreenSize(400,400));
	map.addOverlay(helpWindow);
	helpWindow.hide();
	mapLoading = new GScreenOverlay('images/map-loading.png',
      new GScreenPoint(0.40, 0.45, 'fraction', 'fraction'),  // screenXY
      new GScreenPoint(0, 0),  // overlayXY
      new GScreenSize(0.2, 0.1, 'fraction', 'fraction'));  // size on screen
	map.addOverlay(mapLoading);
    if(!GetParameter("naptan"))
    {
      mapLoading.hide();
    }
    manager = new MarkerManager(map);
    manager2 = new MarkerManager(map);
	GetStopsAsync(1);
    refreshMarkerTimeout = setTimeout("UpdateMarkers()",1000);
  }
}

function ToggleHelp()
{
    if(helpWindow.isHidden())
    {
      helpWindow.show();
    }
    else
    {
      helpWindow.hide();
    }
}


function GetStopsAsync(level) {
    LiveMapDemo.MapDataService.GetStopsForLevel(level, GotStopsList, OnTimeOut, OnError);
}

function GotStopsList(arg)
{
    var selectedStopRef = GetParameter("naptan");
    var stopArray = [];
    var level = 0;
    for(stop in arg)
    {
        var stopFields = arg[stop].split("#");
        var latitude  = parseFloat(stopFields[1]);
        var longitude = parseFloat(stopFields[2]);
        level = stopFields[4];
        var point = new GLatLng(latitude, longitude);
        var label = stopFields[0];
        var marked = stopFields[5];
        var marker = CreateStopMarker(point, stopFields[3], label, marked);
        stopArray.push(marker);
        if(selectedStopRef && selectedStopRef == stopFields[3])
        {
            var point = new GLatLng(latitude, longitude);
            mapLoading.hide();
            map.setCenter(point, 14);
            activeMarker = marker;
            GetDepartures(marker.stopRef);
            if (map.signBox) {
              map.removeOverlay(map.signBox);
            }
            map.signBox = marker.signBox;
            map.addOverlay(map.signBox);
        }
    }
    switch(level)
    {
    case "1":
        manager.addMarkers(stopArray,zoom1);
        GetStopsAsync(2);
        break;
    case "2":
        manager.addMarkers(stopArray,zoom2);
        GetStopsAsync(3);
        break;
    case "3":
        manager.addMarkers(stopArray,zoom3);
        mapLoading.hide();
        break;
    }
    manager.refresh();
}

function CreateStopMarker(point, stopRef, label, marked) {
    var icon = new GIcon();
    if(marked=="1")
    {
        icon.image = "/images/sign-m.png";
    }
    else
    {
        icon.image = "/images/sign-u.png";
    }
    icon.iconSize = new GSize(16, 16);
    icon.iconAnchor = new GPoint(1,16);
    icon.infoWindowAnchor = new GPoint(8, 8);
    var marker = new GMarker(point, {icon:icon, title:label});
    marker.stopRef = stopRef;
    var infoContent = "<br />" + stopRef + "<br />" + label;
      var signBoxOptions = {
        "content": infoContent,
        "offsetHorizontal": 1,
        "offsetVertical": -196,
        "height": 174,
        "width": 270,
        "className": "signBox"
      };
      var signBox = new SignBox(point, signBoxOptions);
      marker.signBox = signBox;
      marker.label = label;

    GEvent.addListener(marker, "click", function() {
        activeMarker = marker;
        GetDepartures(marker.stopRef);
        if (map.signBox) {
          map.removeOverlay(map.signBox);
        }
        map.signBox = marker.signBox;
        map.addOverlay(map.signBox); });
    return marker;
}

function GetDepartures(stopRef)
{
    LiveMapDemo.MapDataService.GetSignData(stopRef, 4, GotDepartures, OnTimeOut, OnError); 
}

function RefreshDepartures()
{
    if(activeMarker != null)
    {
        GetDepartures(activeMarker.stopRef);
    }
}

function GotDepartures(arg)
{
    if(activeMarker != null)
    {
        if(arg[0] == activeMarker.stopRef)
        {
            var pac = arg[2];
            var psm = arg[3];
            var time = arg[4];
            arg.shift();
            arg.shift();
            arg.shift();
            arg.shift();
            arg.shift();
            activeMarker.signBox.SetContent(activeMarker.stopRef,activeMarker.label, pac, psm, time, arg);
        }
    }
}

function GotVehicles(arg)
{
    var addedBuses = false;
    while(serviceBuses.length > 0)
    {
        var oldMarker = serviceBuses.pop();
        manager2.removeMarker(oldMarker);
    }
    for(line in arg)
    {
        var vehicleFields = arg[line].split("#");
        if(vehicleFields.length <= 1)
        {
            if(vehicleFields[0] != serviceID) return;
        }
        else
        {
            var point = new GLatLng(vehicleFields[1], vehicleFields[2]);
            var vehicleID = vehicleFields[0];
            var marker = CreateBusMarker(point, vehicleFields[3], vehicleFields[0], serviceID);
            serviceBuses.push(marker);
            manager2.addMarker(marker, 8, 17);
        }
    }
    manager2.refresh();
}

function OnTimeOut(arg)
{
    var test = arg;
}

function OnError(arg)
{
    var test = arg;
}

function CreateBusMarker(point, direction, busID, serviceID) {
    var icon = new GIcon();
    icon.image = "images/bus"+direction+".png";
    icon.iconSize = new GSize(32, 32);
    icon.iconAnchor = new GPoint(16,16);
    icon.shadow = "images/line"+serviceID+".png";
    icon.shadowSize = new GSize(32,36);
    var marker = new GMarker(point, {icon:icon, title:busID});
    marker.busID = busID;
    return marker;
}

function TrackService()
{
	LiveMapDemo.MapDataService.GetServiceVehicleData(serviceID, GotVehicles, OnTimeOut, OnError);
}

//function UpdateMarkers()
//{
//    if(UpdateToggle)
//    {
//        RefreshDepartures();
//    }
//    else
//    {
//        TrackService();
//    }
//    UpdateToggle = !UpdateToggle;
//    refreshMarkerTimeout = setTimeout("UpdateMarkers()",5000);
//}

function UpdateMarkers()
{
    RefreshDepartures();
    refreshMarkerTimeout = setTimeout("UpdateMarkers()",20000);
}

function ShowService(service)
{
    clearTimeout(refreshMarkerTimeout);
    UpdateToggle = false;
    serviceID = service;
    UpdateMarkers();
}

function LookForStopAsync()
{
    var stopRef = GetParameter("naptan");
    if(stopRef)
    {
        LiveMapDemo.MapDataService.GetStop(stopRef, GotStop, OnTimeOut, OnError);
    }
}

function GotStop(arg)
{
    var stopFields = arg.split("#");
    var latitude  = stopFields[1];
    var longitude = stopFields[2];
    var point = new GLatLng(stopFields[1],stopFields[2]);
    mapLoading.hide();
    map.setCenter(point, 14);
}

function GetParameter(parameter) { 
  var loc = location.search.substring(1, location.search.length);
  var param_value = false;

  var params = loc.split("&");
  for (i=0; i<params.length;i++) {
      param_name = params[i].substring(0,params[i].indexOf('='));
      if (param_name == parameter) {
          param_value = params[i].substring(params[i].indexOf('=')+1)
      }
  }
  if (param_value) {
      return param_value;
  }
  else {
      return false; //Here determine return if no parameter is found
  }
}

function link_open(theURL, theName, popW, popH, scroll) {
    var winleft = (screen.width - popW) / 2;
    var winUp = (screen.height - popH) / 2;
    winProp = 'width='+popW+',height='+popH+',left='+winleft+',t op='+winUp+',scrollbars='+scroll+',resizable'
    Win = window.open(theURL, theName, winProp)
    if (parseInt(navigator.appVersion) >= 4){
	    Win.window.focus();
    }
}

function open_cluster(naptan) {
    var ow = open_window_max('/web/cluster_list.asp?naptan='+naptan,'ACISLIVE');
    ow.focus();
}

function open_window_max(sURL, sWinName ) {
   var wOpen;
   var sOptions;

   sOptions = 'location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,toolbar=yes';
   sOptions = sOptions + ',width=' + (screen.availWidth - 10).toString();
   sOptions = sOptions + ',height=' + (screen.availHeight - 122).toString();
   sOptions = sOptions + ',screenX=0,screenY=0,left=0,top=0';

   wOpen = window.open( '', sWinName, sOptions );
   wOpen.location = sURL;
   wOpen.focus();
   wOpen.moveTo( 0, 0 );
   wOpen.resizeTo( screen.availWidth, screen.availHeight );
   
   return wOpen;
}