allMarkers = [];
$(function(){
  var marker = null,
      d = document,
      map = null,
      geocoder = null,
      defaultName = "名無しのスラックライナー";
  if (GBrowserIsCompatible()) {
    $("#setThisAddress").attr("disabled","");
    $("#moveThisAddress").attr("disabled","disabled");
    $("#sendBtn").attr("disabled","disabled");
    map = new GMap2($("#map").get(0));
    map.addControl(new GOverviewMapControl());
    //map.enableGoogleBar();
    map.addControl(new GMapTypeControl(),new GControlPosition(G_ANCHOR_TOP_RIGHT,new GSize(10,10)));
    map.addControl(new GLargeMapControl());
    //マップの設置
    map.setCenter(new GLatLng(35.673251, 139.697193), 10);
    geocoder = new GClientGeocoder();
    //マーカーの画像[ok]
    var markerOK = new GIcon();
    markerOK.image = "./images/ico_ok.png";
    markerOK.shadow = "./images/ico_shadow.png";
    markerOK.iconSize = new GSize(32,37);
    markerOK.shadowSize = new GSize(45,37);
    markerOK.iconAnchor = new GPoint(16,37);
    markerOK.infoWindowAnchor = new GPoint(16,0);
    //マーカーの画像[new]
    var markerAdd = new GIcon();
    markerAdd.image = "./images/ico_add.png";
    markerAdd.shadow = "./images/ico_shadow.png";
    markerAdd.iconSize = new GSize(32,37);
    markerAdd.shadowSize = new GSize(45,37);
    markerAdd.iconAnchor = new GPoint(16,37);
    markerAdd.infoWindowAnchor = new GPoint(16,0);
    function jsonParse(data){
      var officeLayer = [
        {
          "zoom": [4,17],
          "places": data
        }
      ];
      var mgr = new MarkerManager(map);
      var sidebarHTML = [];
      sidebarHTML.push("<ul>");
      if(data.length == 0){
        sidebarHTML.push("<li>まだ登録されているマップはありません。</li>");
      }
      for (var i in officeLayer) {
        var layer = officeLayer[i];
        var markers = [];
        for (var j in layer["places"]) {
          var markerobj = null;
          var place = layer["places"][j];
          place["lat"] = Number(place["lat"]);
          place["lon"] = Number(place["lon"]);
          var posn = new GLatLng(place["lat"],place["lon"]);
          //マーカー作成
          markerobj = new GMarker(posn,markerOK);
          markerobj.datas = {
            num  : place["mapID"].split('_')[1],
            mapID  : place["mapID"],
            address: place["address"],
            twID   : place["twID"],
            msg    : place["msg"],
            lon    : place["lon"],
            lat    : place["lat"],
          };
          //サイドバー用のHTML作成
          sidebarHTML.push('<li><a href="javascript:void(0);" onclick="list2marker('+j+');return false;">'+place["address"]+'</a></li>');
          GEvent.addListener(markerobj,"click",function() {
            var info = this.datas;
            var html = [];
            var voot_html = '<a href="./session.php">TwitterIDでログインする</a>';
            
            if('undefined' === session){
              voot_html = voot_html;
            }else{
              if(session.state === 'logined' && session.user_name === info.twID){
                voot_html = '<div><a href="javascript:void(0);">削除(未実装)</a></div>';
              }else if(session.state === 'logined' && session.user_name !== info.twID){
                voot_html = '<div><b>評価(未実装)</b><br/><a id="good_'+info.mapID+'" class="vote_good" onclick="voteGood(this)" href="#">good(0)</a>&nbsp;<a id="bad_'+info.mapID+'" class="vote_bad" href="#" onclick="voteBad(this)">bad(0)</a></div>';
              }
            }
            html.push('<dl class="slackwindow">');
            html.push('<dt>');
            html.push('<b>登録者</b>');
            if(info.twID==undefined || info.twID=='' || info.twID==defaultName){
              html.push(defaultName);
            }else{
              html.push('<img src=\"http://api.dan.co.jp/twicon/'+info.twID+'/mini\" />');
              html.push('<a href="http://twitter.com/'+info.twID+'/">'+info.twID+'</a>');
            }
            html.push('</dt><dd>');
            html.push('<div><b>住所</b><br/><span><a href="/detail.php?m=spot&id='+info.num+'">'+info.address+'</a></span></div>');
            html.push('<div><b>コメント</b><br/><span>'+info.msg+'</span></div>');
            //html.push(voot_html);
            html.push('</dd></dl>');
            this.openInfoWindowHtml(html.join('\n'));
            map.setCenter(new GLatLng(info.lat, info.lon));
            map.setZoom(14);
          });
          allMarkers[j] = markerobj;
          markers.push(markerobj);
        }
        mgr.addMarkers(markers, layer["zoom"][0], layer["zoom"][1]);
        if(data.length!=0){
          initCenter(markers);
        }
      }
      mgr.refresh();
      sidebarHTML.push("</ul>");
      $("#sidebar").html(sidebarHTML.join('\n'));
    };
    $.getJSON("./mapdata.php",jsonParse);
  }
  $("#setThisAddress").click(function(){
    if($("#inputAddress").val() != ''){
      $("#marker_retry_input").val($("#inputAddress").val());
      $("#defaultAddress").val($("#inputAddress").val());
      $("#marker_set").hide();
      $(".spotlistBox.box_small").hide();
      showAddress($("#inputAddress").val());
      this.disabled = "disabled";
      $("#sendAddress").css("display","block");
      $("#moveThisAddress").attr("disabled","");
    }
  });
  $("#moveThisAddress").click(function(){
    var myval = $("#marker_retry_input").val();
    if(myval != ''){
      moveMarker(myval);
    }
  });
  $("#confirmBtn").click(function(){
    setHTML();
    $("#sendBtn").attr("disabled","");
  });
  $("#sendBtn").click(function(){
    sendData();
  });
  function sendData(){
    /*
      selectAddress : 自動で選ばれた住所
      address2      : 手動で入力した住所
      gpsX          : 経度 lon
      gpsY          : 緯度 lat
      msg           : コメント
      twitterID     : twitterのアカウント名
    */
    var myFlag = getChecked();
    var selectAddress = getSelectedOpt(),
        writeAddress = $("#defaultAddress").val(),
        gpsX = $("#gpsX").html(),
        gpsY = $("#gpsY").html(),
        msg = $("#msg").val(),
        twID = $("#twitterID").val(),
        rate = $("#rate").val(),
        params = {
          "mode" : "addMarker",
          "address": (myFlag == "selects")? selectAddress : writeAddress,
          "lat": gpsX,
          "lon": gpsY,
          "msg": msg,
          "rate" : rate ,
          "twID": (twID=='' || twID==undefined || twID==defaultName)? defaultName : twID,
          "mapID": ""
        };
    $("#sendData").html("送信中...");

    $("#setThisAddress").attr("disabled","disabled");
    $("#moveThisAddress").attr("disabled","disabled");
    $("#confirmBtn").attr("disabled","disabled");
    $("#sendBtn").attr("disabled","disabled");

    $.post("./mapdata.php",params,function(res){
      params.mode = 'tweet';
      params.mapID = res;
      $.post("./mapdata.php", params);
      setTimeout(function(){
        location.href ="./index.php";
      },1000);
    });
  }
  function setGPS(point){
    $("#gpsX").html(point.x);
    $("#gpsY").html(point.y);
  }
  function moveMarker(address) {
    geocoder.getLatLng(address,function(point){
      setGPS(point);
      localsearch(point);
      map.closeInfoWindow();
      marker.setLatLng(point);
      marker.openInfoWindowHtml('<b>'+address+'</b>付近。<br/>詳細な情報を入力してください。');
      $("#marker_retry_input").val(address);
      $("#defaultAddress").val(address);
    });
  }
  //マーカーを追加する
  function showAddress(address) {
    if (geocoder) {
      geocoder.getLatLng(
        address,
        function(point) {
          if (!point) {
            alert(address + " は、見つかりませんでした･･･");
            $("#setThisAddress").attr("disabled","");
          } else {
            map.setCenter(point, 13);
            var gmarker_options = {
              icon : markerAdd,
              draggable : true
            };
            marker = new GMarker(point,gmarker_options);
            setGPS(point)
            localsearch(point);
            map.addOverlay(marker);
            marker.openInfoWindowHtml('<b>'+address+'</b>付近。<br/>詳細な情報を入力してください。');
            GEvent.addListener(marker, "dragstart", function() {
              map.closeInfoWindow();
            });
            GEvent.addListener(marker, "dragend", function() {
              var point = marker.getLatLng();
              setGPS(point);
              localsearch(point);
              setHTML();
            });
            GEvent.addListener(marker, "click", function() {
              var point = marker.getLatLng();
              setGPS(point);
              localsearch(point);
              setHTML();
            });
          }
        }
      );
    }
  }
  function localsearch(point){
    var apiurl = './locate.php?lat='+point.y+'&lon='+point.x+'&dist=1&o=json&al=3&category=address';
        scriptID = "mapJSON",
        scriptTag = document.createElement("script");
    scriptTag.id = scriptID;
    scriptTag.src = apiurl;
    scriptTag.charset = "utf-8";
    $("body").append(scriptTag);
  }
  function getChecked(){
    var re;
    $.each($('.top_address_check'),function(){
      if($(this).attr("checked") == true){
        re = $(this).attr("value");
      }
    });
    return re;
  }
  function setHTML(){
    var twID = $('#twitterID').val(),
        point = marker.getLatLng(),
        html = [],
        selectAddress = getSelectedOpt(),
        writeAddress = $("#defaultAddress").val();
    var flag = getChecked();
    html.push('<dl class="slackwindow">');
    html.push('<dt>');
    html.push('<b>登録者</b>');
    if(twID==undefined || twID=='' || twID==defaultName){
      html.push(defaultName);
    }else{
      twID = htmlspecialchars(twID);
      html.push('<img src=\"http://api.dan.co.jp/twicon/'+twID+'/mini\" />');
      html.push('<a href="http://twitter.com/'+twID+'/">'+twID+'</a>');
    }
    html.push('</dt><dd>');
    if(flag == 'selects'){
      html.push('<div><b>選択された住所</b><br/><span>'+selectAddress+'</span></div>');
      $("#marker_retry_input").val(selectAddress);
    }else{
      html.push('<div><b>入力された住所</b><br/><span>'+htmlspecialchars(writeAddress)+'</span></div>');
      $("#marker_retry_input").val(htmlspecialchars(writeAddress));
      //$("#defaultAddress").val(htmlspecialchars(writeAddress));
    }
    html.push('<div><b>コメント</b><br/><span>'+htmlspecialchars($("#msg").val())+'</span></div>');
    html.push('</dd></dl>');
    marker.openInfoWindowHtml(html.join('\n'));
  }
  function initCenter(markers){
    var bounds;
    var first = true,
        far = {
          East : 143.08,
          West : 130.66,
          South : 31.59,
          North : 43.39
        }
    for(var i=0, l=markers.length; i<l; i++){
      var marker = markers[i],
          point = marker.getLatLng();
      if((point.lng() < far.East && point.lng() > far.West) && (point.lat() < far.North && point.lat() > far.South)){
        if(first){
          bounds = new GLatLngBounds(point, point);
          first = false;
        }else{
          bounds.extend(point);
        }
      }
    }
    map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
  }
  /*
  $('.followme').click(function(){
    $.get('./session.php', {mode : 'follow'}, function(){$('.followme').hide('slow');});
  });
  */
});

function lsCallback(json){
  var list = $("#addressList"),
      selectTag = [];
  if(json.Item.length > 0){
    list.html('');
    selectTag.push('<select id="selectAddress" name="selectAddress">');
    for(var i=0;i<json.Item.length;i++){
      selectTag.push('<option value="'+json.Item[i].Title+'">'+json.Item[i].Title+'</option>');
    }
    selectTag.push('</select>');
  }else{
    selectTag.push('付近の住所候補が見つかりませんでした。');
  }
  list.html(selectTag.join('\n'));
}
function getSelectedOpt(tarid){
  var option = $("option","#selectAddress"),
  re = '';
  $.each(option,function(){
    if($(this).attr("selected") == true) re = $(this).val();
  });
  return re;
}
function htmlspecialchars(str){
    str = str.replace(/&/g,"&amp;") ;
    str = str.replace(/"/g,"&quot;") ;
    str = str.replace(/'/g,"&#039;") ;
    str = str.replace(/</g,"&lt;") ;
    str = str.replace(/>/g,"&gt;") ;
    return str;
}
function voteGood(_this){
  alert(_this.id+"の評価を上げる");
  return false;
}
function voteBad(_this){
  alert(_this.id+"の評価を下げる");
  return false;
}
function list2marker(num){
  GEvent.trigger(allMarkers[num],"click");
}
