 function xy2xy(east, north){
  var a = 6378137     ;
  var f = 1 / 298.257222101 ;
  var e2 = f * ( 2 - f ) ;
  var fe_swr = 500000   ;
  var fn_swr = 0     ;
  var lambda0_swr = 15  ;
  var k0_swr = 0.9996  ;
/*RT90 2,5 gon V definierad på GRS1980  */
  var fe_rt = 1500064.274  ;
  var fn_rt = -667.711    ;
  var lambda0_rt = 15 + 48 / 60 + 22.624306 / 3600   ;
  var k0_rt = 1.000005610241   ;

function sinh(x) {return (Math.exp(x)-Math.exp(-x))/2}
function cosh(x) {return (Math.exp(x)+Math.exp(-x))/2}

  if (east < 1000000) {

    var fe_in = fe_swr;
    var fe_ut = fe_rt;
    var fn_in = fn_swr;
    var fn_ut = fn_rt;
    var lambda0_in = lambda0_swr;
    var lambda0_ut = lambda0_rt;
    var k0_in = k0_swr;
    var k0_ut = k0_rt;
  }
else {
    var fe_in = fe_rt;
    var fe_ut = fe_swr;
    var fn_in = fn_rt;
    var fn_ut = fn_swr;
    var lambda0_in = lambda0_rt;
    var lambda0_ut = lambda0_swr;
    var k0_in = k0_rt;
    var k0_ut = k0_swr;
  }
var n = f / ( 2 - f ) ;
var n2 = n * n ;
var n3 = n2 * n ;
var n4 = n2 * n2 ;

var atak = (a / ( 1 + n )) * ( 1 + 0.25 * n2 + ((1 / 64) * n4 ));

var ksi = ( north - fn_in ) / k0_in / atak ;
var etha = ( east - fe_in ) / k0_in / atak  ;


var d2 = 0.5 * n - 2 / 3 * n2  + 37 / 96 * n3  - n4 / 360 ;
var d4 = n2 / 48 + n3 / 15 - 437 / 1440 * n4               ;
var d6 = 17 / 480 * n3 - 37 / 840 * n4                      ;
var d8 = 4397 / 161280 * n4                                  ;

var ksip = ksi  ;
var ethap = etha                 ;
var k = [2,4,6,8];
var d = [d2,d4,d6,d8];

for (i=0;i<k.length;i++) {

  var sin =  Math.sin(k[i] * ksi);
  var cos = Math.cos(k[i] * ksi);
  var x = k[i] * etha ;

  var ksip = ksip - d[i] * sin * cosh(x);
  var ethap = ethap - d[i] * cos * sinh(x);
}
var x = ethap    ;
var fistar = Math.asin(Math.sin(ksip) / cosh(x));
var dlambda =  Math.atan(sinh(x) / Math.cos(ksip));
var dlambda = (Math.PI / 180.0)*(lambda0_in - lambda0_ut) + dlambda;
var ksip = Math.atan(Math.tan(fistar) / Math.cos(dlambda)) ;
var x = Math.cos(fistar) * Math.sin(dlambda);
var atanh = Math.log((1 + x ) / ( 1 - x )) / 2.0;
var ethap = atanh ;

var b2 = 0.5 * n - 2 / 3 * n2 + 5 / 16 * n3 + 41 / 180 * n4    ;
var b4 = 13 / 48 * n2 - 0.6 * n3 + 557 / 1440 * n4              ;
var b6 = 61 / 240 * n3 - 103 / 140 * n4                          ;
var b8 = 49561 / 161280 * n4                                      ;

var north = ksip;
var east = ethap;

var k = [2,4,6,8];
var b = [b2,b4,b6,b8];

for (i=0;i<k.length;i++) {

  var sin =  Math.sin(k[i] * ksip);
  var cos = Math.cos(k[i] * ksip);
  var x = k[i] * ethap ;

  var north = north + b[i] * sin * cosh(x);
  var east = east + b[i] * cos * sinh(x);
}
var north = k0_ut * atak * north + fn_ut;
var east =  k0_ut * atak * east + fe_ut;

   return (parseInt(east) + "," + parseInt(north));
 }

function lonlat2xy(lon, lat){

// Direct projection from SWEREF 99 (lat, lon) to RT90 2.5 gon V 0:-15 (x, y)
// using Gauss-Kruger Projection (Tranversal Mercator)
 
 
 // We only support Sweden...
  // These parameters are just a simple estimate of
  // a bounding box covering Sweden.
  if (lon < 10.91667 
      || lon > 24.2
      || lat < 55.31667
      || lat > 69.067) {
    var x = 0;
    var y = 0;
    return ("No");
  }

  var a = 6378137.0;           // Semi-major axis of the ellipsoid (GRS80)
  var f = 1.0 / 298.257222101; // Inverse Flattening
  var e2 = f * (2.0 - f);      // First eccentricity squared
  var lon0 = ((15.0 + (48.0 / 60.0) + (22.624306 / 3600.0))
                * Math.PI) / 180.0; 
                                  // Central meridian (E 15 48'22.624306)
  var k0 = 1.00000561024;      // Scale on central meridian)
  var fn = -667.711;           // False northing
  var fe = 1500064.274;        // False easting

  var n = f / (2.0 - f);
  var n2 = n * n;
  var n4 = n2 * n2;
  var at = (a / (1.0 + n)) * (1.0 + 0.25 * n2 + 0.015625 * n4);
 
 // Compute conformal latitude latStar
  var e4 = e2 * e2;
  var e6 = e2 * e4;
  var e8 = e4 * e4;
  var B = (5.0 * e4 - e6) / 6.0;
  var C = (104.0 * e6 - 45.0 * e8) / 120.0;
  var D = (1237.0 * e8) / 1260.0;
  lat = lat * Math.PI / 180.0;
  
  var sinlat = Math.sin(lat);
  var sinlat2 = sinlat * sinlat;
  var sinlat4 = sinlat2 * sinlat2;
  var sinlat6 = sinlat2 * sinlat4;
  var latStar = lat - (sinlat * Math.cos(lat)
                         * (e2 + B * sinlat2 + C * sinlat4 + D * sinlat6));
 
  // Compute projection
  lon = lon * Math.PI / 180.0;
  var dlon = lon - lon0;
  var xsi = Math.atan(Math.tan(latStar) / Math.cos(dlon));
  var ny = Math.cos(latStar) * Math.sin(dlon);
  ny = Math.log((1.0 + ny) / (1.0 - ny)) / 2.0;
  
  var n3 = n * n2;
  var beta1 = 0.5 * n - 2.0 * n2 / 3.0 + 5.0 * n3 / 16.0 + 41.0 * n4 / 180.0;
  var beta2 = 13.0 * n2 / 48.0 - 3.0 * n3 / 5.0 + 557.0 * n4 / 1440.0;
  var beta3 = 61.0 * n3 / 240.0 - 103.0 * n4 / 140.0;
  var beta4 = 49561.0 * n4 / 161280.0;
    
function sinh(x) {return (Math.exp(x)-Math.exp(-x))/2}
function cosh(x) {return (Math.exp(x)+Math.exp(-x))/2}
  
  x = fn + k0 * at * (xsi 
                      + beta1 * Math.sin(2.0 * xsi) * cosh(2.0 * ny)
                      + beta2 * Math.sin(4.0 * xsi) * cosh(4.0 * ny)
                      + beta3 * Math.sin(6.0 * xsi) * cosh(6.0 * ny)
                      + beta4 * Math.sin(8.0 * xsi) * cosh(8.0 * ny));
  y = fe + k0 * at * (ny
                      + beta1 * Math.cos(2.0 * xsi) * sinh(2.0 * ny)
                      + beta2 * Math.cos(4.0 * xsi) * sinh(4.0 * ny)
                      + beta3 * Math.cos(6.0 * xsi) * sinh(6.0 * ny)
                      + beta4 * Math.cos(8.0 * xsi) * sinh(8.0 * ny));
                     
  return (parseInt(y) + "," + parseInt(x))
}


function xy2lonlat(y, x){


// Direct projection from RT90 2.5 gon V 0:-15 (x, y) to SWEREF 99 (lat, lon)
// using Gauss-Kruger Projection (Tranversal Mercator)

 
 // We only support Sweden...
  // These parameters are just a simple estimate of
  // a bounding box covering Sweden.
  if (y < 1100000 
      || y > 2000000
      || x < 6000000 
      || x > 8000000) {
    var lat = 0;
    var lon = 0;
    return ("No");
  }
  var lat = 0;
    var lon = 0;
 
  var a = 6378137.0;           // Semi-major axis of the ellipsoid (GRS80)
  var f = 1.0 / 298.257222101; // Inverse Flattening
  var e2 = f * (2.0 - f);      // First eccentricity squared
  var lon0 = ((15.0 + (48.0 / 60.0) + (22.624306 / 3600.0))
                * Math.PI) / 180.0; 
                                  // Central meridian (E 15 48'22.624306)
  var k0 = 1.00000561024;      // Scale on central meridian)
  var fn = -667.711;           // False northing
  var fe = 1500064.274;        // False easting

  var n = f / (2.0 - f);
  var n2 = n * n;
  var n3 = n * n2;
  var n4 = n2 * n2;
  var at = (a / (1.0 + n)) * (1.0 + 0.25 * n2 + 0.015625 * n4);
 
 // Compute conformal latitude latStar
  var e4 = e2 * e2;
  var e6 = e2 * e4;
  var e8 = e4 * e4;
 
 
  var xsi = (x - fn) / (k0 * at);
  var ny = (y - fe) / (k0 * at);
  
  var beta1 = 0.5 * n - 2.0 * n2 / 3.0 + 37.0 * n3 / 96.0 - 1.0 * n4 / 360.0;
  var beta2 = 1.0 * n2 / 48.0 + 1.0 * n3 / 15.0 - 437.0 * n4 / 1440.0;
  var beta3 = 17.0 * n3 / 480.0 - 37.0 * n4 / 840.0;
  var beta4 = 4397.0 * n4 / 161280.0;
  
  function sinh(x) {return (Math.exp(x)-Math.exp(-x))/2}
  function cosh(x) {return (Math.exp(x)+Math.exp(-x))/2}
                      
 var xsit = (xsi 
             - beta1 * Math.sin(2.0 * xsi) * cosh(2.0 * ny)
             - beta2 * Math.sin(4.0 * xsi) * cosh(4.0 * ny)
             - beta3 * Math.sin(6.0 * xsi) * cosh(6.0 * ny)
             - beta4 * Math.sin(8.0 * xsi) * cosh(8.0 * ny));
             
 var nyt = (ny
             - beta1 * Math.cos(2.0 * xsi) * sinh(2.0 * ny)
             - beta2 * Math.cos(4.0 * xsi) * sinh(4.0 * ny)
             - beta3 * Math.cos(6.0 * xsi) * sinh(6.0 * ny)
             - beta4 * Math.cos(8.0 * xsi) * sinh(8.0 * ny)); 
             
  
  var latStar = Math.asin(Math.sin(xsit) / cosh(nyt));
 
  // Compute projection
  
  var dlon = Math.atan(sinh(nyt) / Math.cos(xsit));
  
  
  var sinlat = Math.sin(latStar);
  var sinlat2 = sinlat * sinlat;
  var sinlat4 = sinlat2 * sinlat2;
  var sinlat6 = sinlat2 * sinlat4;

  var A = e2 + e4 + e6 + e8;
  var B = -(7.0 * e4 + 17.0 * e6 + 30.0 * e8) / 6.0;
  var C = (224.0 * e6 + 889.0 * e8) / 120.0;
  var D = -(4279.0 * e8) / 1260.0;
   
  lon = lon0 + dlon;
  lat = latStar + Math.sin(latStar) * Math.cos(latStar) *
                ( A + B * sinlat2 + C * sinlat4 + D * sinlat6);
                
  
  
   var lon0 = ((15.0 + (48.0 / 60.0) + (22.624306 / 3600.0))
                * Math.PI) / 180.0;  
  lon = lon * 180.0 / Math.PI;
  lat = lat * 180.0 / Math.PI;
  function dd2mmss(lon)
  {
    var londd = Math.floor(lon);
    var lonmm = Math.floor((lon - londd)*60);                
    var lonss = ((lon - londd)*60 - lonmm)*60; 
    return (londd + " " + lonmm + "'" + lonss.toFixed(1) + "''")
  }

  return (lon.toFixed(4) + "=" + dd2mmss(lon) + ",<br>" + lat.toFixed(4) + "=" + dd2mmss(lat))
}



