var map;
var xml;
var points = new Array();
var is_hide = 0;
var is_focus = 0;

var icon_image = '/fon/img/green.png';
var icon_personalized_image = '/fon/img/green_personalized.png';
var icon_not_activate_image = '/fon/img/yellow.png';
var icon_not_activate_personalized_image = '/fon/img/yellow_personalized.png';

var icon = new GIcon();
icon.shadow = "/fon/img/shadow.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(9, 34);
icon.infoWindowAnchor = new GPoint(9, 2);
icon.infoShadowAnchor = new GPoint(18, 25);

var geocoder = new GClientGeocoder();

function load (lat, lon, zm) {
  if (GBrowserIsCompatible()) {
    var mapElem = document.getElementById('map');

    map = new GMap2(mapElem);
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(lat, lon), zm);

    getPoint();

    GEvent.addListener(map, 'click', function(overlay, point) {
      if (! overlay){
        map.panTo(point);
      }
    });

    GEvent.addListener(map, 'moveend', function () {
      getPoint();
    });

    if (mapElem.addEventListener) {
      mapElem.addEventListener('DOMMouseScroll', zoomByWheel, false);
    }
    mapElem.onmousewheel = zoomByWheel;
  }
}

function getPoint () {
  clearPoint();

  var zm = map.getZoom();
  var bounds = map.getBounds();
  var southWest = bounds.getSouthWest();
  var northEast = bounds.getNorthEast();

  var lat = map.getCenter().y;
  var lon = map.getCenter().x;
  var sWLat = southWest.lat();
  var sWLng = southWest.lng();
  var nELat = northEast.lat();
  var nELng = northEast.lng();

  document.getElementById('lat').innerHTML = lat;
  document.getElementById('lon').innerHTML = lon;

  var url = 'http://labs.ceek.jp/fon/xml.cgi?lat=' + lat + '&lon=' + lon + '&sWLat=' + sWLat + '&sWLng=' + sWLng + '&nELat=' + nELat + '&nELng=' + nELng + '&zm=' + zm;
//  document.getElementById('url').href = url;

  var url_fon = 'http://maps.fon.com/?lt='+ lat +'&ln='+ lon +'&zm='+ zm;
  document.getElementById('fonmaps').href = url_fon;

  var url_simple = 'http://labs.ceek.jp/fon/?lat=' + lat + '&lon=' + lon + '&zm=' + zm;
  document.getElementById('simplefonmaps').href = url_simple;

  var url_kml = url + '&type=kml';
  document.getElementById('kml').href = url_kml;

  if (zm < 10 || document.getElementById('getpoint').checked == false) {
    document.getElementById('status_getpoint').innerHTML = '--';
    document.getElementById('status_writepoint').innerHTML = '';

    return;
  }

  GDownloadUrl(url, function(data, responseCode){
    xml = GXml.parse(data);

    if (xml.documentElement) {
      var markers = xml.documentElement.getElementsByTagName('marker');

      document.getElementById('status_getpoint').innerHTML = markers.length;
      document.getElementById('status_writepoint').innerHTML = '<a href="#" onClick="writePoint()">ポイント描画</a>';

      if (document.getElementById('writepoint').checked == true) {
        writePoint();
      }
    } else {
      document.getElementById('status_getpoint').innerHTML = 0;
      document.getElementById('status_writepoint').innerHTML = '';

      alert('データの取得に失敗しました');
    }
  });
}

function writePoint () {
  clearPoint();

  var markers = xml.documentElement.getElementsByTagName('marker');

  if (markers.length == 200) {
    alert("発見した AP が 200 を超えました\nAP の探索制限により実態と異なる場合があります");
//    if (! confirm("発見した AP が 200 を超えました\nAP の探索制限により実態と異なる場合があります")) {
//      return;
//    }
  }

  var new_ap = 0;

  for (var i = 0; i < markers.length; i++) {
    if (markers[i]) {
      var id = markers[i].getAttribute('id');

      if (! points[id]) {
        var lat = parseFloat(markers[i].getAttribute('lat'));
        var lon = parseFloat(markers[i].getAttribute('lon'));

        var id = markers[i].getAttribute('id');
        var is_activate = markers[i].getAttribute('activate');

        var marker = createMarker(lat, lon, id, is_activate);

        map.addOverlay(marker);

        points[id] = 1;
        new_ap++;
      }
    }
  }

  document.getElementById('status_writepoint').innerHTML = 'New APs : ' + new_ap;
}

function moveNearestPoint () {
  var lat = map.getCenter().y;
  var lon = map.getCenter().x;

  var url = 'http://labs.ceek.jp/fon/xml.cgi?type=nearest&lat=' + lat + '&lon=' + lon;
//  document.getElementById('url').href = url;

  GDownloadUrl(url, function(data, responseCode){
    var xml = GXml.parse(data);

    var is_success = 0;

    if (xml.documentElement) {
      var markers = xml.documentElement.getElementsByTagName('marker');

      var i = 0;

      if (markers[i]) {
        var lat = parseFloat(markers[i].getAttribute('lat'));
        var lon = parseFloat(markers[i].getAttribute('lon'));

        var dist = parseInt(markers[i].getAttribute('dist'));

        var address = markers[i].childNodes.item(0).nodeValue; // for IE, Opera
        if (markers[i].childNodes.item(1)) {
          address = address + markers[i].childNodes.item(1).nodeValue; // for Firefox, Opera (Opera Bug...)
        }

        if (confirm('約 ' + dist + "m 離れた場所に FON AP が見つかりました\n" + address)) {
          map.setCenter(new GLatLng(lat, lon));
        }

        is_success = 1;
      }
    }

    if (is_success == 0) {
      alert('近隣 FON AP の探索に失敗しました');
    }
  });
}

function clearPoint () {
  if (document.getElementById('clearpoint').checked == false) {
    return;
  }

  map.clearOverlays();

  delete points;
  points = new Array();
}

function createMarker(lat, lon, id, is_activate) {
  var html_optional = '';

  if (is_activate == 1) {
    icon.image = icon_image;
  } else {
    icon.image = icon_not_activate_image;
    html_optional = '<div class="optional">電波が出ていないかも</div>';
  }

  var marker = new GMarker(new GLatLng(lat, lon), icon);

  var html_lat = '<div class="lat">緯度: ' + lat  + '</div>';
  var html_lon = '<div class="lon">経度: ' + lon  + '</div>';

  var html = '<div class="info">' + html_lat + html_lon + html_optional + '</div>';

  GEvent.addListener(marker, 'click', function () {
    marker.openInfoWindowHtml(html);
  });

  return marker;
}

function searchAddress () {
  var address = document.getElementById('address').value;
  var is_success = 0;

  if (address != '') {
    geocoder.getLatLng(address, function (point) {
      if (! point) {
        alert(address + ' not Found');
      } else {
        map.setCenter(point);
        is_success = 1;
      }
    });
  } else {
    alert('住所や施設名から検索できます');
  }

  if (is_success == 1) {
    getPoint();
  }
}

function clickGetPoint () {
  document.getElementById('status_getpoint').innerHTML = 0;
  document.getElementById('status_writepoint').innerHTML = 'New APs : 0';

  getPoint();
}

function clickWritePoint () {
  if (document.getElementById('writepoint').checked == true) {
    writePoint();
  }
}

function hideHead () {
  if (is_hide == 1) {
    document.getElementById('head').style.display = '';

    is_hide = 0;
  } else {
    document.getElementById('head').style.display = 'none';

    is_hide = 1;
  }
}

function zoomByWheel (event) {
  if (! event) {
    event = window.event;
  }

  var zoom = map.getZoom();
  var delta = 0;

  if (event.wheelDelta) {
      delta = -event.wheelDelta; // for IE
  } else if (event.detail) {
      delta = event.detail; // for Mozilla
  }

  if (delta) {
    delta = delta < 0 ? +1 : -1;
    zoom += delta;

    if (zoom >= 0) {
      map.setZoom(zoom);

      eventExit(event);
    }
  }
}

function keyAssignment (event) {
  if (! event) {
    event = window.event;
  }

  if (is_focus == 0) {
  	switch (event.keyCode) {
      case 70: // f
        document.getElementById('address').focus();
        eventExit(event);
        break;
      case 72: // h
        hideHead();
        eventExit(event);
        break;
      case 78: // n
        moveNearestPoint();
        eventExit(event);
        break;
      case 80: // p
        pEngineGetLocation();
        eventExit(event);
        break;
    }
  } else {
  	switch (event.keyCode) {
      case 13: // [Enter]
        searchAddress();
        eventExit(event);
        break;
    }
  }
}

function eventExit (event) {
  if (event.preventDefault) {
    // for Mozilla
    event.preventDefault();
    event.stopPropagation();
  } else {
    // for IE
    event.returnValue = false;
    event.cancelBubble = true;
  }
}

function focusNow (status) {
  is_focus = status;
}
