//===================================================================
// ellipsoid_axis[15] = 6378388; ellipsoid_eccen[15] = 0.00672267;  // int24

var deg2rad = Math.PI / 180;
var rad2deg = 180.0 / Math.PI;

// Hay un desplazamiento entre Google y Sigpac: dx_sg = 0.001178 dy_sg = 0.001350 (En Puerta del Sol)
// Ajuste mas fino para Castilla y Leon
var dx_sg = 0.001328;
var dy_sg = 0.001113;

function calc_utm(lat, lon)
{

lat = lat + dy_sg;
lon = lon + dx_sg;

// ellipsoid_axis[15] = 6378388; ellipsoid_eccen[15] = 0.00672267;  // int24 <-> ED50
axis = 6378388;
eccent = 0.00672267;
var k0 = 0.9996;
var latrad = lat * deg2rad;
var longrad = lon * deg2rad;
var zonenum = Math.floor((lon + 180) / 6) + 1;
if (lat >= 56.0 && lat < 64.0 && lon >= 3.0 && lon < 12.0 )
  zonenum = 32;
// Special zones for Svalbard
if( lat >= 72.0 && lat < 84.0 ) 
  {
  if (lon >= 0.0  && lon <  9.0 ) zonenum = 31;
  else if ( lon >= 9.0  && lon < 21.0 ) zonenum = 33;
  else if ( lon >= 21.0 && lon < 33.0 ) zonenum = 35;
  else if ( lon >= 33.0 && lon < 42.0 ) zonenum = 37;
 }

var lonorig = (zonenum - 1) * 6 - 180 + 3;  //+3 puts origin in middle of zone
var lonorigrad = lonorig * deg2rad;

//get letter
var letter = get_zoneletter(lat);

var eccPrimeSquared = (eccent) / (1 - eccent);

//calculate
var N = axis / Math.sqrt(1 - eccent * Math.sin(latrad) * Math.sin(latrad));
var T = Math.tan(latrad) * Math.tan(latrad);
var C = eccPrimeSquared * Math.cos(latrad) * Math.cos(latrad);
var A = Math.cos(latrad) * (longrad - lonorigrad);
var M = axis * ((1 - eccent / 4 - 3 * eccent * eccent / 64 - 5 * eccent * eccent * eccent / 256) * latrad - (3 * eccent / 8 + 3 * eccent * eccent / 32 + 45 * eccent * eccent *eccent / 1024) * Math.sin(2 * latrad) + (15 * eccent * eccent / 256 + 45 * eccent * eccent * eccent / 1024) * Math.sin(4 * latrad) - (35 * eccent * eccent * eccent / 3072) * Math.sin(6 * latrad));

var easting = (k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) + 500000.0);
var northing = (k0 * (M + N * Math.tan(latrad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720)));
if (lat < 0)
  northing += 10000000.0; //10000000 meter offset for southern hemisphere

// round up
easting = Math.floor(easting);
northing = Math.floor(northing);

// correlate index with letter
var cx ="C01D02E03F04G05H06J07K08L09M10N11P12Q13R14S15T16U17V18W19X20";
var cxi = cx.indexOf(letter,0);
var zl = Number(cx.substr(cxi + 1, 2));

var resultado = { N: northing, E: easting, Z: zonenum, i: zl } 
// alert("N: " + northing + ", E: " + easting + ", Z: " + zonenum + ", i: " + zl);
/*
document.myform3.north.value = northing;
document.myform3.east.value = easting;
document.myform3.zone.value = zonenum;
document.myform3.zletter.selectedIndex = zl;
*/
return resultado;
}

//===================================================================
function get_zoneletter(lat)
{
//This routine determines the correct UTM letter designator for the given latitude
//returns 'Z' if latitude is outside the UTM limits of 84N to 80S
var zoneletter;

if ((84 >= lat) && (lat >= 72)) zoneletter = 'X';
else if ((72 > lat) && (lat >= 64)) zoneletter = 'W';
else if ((64 > lat) && (lat >= 56)) zoneletter = 'V';
else if ((56 > lat) && (lat >= 48)) zoneletter = 'U';
else if ((48 > lat) && (lat >= 40)) zoneletter = 'T';
else if ((40 > lat) && (lat >= 32)) zoneletter = 'S';
else if ((32 > lat) && (lat >= 24)) zoneletter = 'R';
else if ((24 > lat) && (lat >= 16)) zoneletter = 'Q';
else if ((16 > lat) && (lat >= 8)) zoneletter = 'P';
else if (( 8 > lat) && (lat >= 0)) zoneletter = 'N';
else if (( 0 > lat) && (lat >= -8)) zoneletter = 'M';
else if ((-8> lat) && (lat >= -16)) zoneletter = 'L';
else if ((-16 > lat) && (lat >= -24)) zoneletter = 'K';
else if ((-24 > lat) && (lat >= -32)) zoneletter = 'J';
else if ((-32 > lat) && (lat >= -40)) zoneletter = 'H';
else if ((-40 > lat) && (lat >= -48)) zoneletter = 'G';
else if ((-48 > lat) && (lat >= -56)) zoneletter = 'F';
else if ((-56 > lat) && (lat >= -64)) zoneletter = 'E';
else if ((-64 > lat) && (lat >= -72)) zoneletter = 'D';
else if ((-72 > lat) && (lat >= -80)) zoneletter = 'C';
else zoneletter = chr(32 + 66); //This is here as an error flag to show that the Latitude is outside the UTM limits
return zoneletter;
}

// calc_utm(41.5, -3.5);