//-- javascript functions LL2UTM and UTM2LL  abj3  May 1, 2009
//
//  available funtion calls:
//-- setNAD27()  -  establish global variables for North American Datum 1927
//-- setNAD83()  -  establish global variables for North American Datum 1983
//-- deg2rad( decimaldegrees )  -  returns angle in radians
//-- rad2deg( radians )  -  reurns angle in decimal degrees
//-- Longitude2zone( decimaldegrees ) - return UTM Zone associated with longitude
//-- zone2Longitude( zone )  -  return central meridian of UTM zone
//-- UTM2LL( utm, zone ) - return string decimal lattitude space longitude
//-- LL2UTM( ll, zone )  -  return string UTME space UTMN space Zone
//-- nDecString( float, d )  -  return string for float number having d decimal places
//-- dd2dms( dd )  -  return degrees, minutes, seconds string from decimal degrees
//-- dms2dd( dms )  - return decimal degrees string from degrees, minutes, seconds
//-- dd( string )  -  return decimal degrees string from string formated as coordinates:
//--                  dd, dms, ll, utm
//
//-- Global Variables
// Default Ellipsoid model constants  for NAD83/WGS84 in meters
    var LLUTMequatorialRadius = 6378137.0;
    var LLUTMpolarRadius = 6356752.3142;
    var LLUTMradiusFactor = (LLUTMequatorialRadius - LLUTMpolarRadius) / (LLUTMequatorialRadius + LLUTMpolarRadius);

//--- CONSTANTS
    var LLUTMrf2 = LLUTMradiusFactor * LLUTMradiusFactor;
    var LLUTMrf3 = LLUTMrf2 * LLUTMradiusFactor;
    var LLUTMrf4 = LLUTMrf2 * LLUTMrf2;
    var LLUTMrf5 = LLUTMrf3 * LLUTMrf2;

    var aa_LLUTM = LLUTMequatorialRadius*LLUTMequatorialRadius;
    var bb_LLUTM = LLUTMpolarRadius*LLUTMpolarRadius;
    var b2a_LLUTM = bb_LLUTM/LLUTMequatorialRadius;
    var top_LLUTM = (aa_LLUTM)-(bb_LLUTM);
    var e2_LLUTM = top_LLUTM/(aa_LLUTM);
    var e2p_LLUTM = top_LLUTM/(bb_LLUTM);

    var rad_LLUTM=180.0/3.14159265358979323846;
    var e4_LLUTM=e2_LLUTM*e2_LLUTM;
    var e6_LLUTM=e2_LLUTM*e4_LLUTM;
    var e8_LLUTM=e4_LLUTM*e4_LLUTM;
    var e10_LLUTM=e4_LLUTM*e6_LLUTM;
    var t2_LLUTM=0.75*e2_LLUTM;

    var co1_LLUTM=1.0+t2_LLUTM+(45.0/64.0)*e4_LLUTM+(175.0/256.0)*e6_LLUTM+(11025.0/16384.0)*e8_LLUTM+(43659.0/65536.0)*e10_LLUTM;
    var co2_LLUTM=t2_LLUTM+(15.0/16.0)*e4_LLUTM+(525.0/512.0)*e6_LLUTM+(2205.0/2048.0)*e8_LLUTM+(72765.0/65536.0)*e10_LLUTM;
    var co3_LLUTM=(15.0/64.0)*e4_LLUTM+(105.0/256.0)*e6_LLUTM+(2205.0/4096.0)*e8_LLUTM+(10395.0/16384.0)*e10_LLUTM;
    var co4_LLUTM=(35.0/512.0)*e6_LLUTM+(315.0/2048.0)*e8_LLUTM+(31185.0/131072.0)*e10_LLUTM;
    var co5_LLUTM=(315.0/16384.0)*e8_LLUTM+(3465.0/65536.0)*e10_LLUTM;
    var co6_LLUTM=(693.0/131072.0)*e10_LLUTM;

function setNAD27() {
// Ellipsoid model constants  for NAD27/Clarke 1986 in meters
   if( LLUTMequatorialRadius != 6378206.4 ) {
       LLUTMequatorialRadius = 6378206.4;
       LLUTMpolarRadius = 6356583.8;
       LLUTMradiusFactor = (LLUTMequatorialRadius - LLUTMpolarRadius) / (LLUTMequatorialRadius + LLUTMpolarRadius);

//--- CONSTANTS
      LLUTMrf2 = LLUTMradiusFactor * LLUTMradiusFactor;
      LLUTMrf3 = LLUTMrf2 * LLUTMradiusFactor;
      LLUTMrf4 = LLUTMrf2 * LLUTMrf2;
      LLUTMrf5 = LLUTMrf3 * LLUTMrf2;

      aa_LLUTM = LLUTMequatorialRadius*LLUTMequatorialRadius;
      bb_LLUTM = LLUTMpolarRadius*LLUTMpolarRadius;
      b2a_LLUTM = bb_LLUTM/LLUTMequatorialRadius;
      top_LLUTM = (aa_LLUTM)-(bb_LLUTM);
      e2_LLUTM = top_LLUTM/(aa_LLUTM);
      e2p_LLUTM = top_LLUTM/(bb_LLUTM);

      rad_LLUTM=180.0/3.14159265358979323846;
      e4_LLUTM=e2_LLUTM*e2_LLUTM;
      e6_LLUTM=e2_LLUTM*e4_LLUTM;
      e8_LLUTM=e4_LLUTM*e4_LLUTM;
      e10_LLUTM=e4_LLUTM*e6_LLUTM;
      t2_LLUTM=0.75*e2_LLUTM;

      co1_LLUTM=1.0+t2_LLUTM+(45.0/64.0)*e4_LLUTM+(175.0/256.0)*e6_LLUTM+(11025.0/16384.0)*e8_LLUTM+(43659.0/65536.0)*e10_LLUTM;
      co2_LLUTM=t2_LLUTM+(15.0/16.0)*e4_LLUTM+(525.0/512.0)*e6_LLUTM+(2205.0/2048.0)*e8_LLUTM+(72765.0/65536.0)*e10_LLUTM;
      co3_LLUTM=(15.0/64.0)*e4_LLUTM+(105.0/256.0)*e6_LLUTM+(2205.0/4096.0)*e8_LLUTM+(10395.0/16384.0)*e10_LLUTM;
      co4_LLUTM=(35.0/512.0)*e6_LLUTM+(315.0/2048.0)*e8_LLUTM+(31185.0/131072.0)*e10_LLUTM;
      co5_LLUTM=(315.0/16384.0)*e8_LLUTM+(3465.0/65536.0)*e10_LLUTM;
      co6_LLUTM=(693.0/131072.0)*e10_LLUTM;
   }
}

function setNAD83() {
// Ellipsoid model constants  for NAD83/WGS84 in meters
   if( LLUTMequatorialRadius != 6378137.0 ) {
       LLUTMequatorialRadius = 6378137.0;
       LLUTMpolarRadius = 6356752.3142;
       LLUTMradiusFactor = (LLUTMequatorialRadius - LLUTMpolarRadius) / (LLUTMequatorialRadius + LLUTMpolarRadius);

//--- CONSTANTS
      LLUTMrf2 = LLUTMradiusFactor * LLUTMradiusFactor;
      LLUTMrf3 = LLUTMrf2 * LLUTMradiusFactor;
      LLUTMrf4 = LLUTMrf2 * LLUTMrf2;
      LLUTMrf5 = LLUTMrf3 * LLUTMrf2;

      aa_LLUTM = LLUTMequatorialRadius*LLUTMequatorialRadius;
      bb_LLUTM = LLUTMpolarRadius*LLUTMpolarRadius;
      b2a_LLUTM = bb_LLUTM/LLUTMequatorialRadius;
      top_LLUTM = (aa_LLUTM)-(bb_LLUTM);
      e2_LLUTM = top_LLUTM/(aa_LLUTM);
      e2p_LLUTM = top_LLUTM/(bb_LLUTM);

      rad_LLUTM=180.0/3.14159265358979323846;
      e4_LLUTM=e2_LLUTM*e2_LLUTM;
      e6_LLUTM=e2_LLUTM*e4_LLUTM;
      e8_LLUTM=e4_LLUTM*e4_LLUTM;
      e10_LLUTM=e4_LLUTM*e6_LLUTM;
      t2_LLUTM=0.75*e2_LLUTM;

      co1_LLUTM=1.0+t2_LLUTM+(45.0/64.0)*e4_LLUTM+(175.0/256.0)*e6_LLUTM+(11025.0/16384.0)*e8_LLUTM+(43659.0/65536.0)*e10_LLUTM;
      co2_LLUTM=t2_LLUTM+(15.0/16.0)*e4_LLUTM+(525.0/512.0)*e6_LLUTM+(2205.0/2048.0)*e8_LLUTM+(72765.0/65536.0)*e10_LLUTM;
      co3_LLUTM=(15.0/64.0)*e4_LLUTM+(105.0/256.0)*e6_LLUTM+(2205.0/4096.0)*e8_LLUTM+(10395.0/16384.0)*e10_LLUTM;
      co4_LLUTM=(35.0/512.0)*e6_LLUTM+(315.0/2048.0)*e8_LLUTM+(31185.0/131072.0)*e10_LLUTM;
      co5_LLUTM=(315.0/16384.0)*e8_LLUTM+(3465.0/65536.0)*e10_LLUTM;
      co6_LLUTM=(693.0/131072.0)*e10_LLUTM;
   }
}

function deg2rad( degrees ) { return( ( degrees && (degrees=parseFloat(degrees)) )? ( degrees/180.0 ) * 3.14159265358979323846 : 0); } //-- return radians

function rad2deg( radians ) { return( ( radians && (radians=parseFloat(radians)) )? ( radians/3.14159265358979323846 ) * 180.0 : 0); } //-- return degrees

function Longitude2zone( longitude ) {  return( ( longitude && (longitude=parseFloat(longitude)) )? (parseInt( 180.0 + longitude, 10 ) / 6.0 ) + 1 : 0); }

function zone2Longitude( zone ) {  return( ( zone && (zone=parseInt(zone,10)) ) ? 6*zone - 183: 0 ); }


function UTM2LL( utmString, zone ) {
//--- Convert UTM to Decimal Degrees Latitude Longitude ( Northern Hemisphere )
//--- based on Ned Oakie's fortran program, VPI&SU 1978

      if( !utmString ) { return; }
      if( !zone ) { zone = ''; }
      var utmArray = utmString.split(' ');
      var utmx = parseFloat(utmArray.shift());
      var utmy = parseFloat(utmArray.shift());
      var utmz = utmArray.shift();

//--- UTM Zone in the coordinate string has presidence over parameter zone
      if( utmz && utmz !== '' ) { zone = utmz; }

      zone = parseInt(zone,10);

//--- Default UTM Zone is 17
      if( !zone || zone === '' ) { zone = 17; }

      var arc,dphi,phi,slon;

      var cmr;
//   CHANGE UTM REFERENCE ZONE TO CENTRAL MERIDIAN IN RADIANS 
      if( zone > 0 && zone < 61 ) { cmr = ( 6*zone - 183 )/rad_LLUTM; } else { cmr=0; }

      var x = (utmx-500000.0)/0.9996;
      var y = (utmy)/0.9996;

//         COMPUTE THE FOOTPOINT LATITUDE - PHI1
//         WHOSE  Y-COORDINATE EQUALS THE ARC LENGTH
 
      var iter=0;
      arc=0.0;
      var phi1=0.0;

      do {
         dphi=(y-arc)/(b2a_LLUTM*co1_LLUTM);
         phi1=phi1+dphi;
         iter+=1;
         phi=phi1;

         var sin2p=Math.sin(2.0*phi);
         var sin4p=Math.sin(4.0*phi);
         var sin6p=Math.sin(6.0*phi);
         var sin8p=Math.sin(8.0*phi);
         var sin10p=Math.sin(10.0*phi);

//        ARC IS THE LENGTH OF THE MERIDIAN FROM THE EQUATOR TO
//        LATITUDE, PHI

         arc=b2a_LLUTM*(co1_LLUTM*phi-0.5*co2_LLUTM*sin2p+0.25*co3_LLUTM*sin4p-co4_LLUTM*sin6p/6.0+0.125*co5_LLUTM*sin8p-0.1*co6_LLUTM*sin10p);

      } while( Math.abs(dphi)>0.000000000001 && iter<9 );

      slon = 0.0;
      if (iter>8) {
         alert( '(UTM2LL) -- APPROX TO FOOTPOINT LATITUDE WILL NOT CONVERGE. dphi=' + dphi );
         phi=0.0;
      } else {
         var sinp=Math.sin(phi1);
         var cosp=Math.cos(phi1);
         var w1=Math.sqrt(1.0-e2_LLUTM*sinp*sinp);
         var em1=b2a_LLUTM/(w1*w1*w1);
         var en1=LLUTMequatorialRadius/w1;
         var t1=Math.tan(phi1);
         var eta2=e2p_LLUTM*cosp*cosp;
         var en2=en1*en1;
         var en4=en2*en2;
         var en6=en4*en2;
         var t2=t1*t1;
         var t4=t2*t2;
         var t6=t4*t2;
         var eta4=eta2*eta2;
         var eta6=eta4*eta2;
         var eta8=eta4*eta4;
         var t2e2=t2*eta2;

//          CO21 TO CO28 ARE THE COEFFICIENTS USED TO TRANSFORM
//          X AND Y TO LATITUDE AND LONGITUDE

         var fac=t1/(2.0*em1*en1);
         var co22=fac;
         var co24=fac/(12.0*en2)*(5.0+3.0*t2+eta2-4.0*eta4-9.0*t2e2);
         var co26=fac/(360.0*en4)*(61.0+90.0*t2+46.0*eta2+45.0*t4-252.0*t2e2-3.0*eta4+100.0*eta6-66.0*t2*eta4-90.0*t4*eta2+88.0*eta8+225.0*t4*eta4+84.0*t2*eta6-192.0*t2*eta8);
         var co28=fac/(20160.0*en6)*(1385.0+3633.0*t2+4095.0*t4+1574.0*t6);

         fac=1.0/(en1*cosp);
         var co21=fac;
         var co23=fac/(6.0*en2)*(1.0+2.0*t2+eta2);
         var co25=fac/(120.0*en4)*(5.0+6.0*eta2+28.0*t2-3.0*eta4+8.0*t2e2+24.0*t4-4.0*eta6+4.0*t2*eta4+24.0*t2*eta6);
         var co27=fac/(5040.0*en6)*(61.0+662.0*t2+1320.0*t4+720.0*t6);
 
         var x2=x*x;
         var x4=x2*x2;
         var x6=x4*x2;
         var x8=x4*x4;
         dphi=-x2*co22+x4*co24-x6*co26+x8*co28;
         phi=dphi+phi1;
 
         var dl=x*co21-x*x2*co23+x*x4*co25-x*x6*co27;
         slon=dl+cmr;
      }

      return ( (phi*rad_LLUTM) + ' ' + (slon*rad_LLUTM) );
}

//-----------------------------------------------------------------------------------------------------

function LL2UTM( llString, zone ) {
   if( !llString ) { return; }
//--- Convert Decimal Degrees Latitude Longitude to UTM
//--- based on Ned Oakie's fortran program, VPI&SU 1978
   var utmx, utmy;
   var llArray = llString.split(' ');
   var latitude = parseFloat( llArray.shift() );
   var longitude = parseFloat( llArray.shift() );
   if( !zone || zone === '' ) {
//--- DETERMIN THE UTM ZONE. FUDGE SLIGHTLY TO THE EAST SO THAT LONGITUDE
//--- OF A ZONE BOUNDARY IS ASSIGNED TO THE EASTERN ZONE REFLECTING USGS QUAD
      zone=30+parseInt((longitude-0.000000001)*0.16666666666666,10);
   }

   var slon = 3600.0* longitude;
   var dl = ((30.5-zone)*21600+slon) * 4.8481368110957E-06;
//        POWERS OF DELTA LAMBDA OVER THE FACTORIAL
   var cd1=dl;
   var cd2=dl*cd1/2.0;
   var cd3=dl*cd2/3.0;
   var cd4=dl*cd3/4.0;
   var cd5=dl*cd4/5.0;
   var cd6=dl*cd5/6.0;
   var cd7=dl*cd6/7.0;
   var cd8=dl*cd7/8.0;

   var phi = 3600.0* latitude;
   phi = phi * 4.8481368110957E-06;
   if( phi > 1.3962634015956 ) {
//warn "(LL2UTM) -- LATTITUDE, latitude, GREATER THAN 80  DEGREES";
       utmx=0; utmy=0; zone=0;
   } else { 

//        ARC IS THE LENGTH OF THE MERIDIAN FROM THE EQUATOR TO
//        LATITUDE, PHI

//-- Ellipsoidal distance in meters from equator to latitude radians.
//-- Global Variables:
//      LLUTMequatorialRadius - Ellipsoid model major axis in meters.
//      LLUTMpolarRadius - Ellipsoid model minor axis in meters.
//      LLUTMradiusFactor - difference of radii over sum of radii

      var alpha = ( (LLUTMequatorialRadius + LLUTMpolarRadius) / 2.0) * ( 1.0 + ( LLUTMrf2 / 4.0) + ( LLUTMrf4 / 64.0 ) );
      var beta = ( -3.0 * LLUTMradiusFactor / 2.0 ) + ( 9.0 * LLUTMrf3 / 16.0 ) + ( -3.0 * LLUTMrf5 / 32.0 );
      var gamma = ( 15.0 * LLUTMrf2 / 16.0 ) + ( -15.0 * LLUTMrf4 / 32.0 );
      var delta = ( -35.0 * LLUTMrf3 / 48.0 ) + ( 105.0 * LLUTMrf5 / 256.0 );
      var epsilon = ( 315.0 * LLUTMrf4 / 512.0 );

      var arc = alpha * ( phi + ( beta * Math.sin( 2.0 * phi ) ) + ( gamma * Math.sin( 4.0 * phi ) ) + ( delta * Math.sin( 6.0 * phi ) ) + ( epsilon * Math.sin( 8.0 * phi ) )  );

       var sinp=Math.sin(phi);
       var cosp=Math.cos(phi);
//       var sinp2=sinp*sinp;
       var cosp2=cosp*cosp;
       var cosp3=cosp*cosp2;
       var cosp4=cosp2*cosp2;
       var cosp5=cosp2*cosp3;
       var cosp6=cosp3*cosp3;
       var cosp7=cosp4*cosp3;

       var ep2 = ( LLUTMequatorialRadius*LLUTMequatorialRadius -  LLUTMpolarRadius*LLUTMpolarRadius ) / (LLUTMpolarRadius*LLUTMpolarRadius);
       var eta2 = ep2 * cosp2;
       var en = Math.pow( LLUTMequatorialRadius, 2.0 ) / ( LLUTMpolarRadius * Math.sqrt( 1 + eta2 ) );

       var t=Math.tan(phi);
       var t2=t*t;
       var t4=t2*t2;
       var t6=t4*t2;
       var eta4=eta2*eta2;
       var e2t2=eta2*t2;

       var c1=en*cosp;
       var c2=en*sinp*cosp;
       var c3=en*cosp3*(1.0-t2+eta2);
       var c4=c2*cosp2*(5.0-t2+9.0*eta2+4.0*eta4);
       var c5=en*cosp5*(5.0-18.0*t2+t4+14.0*eta2-58.0*e2t2);
       var c6=c2*cosp4*(61.0-58.0*t2+t4+270.0*eta2-330.0*e2t2);
       var c7=en*cosp7*(61.0-479.0*t2+179.0*t4-t6);
       var c8=c2*cosp6*(1385.0-3111.0*t2+543.0*t4-t6);
     
       utmx = parseInt((cd1*c1+cd3*c3+cd5*c5+cd7*c7) * 0.9996 +0.5,10) + 500000;
       utmy = parseInt((arc+cd2*c2+cd4*c4+cd6*c6+cd8*c8) * 0.9996 +0.5,10);
     }
   
   return( utmx + ' ' + utmy + ' ' + zone );
}

function nDecString(floatNumber,nDec) {
//-- Function Returns a floating point number as a string with a fixed number of decimal places

   if( floatNumber === null ) { floatNumber = 0.0; }
   if( nDec === null ) { nDec = 1; } else { nDec = parseInt(nDec,10); }
   if( nDec < 0  ) {nDec = 0; }
   if( nDec > 10 ) {nDec = 10; }

//-- round nDec+1 decimal point
   var f = parseFloat(floatNumber) + ( 0.5/Math.pow(10,nDec));
   var fString = '';
   fString += f;
   var p = fString.indexOf('.');
   if( p<0 ) {
	fString += '.' + '0000000000'.substr(0,nDec);
   } else {
        fString = (fString+'0000000000').substr(0,(p+nDec));
   }
   return fString;
}

function dd2dms( decimalDegrees,delimiter, prec ) {

   function d2dms( dv ){
      if( typeof prec == 'undefined' ) { prec=2; }
      var dd = parseFloat( dv );
      var sign = '';
      if( dd < 0.0 ) { sign = '-'; dd = -dd; }
      var d = parseInt( dd, 10 );
      dd = ( dd - d ) * 60.0;
      var m = parseInt( dd, 10 );
      dd = ( dd - m ) * 60.0;
      var s = dd;
      if( nDecString(s,prec) >= 60.0 ) {
         m ++;
         s -= 60.0;
      }
      if( m >= 60 ) {
         d ++;
         m -= 60;
      }
      if( m < 10 ) { m = '0' + ( '' + m ); }
      if( nDecString(s,prec) < 10 ) { s = '0' + nDecString(s,prec); } else { s = nDecString(s,prec); }
      if( s.length == 2 ) { s += '.0'; }
      return( sign + '' + d + delimiter + m + delimiter + s );
   }

   if( !decimalDegrees ) { return; }
   if( !delimiter ) { delimiter = ','; }
   var result = '';
   var ddArray = decimalDegrees.split(' ');

//-- first coordinate
   var ddv = ddArray.shift();
   if( ddv ) { result += d2dms( ddv ); }

//-- second coordinate
   ddv = ddArray.shift();
   if( ddv ) { result += ' ' + d2dms( ddv ); }

//-- remainder
   if( ddArray[0] ) { result += ' ' + ddArray.join(' '); }

   return( result );
}

function dms2dd( degreesMinutesSeconds ) {

   function privateDMS2DD( dmsString ) {
      var c, d, m, s;
      var i = 0;
      var n = 0;
      var delimiter = '';
      var numbers = '0123456789.';
      var sign = '';
      c = dmsString.charAt(i);
      while ( c ) {
         if( c == '-' ) {
            sign = '-';
         } else if( numbers.indexOf(c,0)<0 ) {
            if( n === 0 ) {
               delimiter = c; n = 1;
            } else {
               if( c === delimiter ) { n++; } else { delimiter = c;  n = 1; }
            }
         }
         i ++;
         c = dmsString.charAt(i);
      }

      if( n == 2 ) {

         var partsArray = dmsString.split(delimiter);
         d = parseFloat( partsArray[0] );
         if( sign == '-' ) { d = -d; }
         m = parseFloat( partsArray[1] );
         s = parseFloat( partsArray[2] );

      } else if( delimiter === '' && dmsString.length == 6 ) {

         var dms = parseFloat(dmsString);
         s = dms - ( parseInt( dms / 100.0, 10 ) * 100.0 );
         var dm = parseInt( dms / 100.0, 10 );
         d = parseInt( dm / 100.0, 10 );
         m = dm - ( d * 100 );
//-- assumption of West Longitude
         if( d > 60 ) { sign = '-'; }

      } else {

         d = 0.0;
         m = 0.0;
         s = 0.0;

      }
      return( sign + ( d + m/60.0 + s/3600.0 ) );
   }

//   ---------------------------------------------------
//   ---------------------------------------------------

   if( !degreesMinutesSeconds ) { return; }
   var dmsArray = degreesMinutesSeconds.split(' ');
   var result = '';

   if( !dmsArray[0] ) { return result; }

//-- first coordinate

   var dmsString = '' + dmsArray.shift();
   result = privateDMS2DD( dmsString );

//-- second coordinate

   if( dmsArray[0] ) {
      dmsString = '' + dmsArray.shift();
      result += ' ' + privateDMS2DD( dmsString );
   }

//-- remainder
   if( dmsArray[0] ) {
      result += ' ' + dmsArray.join(' ');
   }

   return( result );
}


function dd(coordinateString, zone) {
//--- Convert value (DD, DMS, UTM) to Decimal Degrees Latitude Longitude
//--- optional zone used when coordinateString is UTM eee nnnn without zz
      if( !zone ) { zone = ''; }

//--- modify vale with a leading "A" and trailing "Z" for proper matching of optional decimal components
	var value = "A" + coordinateString + "Z";

	var lat, sign, lon, latdd, latm, lats, londd, lonm, lons, reg, regArray, latmd, lonmd, latsd, lonsd, ddArray;
	var latd = 0;
	var lond = 0;
	var result = "";

	if( result === "" ) {
//--- 6 digit latitude, space,  6 digit longitude  ddmmss ddmmss
		reg = /[A](\d{6})\s([\-]?)(\d{6})[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			lat = parseInt(regArray[1],10);
			sign = regArray[2];
			lon = parseInt(regArray[3],10);
			latdd = parseInt(lat/10000,10);
			latm = parseInt( (lat-latdd*10000) / 100 ,10 );
			lats = lat - latdd*10000 - latm*100;
			londd = parseInt(lon/10000,10);
			lonm = parseInt( (lon-londd*10000) / 100 ,10 );
			lons = lon - londd*10000 - lonm*100;
			if( latm<60 && lats<60 && lonm<60 && lons<60 ){
				latd = latdd + latm/60.0 + lats/3600.0;
				lond = (londd + lonm/60.0 + lons/3600.0);
				if( sign ) { lond = -lond; }
				result = "LL6";
			}
		}
	}

	if( result === "" ) {
//--- Decimal degrees  dd.dddd dd.dddd
		reg = /[A](\d{2})\.(\d+)\s([\-]?)(\d{2})\.(\d+)[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			lat = regArray[1];
			latdd = regArray[2];
			sign = regArray[3];
			lon = regArray[4];
			londd= regArray[5];

			latd = parseFloat(lat+'.'+latdd);
			lond = parseFloat(lon+'.'+londd);
			if( sign ) { lond = -lond; }
			result='DD';
		}
	}

	if( result === "" ) {
//--- D.M latitude, space,  D.M longitude  dd,mm.mmmm dd,mm.mmmm
		reg = /[A](\d{2})\W(\d{1,2})[\.]?(\d*)\s([\-]?)(\d{2})\W(\d{1,2})[\.]?(\d*)[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			latdd = parseInt(regArray[1],10);
			latm = parseFloat(regArray[2]);
			latmd = regArray[3];
			sign = regArray[4];
			londd = parseInt(regArray[5],10);
			lonm = parseFloat(regArray[6]);
			lonmd = regArray[7];

			if( latm<60 && lonm<60 ){
				if( latmd ) { latm += parseFloat("." + latmd); }
				if( lonmd ) { lonm += parseFloat("." + lonmd); }
				latd = latdd + latm/60.0;
				lond = londd + lonm/60.0;
				if( sign ) { lond = -lond; }
				result='DM';
			}
		}
	}

	if( result === "" ) {
//--- D.M.S latitude, space,  D.M.S longitude  dd,mm,ss.ss dd,mm,ss.ss
		reg = /[A](\d{2})\W(\d{1,2})\W(\d{1,2})[\.]?(\d*)\s([\-]?)(\d{2})\W(\d{1,2})\W(\d{1,2})[\.]?(\d*)[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			latdd = parseInt(regArray[1],10);
			latm = parseInt(regArray[2],10);
			lats = parseFloat(regArray[3]);
			latsd = regArray[4];
			sign = regArray[5];
			londd = parseInt(regArray[6],10);
			lonm = parseInt(regArray[7],10);
			lons = parseFloat(regArray[8]);
			lonsd = regArray[9];

			if( latm<60 && lats<60 && lonm<60 && lons<60 ){
				if( latsd ) { lats += parseFloat("."+latsd); }
				if( lonsd ) { lons += parseFloat("."+lonsd); }
				latd = latdd + latm/60.0 + lats/3600.0;
				lond = londd + lonm/60.0 + lons/3600.0;
				if( sign ) { lond = -lond; }
				result='DMS';
			}
		}
	}

	if( result === "" ) {
//--- UTM with Zone - 7 digit utme optional decimal places  eeeeeee.ee nnnnnnn.nn zz
		reg = /[A](\d{7})[\.]?(\d*)\s(\d{7})[\.]?(\d*)\s(\d{2})[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			ddArray = UTM2LL(value.substr(1,value.length-2)).split(' ');
			latd = ddArray.shift();
			lond = ddArray.shift();
			result='UTMZ7';
		}
	}

	if( result === "" ) {
//--- UTM NOT Zone - 7 digit utme optional decimal places  eeeeeee.ee nnnnnnn.nn
		reg = /[A](\d{7})[\.]?(\d*)\s(\d{7})[\.]?(\d*)[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			ddArray = UTM2LL(value.substr(1,value.length-2),zone).split(' ');
			latd = ddArray.shift();
			lond = ddArray.shift();
			result='UTM7';
		}
	}

	if( result === "" ) {
//--- UTM with Zone - 6 digit utme optional decimal places  eeeeee.ee nnnnnnn.nn zz
		reg = /[A](\d{6})[\.]?(\d*)\s(\d{7})[\.]?(\d*)\s(\d{2})[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			ddArray = UTM2LL(value.substr(1,value.length-2)).split(' ');
			latd = ddArray.shift();
			lond = ddArray.shift();
			result='UTMZ6';
		}
	}

	if( result === "" ) {
//--- UTM not Zone - 6 digit utme optional decimal places  eeeeee.ee nnnnnnn.nn
		reg = /[A](\d{6})[\.]?(\d*)\s(\d{7})[\.]?(\d*)[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			ddArray = UTM2LL(value.substr(1,value.length-2),zone).split(' ');
			latd = ddArray.shift();
			lond = ddArray.shift();
			result='UTM6';
		}
	}

	if( result === "" ) {
//--- Integer degrees Lat and Decimal degrees lon  dd dd.dddd
		reg = /[A](\d{2})\s([\-]?)(\d{2})\.(\d+)[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			lat = regArray[1];
			sign = regArray[2];
			lon = regArray[3];
			londd= regArray[4];

			latd = parseFloat(lat);
			lond = parseFloat(lon+'.'+londd);
			if( sign ) { lond = -lond; }
			result='DD';
		}
	}

	if( result === "" ) {
//--- Decimal degrees Lat and Integer degrees lon  dd.dddd dd
		reg = /[A](\d{2})\.(\d+)\s([\-]?)(\d{2})[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			lat = regArray[1];
			latdd = regArray[2];
			sign = regArray[3];
			lon = regArray[4];

			latd = parseFloat(lat+'.'+latdd);
			lond = parseFloat(lon);
			if( sign ) { lond = -lond; }
			result='DD';
		}
	}

	if( result === "" ) {
//--- Integer degrees Lat and Integer degrees lon  dd dd
		reg = /[A](\d{2})\s([\-]?)(\d{2})[Z]/;
		regArray = reg.exec(value);
		if( regArray ) {
			lat = regArray[1];
			sign = regArray[2];
			lon = regArray[3];

			latd = parseFloat(lat);
			lond = parseFloat(lon);
			if( sign ) { lond = -lond; }
			result='DD';
		}
	}

//alert('DD "' + coordinateString + '" returns - "' + nDecString(latd,6) + " " + nDecString(lond,6) + " " + result + '"')
	return nDecString(latd,6) + " " + nDecString(lond,6);
}