var saveText = '';
function computeDeg() {
  var lat  = trim(document.forms['form'].elements['latitude'].value);
  var lon = trim(document.forms['form'].elements['longitude'].value);

  if (lat=='') {
    document.forms['form'].elements['latd'].value = '';
    document.forms['form'].elements['latm'].value = '';
    document.forms['form'].elements['lats'].value = '';
  } else {
    var array = decToDeg(lat);
    document.forms['form'].elements['latd'].value = array[0];
    document.forms['form'].elements['latm'].value = array[1];
    document.forms['form'].elements['lats'].value = array[2];
  }

  if (lon=='') {
    document.forms['form'].elements['longd'].value = '';
    document.forms['form'].elements['longm'].value = '';
    document.forms['form'].elements['longs'].value = '';
  } else {
    var array = decToDeg(lon);
    document.forms['form'].elements['longd'].value = array[0];
    document.forms['form'].elements['longm'].value = array[1];
    document.forms['form'].elements['longs'].value = array[2];
  }

}

function computeDec() {
  var maps = document.getElementById("maps");

  var latd  = trim(document.forms['form'].elements['latd'].value);
  var latm  = trim(document.forms['form'].elements['latm'].value);
  var lats  = trim(document.forms['form'].elements['lats'].value);

  var longd  = trim(document.forms['form'].elements['longd'].value);
  var longm  = trim(document.forms['form'].elements['longm'].value);
  var longs  = trim(document.forms['form'].elements['longs'].value);

  //if (latd=='' || longd=='') return;
  if (latm=='') latm = 0.;
  if (lats=='') lats = 0.;
  if (longm=='') longm = 0.;
  if (longs=='') longs = 0.;

  var lat = degToDec('latitude');
  var lon = degToDec('longitude');

  document.forms['form'].elements['latitude'].value  = lat;
  document.forms['form'].elements['longitude'].value = lon;
}

/**
* Si les décimales sont OK, montre les liens, sinon les cache
*/
function showLinks() {
  var lat  = trim(document.forms['form'].elements['latitude'].value);
  var lon = trim(document.forms['form'].elements['longitude'].value);

  if (lat=='' || lon=='' || lat=='-' || lon=='-') {
    document.getElementById("maps").style.display = 'none';
    return;
  }
  document.getElementById("maps").style.display = 'block';

  var ind = 0;
  if (lat=='-' || lat<0) ind = 1;
  document.forms['form'].elements['rlatdec'][ind].checked = true;
  document.forms['form'].elements['rlatdeg'][ind].checked = true;

  var ind = 0;
  if (lon=='-' || lon<0) ind = 1;
  document.forms['form'].elements['rlongdec'][ind].checked = true;
  document.forms['form'].elements['rlongdeg'][ind].checked = true;

  document.getElementById("maps-lat").firstChild.nodeValue = parseInt(lat*10000.)/10000.;
  document.getElementById("maps-long").firstChild.nodeValue = parseInt(lon*10000.)/10000.;

  document.getElementById("maps-mapquest").href = 'http://www.mapquest.com/maps/map.adp?latlongtype=decimal&latitude='+lat+'&longitude='+lon;

  document.getElementById("maps-multimap").href = 'http://www.multimap.com/map/browse.cgi?lat='+lat+'&lon='+lon+'&scale=25000&icon=x';

  document.getElementById("maps-google").href = 'http://maps.google.com/maps?q='+lat+','+lon+'&spn=0.05636,0.011996&t=k';
}

function decToDeg(value) {
  var array = new Array();
  if (value=='-') {
    array[0] = '-';
    array[1] = '';
    array[2] = '';
    return array;
  }

  var neg = false;
  if (value<0) {
    value = Math.abs(value);
    neg = true;
  }

  var newv;

  array[0] = parseInt(value);  
  newv = (value-array[0])*60.;

  array[1] = parseInt(newv);
  newv = (newv-array[1])*60.;

  array[2] = parseInt(newv*100.)/100.;

  if (neg) array[0] = -array[0];

  return array;
}

function degToDec(field) {  

  var neg = 1.;
  if (field=='latitude') {   
    deg = document.forms['form'].elements['latd'].value;
    if (deg=='') return '';
    else if (deg=='-') return '-';
    else if (deg==0 && !document.forms['form'].elements['rlatdeg'][0].checked) neg = -1.;
    else if (deg<0.) neg = -1.;
    deg = Math.abs(deg);
    min = document.forms['form'].elements['latm'].value;
    sec = document.forms['form'].elements['lats'].value;
  } else {
    deg = document.forms['form'].elements['longd'].value;
    if (deg=='') return '';
    else if (deg=='-') return '-';
    else if (deg==0 && !document.forms['form'].elements['rlongdeg'][0].checked) neg = -1.;
    else if (deg<0.) neg = -1.;
    deg = Math.abs(deg);
    min = document.forms['form'].elements['longm'].value;
    sec = document.forms['form'].elements['longs'].value;
  }

  return deg*neg + min/60. + sec/3600.;
}

/**
* N,E: positif
* S,W: négatif
*/
function checkRadio(radio) {

  if (radio.name=='rlatdec') {

    var lat = Math.abs(document.forms['form'].elements['latitude'].value);
    if (radio.value=='N') {
      document.forms['form'].elements['rlatdeg'][0].checked = true;
      if (lat!='') {
        document.forms['form'].elements['latitude'].value = lat;
        document.forms['form'].elements['latd'].value = Math.abs(document.forms['form'].elements['latd'].value);
      }
    } else {
      document.forms['form'].elements['rlatdeg'][1].checked = true;
      if (lat!='') {
        document.forms['form'].elements['latitude'].value = -lat;
        document.forms['form'].elements['latd'].value = -Math.abs(document.forms['form'].elements['latd'].value);
      }
    }

  }

  if (radio.name=='rlongdec') {

    var lon = Math.abs(document.forms['form'].elements['longitude'].value);
    if (radio.value=='E') {
      document.forms['form'].elements['rlongdeg'][0].checked = true;
      if (lon!='') {
        document.forms['form'].elements['longitude'].value = lon;
        document.forms['form'].elements['longd'].value = Math.abs(document.forms['form'].elements['longd'].value);
      }
    } else {
      document.forms['form'].elements['rlongdeg'][1].checked = true;
      if (lon!='') {
        document.forms['form'].elements['longitude'].value = -lon;
        document.forms['form'].elements['longd'].value = -Math.abs(document.forms['form'].elements['longd'].value);
      }
    }

  }

  // ATTENTION: 0 2 3 N et 0 2 3 S sont différents !!!
  if (radio.name=='rlatdeg') {

    var lat = document.forms['form'].elements['latd'].value;
    if (radio.value=='N') {
      document.forms['form'].elements['rlatdec'][0].checked = true;
      if (lat!='') {
        document.forms['form'].elements['latd'].value = Math.abs(lat);
        document.forms['form'].elements['latitude'].value = Math.abs(document.forms['form'].elements['latitude'].value);
      }
    } else {
      document.forms['form'].elements['rlatdec'][1].checked = true;
      if (lat!='') {
        document.forms['form'].elements['latd'].value = -Math.abs(lat);
        document.forms['form'].elements['latitude'].value = -Math.abs(document.forms['form'].elements['latitude'].value);
      }
    }

  }

  if (radio.name=='rlongdeg') {

    var lon = document.forms['form'].elements['longd'].value;
    if (radio.value=='E') {
      document.forms['form'].elements['rlongdec'][0].checked = true;
      if (lon!='') {
        document.forms['form'].elements['longd'].value = Math.abs(lon);
        document.forms['form'].elements['longitude'].value = Math.abs(document.forms['form'].elements['longitude'].value);
      }
    } else {
      document.forms['form'].elements['rlongdec'][1].checked = true;
      if (lon!='') {
        document.forms['form'].elements['longd'].value = -Math.abs(lon);
        document.forms['form'].elements['longitude'].value = -Math.abs(document.forms['form'].elements['longitude'].value);
      }
    }

  }

  showLinks();
}

function checkDec(text, type) {
  if (!isDecimal(text.value)) text.value = saveText;
  else {
    if (type=='dec') computeDeg();
    else computeDec();
    showLinks();
  }
}

function checkDecPos(text, type) {
  if (!isDecimalPositive(text.value)) text.value = saveText;
  else {
    if (type=='dec') computeDeg();
    else computeDec();
    showLinks();
  }
}

function trim(string) {
  return string.replace(/(^\s*)|(\s*$)/g,'');
} 

function isDecimal(str) {
  return /^-?\d*\.?\d*$/.test(str);
}

function isDecimalPositive(str) {
  return /^\d*\.?\d*$/.test(str);
}

function save(text) {
  saveText = text.value;
}
