var map = null;
var _charCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var center_lat = 0;
var center_lng = 0;
var center_exp = new String("");
var d;
var spotMarker;


function loadGeom() {
    if(typeof(GIcon) == 'undefined'){
	alert("GoogleMapの初期化が不完全です。この問題は、ブラウザのキャッシュを削除すると解決する可能性があります。");
	return;
    }	

    baseIcon = new GIcon();
    baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
    baseIcon.image = "http://www.google.com/mapfiles/marker.png";
    baseIcon.iconSize = new GSize(20, 34);
    baseIcon.shadowSize = new GSize(37, 34);
    baseIcon.iconAnchor = new GPoint(9, 34);
    baseIcon.infoWindowAnchor = new GPoint(9, 2);
    baseIcon.infoShadowAnchor = new GPoint(18, 25);
    baseIcon.markerId = 0;

    var ua = navigator.userAgent;
    window.onresize = function() {
        var mapArea = document.getElementById("geom_map");
        if( ua.indexOf("MSIE") >= 0 ){
            mapArea.style.width  = String( document.body.clientWidth - 400 ) + "px";
	}	    
        else{
            mapArea.style.width  = String( window.innerWidth - 400 ) + "px";
	}

        mapArea.style.height = "350px";
        map.checkResize();
    } 

    if (GBrowserIsCompatible()) {
        var mapArea = document.getElementById("geom_map");

        if( ua.indexOf("MSIE") >= 0 ){
            mapArea.style.width  = String( document.body.clientWidth - 440 ) + "px";
	}	    
        else{
            mapArea.style.width  = String( window.innerWidth - 440 ) + "px";
	}
        mapArea.style.height = "350px";

        map = new GMap2(document.getElementById("geom_map"));
        createCrossIcon(); 
        map.setCenter(new GLatLng(center_lat, center_lng), zoom_level);
        map.addControl(new GLargeMapControl());
        controlObj = new GMapTypeControl();
        map.addControl( controlObj );

        map.enableDoubleClickZoom();
        map.enableScrollWheelZoom();

        GEvent.addListener(map, "dragend", function(){
            center_lat = (map.getCenter()).lat().toFixed(6);
            center_lng = (map.getCenter()).lng().toFixed(6);
            search();
        });

        GEvent.addListener(map, "click", function( overlay, point ){
            if( point ){
                center_lat = point.lat().toFixed(6);
                center_lng = point.lng().toFixed(6);
                map.panTo( new GLatLng( point.lat(), point.lng() ));
                search();
            }
        });

        GEvent.addListener(map, "dblclick", function( overlay, point ){
            if( point ){
                center_lat = point.lat().toFixed(6);
                center_lng = point.lng().toFixed(6);
                search();
            }
        });

        GEvent.addListener(map, "move", function(){
            var x = (map.getCenter()).lng().toFixed(6);
            var y = (map.getCenter()).lat().toFixed(6);
            document.getElementById("centerpoint").innerHTML =
            "(N:"+y+",E:"+x+")";
        });

        GEvent.addListener(map, "zoomend", function(){
            zoom_level = map.getZoom();
        });
    }
    search();
}


function loadRss() {
    var fName = '/blogsearch/hotspots_curl.cgi';
    new Ajax.Request( fName, { method: "get", asynchronous: false,  onComplete: showRss });
}

function createCrossIcon() {
  //cross_px：十字の横幅・縦幅（ピクセル）
  //cross_td：十字の太さ（ピクセル）
  //cross_cr：十字の色（スタイルシートと同様の書式）
  var cross_px = 60;
  var cross_td = 2;
  var cross_cr = "red";

  //十字の縦線のエレメントを設定    
  var cross_h_emt =  document.createElement("div");
  //IE用にfontSizeを最小値
  cross_h_emt.style.fontSize = "1px";
  cross_h_emt.style.margin = "0px";
  cross_h_emt.style.padding = "0px";
  cross_h_emt.style.width = cross_px + "px";
  cross_h_emt.style.height = cross_td + "px";
  cross_h_emt.style.backgroundColor = cross_cr;

  //十字の横線のエレメントを設定
  var cross_v_emt =  document.createElement("div");
  cross_v_emt.style.margin = "0px";
  cross_v_emt.style.padding = "0px";
  cross_v_emt.style.width = cross_td+"px";
  cross_v_emt.style.height = cross_px + "px";
  cross_v_emt.style.backgroundColor = cross_cr;

  //十字（縦・横線）の位置を計算
  var MapPX = map.getSize();
  var mycenterHX = MapPX.width  / 2 - cross_px / 2;
  var mycenterHY = MapPX.height / 2 - cross_td / 2;
  var mycenterVX = MapPX.width  / 2 - cross_td / 2;
  var mycenterVY = MapPX.height / 2 - cross_px / 2;

  var mycenter_H = new GSize(mycenterHX,mycenterHY);
  var myposH = new GControlPosition(G_ANCHOR_TOP_LEFT, mycenter_H);
  myposH.apply(cross_h_emt);
  map.getContainer().appendChild(cross_h_emt); 

  var mycenter_V = new GSize(mycenterVX,mycenterVY);
  var myposV = new GControlPosition(G_ANCHOR_TOP_LEFT, mycenter_V);
  myposV.apply(cross_v_emt); 
  map.getContainer().appendChild(cross_v_emt);
}


function search() {
    map.clearOverlays();
    $('info').innerHTML = "";
    $("inputError").innerHTML = "";

    var url = geom_settings.urlbase +'v1/search_contents_gd/?callback=showResponse\
Tree';
    var limit = 20;
    if (isNaN(limit == NaN)) { limit = 10; }
    url = url + "&lng=" + center_lng + "&lat=" + center_lat + "&limit=" + limit;
    var distance = Math.round(100 * 1000 * map.getBounds().toSpan().lat() / 2);
    url = url + "&distance=" + distance;
    url = url + "&mask=" + "bodytext";
    url = url + "&mesh=5,5";

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    document.body.appendChild(script);
}


function jumpToEntryPlace(exp, lat, lng, letter, dtree_id){
    $("inputError").innerHTML = "";
    center_exp = exp;
    center_lat = lat;
    center_lng = lng;
    showSpotMarker( lat, lng, letter );
    d.closeAll();
    d.openTo( dtree_id, true );
    fixed_place = 2;
    map.setCenter(new GLatLng(center_lat, center_lng), zoom_level);
//    document.getElementById("selectSpot").style.backgroundColor='#FFFFFF';
//    document.getElementById("selectSpot").style.fontWeight='normal';
//  loadRss();
}


function showSpotMarker( lat, lng, letter ){
    var icon = new GIcon(baseIcon);
    icon.image = "http://www.google.com/mapfiles/marker_yellow"+letter+".png";
    if( spotMarker ){
       map.removeOverlay( spotMarker ) ;
    }
    spotMarker =  new GMarker(new GLatLng( lat, lng ), {icon: icon});
    map.addOverlay( spotMarker);
}


function removeSpotMarker(){
    if( spotMarker ){
       map.removeOverlay( spotMarker ) ;
    }
}


function jumpToNewPlace(){
    var place = $("new_place").value;
    if( place == "" || place.length >= 30 ) return;
    var url = "/blogsearch/geocode_curl.cgi?text="+encodeURIComponent(place);
    center_exp = place;
    fixed_place = 2;
    new Ajax.Request( url, { method: "get", onComplete: getGeocode });
    document.getElementById("selectSpot").style.backgroundColor='#FFFFFF';
    document.getElementById("selectSpot").style.fontWeight='normal';
}


function getGeocode(httpObj){
    var data = eval("(" + httpObj.responseText + ")");
    if( data.results.length == 0 ){
        $("inputError").innerHTML = "この場所を特定できませんでした。";
        return;
    }
    center_lat = data.results[0].lat;
    center_lng = data.results[0].lng;

    var uri = '/blogsearch/?lat='+center_lat+'&lng='+center_lng+'&exp='+encodeURIComponent( center_exp );
    window.open( uri,'_self');
}



function showRss(httpObj){
    $("rss").innerHTML= "<b>最近話題の場所</b> <a href=\"http://api.locosticker.jp/rss/hot_spots.xml\"><img src=\"/blogsearch/doc/images/rss_hotspots.png\" border=\"0\"></a><br>";
    var xml = httpObj.responseXML;
    var itemTag = xml.getElementsByTagName("item");

    var num = itemTag.length;
    var r = Math.floor( Math.random() * num );
    if( r == num ) r = num - 1;

    for( var k = 0 ; k < num ; k++ ){
        var title  = itemTag[k].getElementsByTagName("title");
        if( title.length <= 0 ) continue;
        var exp    = title[0].firstChild.nodeValue;

        var georss = itemTag[k].getElementsByTagName("georss:point");
        if( georss.length <= 0 ) continue;
        var  point  = georss[0].firstChild.nodeValue.split(" ");

        var param  = "lat=" + point[0] + "&lng=" + point[1] + "&exp=" + encodeURIComponent(exp);
       if( fixed_place == 0 && k == r ){
           center_lat = point[0];
           center_lng = point[1];
           center_exp = exp;
       }
       if( center_exp == exp && fixed_place <= 1){
           $("rss").innerHTML += "<a href=\"/blogsearch/?" + param +
        "\"><span id=\"selectSpot\">"+exp+"</span></a>&nbsp;&nbsp;";
       }
       else{
         $("rss").innerHTML += "<a href=\"/blogsearch/?" + param +
        "\">"+exp+"</a>&nbsp;&nbsp;"; 
       }
    }
}


function openTreeWindow(uri){
    window.open(uri, 'neighborblogTree');
}

function showResponseTree(hash) {
    var results = hash.results;
    var last_lat = 0;
    var last_lng = 0;
    var ptree_id = 0;
    var dtree_id = 0;
    var treeTitle = '<font size="+1">『このへん』のエントリ</font>';
    d = new dTree('d');
    d.config.closeSameLevel = true;

    if( results && results.length > 0 ){
        treeTitle = "<span style=\"font-size:12pt; vertical-align:middle\">『" + results[0].expression + "』付近のエントリ</span>";
    }

    d.add(dtree_id++, -1, treeTitle);
    var markerCount = 0;

    for (var i = 0; i < results.length, element = results[i] ; i++) {

        if( element.title && element.title.length > 20 ){
            element.title = element.title.substring( 0, 20 );
            element.title += "...";
        }

        if( last_lat != element.lat || last_lng != element.lng ){
            last_lat = element.lat;
            last_lng = element.lng;

            if( markerCount > 25 ){
              markerCount = 0;
            }
            var icon = new GIcon(baseIcon);
            var letter = _charCode.charAt( markerCount++ );
            icon.image = "http://www.google.com/mapfiles/marker_green"+letter+".png";
            var spotimage  = "http://www.google.com/mapfiles/marker_yellow"+letter+".png";
            var point = new GLatLng(element.lat, element.lng);
            var marker = new GMarker( point,{icon: icon});
            marker.markerId = dtree_id;
            marker.letter = letter;

            map.addOverlay(marker);
            GEvent.addListener( marker, 'mouseover', function(){
                    var mPoint = this.getPoint();
                    showSpotMarker( mPoint.lat(), mPoint.lng(), this.letter );
                    d.closeAll();
                    d.openTo( this.markerId, true );
            });

            var latlng = element.expression + 
                         ' (N:'+last_lat+','+'E:'+last_lng+')';
            var jsAction= '"javascript:void(0)"' + 
              ' onmouseover = "showSpotMarker('+element.lat+','+element.lng+',\''+letter+'\'); return false"' + 
              ' onmouseout = "removeSpotMarker(); return false"' + 
              ' onclick = "jumpToEntryPlace(\''+element.expression+'\','+element.lat+','+element.lng+',\''+letter+'\','+dtree_id+' ); return false"';

            d.add(dtree_id, 0, latlng, jsAction, null, null, icon.image, spotimage  );

            ptree_id = dtree_id++;
        }

        var jsActionChildren =
              '"javascript:void(0)"' + 
              ' onclick = "openTreeWindow(\''+element.uri+'\'); return false"' +
              ' onmouseover = "showSpotMarker('+element.lat+','+element.lng+',\''+letter+'\'); return false"' + 
              ' onmouseout = "removeSpotMarker(); return false"';

        d.add(dtree_id++, ptree_id, element.title, jsActionChildren );
    }

    d.closeAll();
    $('info').innerHTML = d.toString();
    if(ptree_id > 0){
      d.openTo(1,true);
    }
}


