var defaultBGLayer = 'sat';
var defaultFGLayer = 'map';

var bomCopyrightText = 'Copyright Australian BoM';
var noaaCopyrightText = 'Copyright NOAA';
var bmCopyrightText = 'Copyright NASA';
var bmZoomStart = 0;
var bmZoomEnd = 8;

var blankTileURL   = 'http://www.thesnowchaser.com/maps/blank_tile.png';

//var ausBaseTileURL = 'http://www.thesnowchaser.com/maps/radar_tiles3/';
var ausBaseTileURL = 'http://data.theweatherchaser.com/tiles/radar_aus/';

//var usBaseTileURL  = 'http://www.thesnowchaser.com/maps/radar_tiles_us/';
var usBaseTileURL = 'http://data.theweatherchaser.com/tiles/radar_us/';

var baseBMTileURL = 'http://data.theweatherarchive.com/images/gis/bm_tiles/';

var baseBoMURL  = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map&version=1.1.1&service=WMS&request=GetMap&transparent=true&bbox=&format=image/gif&height=256&width=256&layers=';
var baseBoMURL2 = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/nwp.map&request=getMap&version=1.1.1&service=WMS&transparent=TRUE&bbox=&format=image/gif&height=256&width=256&layers=';

var baseSatURL = 'http://data.theweatherchaser.com/tiles/sat_tiles/';


var baseSatURLs = new Array();
baseSatURLs['VIS'] = baseSatURL + 'VIS/';
baseSatURLs['VISC'] = baseSatURL + 'VISC/';
baseSatURLs['IR1'] = baseSatURL + 'IR1/';
baseSatURLs['IR1C'] = baseSatURL + 'IR1C/';
baseSatURLs['IR2'] = baseSatURL + 'IR2/';
baseSatURLs['NIR'] = baseSatURL + 'NIR/';
baseSatURLs['WV'] = baseSatURL + 'WV/';
var irZoomStart = 0;
var irZoomEnd = 6;
var visZoomStart = 0;
var visZoomEnd = 8;

var fgDefs = new Array();
var bgDefs = new Array();

////////////////////////////////////////////////////////////////////////////////
// Custom url definitions :
////////////////////////////////////////////////////////////////////////////////
var ausRadarExtents = new Array();
ausRadarExtents[9] = new Array(192, 255, 128, 191);
ausRadarExtents[10] = new Array(96, 127, 64, 95);
ausRadarExtents[11] = new Array(48, 63, 32, 47);
ausRadarExtents[12] = new Array(24, 31, 16, 23);
ausRadarExtents[13] = new Array(12, 15, 8, 11);
ausRadarExtents[14] = new Array(6, 7, 4, 5);
ausRadarExtents[15] = new Array(3, 3, 2, 2);

function getAusRadarOverlayURL(pt, zoom){
  var x = pt.x;
  var y = pt.y;
  zoom = 17-zoom;

  var range = ausRadarExtents[zoom];
  if (!range)  return blankTileURL;
  if ((pt.x < range[0])||(pt.x > range[1])||(pt.y < range[2])||(pt.y > range[3])) {
    return blankTileURL;
  }
  //x = x - 3*Math.pow(2,15-zoom);
  //y = y - 2*Math.pow(2,15-zoom);
  //return ausBaseTileURL  + 'tile.' + x + '.' + y + '.' + zoom + '.gif';
  return ausBaseTileURL + zoom + '/' + pt.x + '/tile.' + zoom + '.' + pt.x + '.' + pt.y + '.gif';

};

var usRadarExtents = new Array();
usRadarExtents[9] = new Array(32, 95, 64, 127);
usRadarExtents[10] = new Array(16, 47, 32, 63);
usRadarExtents[11] = new Array(8, 23, 16, 31);
usRadarExtents[12] = new Array(4, 11, 8, 15);
usRadarExtents[13] = new Array(2, 5, 4, 7);
usRadarExtents[14] = new Array(1, 2, 2, 3);

function getUSRadarOverlayURL(pt, zoom){
  zoom = 17-zoom;  
  var range = usRadarExtents[zoom];
  if (!range) 
    return blankTileURL;

  if ((pt.x < range[0])||(pt.x > range[1])||(pt.y < range[2])||(pt.y > range[3])) {
    return blankTileURL;
  }
  //return usBaseTileURL + 'tile.' + pt.x + '.' + pt.y + '.' + zoom + '.gif';
  return usBaseTileURL + zoom + '/' + pt.x + '/tile.' + zoom + '.' + pt.x + '.' + pt.y + '.gif';
};

var visSatExtents = new Array();
visSatExtents[17] = (0,1,0,1);
visSatExtents[16] = (1,2,1,2);
visSatExtents[15] = (3,4,2,3);
visSatExtents[14] = (6,8,4,6);
visSatExtents[13] = (12,16,8,12);
visSatExtents[12] = (24,32,16,23);
visSatExtents[11] = (48,64,32,46);
visSatExtents[10] = (96,128,64,91);
visSatExtents[9] = (192,256,128,182);

var irSatExtents = new Array();
irSatExtents[17] = (0,1,0,1);
irSatExtents[16] = (1,2,1,2);
irSatExtents[15] = (3,4,2,3);
irSatExtents[14] = (6,8,4,6);
irSatExtents[13] = (12,16,8,12);
irSatExtents[12] = (24,32,16,23);
irSatExtents[11] = (48,64,32,46);


function getWeatherSatURL(freq, pt, zoom) {
  var baseURL = baseSatURLs[freq];
  var x = pt.x;
  var y = pt.y;
  zoom = 17-zoom;
  var radarExtents = (freq=='VIS'||freq=='VISC')?visSatExtents:irSatExtents;
  var range = radarExtents[zoom];
  if (!range) 
    return blankTileURL;

  if ((pt.x < range[0])||(pt.x > range[1])||(pt.y < range[2])||(pt.y > range[3])) {
    return blankTileURL;
  }

  var url = baseURL + zoom + '/' + x + '/tile.' + zoom + '.' + x + '.' + y + '.jpg';

  return url;
}

function getBlueMarbleOverlayURL(month, pt, zoom) {
  month = LZ(month)
  var x = pt.x;
  var y = pt.y;
  zoom = 17-zoom;

  var tilesAtThisZoom = Math.pow(2,17-zoom);
  while (x < 0) {
    x += tilesAtThisZoom;
  }
  while (x >= tilesAtThisZoom) {
    x -= tilesAtThisZoom;
  }

  if (y < 0) {
    return blankTileURL;
  } else if (y >= tilesAtThisZoom) {
    return blankTileURL;
  }

  if (zoom < 9) {
    return blankTileURL;
  }

  var url = baseBMTileURL + 'bm_tiles.' + month + '/' + zoom + '/' + x + '/tile.' + zoom + '.' + x + '.' + y + '.jpg';

  return url;
}

////////////////////////////////////////////////////////////////////////////////
// BoM Webservice definitions
////////////////////////////////////////////////////////////////////////////////
// getBoMWind10mOverlayURL :  var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map&version=1.1.1&service=WMS&request=GetMap&layers=windanalysis&SRS=EPSG:4283&transparent=true&format=image/gif&height=256&width=256&bbox=';
// getForecastOverlayURL :  var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map&version=1.1.1&service=WMS&request=GetMap&layers=forecast_capital&SRS=EPSG:4283&transparent=true&format=image/gif&height=256&width=256&bbox=';
// getIRSatelliteOverlayURL : var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map&version=1.1.1&service=WMS&request=GetMap&layers=satelliteir,radarvic,radartas,radarnsw,radarqld,radarnt,radarwa,radarsa,coastlines,windanalysis,mslpanalysis&SRS=EPSG:4283&transparent=true&format=image/gif&height=256&width=256&bbox=';
//function getComboOverlayURL(x, y, zoom) {
//        var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map&version=1.1.1&service=WMS&request=GetMap&layers=radarvic,radartas,radarnsw,radarqld,radarnt,radarwa,radarsa,coastlines,windanalysis,mslpanalysis&SRS=EPSG:4283&transparent=true&format=image/gif&height=256&width=256&bbox=';
//function getStateThunderstormForecastOverlayURL(x, y, zoom) {
//       var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map&version=1.1.1&service=WMS&request=GetMap&layers=tsfcststate&SRS=EPSG:4283&transparent=true&format=image/gif&height=256&width=256&bbox=';
//function getSSTOverlayURL(x, y, zoom) {
  //       var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map&version=1.1.1&service=WMS&request=GetMap&layers=sstanalysis&height=256&width=256&SRS=EPSG:4283&transparent=true&format=image/gif&bbox=';
//function getMSLPOverlayURL(x, y, zoom){
//        var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?&map=/web/htdocs/mapserver/nwp.map&request=getMap&version=1.1.1&service=WMS&layers=MSLP%20Data&height=256&width=256&transparent=TRUE&format=image/gif&bbox=';
//function getRadar2OverlayURL(x, y, zoom){
//        var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?&map=/web/htdocs/mapserver/radar.map&request=getMap&version=1.1.1&service=WMS&layers=Radar%20VIC%20Data,Radar%20NSW%20Data,Radar%20QLD%20Data,Radar%20NT%20Data,Radar%20WA%20Data,Radar%20SA%20Data,Radar%20TAS%20Data&height=256&width=256&transparent=TRUE&format=image/gif&bbox='

function getBoMWind10mOverlayURL(pt, zoom) {	  
  var baseURL = baseBoMURL + 'windanalysis&SRS=EPSG:4283';
  res = getTileBox(pt.x,pt.y,zoom);
  return baseURL + res[0] + "," + res[1] + "," + res[2] + "," + res[3];
}

function getBoMForecastOverlayURL(pt, zoom) {
  var baseURL = baseBoMURL + 'forecast_capital&SRS=EPSG:4283';
  res = getTileBox(pt.x,pt.y,zoom);
  return baseURL + res[0] + "," + res[1] + "," + res[2] + "," + res[3];
}

function getBoMIRSatelliteOverlayURL(pt, zoom) {
  //var baseURL = baseBoMURL + 'satelliteir,radarvic,radartas,radarnsw,radarqld,radarnt,radarwa,radarsa,coastlines,windanalysis,mslpanalysis&SRS=EPSG:4283';
  var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?map=/web/htdocs/mapserver/weather.map&version=1.1.1&service=WMS&request=GetMap&layers=satelliteir,radarvic,radartas,radarnsw,radarqld,radarnt,radarwa,radarsa,coastlines,windanalysis,mslpanalysis&SRS=EPSG:4283&transparent=true&format=image/gif&height=256&width=256&bbox=';
  res = getTileBox(pt.x,pt.y,zoom);
  return baseURL + res[0] + "," + res[1] + "," + res[2] + "," + res[3];
}

function getBoMComboOverlayURL(pt, zoom) {
  var baseURL = baseBoMURL + 'radarvic,radartas,radarnsw,radarqld,radarnt,radarwa,radarsa,coastlines,windanalysis,mslpanalysis&SRS=EPSG:4283';
  res = getTileBox(pt.x,pt.y,zoom);
  return baseURL + res[0] + "," + res[1] + "," + res[2] + "," + res[3];
}

function getBoMStateThunderstormForecastOverlayURL(pt, zoom) {
  var baseURL = baseBoMURL + 'tsfcststate&SRS=EPSG:4283';
  res = getTileBox(pt.x,pt.y,zoom);
  return baseURL + res[0] + "," + res[1] + "," + res[2] + "," + res[3];
}

function getBoMSSTOverlayURL(pt, zoom) {
  var baseURL = baseBoMURL + 'sstanalysis&SRS=EPSG:4283';
  res = getTileBox(pt.x,pt.y,zoom);
  return baseURL + res[0] + "," + res[1] + "," + res[2] + "," + res[3];
  
}
function getBoMMSLPOverlayURL(pt, zoom){
  //var baseURL = baseBoMURL2 + 'MSLP%20Data';
  var baseURL = 'http://ows.bom.gov.au/cgi-bin/mapserver/mapserv?&map=/web/htdocs/mapserver/nwp.map&request=getMap&version=1.1.1&service=WMS&layers=MSLP%20Data&height=256&width=256&transparent=TRUE&format=image/gif&bbox=';
  res = getTileBox(pt.x,pt.y,zoom);
  return baseURL + res[0] + "," + res[1] + "," + res[2] + "," + res[3];
}

function getBoMRadarOverlayURL(pt, zoom){
  var baseURL = baseBoMURL2 + 'Radar%20VIC%20Data,Radar%20NSW%20Data,Radar%20QLD%20Data,Radar%20NT%20Data,Radar%20WA%20Data,Radar%20SA%20Data,Radar%20TAS%20Data';
  res = getTileBox(pt.x,pt.y,zoom);
  return baseURL + res[0] + "," + res[1] + "," + res[2] + "," + res[3];
}

////////////////////////////////////////////////////////////////////////////////
// Background layers
////////////////////////////////////////////////////////////////////////////////
var satLayer = G_SATELLITE_MAP.getTileLayers()[0];
var satLayerVIS = new GTileLayer(new GCopyrightCollection(bomCopyrightText), visZoomStart, visZoomEnd);
var satLayerVISC = new GTileLayer(new GCopyrightCollection(bomCopyrightText), visZoomStart, visZoomEnd);
var satLayerIR1 = new GTileLayer(new GCopyrightCollection(bomCopyrightText), irZoomStart, irZoomEnd);
var satLayerIR1C = new GTileLayer(new GCopyrightCollection(bomCopyrightText), irZoomStart, irZoomEnd);
var satLayerIR2 = new GTileLayer(new GCopyrightCollection(bomCopyrightText), irZoomStart, irZoomEnd);
var satLayerNIR = new GTileLayer(new GCopyrightCollection(bomCopyrightText), irZoomStart, irZoomEnd);
var satLayerWV  = new GTileLayer(new GCopyrightCollection(bomCopyrightText), irZoomStart, irZoomEnd);
satLayerVIS.getTileUrl = function(x,y,zoom) {return getWeatherSatURL('VIS',x,y,zoom);}
satLayerVISC.getTileUrl = function(x,y,zoom) {return getWeatherSatURL('VISC',x,y,zoom);}
satLayerIR1.getTileUrl = function(x,y,zoom) {return getWeatherSatURL('IR1',x,y,zoom);}
satLayerIR1C.getTileUrl = function(x,y,zoom) {return getWeatherSatURL('IR1C',x,y,zoom);}
satLayerIR2.getTileUrl = function(x,y,zoom) {return getWeatherSatURL('IR2',x,y,zoom);}
satLayerNIR.getTileUrl = function(x,y,zoom) {return getWeatherSatURL('NIR',x,y,zoom);}
satLayerWV.getTileUrl  = function(x,y,zoom) {return getWeatherSatURL('WV',x,y,zoom);}

var bmLayer1 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer2 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer3 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer4 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer5 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer6 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer7 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer8 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer9 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer10 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer11 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
var bmLayer12 = new GTileLayer(new GCopyrightCollection(bmCopyrightText), bmZoomStart, bmZoomEnd);
bmLayer1.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(1,x,y,zoom);}
bmLayer2.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(2,x,y,zoom);}
bmLayer3.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(3,x,y,zoom);}
bmLayer4.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(4,x,y,zoom);}
bmLayer5.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(5,x,y,zoom);}
bmLayer6.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(6,x,y,zoom);}
bmLayer7.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(7,x,y,zoom);}
bmLayer8.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(8,x,y,zoom);}
bmLayer9.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(9,x,y,zoom);}
bmLayer10.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(10,x,y,zoom);}
bmLayer11.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(11,x,y,zoom);}
bmLayer12.getTileUrl = function(x,y,zoom) {return getBlueMarbleOverlayURL(12,x,y,zoom);}

var irSatLayer = new GTileLayer(new GCopyrightCollection(bomCopyrightText), 0, 8);
irSatLayer.getTileUrl = getBoMIRSatelliteOverlayURL

bgDefs['sat'] = new Array('Satellite', satLayer);

bgDefs['vis'] = new Array('Current Aus Vis Sat', satLayerVIS);
bgDefs['visc'] = new Array('Current Aus Colour Vis Sat', satLayerVISC);
bgDefs['ir1'] = new Array('Current Aus IR1 Sat', satLayerIR1);
bgDefs['ir1c'] = new Array('Current Aus Colour IR1 Sat', satLayerIR1C);
bgDefs['ir2'] = new Array('Current Aus IR2 Sat', satLayerIR2);
bgDefs['nir'] = new Array('Current Aus NIR Sat', satLayerNIR);
bgDefs['wv'] =  new Array('Current Aus WV Sat',  satLayerWV);

bgDefs['bm1'] = new Array('Blue Marble - January', bmLayer1);
bgDefs['bm2'] = new Array('Blue Marble - February', bmLayer2);
bgDefs['bm3'] = new Array('Blue Marble - March', bmLayer3);
bgDefs['bm4'] = new Array('Blue Marble - April', bmLayer4);
bgDefs['bm5'] = new Array('Blue Marble - May', bmLayer5);
bgDefs['bm6'] = new Array('Blue Marble - June', bmLayer6);
bgDefs['bm7'] = new Array('Blue Marble - July', bmLayer7);
bgDefs['bm8'] = new Array('Blue Marble - August', bmLayer8);
bgDefs['bm9'] = new Array('Blue Marble - September', bmLayer9);
bgDefs['bm10'] = new Array('Blue Marble - October', bmLayer10);
bgDefs['bm11'] = new Array('Blue Marble - November', bmLayer11);
bgDefs['bm12'] = new Array('Blue Marble - December', bmLayer12);

////////////////////////////////////////////////////////////////////////////////
// Foreground layers
////////////////////////////////////////////////////////////////////////////////

var mapLayer = G_HYBRID_MAP.getTileLayers()[1];

var ausRadarLayer = new GTileLayer(new GCopyrightCollection(bomCopyrightText), 0, 8);
ausRadarLayer.getTileUrl = getAusRadarOverlayURL;

var ausMSLPLayer = new GTileLayer(new GCopyrightCollection(bomCopyrightText), 0, 8);
ausMSLPLayer.getTileUrl = getBoMMSLPOverlayURL;

var usRadarLayer = new GTileLayer(new GCopyrightCollection(noaaCopyrightText), 0, 8);
usRadarLayer.getTileUrl = getUSRadarOverlayURL;

fgDefs['map'] = new Array('Map', mapLayer);
fgDefs['ausradar'] = new Array('Radar (Aus)', ausRadarLayer);
//fgDefs['ausmslp'] = new Array('MSLP (Aus)', ausMSLPLayer);
//fgDefs['usradar'] = new Array('Radar (US)', usRadarLayer);

