﻿//----------------------------------------------------------------------------------------------------------------------
// utf-8
// Google Maps API Application
// by s.noguchi 2010-2012
//----------------------------------------------------------------------------------------------------------------------
var version = "1.05";
var handle = 0;
var default_read_end = false;
var marker_read_end = false;
var polyline_read_end = false;
var geocoder = new GClientGeocoder();
var map = new Object();
var icon = new Array();
var zoom_busy     =  0;
var zoom_level    = new Array(13,14,15);		// 暫定
var marker_class  = new Array();
var map_center    = new GLatLng(35.6570,139.3315);	// 暫定
var min_zoom      =  9;					// 暫定
var max_zoom      = 19;					// 暫定
var map_contrast  =  0;
var map_background = "";
var myEvent;
var html_cache    = "";
var exp_dummy = "?" + (new Date()).getTime();
var file_default  = "default.xml" + exp_dummy;
var file_polyline = "polyline.xml" + exp_dummy;
var file_marker   = "marker.xml" + exp_dummy;
var file_area     = location.href + "hachioji.kml";
//----------------------------------------------------------------------------------------------------------------------
function IsFirefox() { if( navigator.userAgent.match( /Firefox[\/\s](\d\.\d+)/ ) ) {return true;} else {return false;} }

function IconCreate(image) {
  icon[image] = new GIcon();
  icon[image].image = image;
  icon[image].shadow = "shadow.png";
  icon[image].iconSize = new GSize(12, 20);
  icon[image].shadowSize = new GSize(22, 20);
  icon[image].iconAnchor = new GPoint(6, 20);
  icon[image].infoWindowAnchor = new GPoint(5, 1);
  return icon[image]
}

function DefaultSet() {
  GDownloadUrl( file_default, function (doc,status) {
    var xmlDoc = GXml.parse(doc);
    var Obj = xmlDoc.documentElement.getElementsByTagName("map");
    map_center = new GLatLng( parseFloat( Obj[0].getAttribute("lat") ), parseFloat( Obj[0].getAttribute("lng") ) );
    map_contrast = parseFloat( Obj[0].getAttribute("contrast") );
    min_zoom = parseFloat( Obj[0].getAttribute("minimumzoom") );
    max_zoom = parseFloat( Obj[0].getAttribute("maximumzoom") );
    map_background = Obj[0].getAttribute("image");
    default_read_end = true;
  } );
}

function MarkerDisplay(overlay) { for (var i = 0; i < overlay.length; i++) { map.addOverlay( overlay[i] ); } }

function MarkerClear(overlay) { for (var i = 0; i < overlay.length; i++) { map.removeOverlay( overlay[i] ); } }

function ZipCoder(zipcode) {
  map.closeInfoWindow();
  GDownloadUrl( "zipcoder.cgi?" + zipcode, function (doc,status) {
    document.forms["f1"].address.value = doc;
  } );
}

function AdsCoder(address) {
  map.closeInfoWindow();
  if (geocoder) {
    geocoder.getLatLng( "東京都八王子市" + address,gotoAddress );
  }
}

function gotoAddress(point) {
  if (!point) {
    map.openInfoWindow( map.getCenter(),document.createTextNode("見つかりません") );
  } else {
    map.setCenter(point, zoom_level[0]);
    var marker = new GMarker( point,{ draggable: false, 
                 title: point.lat() + " " + point.lng(),
                 icon: icon["blue.png"], bouncy: false } );
    map.addOverlay( marker );
  }
}

function Search(str) {
  map.closeInfoWindow();
  for (var j = 0; j < 3; j++) {
    var overlay = marker_class[j];
    for (var i = 0; i < overlay.length; i++) {
      if( overlay[i].ha.title == str ) {				//
          map.setZoom( zoom_level[j] );
          GEvent.trigger( overlay[i],"click" );
          return;
      } else {
          map.openInfoWindow( map.getCenter(),document.createTextNode("見つかりません") ); 
      }
    }
  }
}

function Seek(str, j, i) {
  var jj = (j != null) ? j : 0;
  var ii = (i != null) ? i + 1 : 0;
  map.closeInfoWindow();
  for (var j = jj ; j < 3; j++) {
    var overlay = marker_class[j];
    for (var i = ii ; i < overlay.length; i++) {
      if( overlay[i].ha.title.match( str ) ){				//
        map.setZoom( zoom_level[j] );
        GEvent.trigger( overlay[i],"click" );
        document.getElementById("next").innerHTML = "&nbsp;&nbsp;&nbsp;" +
          "<a href=\"javascript:void(0)\" onclick=\'Seek(\"" + str + "\"," + j + "," + i + ")\'>\>\>\>次を探す</a><br/>";
        return;
      } else {
        map.openInfoWindow( map.getCenter(),document.createTextNode("見つかりません") );
      }
    }
    ii = 0;
  }
}

function ChildCreate(child) {
  var childs = child.split(",");
  var doc = "<div class='next_maker'>";
  for (var i = 0; i < childs.length; i++) {
    doc += "<div><a href=\"javascript:void(0)\" onclick=\'Search(\"" + childs[i] + "\")\'>" + childs[i] + "</a></div>";
  }
  doc += "</div>";
  return doc;
}

function MarkerCreate(point, icon, link, title, child) {
  var marker = new GMarker( point,{ draggable: false, title: title,
               icon: icon, bouncy: false } );
  GEvent.addListener( marker, 'click', function() {
    marker.openInfoWindowHtml( 
      ( (link == "") ? title : "<a href=\"" + link + "\" target=\"_top\">" + title + "</a>" ) + "<span id=\"next\"></span>" +
      ( (child == "") ? "" : ChildCreate(child) )
    );
  } );
  return marker;
}

function MarkerSet() {
  GDownloadUrl( file_marker, function (doc,status) {
    var xmlDoc = GXml.parse(doc);
// firefox bugfix -----------------------------------------
    var k = IsFirefox() ? (xmlDoc.documentElement.childNodes.length - 1) / 2 : xmlDoc.documentElement.childNodes.length;
// firefox bugfix end -------------------------------------
    for (var j = 0; j < k; j++) {
      marker_class[j]  = new Array();
      var overlay = marker_class[j];
      var jj = IsFirefox() ? (j * 2) + 1 : j;
      var xmlNode  = xmlDoc.documentElement.childNodes[jj];
      var icon     = IconCreate( xmlNode.getAttribute("image") );
      zoom_level[j] = parseInt( xmlNode.getAttribute("zoom") ); 		// zoom read -------
      var markers  = xmlNode.getElementsByTagName("marker");
      for (var i = 0; i < markers.length; i++) {
        var link   = markers[i].getAttribute("link");
        var title  = markers[i].getAttribute("title");
        var child  = markers[i].getAttribute("child");
        overlay[i] = MarkerCreate(new GLatLng( parseFloat(markers[i].getAttribute("lat") ),
              parseFloat( markers[i].getAttribute("lng") ) ), icon, link, title, child);
        html_cache += "<a href=\"javascript:void(0)\" onclick=\'Search(\"" + title + "\")\'>" + title + "</a><br />";
//      if( j == 0 ){ html_cache += "<a href=\"javascript:void(0)\" onclick=\'Search(\"" + title + "\")\'>" + title + "</a><br />" }	// list 
      }
    }
// ---------------- HTML ----------------
  html_cache += "<a target=\"_blank\" href=\"http://maps.google.co.jp/maps?ll=" + map_center.lat() + "," + map_center.lng() + "\">拡大地図へ</a>";
  document.getElementById("side").innerHTML = html_cache;
// ---------------- HTML ----------------
  marker_read_end = true;
  } );
}

function PolylineSet() {
  GDownloadUrl( file_polyline, function (doc,status) {
    var xmlDoc = GXml.parse(doc);
// firefox bugfix -----------------------------------------
    var k = IsFirefox() ? (xmlDoc.documentElement.childNodes.length - 1) / 2 : xmlDoc.documentElement.childNodes.length;
// firefox bugfix end -------------------------------------
    for (var j = 0 ; j < k; j++ ) {
      var jj = IsFirefox() ? (j * 2) + 1 : j;
      var xmlNode  = xmlDoc.documentElement.childNodes[jj];
      var color    = xmlNode.getAttribute("color");
      var width    = parseInt( xmlNode.getAttribute("width") );
      var opacity  = parseInt( xmlNode.getAttribute("opacity") );
      var polyline = xmlNode.getElementsByTagName("polyline");
      var points   = new Array();
      for (var i = 0; i < polyline.length; i++) {
        points[i] = new GLatLng( parseFloat( polyline[i].getAttribute("lat") ),
                                 parseFloat( polyline[i].getAttribute("lng") ) );
      }
      var polyline = new GPolyline( points, color, width, opacity );
      map.addOverlay( polyline );
    }
    polyline_read_end = true;
  } );
}
//----------------------------------------------------------------------------------------------------------------------
function getPoints(flag) {
  map.closeInfoWindow();
  if (flag) {
    document.getElementById("side").innerHTML = "";
    var html ="";
    myEvent = GEvent.addListener(map, 'click', function(overlay, point) {
      if (point) {
        map.panTo(point);
        html += "lat=" + point.lat() + "<br />" + "lng=" + point.lng() + "<br />";
        document.getElementById("side").innerHTML = html;
      }
    } );
  } else {
    if (myEvent) {
      document.getElementById("side").innerHTML = html_cache;
      GEvent.removeListener(myEvent);
    }
  }
}
//----------------------------------------------------------------------------------------------------------------------
function load() {
  DefaultSet();
  MarkerSet();
  handle = setInterval( "define()",100 );
}
function define() {
  if( !default_read_end || !marker_read_end ) { document.getElementById("map").innerHTML = version + " 読込中です"; return; }
    clearInterval( handle );
  if( typeof( GBrowserIsCompatible ) == "undefined" ) { document.getElementById("map").innerHTML = "インターネットに接続してください"; }
  if( GBrowserIsCompatible() ) {
    map = new GMap2( document.getElementById("map") );
//    map.addMapType(G_PHYSICAL_MAP);
    map.addControl( new GSmallMapControl() );  // or LargeMapControl
    map.addControl( new GMapTypeControl() );
    map.addControl( new GScaleControl() );
    map.enableContinuousZoom();    //smooth
    map.enableDoubleClickZoom();
// --- Set the getTileUrl to use the Google KML tile processor ---
    var tilelayer = new GTileLayer( new GCopyrightCollection(), 0, 17 );
    tilelayer.getTileUrl = function(a,b) {
      b = this.maxResolution() - b;
      return "http://maps.google.com/mapsdt?id=" + file_area + "&x=" + a.x +"&y=" + a.y + "&zoom=" + b;
    }
// --- spec change ---
//  tilelayer.getTileUrl = function(tile, zoom) { return map_background };
    tilelayer.getOpacity = function() { return map_contrast }
//
    map.setCenter( map_center, zoom_level[0] );            // read after xml file

    map.addOverlay( new GTileLayerOverlay(tilelayer) );
    var mt = map.getMapTypes();
// --- Zoom range Overwrite getMinimum/MaximumResolution() methods ---
    for (var i = 0; i < mt.length; i++) {
      mt[i].getMinimumResolution = function() { return min_zoom; }
      mt[i].getMaximumResolution = function() { return max_zoom; }
    }
    PolylineSet();
// --- timming change ---
    main();
//  handle = setInterval( "main()",100 );
  }
}

function main() {
//  if( !marker_read_end ) return;
//    clearInterval( handle );
    MarkerDisplay(marker_class[0]);zoom_busy = zoom_level[0];    // read after xml
    GEvent.addListener( map,'zoomend', function(oldLevel,newLevel) {
      map.closeInfoWindow();
        if( newLevel == zoom_level[1] && zoom_busy == zoom_level[0] ){ if( zoom_busy != zoom_level[1] ){
          MarkerClear(marker_class[0]);
          MarkerDisplay(marker_class[1]);
          zoom_busy = zoom_level[1]; } };  //1->2
        if( newLevel == zoom_level[2] && zoom_busy == zoom_level[0] ){ if( zoom_busy != zoom_level[2] ){
          MarkerClear(marker_class[0]);
          MarkerDisplay(marker_class[2])
          zoom_busy = zoom_level[2]; } };  //1->3
        if( newLevel == zoom_level[0] && zoom_busy == zoom_level[1] ){ if( zoom_busy != zoom_level[0] ){
          MarkerClear(marker_class[1]);
          MarkerDisplay(marker_class[0]);
          zoom_busy = zoom_level[0]; } };  //2->1
        if( newLevel == zoom_level[2] && zoom_busy == zoom_level[1] ){ if( zoom_busy != zoom_level[2] ){
          MarkerClear(marker_class[1]);
          MarkerDisplay(marker_class[2]);
          zoom_busy = zoom_level[2]; } };  //2->3
        if( newLevel == zoom_level[0] && zoom_busy == zoom_level[2] ){ if( zoom_busy != zoom_level[0] ){
          MarkerClear(marker_class[2]);
          MarkerDisplay(marker_class[0]);
          zoom_busy = zoom_level[0]; } };  //3->1
        if( newLevel == zoom_level[1] && zoom_busy == zoom_level[2] ){ if( zoom_busy != zoom_level[1] ){
          MarkerClear(marker_class[2]);
          MarkerDisplay(marker_class[1]);
          zoom_busy = zoom_level[1]; } };  //3->2
    } );
//  GEvent.addListener( map,'click', function(overlay, point){ GLog.write(point); });
}
//----------------------------------------------------------------------------------------------------------------------
