
var mouseLat;
var mouseLong;
var mouseNorth;
var mouseEast; 
var mouseZone;

var PI = 3.141592653582;
var A = 6378137.0;                  //semimajor axis of GRS 1980 ellipsoid

var inv_f = 298.257222101           //Inverse flattening (1/f)	298.257 222 101 000
var f = 1 / inv_f;                  //Flattening (1/f)	298.257 222 101 000
var b = A * (1 - f);                //Semi-minor axis (b) (m)	

var Ec2 = (2 * f) - (f * f);        //Eccentricity squared  (e2)	0.006 694 380 023
var Ec = Math.sqrt(Ec2);            //Eccentricity 
var Ec4 = Ec2 * Ec2;
var Ec6 = Ec4 * Ec2;

var k0 = 0.9996;                    //scale factor of central meridian
var ZWidth = 6;                     //Zone width (degrees)	6°

var LongCMZ1 = -177;                //Longitude of the central meridian of zone 1(degrees)
var LongWEZ0 = parseInt(LongCMZ1 - (1.5 * ZWidth));     //Longitude of western edge of zone zero
var LongCMZ0 = parseInt(LongWEZ0 + (ZWidth / 2));       //Central meridian of zone zero

var _eastFalse = 500000.0;           //false easting latlong
var _northFalse = 10000000.0;        //false northing latlong

function convertDecimal2Degree(x,y) {
    mouseLong = Dec2Degree(x);
    mouseLat = "-" + Dec2Degree(y);
}

function Dec2Degree(decValue) {
	var absValue = Math.abs(decValue);
    var degree = Math.floor(absValue);
	
	var minute = (absValue - degree) * 60;
	var minDec = minute; //+ 0.005;
	minute = parseInt(Math.floor(minDec));
	var second = parseInt((minDec - minute) * 60);

    if(second >= 60) {
        second = second - 60;
        minute = minute + 1;
    }
    if(minute >= 60) {
        minute = minute - 60;
        degree = degree + 1;
    }

    return degree + '\260' + minute + '\047' + second + '\047\047';
}

function convertLatLong2MGA(longitude,latitude) {
    //Lats and Longs
    var _LatRad = latitude * PI /180;
    var _LongRad = longitude * PI / 180;

    //Cos latitude, in radians
    var CosLat = Math.cos(_LatRad);
    var CosLat3 = CosLat * CosLat * CosLat;
    var CosLat5 = CosLat3 * CosLat * CosLat;
    var CosLat7 = CosLat3 * CosLat3 * CosLat;

    //Tan latitude, in radians
    var TanLat = Math.tan(_LatRad);
    var TanLat2 = TanLat * TanLat;
    var TanLat4 = TanLat2 * TanLat2;
    var TanLat6 = TanLat4 * TanLat2;

    //Sin latitude, in radians
    var SinLat = Math.sin(_LatRad);
    var Sin2Lat = Math.sin(2 * _LatRad);
    var Sin4Lat = Math.sin(4 * _LatRad);
    var Sin6Lat = Math.sin(6 * _LatRad);
    //****************************************

    //***** Meridian Distance
    var A0 = 1 - (Ec2 / 4) - (3 * Ec4 / 64) - (5 * Ec6 / 256);
    var A2 = (3 / 8) * (Ec2 + (Ec4 / 4) + (15 * Ec6 / 128));
    var A4 = (15 / 256) * (Ec4 + (3 * Ec6 / 4));
    var A6 = 35 * Ec6 / 3072;
    //True distance from the equator, along the meridian, -ve southwards
    var m = A * ((A0 * _LatRad) - (A2 * Sin2Lat) + (A4 * Sin4Lat) - (A6 * Sin6Lat));

    //***** Radius of curvature
    var rho = A * (1 - Ec2) / Math.pow(1 - (Ec2 * SinLat * SinLat), 1.5);
    var nu = A / Math.pow(1 - (Ec2 * SinLat * SinLat), 0.5);
    var psi = nu / rho;
    var psi2 = psi * psi;
    var psi3 = psi2 * psi;
    var psi4 = psi2 * psi2;

    //***************************************
    //***** ZONE & CENTRALMERIDIAN
    mouseZone = parseInt(Math.floor((longitude - LongWEZ0) / ZWidth));
    _CentralMeridian = (mouseZone * ZWidth) + LongCMZ0;

    //Omega - Geodetic longitude difference measured from the central meridian (in radians)
    var w = _LongRad - (_CentralMeridian * PI / 180);
    var w2 = w * w;
    var w3 = w2 * w;
    var w4 = w2 * w2;
    var w5 = w2 * w2 * w;
    var w6 = w2 * w4;
    var w7 = w2 * w4 * w;
    var w8 = w4 * w4;


    //***** EASTING **************************
    var e_t1 = nu * w * CosLat;
    var e_t2 = nu * w3 * CosLat3 * (psi - TanLat2) / 6;
    var e_t3 = nu * w5 * CosLat5 * (4 * psi3 * (1 - 6 * TanLat2) + psi2 * (1 + 8 * TanLat2) - psi * (2 * TanLat2) + TanLat4) / 120;
    var e_t4 = nu * w7 * CosLat7 * (61 - 479 * TanLat2 + 179 * TanLat4 - TanLat6) / 5040;
    mouseEast = parseFloat(((e_t1 + e_t2 + e_t3 + e_t4) * k0) + _eastFalse);
    
    //***** NORTHING **************************
    var n_t1 = nu * SinLat * w2 * CosLat / 2
    var n_t2 = nu * SinLat * w4 * CosLat3 * (4 * psi2 + psi - TanLat2) / 24;
    var n_t3 = nu * SinLat * w6 * CosLat5 * (8 * psi4 * (11 - 24 * TanLat2) - 28 * psi3 * (1 - 6 * TanLat2) + psi2 * (1 - 32 * TanLat2) - psi * (2 * TanLat2) + TanLat4) / 720;
    var n_t4 = nu * SinLat * w8 * CosLat7 * (1385 - 3111 * TanLat2 + 543 * TanLat4 - TanLat6) / 40320;
    mouseNorth = parseFloat(((m + n_t1 + n_t2 + n_t3 + n_t4) * k0) + _northFalse);
}


function getMapSheetLongitude(mapLcnX) {
  //move backwards from the right edge of WA
  var count = 129;
  while (count > 111) {
    if (mapLcnX > count) {  return count;  }
    count = count - 1.5;
  }
}

function getMapSheet112(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -21:
      return 'JURABI POINT (SF4908)';
    case -22:
      return 'NINGALOO (SF4912)';
    case -23:
      return 'MINILYA (SF4916)';
    case -24:
      return 'QUOBBA (SG4904)';
    case -25:
      return 'SHARK BAY (SG4908)';
    case -26:
      return 'EDEL (SG4912)';
    case -27:
      return 'ZUYTDORP (SG4916)';
    case -28:
      return 'HOUTMAN ABROLHOS (SH4904)';
    default:
      return '';
  }
}

function getMapSheet114(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -20:
      return 'BARROW ISLAND (SF5001)';
    case -21:
      return 'ONSLOW (SF5005)';
    case -22:
      return 'YANREY (SF5009)';
    case -23:
      return 'WINNING POOL (SF5013)';
    case -24:
      return 'KENNEDY RANGE (SG5001)';
    case -25:
      return 'WOORAMEL (SG5005)';
    case -26:
      return 'YARRINGA (SG5009)';
    case -27:
      return 'AJANA (SG5013)';
    case -28:
      return 'GERALDTON (SH5001)';
    case -29:
      return 'DONGARA (SH5005)';
    case -30:
      return 'HILL RIVER (SH5009)';
    case -31:
      return 'LANCELIN (SH5013)';
    case -32:
      return 'SI5001';
    case -33:
      return 'BUSSELTON (SI5005)';
    case -34:
      return 'AUGUSTA (SI5009)';
    default:
      return '';
  }
}
function getMapSheet115(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -20:
      return 'DAMPIER (SF5002)';
    case -21:
      return 'YARRALOOLA (SF5006)';
    case -22:
      return 'WYLOO (SF5010)';
    case -23:
      return 'EDMUND (SF5014)';
    case -24:
      return 'MT. PHILLIPS (SG5002)';
    case -25:
      return 'GLENBURGH (SG5006)';
    case -26:
      return 'BYRO (SG5010)';
    case -27:
      return 'MURGOO (SG5014)';
    case -28:
      return 'YALGOO (SH5002)';
    case -29:
      return 'PERENJORI (SH5006)';
    case -30:
      return 'MOORA (SH5010)';
    case -31:
      return 'PERTH (SH5014)';
    case -32:
      return 'PINJARRA (SI5002)';
    case -33:
      return 'COLLIE (SI5006)';
    case -34:
      return 'PEMBERTON (SI5010)';
    case -35:
      return 'IRWIN INLET (SI5014)';
    default:
      return '';
  }
}
function getMapSheet117(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -20:
      return 'ROEBOURNE (SF5003)';
    case -21:
      return 'PYRAMID (SF5007)';
    case -22:
      return 'MT. BRUCE (SF5011)';
    case -23:
      return 'TOREE CREEK (SF5015)';
    case -24:
      return 'MT. EGERTON (SG5003)';
    case -25:
      return 'ROBINSON RANGE (SG5007)';
    case -26:
      return 'BELELE (SG5011)';
    case -27:
      return 'CUE (SG5015)';
    case -28:
      return 'KIRKALOCKA (SH5003)';
    case -29:
      return 'NINGHAN (SH5007)';
    case -30:
      return 'BENCUBBIN (SH5011)';
    case -31:
      return 'KELLEBERIN (SH5015)';
    case -32:
      return 'CORRIGIN (SI5003)';
    case -33:
      return 'DUMBLEYUNG (SI5007)';
    case -34:
      return 'MOUNT BARKER (SI5011)';
    case -35:
      return 'ALBANY (SI5015)';
    default:
      return '';
  }
}
function getMapSheet118(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -19:
      return 'BEDOUT ISLAND (SE5016)';
    case -20:
      return 'PORT HEDLAND (SF5004)';
    case -21:
      return 'MARBLE BAR (SF5008)';
    case -22:
      return 'ROY HILL (SF5012)';
    case -23:
      return 'NEWMAN (SF5016)';
    case -24:
      return 'COLLIER (SG5004)';
    case -25:
      return 'PEAK HILL (SG5008)';
    case -26:
      return 'GLENGARRY (SG5012)';
    case -27:
      return 'SANDSTONE (SG5016)';
    case -28:
      return 'YOUANMI (SH5004)';
    case -29:
      return 'BARLEE (SH5008)';
    case -30:
      return 'JACKSON (SH5012)';
    case -31:
      return 'SOUTHERN CROSS (SH5016)';
    case -32:
      return 'HYDEN (SI5004)';
    case -33:
      return 'NEWDEGATE (SI5008)';
    case -34:
      return 'BREMER BAY (SI5012)';
    default:
      return '';
  }
}
function getMapSheet120(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -19:
      return 'MANDORA (SE5113)';
    case -20:
      return 'YARRIE (SF5101)';
    case -21:
      return 'NULLAGINE (SF5105)';
    case -22:
      return 'BALFOUR DOWN (SF5109)';
    case -23:
      return 'ROBERTSON (SF5113)';
    case -24:
      return 'BULLEN (SG5101)';
    case -25:
      return 'NABBERU (SG5105)';
    case -26:
      return 'WILUNA (SG5109)';
    case -27:
      return 'SIR SAMUEL (SG5113)';
    case -28:
      return 'LEONORA (SH5101)';
    case -29:
      return 'MENZIES (SH5105)';
    case -30:
      return 'KALGOORLIE (SH5109)';
    case -31:
      return 'BOORABBIN (SH5113)';
    case -32:
      return 'LAKE JOHNSTON (SI5101)';
    case -33:
      return 'RAVENSTHORPE (SI5105)';
    case -34:
      return 'INVESTIGATOR ISLAND (SI5109)';
    default:
      return '';
  }
}
function getMapSheet121(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -16:
      return 'PENDER (SE5102)';
    case -17:
      return 'BROOME (SE5106)';
    case -18:
      return 'LAGRANGE (SE5110)';
    case -19:
      return 'MUNRO (SE5114)';
    case -20:
      return 'ANKETELL (SF5102)';
    case -21:
      return 'PATERSON RANGE (SF5106)';
    case -22:
      return 'RUDAL (SF5110)';
    case -23:
      return 'GUNANYA (SF5114)';
    case -24:
      return 'TRAINOR (SG5102)';
    case -25:
      return 'STANLEY (SG5106)';
    case -26:
      return 'KINGSTON (SG5110)';
    case -27:
      return 'DUKETON (SG5114)';
    case -28:
      return 'LAVERTON (SH5102)';
    case -29:
      return 'EDJUDINA (SH5106)';
    case -30:
      return 'KURNALPI (SH5110)';
    case -31:
      return 'WIDGIEMOOLTHA (SH5114)';
    case -32:
      return 'NORSEMAN (SI5102)';
    case -33:
      return 'ESPERANCE (SI5106)';
    case -34:
      return 'MONDRAIN ISLAND (SI5110)';
    default:
      return '';
  }
}
function getMapSheet123(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -14:
      return 'BROWSE ISLAND (SD5111)';
    case -15:
      return 'CAMDEN SOUND (SD5115)';
    case -16:
      return 'YAMPI (SE5103)';
    case -17:
      return 'DERBY (SE5107)';
    case -18:
      return 'MT. ANDERSON (SE5111)';
    case -19:
      return 'MCLARTY HILLS (SE5115)';
    case -20:
      return 'JOANNA SPRING (SF5103)';
    case -21:
      return 'SAHARA (SF5107)';
    case -22:
      return 'TABLETOP (SF5111)';
    case -23:
      return 'RUNTON (SF5115)';
    case -24:
      return 'MADLEY (SG5103)';
    case -25:
      return 'HERBERT (SG5107)';
    case -26:
      return 'ROBERT (SG5111)';
    case -27:
      return 'THROSSELL (SG5115)';
    case -28:
      return 'RASON (SH5103)';
    case -29:
      return 'MINIGWAL (SH5107)';
    case -30:
      return 'CUNDEELEE (SH5111)';
    case -31:
      return 'ZANTHUS (SH5115)';
    case -32:
      return 'BALLADONIA (SI5103)';
    case -33:
      return 'MALCOLM (SI5107)';
    case -34:
      return 'CAPE ARID (SI5111)';
    default:
      return '';
  }
}
function getMapSheet124(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -14:
      return 'MONTAGUE SOUND (SD5112)';
    case -15:
      return 'PRINCE REGENT (SD5116)';
    case -16:
      return 'CHARNLEY (SE5104)';
    case -17:
      return 'LENNARD RIVER (SE5108)';
    case -18:
      return 'NOONKANBAH (SE5112)';
    case -19:
      return 'CROSSLAND (SE5116)';
    case -20:
      return 'DUMMER (SF5104)';
    case -21:
      return 'PERCIVAL (SF5108)';
    case -22:
      return 'URAL (SF5112)';
    case -23:
      return 'MORRIS (SF5116)';
    case -24:
      return 'WARRI (SG5104)';
    case -25:
      return 'BROWNE (SG5108)';
    case -26:
      return 'YOWALGA (SG5112)';
    case -27:
      return 'WESTWOOD (SG5116)';
    case -28:
      return 'NEALE (SH5104)';
    case -29:
      return 'PLUMRIDGE (SH5108)';
    case -30:
      return 'SEEMORE (SH5112)';
    case -31:
      return 'NARETHA (SH5116)';
    case -32:
      return 'CULVER (SI5104)';
    case -33:
      return 'SI5108';
    default:
      return '';
  }
}
function getMapSheet126(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -14:
      return 'DRYSDALE (SD5209)';
    case -15:
      return 'ASHTON (SD5213)';
    case -16:
      return 'MT. ELIZABETH (SE5201)';
    case -17:
      return 'LANSDOWNE (SE5205)';
    case -18:
      return 'MT. RAMSEY (SE5209)';
    case -19:
      return 'MT. BANNERMAN (SE5213)';
    case -20:
      return 'CORNISH (SF5201)';
    case -21:
      return 'HELENA (SF5205)';
    case -22:
      return 'WILSON (SF5209)';
    case -23:
      return 'RYAN (SF5213)';
    case -24:
      return 'COBB (SG5201)';
    case -25:
      return 'BENTLEY (SG5205)';
    case -26:
      return 'TALBOT (SG5209)';
    case -27:
      return 'LENNIS (SG5213)';
    case -28:
      return 'VERNON (SH5201)';
    case -29:
      return 'JUBILEE (SH5205)';
    case -30:
      return 'LOONGANA (SH5209)';
    case -31:
      return 'MADURA (SH5213)';
    case -32:
      return 'BURNABBIE (SI5201)';
    default:
      return '';
  }
}
function getMapSheet127(mapLcnY) {
  switch (parseInt(mapLcnY)) {
    case -14:
      return 'MEDUSA BANKS (SD5210)';
    case -15:
      return 'CAMBRIDGE GULF (SD5214)';
    case -16:
      return 'LISSADEL (SE5202)';
    case -17:
      return 'DIXON RANGE (SE5206)';
    case -18:
      return 'GORDON DOWNS (SE5210)';
    case -19:
      return 'BILLUNA (SE5214)';
    case -20:
      return 'LUCAS (SF5202)';
    case -21:
      return 'STANSMORE (SF5206)';
    case -22:
      return 'WEBB (SF5210)';
    case -23:
      return 'MACDONALD (SF5214)';
    case -24:
      return 'RAWLINSON (SG5202)';
    case -25:
      return 'SCOTT (SG5206)';
    case -26:
      return 'COOPER (SG5210)';
    case -27:
      return 'WAIGEN (SG5214)';
    case -28:
      return 'WANNA (SH5202)';
    case -29:
      return 'MASON (SH5206)';
    case -30:
      return 'MASON (SH5207)';
    case -31:
      return 'MASON (SH5208)';
    case -32:
      return 'MASON (SH5209)';
    default:
      return '';
  }
}


function getMapSheet(mapLcnX, mapLcnY) {
  //work out which part of WA we are in
  switch (getMapSheetLongitude(mapLcnX)) {
    case 112.5:
      return getMapSheet112(mapLcnY);
    case 114:
      return getMapSheet114(mapLcnY);
    case 115.5:
      return getMapSheet115(mapLcnY);
    case 117:
      return getMapSheet117(mapLcnY);
    case 118.5:
      return getMapSheet118(mapLcnY);
    case 120:
      return getMapSheet120(mapLcnY);
    case 121.5:
      return getMapSheet121(mapLcnY);
    case 123:
      return getMapSheet123(mapLcnY);
    case 124.5:
      return getMapSheet124(mapLcnY);;
    case 126:
      return getMapSheet126(mapLcnY);;
    case 127.5:
      return getMapSheet127(mapLcnY);;
    default:
      return '';
  }
}
