/********************************************************************
 C&R研究所刊 「マッシュアップかんたんAtoZ」 サンプルコード
.....................................................................
 CAPTER 2 - 飲み会マップ
.....................................................................
 (C) 2007 M.HONDA
********************************************************************/

var map;
var RANGE = 3;
var MAXHIT = 30;
var ZOOM_SIZE = 16;
var POPDIV_ID = "_shopphoto";

//-------------------------------------------------------------------
// HTMLイベントハンドラ設定

window.onload = function() {
    load();
    setEvent();
}

//-------------------------------------------------------------------
// Googleマップ初期化

function load() {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("mymap"));
        map.setCenter(new GLatLng(35.6829, 139.7653), 5);
        map.addControl(new GScaleControl());
        map.addControl(new GLargeMapControl());
        map.addControl(new GOverviewMapControl(new GSize(128,128)));
    }
}

//-------------------------------------------------------------------
// マーカを作る

function createGMarker(title, html, lat, lng) {
    var infoObj = new Object();
    infoObj.title = title;
    var gpObj = new GLatLng(lat, lng);
    var marker = new GMarker(gpObj, infoObj);
    map.addOverlay(marker);
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(html);
    });
}

//---------------------------------------------------------------------
// イベントハンドラ設定

function setEvent() {
    GEvent.addListener(map, "click", function(lay, point) {
        if (lay == null) {
            map.clearOverlays();
            _d("info", "＊ 検索中です ＊");
            var lat = Math.round(chgWgs2TkyLat(point.y, point.x)*100000)/100000;
            var lng = Math.round(chgWgs2TkyLng(point.y, point.x)*100000)/100000;
            var gurunaviUrl = getGurunaviUrl(lat, lng);
            xml2Json(gurunaviUrl,"callBackX2J");
        }
    });

    GEvent.addListener(map, "infowindowclose", function() {
        sPhotoClose();
    });
}

//-------------------------------------------------------------------
// 地図上にすべての飲食店マーカを設置する

function setMarkers(res) {

    if (! res.total_hit_count) {
        _d("info", "該当情報が登録されていません。エラー番号:" + res.error.code);
    }
    else {
        _d("info", "検索ヒット数&nbsp;" + res.total_hit_count + "&nbsp;件");
        if(res.total_hit_count == 1) {
            shopName = res.rest.name;
            objShop = res.rest;
            createMarker(objShop,shopName);
        }
        else {
            for (shopName in res.rest) {
                objShop = eval("res[\"rest\"][\"" + shopName + "\"]");
                createMarker(objShop,shopName);
            }
        }
    }
}

//-------------------------------------------------------------------
// 地図上に飲食店マーカを１つ設置する

function createMarker(objShop, shopName) {
    shopName = shopName.replace(/<[ \t]*[Bb][Rr][ \t]*>/, "・");
    var tTitle = createShopTitle(objShop, shopName);
    var tHtml = createShopInfoHtml(objShop, shopName);
    createGMarker(tTitle, tHtml, objShop.latitude, objShop.longitude);
}

//-------------------------------------------------------------------
// マーカのチップヘルプ

function createShopTitle(objShop, shopName) {
    var sTitle = shopName +
        "(" + errChk(objShop.code.category_name_l.content) +
        ":" + errChk(objShop.code.category_name_s.content) +
        "/" + errChk(objShop.budget) + "円)";
    return sTitle;
}

//-------------------------------------------------------------------
// 情報ウィンドウ内に表示するHTMLコード作成

function createShopInfoHtml(objShop, shopName) {
    var sBody = "<table width=\"480\">" +
        "<tr><th colspan=\"2\">" + shopName + "</th></tr>" +
        "<tr><td>■種別</td><td>" +
        errChk(objShop.code.category_name_l.content) +
        "&nbsp;/&nbsp;" +
        errChk(objShop.code.category_name_s.content) +
        "</td></tr>" +
        "<tr><td>■営業</td><td>" + 
        errChk(objShop.opentime) + "&nbsp;/&nbsp;" +
        errChk(objShop.holiday) + "</td></tr>" +
        "<tr><td>■予算</td><td>" +
        errChk(objShop.budget) + "円</td></tr>" +
        "<tr><td><nobr>■アクセス</nobr></td><td>" +
        errChk(objShop.access.line) + "&nbsp;" +
        errChk(objShop.access.station) + "<br />&nbsp;(&nbsp;" +
        errChk(objShop.access.station_exit) + "&nbsp;から&nbsp;" +
        errChk(objShop.access.walk) + "分&nbsp;)&nbsp;" +
        "</td></tr>";
        "<tr><td>■住所</td><td>" +
        errChk(objShop.address) + "</td></tr>" +
        "<tr><td>■電話</td><td>" + errChk(objShop.tel) + "</td></tr>";

    if (varChk(objShop.url, "string")) {
        sBody += "<tr><td>■HP</td>" +
            "<td><a href=\"" + objShop.url + "\" target=\"blank\">" +
            objShop.url + "</td></tr>";
    }

    sBody += "<tr><td colspan=\"2\">" + errChk(objShop.pr.pr_long);

    if (varChk(objShop.image_url.shop_image1,"string")) {
        sBody += "&nbsp;<span onClick=\"sPhotoDsp('" +
            objShop.image_url.shop_image1 +
            "')\"><br />[お店の画像]</span>&nbsp;</td></tr>";
    }

    sBody += "</table>";
    return sBody;
}

//-------------------------------------------------------------------
// 店舗データの特定項目が未定義か、空欄だった場合の判定

function errChk(tgd) {
    return varChk(tgd,"string") ? tgd : "---";
}

//-------------------------------------------------------------------
// 店舗写真の表示

var photoDiv;

function sPhotoDsp(imageUrl) {
    photoDiv = createDiv(POPDIV_ID,80,32);
    document.getElementById(POPDIV_ID).innerHTML = 
        "<div id=\"photocnt\" onClick=\"sPhotoClose()\"><img src=\"" +
        imageUrl +
        "\" /><br />提供：ぐるナビ</div>";
}

//-------------------------------------------------------------------
// 店舗写真を消す

function sPhotoClose() {
    removeDiv(POPDIV_ID);
}

//-------------------------------------------------------------------
// 「ぐるナビ」データアクセスURL作成

function getGurunaviUrl(lat, lng) {
    var gurunaviApi = "http://api.gnavi.co.jp/ver1/RestSearchAPI/";
    var gurunaviKey = "ec4cfad5a518625fa59c7f483dc3787a";
    var queri = gurunaviApi + "?keyid=" + gurunaviKey +
        "&coordinates_mode=2" +
        "&latitude=" + lat +
        "&longitude=" + lng +
        "&range=" + RANGE +
        "&hit_per_page=" + MAXHIT;
    return queri;
}

//-------------------------------------------------------------------
// APIアクセス中継

function xml2Json(url,callback) {
    var proxyUrl = "http://app.drk7.jp/xml2json/";
    var callUrl = proxyUrl + "var=" + callback + "&url=" + encodeURIComponent(url);
    var script = document.createElement('script');
    script.charset = 'UTF-8';
    script.src = callUrl;
    document.body.appendChild(script);
}

//-------------------------------------------------------------------
// JSONPコールで使用するコールバック関数

var callBackX2J = {}
callBackX2J.onload = function(res) {
    setMarkers(res);
}

//-------------------------------------------------------------------
// 測地系の変換
//  ※本コードはNowral氏が下記に公開されている変換式を参考にしています。
//  http://homepage3.nifty.com/Nowral/index.html

function chgTky2WgsLng(lat, lng) {
    return (lng - lat * 0.000046038 - lng * 0.000083043 + 0.010040);
}

function chgTky2WgsLat(lat, lng) {
    return (lat - lat * 0.00010695 + lng * 0.000017464 + 0.0046017);
}

function chgWgs2TkyLng(lat, lng) {
    return (lng + lat * 0.000046047 + lng * 0.000083049 - 0.010041);
}

function chgWgs2TkyLat(lat, lng) {
    return (lat + lat * 0.00010696 - lng * 0.000017467 - 0.0046020);
}

//-------------------------------------------------------------------
// htmlコード挿入

function _d(id, htmlTxt) {
    document.getElementById(id).innerHTML = htmlTxt;
}

//-------------------------------------------------------------------
// divブロック挿入

function createDiv(id,left,top) {
    var outDiv;
    outDiv =document.createElement('div');
    outDiv.id = id;
    document.body.appendChild(outDiv);

    var tgdStyle = document.getElementById(id).style;
    tgdStyle.position = "absolute";
    tgdStyle.left = left + "px";
    tgdStyle.top = top + "px";
    tgdStyle.background = "white";
}

//-------------------------------------------------------------------
// divブロックの削除

function removeDiv(id) {
    var outDiv = document.getElementById(id);
    document.body.removeChild(outDiv);
}

//-------------------------------------------------------------------
// 要素のタイプを確認する

function varChk(tgd,type) {
    return typeof(tgd) == type ? true : false;
}

// EOF
