/**************************************************************
* Common Variables
**************************************************************/
var map = null; //GoogleMapオブジェクト

/**************************************************************
* Name:         cnvD
* Parameters:   dms:[度,分,秒]の配列
* Function:     度･分･秒の値を、度に換算して返す。
**************************************************************/
function cnvD(dms) {
    var dd = dms[0] + dms[1]/60 + dms[2]/3600;
    return dd;
}
/**************************************************************
* Name:         loadMap
* Parameters:   lat:緯度,lng:経度,pwr:倍率,sizeAry:サイズ
* Function:     指定地点の地図をロード。
**************************************************************/
function loadMap(latAry,lngAry,pwr,sizeAry) {
    if (GBrowserIsCompatible()) {
        var numOfArgs = arguments.length;
        if (numOfArgs < 4) {
            sizeAry = [440,330];    //地図のデフォルト･サイズ
            if (numOfArgs < 3) {
                pwr = 15;           //デフォルトの倍率
            }
        }
        var msize = new GSize(sizeAry[0],sizeAry[1]);
        map = new GMap2(document.getElementById("map"), {size: msize});
        var center = new GLatLng(cnvD(latAry), cnvD(lngAry));
        with (map) {
            addControl(new GSmallMapControl());
            addControl(new GScaleControl());
            addControl(new GMapTypeControl());
            setCenter(center, pwr);
        }
    }
}
/**************************************************************
* Name:         unloadMap
* Parameters:   None
* Function:     地図をアンロード。
**************************************************************/
function unloadMap() {
    //GoogleMap API呼出し。
    GUnload();
}
/**************************************************************
* Name:         addMarker
* Parameters:   ttl:タイトル,txt:テキスト,lnk:URL,img:画像パス,latAry:緯度[度,分,秒],lngAry:経度[度,分,秒]
* Function:     指定地点にマーカーへの追加を制御。
**************************************************************/
function addMarker(ttl,txt,lnk,img,latAry,lngAry) {
    //引数の数によってデフォルト値をセット。(オーバーロードの代わり)
    var numOfArgs = arguments.length;
	var lgd = "";
    if (numOfArgs < 5) {
        //地点が省略された場合は、地図の中心点とする。
        var lat = map.getCenter().lat();
        var lng = map.getCenter().lng();
        if (numOfArgs < 4) {
            img = "";
			lgd = '<ul><li><a href="' + lnk + '" title="' + ttl + '">"<strong>' + ttl + '</strong>"</a></ul>';
            if (numOfArgs < 3) {
                lnk = "";
                lgd = "";
            }
        }
    } else {
        var lat = cnvD(latAry);
        var lng = cnvD(lngAry);
    }
    //地図上に追加。
    addGMarker(ttl,'<h3>' + ttl + '</h3>',txt,lnk,img,lgd,lat,lng);
}
/**************************************************************
* Name:         addMarkerById
* Parameters:   eid:要素Id,txt:テキスト,latAry:緯度[度,分,秒],lngAry:経度[度,分,秒]
* Function:     指定地点にマーカーへの追加を制御。
**************************************************************/
function addMarkerById(eid,txt,latAry,lngAry) {
    //引数の数によってデフォルト値をセット。(オーバーロードの代わり)
    if (arguments.length < 3) {
        //地点が省略された場合は、地図の中心点とする。
        var lat = map.getCenter().lat();
        var lng = map.getCenter().lng();
    } else {
        var lat = cnvD(latAry);
        var lng = cnvD(lngAry);
    }
    //要素IDから、情報を取得。
    var el = document.getElementById(eid);
    if (eid == 'headline') {
        var ttl = el.getElementsByTagName('h2')[0].getElementsByTagName('a')[0].firstChild.nodeValue;
        var hht = '<h3>' + ttl + '</h3>';
    } else {
        var ttl = el.getElementsByTagName('h3')[0].getElementsByTagName('a')[0].firstChild.nodeValue;
        var hht = el.getElementsByTagName('h3')[0].outerHTML;
    }
    if (el.className == 'section') {
        var lnk = el.getElementsByTagName('li')[0].getElementsByTagName('a')[0].href;
        var img = el.getElementsByTagName('img')[0].src;
        var lgd = el.getElementsByTagName('ul')[0].outerHTML;
    } else {
        var lnk = '#' + eid;
        var img = '';
        var lgd = '<ul><li><a href="#' + eid + '" onclick="return hideInfoWindow();" title="' + ttl + '">"' + ttl +'"の記事へ</a></li></ul>';
    }
    //地図上に追加。
    addGMarker(ttl,hht,txt,lnk,img,lgd,lat,lng);
}
/**************************************************************
* Name:         addGMarker
* Parameters:   ttl:タイトル,hht:ヘッダ用HTML,txt:テキスト,lnk:URL,img:画像パス,lgd:リンク･ガイド,lat:緯度,lng:経度
* Function:     指定地点にマーカーを追加。
**************************************************************/
function addGMarker(ttl,hht,txt,lnk,img,lgd,lat,lng) {
    //地図上にmarkerを追加。
    var marker = new GMarker(new GLatLng(lat,lng),{title: ttl});
    map.addOverlay(marker);
    //markerに対するイベント･リスナーを定義。
    //--Click--
    GEvent.addListener(marker,"click",function() {
        showHideInfoWindow(marker,ttl,hht,txt,lnk,img,lgd);
    });
    //--InfoWindowClose--
    GEvent.addListener(marker,"infowindowclose",function() {
        map.returnToSavedPosition();
    });
}
/**************************************************************
* Name:         showHideInfoWindow
* Parameters:   mkr:マーカー･オブジェクト,ttl:タイトル,hht:ヘッダ用HTML,txt:テキスト,lnk:URL,img:画像パス,lgd:リンク･ガイド
* Function:     情報ポップアップの表示を制御。
**************************************************************/
function showHideInfoWindow(mkr,ttl,hht,txt,lnk,img,lgd) {
    //情報ウィンドウの表示状態で分岐...
    if (map.getInfoWindow().isHidden()) {
        //情報ポップアップ表示前の位置を記憶。
        map.savePosition();
        //情報ポップアップを表示。
        mkr.openInfoWindowHtml(generateHTML(ttl,hht,txt,lnk,img,lgd),{ maxWidth: 180 });
    } else {
        //情報表示中のマーカーの場合
        if (map.getInfoWindow().getPoint() == mkr.getPoint()) {
            //情報ポップアップを隠す。
            hideInfoWindow();
        } else {
            //情報ポップアップを表示。
            mkr.openInfoWindowHtml(generateHTML(ttl,hht,txt,lnk,img,lgd),{ maxWidth: 180 });
        }
    }
}
/**************************************************************
* Name:         hideInfoWindow
* Parameters:   None
* Function:     情報ポップアップを非表示化。
**************************************************************/
function hideInfoWindow() {
    with (map) {
        //情報ポップアップを隠す。
        getInfoWindow().hide();
        //元の表示位置に移動。
        returnToSavedPosition();
    }
    //
    return true;
}
/**************************************************************
* Name:         generateHTML
* Parameters:   ttl:タイトル,hht:ヘッダ用HTML,txt:テキスト,lnk:URL,img:画像パス,lgd:リンク･ガイド
* Function:     情報ポップアップに表示するHTML文字列を生成。
**************************************************************/
function generateHTML(ttl,hht,txt,lnk,img,lgd) {
    //情報HTMLを作成。
    var html = '<div class="mapinfo">';
    //タイトル
    html = html+ hht;
    //画像(指定ある場合)
    if (img != "") {
        html = html + '<a href="' + lnk + '"><img src="' + img + '" alt="' + ttl + '" /></a>';
    }
    //テキスト
    html = html + '<p>' + txt + '</p>';
    //詳細リンク
    if (lnk != "" && lgd != "") {
        html = html + lgd;
    }
    html = html + '</div>';
    //生成したHTMLを返す。
    return html;
}

