// version V3.0 2010-10-10
var Ireland = [
[51.2,-9.9],[52.0,-10.9],[54.4,-10.3],[55.5,-8.0],
[55.4,-6.1],[54.6,-5.2],[52.1,-6.2],[51.2,-9.9]
];
var ChannelIslands = [
[49.80,-2.33],[49.42,-2.89],[49.06,-2.25],
[49.13,-1.83],[49.80,-2.05],[49.80,-2.33]
];
var GreatBritain = [
[55.9,-7.2],[57.0,-8.8],[58.3,-8.7],[61.1,-1.5],
[60.9,0.2],[58.3,-1.7],[52.6,2.6],[50.4,1.0],
[49.4,-6.5],[49.9,-6.9],[53.3,-5.2],[54.7,-5.3],
[55.4,-6.2],[55.9,-7.2]
];
function pointInPoly(lat, lng, poly){
  var c = false, n = poly.length; // poly=lat,lng
  for (var i = -1, j = n-1; ++i < n; j = i) {
    ((poly[i][0] <= lat && lat < poly[j][0]) 
    || (poly[j][0] <= lat && lat < poly[i][0]))
    && (lng < (poly[j][1] - poly[i][1]) 
    * (lat - poly[i][0]) / (poly[j][0] - poly[i][0]) + poly[i][1])
    && (c = !c);
  }
  return (c);
}
function LatLonToUKNG(lat, lon, height, prec, pad) {
  if (typeof height == 'undefined') var height = 0;
  if (typeof prec == 'undefined') var prec = 0;
  if (typeof pad == 'undefined') var pad = false;
  if (lat < 49 || lat > 62 || lon < -9.0 || lon > 3) return ('');
  var deg2rad = Math.PI / 180; var sec2rad = deg2rad / 3600;
  var phi = lat * deg2rad; var lam = lon * deg2rad;
  var s_a = 6378137.000; var s_b = 6356752.314; // GRS80
  var s_e2 = (s_a * s_a - s_b * s_b) / (s_a * s_a);
  var v = s_a / Math.sqrt(1 - s_e2 * Math.pow(Math.sin(phi), 2));
  var x = (v + height) * Math.cos(phi) * Math.cos(lam);
  var y = (v + height) * Math.cos(phi) * Math.sin(lam);
  var z = ((1 - s_e2) * v + height) * Math.sin(phi);
  var xt = -446.448; var yt = 125.157; var zt = -542.06; // OSGB36
  var xr = -0.1502 * sec2rad; var yr = -0.247 * sec2rad; 
  var zr = -0.8421 * sec2rad; var sf = 20.4894 * 0.000001;
  var hx = x * (1 + sf) - y * zr + z * yr + xt;
  var hy = x * zr + y   + y * sf - z * xr + yt;
  var hz = x * (-yr)    + y * xr + z * (1 + sf) + zt;
  var a = 6377563.396; var b = 6356256.910; // Airy
  var e2 = (a * a - b * b) / (a * a);
  lam = Math.atan(hy / hx);
  var p = Math.sqrt(hx * hx + hy * hy);
  phi = Math.atan(hz / (p * (1 - e2)));
  v = a / Math.sqrt(1 - e2 * Math.pow(Math.sin(phi), 2));
  var ev = 1.0; var phi0 = 0;
  while (ev > 0.00000002)  {
    phi0 = Math.atan((hz + e2 * v * Math.sin(phi)) / p);
    ev = Math.abs(phi0 - phi);
    phi = phi0;
  } 
  var e0 = 400000; var n0 = -100000; var f0 = 0.9996012717; // EN
  var lam0 = -2 * deg2rad; var phi0 = 49 * deg2rad;
  var af0 = a * f0; var bf0 = b * f0;
  var cp = Math.cos(phi); var sp = Math.sin(phi); tp = sp / cp;
  var sp2 = sp * sp; var cp3 = cp * cp * cp; var tp2 = tp * tp;
  var cp5 = cp3 * cp * cp; var tp4 = tp2 * tp2;
  var nu = af0 / (Math.sqrt(1 - (e2 * (sp2))));
  var rho = (nu * (1 - e2)) / (1 - (e2 * sp2));
  var eta2 = (nu / rho) - 1; var p = lam - lam0;
  var IV = nu * cp;
  var V = (nu / 6) * cp3 * ((nu / rho) - tp2);
  var VI = (nu / 120) * cp5 * ((5 - (18 * tp2)) 
   + tp4 + (14 * eta2) - (58 * tp2 * eta2));
  var E = e0 + (p * IV) + (Math.pow(p, 3) * V) + (Math.pow(p, 5) * VI);
  E = Math.round(E); var e100k = Math.floor(E / 100000);
  if (!(e100k >= 0 && e100k < 7)) return('');
  var n = (af0 - bf0) / (af0 + bf0);
  var M = bf0 * (((1 + n + ((5 / 4) * (n * n)) + ((5 / 4) * (n * n * n)))
    * (phi - phi0))
   - (((3 * n) + (3 * (n * n)) + ((21 / 8) * (n * n * n)))
    * (Math.sin(phi - phi0)) * (Math.cos(phi + phi0)))
   + ((((15 / 8) * (n * n)) + ((15 / 8) * (n * n * n)))
    * (Math.sin(2 * (phi - phi0))) * (Math.cos(2 * (phi + phi0))))
   - (((35 / 24) * (n * n * n)) * (Math.sin(3 * (phi - phi0)))
    * (Math.cos(3 * (phi + phi0)))));
  var I = M + n0;
  var II = (nu / 2) * sp * cp;
  var III = ((nu / 24) * sp * cp3) * (5 - tp2 + (9 * eta2));
  var IIIA = ((nu / 720) * sp * cp5) * (61 - (58 * tp2) + tp4);
  var N = I + ((p * p) * II) + (Math.pow(p, 4) * III) + (Math.pow(p, 6) * IIIA);
  N = Math.round(N); var n100k = Math.floor(N / 100000);
  if (!(n100k >= 0 && n100k < 13)) return('');
  var c1 = (19 - n100k) - (19 - n100k) % 5 + Math.floor((e100k + 10) / 5);
  var c2 = (19 - n100k) * 5 % 25 + e100k % 5;
  var alpha = "ABCDEFGHJKLMNOPQRSTUVWXYZ";
  var c100k = alpha.substr(c1, 1) + alpha.substr(c2, 1);
  if (prec == 0) prec = 1;
  if (prec == 2000) {
    var dinty = 'AFKQVBGLRWCHMSXDINTYEJPUZ';
    var lxi = Math.floor(((Math.floor(E / 1000) % 100) % 10) / 2);
    var lyi = Math.floor(((Math.floor(N / 1000) % 100) % 10) / 2);
    var i = lxi + (lyi * 5);
    var t = dinty.charAt(i);
    E = Math.floor((E % 100000) / 10000);
    N = Math.floor((N % 100000) / 10000);
    var cE = String(E); while (cE.length < 1) cE = '0' + cE;
    var cN = String(N); while (cN.length < 1) cN = '0' + cN;
    var padding = '';
    if (pad) padding = ' ';
    return (c100k + padding + cE + padding + cN + padding + t);
  }
  else {
    E = Math.floor((E % 100000) / prec);
    N = Math.floor((N % 100000) / prec);
    var digits = 5 - Math.log(prec) / Math.log(10);
    var cE = String(E); while (cE.length < digits) cE = '0' + cE;
    var cN = String(N); while (cN.length < digits) cN = '0' + cN;
    var padding = '';
    if (pad) padding = ' ';
    return (c100k + padding + cE + padding + cN);
  }
}
function LatLonToING(lat, lon, height, prec, pad) {
  if (typeof height == 'undefined') var height = 0;
  if (typeof prec == 'undefined') var prec = 0;
  if (typeof pad == 'undefined') var pad = false;
  if (lat < 51.2 || lat > 55.8 || lon < -11.0 || lon > -4.8) return ('');
  var deg2rad = Math.PI / 180; var sec2rad = deg2rad / 3600;
  var phi = lat * deg2rad; var lam = lon * deg2rad;
  var s_a = 6378137.000; var s_b = 6356752.314; // GRS80
  var s_e2 = (s_a * s_a - s_b * s_b) / (s_a * s_a);
  var v = s_a / Math.sqrt(1 - s_e2 * Math.pow(Math.sin(phi), 2));
  var x = (v + height) * Math.cos(phi) * Math.cos(lam);
  var y = (v + height) * Math.cos(phi) * Math.sin(lam);
  var z = ((1 - s_e2) * v + height) * Math.sin(phi);
  var xt = -482.53; var yt = 130.596; var zt = -564.557; // OSI65
  var xr = 1.042 * sec2rad; var yr = 0.214 * sec2rad;
  var zr = 0.631 * sec2rad; var sf = -8.15 * 0.000001;
  var hx = x * (1 + sf) - y * zr + z * yr + xt;
  var hy = x * zr + y   + y * sf - z * xr + yt;
  var hz = x * (-yr)    + y * xr + z * (1 + sf) + zt;
  var a = 6377340.189; var b = 6356034.447; // Airy modified
  var e2 = (a * a - b * b) / (a * a);
  lam = Math.atan(hy / hx);
  var p = Math.sqrt(hx * hx + hy * hy);
  phi = Math.atan(hz / (p * (1 - e2)));
  v = a / Math.sqrt(1 - e2 * Math.pow(Math.sin(phi), 2));
  var ev = 1.0; var phi0 = 0;
  while (ev > 0.00000002)  {
    phi0 = Math.atan((hz + e2 * v * Math.sin(phi)) / p);
    ev = Math.abs(phi0 - phi);
    phi = phi0;
  }
  var e0 = 200000; var n0 = 250000; var f0 = 1.000035; // EN
  var lam0 = -8 * deg2rad; var phi0 = 53.5 * deg2rad;
  var af0 = a * f0; var bf0 = b * f0;
  var cp = Math.cos(phi); var sp = Math.sin(phi); tp = sp / cp;
  var sp2 = sp * sp; var cp3 = cp * cp * cp; var tp2 = tp * tp;
  var cp5 = cp3 * cp * cp; var tp4 = tp2 * tp2;
  var nu = af0 / (Math.sqrt(1 - (e2 * (sp2))));
  var rho = (nu * (1 - e2)) / (1 - (e2 * sp2));
  var eta2 = (nu / rho) - 1; var p = lam - lam0;
  var IV = nu * cp;
  var V = (nu / 6) * cp3 * ((nu / rho) - tp2);
  var VI = (nu / 120) * cp5 * ((5 - (18 * tp2)) 
   + tp4 + (14 * eta2) - (58 * tp2 * eta2));
  var E = e0 + (p * IV) + (Math.pow(p, 3) * V) + (Math.pow(p, 5) * VI);
  E = Math.round(E); var e100k = Math.floor(E / 100000);
  if (!(e100k >= 0 && e100k < 4)) return('');
  var n = (af0 - bf0) / (af0 + bf0);
  var M = bf0 * (((1 + n + ((5 / 4) * (n * n)) + ((5 / 4) * (n * n * n)))
    * (phi - phi0))
   - (((3 * n) + (3 * (n * n)) + ((21 / 8) * (n * n * n)))
    * (Math.sin(phi - phi0)) * (Math.cos(phi + phi0)))
   + ((((15 / 8) * (n * n)) + ((15 / 8) * (n * n * n)))
    * (Math.sin(2 * (phi - phi0))) * (Math.cos(2 * (phi + phi0))))
   - (((35 / 24) * (n * n * n)) * (Math.sin(3 * (phi - phi0)))
    * (Math.cos(3 * (phi + phi0)))));
  var I = M + n0;
  var II = (nu / 2) * sp * cp;
  var III = ((nu / 24) * sp * cp3) * (5 - tp2 + (9 * eta2));
  var IIIA = ((nu / 720) * sp * cp5) * (61 - (58 * tp2) + tp4);
  var N = I + ((p * p) * II) + (Math.pow(p, 4) * III) + (Math.pow(p, 6) * IIIA);
  N = Math.round(N); var n100k = Math.floor(N / 100000);
  if (!(n100k >= 0 && n100k < 5)) return('');
  var c2 = (4 - n100k) * 5 % 25 + e100k % 5;
  var alpha = "ABCDEFGHJKLMNOPQRSTUVWXYZ";
  var c100k = alpha.substr(c2, 1);
  if (prec == 0) prec = 1;
  if (prec == 2000) {
    var dinty = 'AFKQVBGLRWCHMSXDINTYEJPUZ';
    var lxi = Math.floor(((Math.floor(E / 1000) % 100) % 10) / 2);
    var lyi = Math.floor(((Math.floor(N / 1000) % 100) % 10) / 2);
    var i = lxi + (lyi * 5);
    var t = dinty.charAt(i);
    E = Math.floor((E % 100000) / 10000);
    N = Math.floor((N % 100000) / 10000);
    var cE = String(E); while (cE.length < 1) cE = '0' + cE;
    var cN = String(N); while (cN.length < 1) cN = '0' + cN;
    var padding = '';
    if (pad) padding = ' ';
    return (c100k + padding + cE + padding + cN + padding + t);
  }
  else {
    E = Math.floor((E % 100000) / prec);
    N = Math.floor((N % 100000) / prec);
    var digits = 5 - Math.log(prec) / Math.log(10);
    var cE = String(E); while (cE.length < digits) cE = '0' + cE;
    var cN = String(N); while (cN.length < digits) cN = '0' + cN;
    var padding = '';
    if (pad) padding = ' ';
    return (c100k + padding + cE + padding + cN);
  }
}
function LatLonToCING(lat, lon, height, prec, pad) {
  if (typeof height == 'undefined') var height = 0;
  if (typeof prec == 'undefined') var prec = 0;
  if (typeof pad == 'undefined') var pad = false;
  if (lat < 49 || lat > 49.8 || lon < -3.0 || lon > -1.8) return ('');
  var deg2rad = Math.PI / 180; var sec2rad = deg2rad / 3600;
  var phi = lat * deg2rad; var lam = lon * deg2rad;
  var s_a = 6378137.000; var s_b = 6356752.314; // GRS80
  var s_e2 = (s_a * s_a - s_b * s_b) / (s_a * s_a);
  var v = s_a / Math.sqrt(1 - s_e2 * Math.pow(Math.sin(phi), 2));
  var x = (v + height) * Math.cos(phi) * Math.cos(lam);
  var y = (v + height) * Math.cos(phi) * Math.sin(lam);
  var z = ((1 - s_e2) * v + height) * Math.sin(phi);
  var xt = 87; var yt = 98; var zt = 121; // ED50
  //var xt = 83.901; var yt = 98.127; var zt = 118.635;
  var xr = 0 * sec2rad; var yr = 0 * sec2rad; 
  var zr = 0 * sec2rad; var sf = 0 * 0.000001;
  var hx = x * (1 + sf) - y * zr + z * yr + xt;
  var hy = x * zr + y   + y * sf - z * xr + yt;
  var hz = x * (-yr)    + y * xr + z * (1 + sf) + zt;
  var a = 6378388.000; var b = 6356911.946; // ED50
  var e2 = (a * a - b * b) / (a * a);
  lam = Math.atan(hy / hx);
  var p = Math.sqrt(hx * hx + hy * hy);
  phi = Math.atan(hz / (p * (1 - e2)));
  v = a / Math.sqrt(1 - e2 * Math.pow(Math.sin(phi), 2));
  var ev = 1.0; var phi0 = 0;
  while (ev > 0.00000002)  {
    phi0 = Math.atan((hz + e2 * v * Math.sin(phi)) / p);
    ev = Math.abs(phi0 - phi);
    phi = phi0;
  } 
  var e0 = 500000; var n0 = 0; var f0 =  0.9996; // EN
  var lam0 = -3 * deg2rad; var phi0 = 0 * deg2rad;
  var af0 = a * f0; var bf0 = b * f0;
  var cp = Math.cos(phi); var sp = Math.sin(phi); tp = sp / cp;
  var sp2 = sp * sp; var cp3 = cp * cp * cp; var tp2 = tp * tp;
  var cp5 = cp3 * cp * cp; var tp4 = tp2 * tp2;
  var nu = af0 / (Math.sqrt(1 - (e2 * (sp2))));
  var rho = (nu * (1 - e2)) / (1 - (e2 * sp2));
  var eta2 = (nu / rho) - 1; var p = lam - lam0;
  var IV = nu * cp;
  var V = (nu / 6) * cp3 * ((nu / rho) - tp2);
  var VI = (nu / 120) * cp5 * ((5 - (18 * tp2)) 
   + tp4 + (14 * eta2) - (58 * tp2 * eta2));
  var E = e0 + (p * IV) + (Math.pow(p, 3) * V) + (Math.pow(p, 5) * VI);
  E = Math.round(E); var e100k = Math.floor(E / 100000);
  if (!(e100k >= 0 && e100k < 7)) return('');
  var n = (af0 - bf0) / (af0 + bf0);
  var M = bf0 * (((1 + n + ((5 / 4) * (n * n)) + ((5 / 4) * (n * n * n)))
    * (phi - phi0))
   - (((3 * n) + (3 * (n * n)) + ((21 / 8) * (n * n * n)))
    * (Math.sin(phi - phi0)) * (Math.cos(phi + phi0)))
   + ((((15 / 8) * (n * n)) + ((15 / 8) * (n * n * n)))
    * (Math.sin(2 * (phi - phi0))) * (Math.cos(2 * (phi + phi0))))
   - (((35 / 24) * (n * n * n)) * (Math.sin(3 * (phi - phi0)))
    * (Math.cos(3 * (phi + phi0)))));
  var I = M + n0;
  var II = (nu / 2) * sp * cp;
  var III = ((nu / 24) * sp * cp3) * (5 - tp2 + (9 * eta2));
  var IIIA = ((nu / 720) * sp * cp5) * (61 - (58 * tp2) + tp4);
  var N = I + ((p * p) * II) + (Math.pow(p, 4) * III) + (Math.pow(p, 6) * IIIA);
  N = Math.round(N); var n100k = Math.floor(N / 100000);
  var c100k = 'WV';
  if (n100k == 55) c100k = 'WA';
  if (prec == 0) prec = 1;
  if (prec == 2000) {
    var dinty = 'AFKQVBGLRWCHMSXDINTYEJPUZ';
    var lxi = Math.floor(((Math.floor(E / 1000) % 100) % 10) / 2);
    var lyi = Math.floor(((Math.floor(N / 1000) % 100) % 10) / 2);
    var i = lxi + (lyi * 5);
    var t = dinty.charAt(i);
    E = Math.floor((E % 100000) / 10000);
    N = Math.floor((N % 100000) / 10000);
    var cE = String(E); while (cE.length < 1) cE = '0' + cE;
    var cN = String(N); while (cN.length < 1) cN = '0' + cN;
    var padding = '';
    if (pad) padding = ' ';
    return (c100k + padding + cE + padding + cN + padding + t);
  }
  else {
    E = Math.floor((E % 100000) / prec);
    N = Math.floor((N % 100000) / prec);
    var digits = 5 - Math.log(prec) / Math.log(10);
    var cE = String(E); while (cE.length < digits) cE = '0' + cE;
    var cN = String(N); while (cN.length < digits) cN = '0' + cN;
    var padding = '';
    if (pad) padding = ' ';
    return (c100k + padding + cE + padding + cN);
  }
}
function ng100k(e, n) {
  var ng = '';
  var e100k = Math.floor(e / 100000), n100k = Math.floor(n / 100000);
  if (!(e100k<0 || e100k>6 || n100k<0 || n100k>12)) {
    var i1 = (19 - n100k) - (19 - n100k) % 5 + Math.floor((e100k + 10) / 5);
    var i2 = (19 - n100k) * 5 % 25 + e100k % 5;
    if (i1 > 7) i1++; if (i2 > 7) i2++; // swalow 'I' in A=0 to Z=25
    ng = String.fromCharCode(i1 + 'A'.charCodeAt(0), i2 + 'A'.charCodeAt(0));
  }
  return ng;
}
function tetrad(e, n) {
  var dinty = 'AFKQVBGLRWCHMSXDINTYEJPUZ';
  var lxi = Math.floor(((Math.floor(e / 1000) % 100) % 10) / 2);
  var lyi = Math.floor(((Math.floor(n / 1000) % 100) % 10) / 2);
  var i = lxi + (lyi * 5);
  var t = dinty.charAt(i);
  var xs = Math.floor(e % 100000).toString();
  while (xs.length < 5) xs = '0' + xs;
  xs = xs.substr(0, 1);
  var ys = Math.floor(n % 100000).toString();
  while (ys.length < 5) ys = '0' + ys;
  ys = ys.substr(0, 1);
  return ng100k(e, n) + xs + ys + t;
}
function cursor(x, y) {
  gs = ng100k(x, y);
  if (gs != '') {
    var xs = Math.floor(x % 100000).toString();
    while (xs.length < 5) xs = '0' + xs;
    xs = xs.substr(0, 3);
    var ys = Math.floor(y % 100000).toString();
    while (ys.length < 5) ys = '0' + ys;
    ys = ys.substr(0, 3);
    gs = gs + xs + ys + ' ' + '(' + tetrad(x, y) + ')';
  }
  else gs = "&nbsp;";
  return gs;
}

