var mc = function(){}
var crossMarker = null;

mc.listOfCenter = [
    {name:'デフォルト',lat:33.953862,lng:130.961881,zoom:14},
    {name:'九州鉄道記念館駅',lat:33.944384,lng:130.962439,zoom:17},
    {name:'出光美術館駅',lat:33.947774,lng:130.965292,zoom:17},
    {name:'ノーフォーク広場駅',lat:33.956029,lng:130.964225,zoom:16},
    {name:'関門海峡めかり駅',lat:33.960643,lng:130.967395,zoom:16},
    {name:'トンネル下関出口',lat:33.965252,lng:130.956151,zoom:15},
    {name:'関門汽船唐戸乗り場',lat:33.956033,lng:130.942542,zoom:16}];
mc.mapfit = function(callback){
    var el = $('#map').offset();
    if(el.top > 220) return;
    var h = $(window).height();
    var nh = h - el.top;
    $('#map,#sidebar,#mapWrapper').css('height',nh + 'px');
    if(callback) callback();
    
}
mc.setCenter = function(centerId){
    var target = new GLatLng(mc.listOfCenter[centerId].lat,mc.listOfCenter[centerId].lng,true);
    
    map.setCenter(target,mc.listOfCenter[centerId].zoom, G_NORMAL_MAP);
}


function parse_loc(response, to_open) {
	var xmldoc  = GXml.parse(response);
	var lat     = xmldoc.documentElement.getElementsByTagName('lat');
	var lon     = xmldoc.documentElement.getElementsByTagName('lon');
	var title   = xmldoc.documentElement.getElementsByTagName('title');
	var link    = xmldoc.documentElement.getElementsByTagName('link');
	var date    = xmldoc.documentElement.getElementsByTagName('date');
	var excerpt = xmldoc.documentElement.getElementsByTagName('excerpt');
	var n = lat.length;
	if (n < 1) {
		return null;
	}
	
	
	
	var points = new Array();
	for (var i = 0 ; i < n ; i++) {
		var latlng = new GLatLng(GXml.value(lat[i]), GXml.value(lon[i]));
		if (to_open && latlng.equals(to_open)) {
			var opened = true;
		} else {
			var opened = false;
		}
		var desc = {
			'title'  : GXml.value(title[i]),
			'link'   : GXml.value(link[i]),
			'date'   : GXml.value(date[i]),
			'excerpt': GXml.value(excerpt[i])
		};
		var has_same = false;
		if (i > 0) {
			var last = Math.min(i, points.length);
			for (var j = 0 ; j < last ; j++) {
				if (latlng.equals(points[j][0])) {
					has_same = true;
					points[j].push(desc);
					break;
				}
			}
		}
		if (! has_same) {
			points.push(new Array(latlng, opened, desc));
		}
	}
	return points;
}
// --------------------
function window_content(desc) {
	return '<div class="infowindow"><strong><a href="'+desc.link+'">'+desc.title+'</a></strong><br />'+desc.date+'<p>'+desc.excerpt+'</p></div>';
}

// --------------------
function display_line(map){
    var geoXml = new GGeoXml('http://www.retro-line.net/wp-content/assets/map/mojiko.kml');
	map.addOverlay(geoXml);
}

// --------------------
function create_marker(map, loc) {
	var marker = new GMarker(loc[0]);
	map.addOverlay(marker);
	var n = loc.length;
	if (n <= 3) {
		marker.bindInfoWindowHtml(window_content(loc[2]), {'maxWidth':250});
		if (loc[1]) {
			marker.openInfoWindowHtml(window_content(loc[2]), {'maxWidth':250});
		}
	} else {
		var tabs = new Array(n - 2);
		for (var i = 2 ; i < n ; i++) {
			tabs[i - 2] = new GInfoWindowTab(i - 1, window_content(loc[i]));
		}
		marker.bindInfoWindowTabsHtml(tabs, {'maxWidth':250});
		if (loc[1]) {
			marker.openInfoWindowTabsHtml(tabs, {'maxWidth':250});
		}
	}
	return marker;
}
// --------------------
function put_markers(map, locs) {
	if (locs) {
		map.clearOverlays();
		var n = locs.length;
		for (var i = 0 ; i < n ; i++) {
			create_marker(map, locs[i]);
		}
	}
}
// --------------------
function recent_locations(num) {
	var query = 'recent=' + num;
	/*
	GDownloadUrl(baseurl + query, function(response) {
		var locs = parse_loc(response, null);
		if (locs) {
			locs[0][1] = true; // open a window of the recent marker
			put_markers(map, locs);
		}
	});
	*/
}
// --------------------
function move_to_latlong(latlng) {
	map.setCenter(latlng, 14, G_NORMAL_MAP);
	var bounds = map.getBounds();
	var query = 'bounds=' + bounds.getSouthWest().lat() + ',' + bounds.getSouthWest().lng() + ',' + bounds.getNorthEast().lat() + ',' + bounds.getNorthEast().lng();
	GDownloadUrl(baseurl + query, function(response) {
		var locs = parse_loc(response, latlng);
		put_markers(map, locs);
	});
}
// --------------------
function move_to_place(place) {
	geocoder.getLatLng(place, function(latlng) {
		if (latlng) {
			move_to_latlong(latlng);
		} else {
			alert(place + 'の緯度・経度が分かりませんでした。');
		}
	});
}
// --------------------
function get_outline(locs) {
	var outline = new GLatLngBounds(locs[0].latlng, locs[0].latlng);
	var n = locs.length;
	for (var i = 0 ; i < n ; i++) {
		outline.extend(locs[i][0]);
	}
	return outline;
}
// --------------------
function refine_by_category(cat_id) {
	var query = 'category=' + cat_id;
	GDownloadUrl(baseurl + query, function(response) {
		var locs  = parse_loc(response, null);
		if (! locs) {
			map.setCenter(new GLatLng(38.0,137.5), 4, G_NORMAL_MAP);
			map.clearOverlays();
			return;	
		}
		var outline = get_outline(locs);
		map.setCenter(outline.getCenter(), map.getBoundsZoomLevel(outline), G_NORMAL_MAP);
		put_markers(map, locs);
	});
}
// --------------------
function refine_by_tag(tag) {
	var query = 'tag=' + encodeURI(tag);
	GDownloadUrl(baseurl + query, function(response) {
		var locs  = parse_loc(response, null);
		if (! locs) {
			map.setCenter(new GLatLng(38.0,137.5), 4, G_NORMAL_MAP);
			map.clearOverlays();
			return;	
		}
		var outline = get_outline(locs);
		map.setCenter(outline.getCenter(), map.getBoundsZoomLevel(outline), G_NORMAL_MAP);
		put_markers(map, locs);
	});
}
// --------------------
function main() {
	map = new GMap2(document.getElementById('map'));
	map.removeMapType(G_SATELLITE_MAP);
	map.addMapType(G_PHYSICAL_MAP);
	map.addControl(new GLargeMapControl3D());
	map.addControl(new GMapTypeControl());
	map.addControl(new GScaleControl());
	
	
	var crossIcon = new GIcon();
    crossIcon.image = "http://www.retro-line.net/wp-content/assets/map/cross_icon.gif";
    crossIcon.iconSize = new GSize(39, 39);
    crossIcon.iconAnchor = new GPoint(20, 20);
    
    var crossOption = {
                     icon  : crossIcon   //アイコン = cross_icon
                    ,clickable : false    //クリック = 不可
                 };
    
	//map.addControl(new GOverviewMapControl());
	geocoder = new GClientGeocoder();
	var baseLat = 33.953862;  if ( typeof(request_lat )!= 'undefined' ){ baseLat = request_lat; }
	var baseLong = 130.961881; if ( typeof(request_long) != 'undefined' ){ baseLong = request_long; }
	
	map.setCenter(new GLatLng(baseLat,baseLong), 14, G_NORMAL_MAP);
	GEvent.addListener(map, "moveend", getData);
	
	crossMarker = new GMarker(map.getCenter(), crossOption);
	
    map.addOverlay(crossMarker);
    // イベントの登録 : 地図が移動中のとき、呼び出されるようにする
    GEvent.addListener(map, "move", function(){
        drawCrossScope(map);
    });
    
    // 十字マークの描画
    drawCrossScope(map);
    display_line(map);
    
	
	recent_locations(100);
	getData();
}
// --------------------

function drawCrossScope(map){
    // 現在表示している地図の中心地点を取得する
    var mapCenter = map.getCenter();
    
    //マーカーを地図の中心地点に移動させる
    crossMarker.setPoint(mapCenter);
}

var loadedJson = {};

function getData() {

    var LatLngObj = map.getCenter();
    GDownloadUrl( gmdUrl + 'json.php?lat=' + LatLngObj.y + '&long=' +  LatLngObj.x , function(doc, stat){ 
        eval("loaddata=" + doc);
        $('#sidebar').html('');
        for(var i=0; i<loaddata.data.length; i++){ 
            if ( loadedJson[loaddata.data[i].ID] == undefined ){
                loadedJson[loaddata.data[i].ID] = loaddata.data[i];
                var marker=makeMarker(loaddata.data[i]);
                map.addOverlay(marker);
            }
            $('#sidebar').append(fetchSideBarElement(loaddata.data[i]));
        }
        $('#sidebar>div:odd').css('background-color','#CCDFF6');
    }); 
        
}

function fetchSideBarElement(row){

    var distance = parseInt(row.distance);
    var distanceStr = '';
    if (distance > 994 ) { distanceStr = (distance/1000).toFixed(1)  + 'km';  }
    else distanceStr = distance + 'm';

    var sbhtml = '<div class="sbElement"><strong><a href="javascript:openInfoWindow('+ row.ID +');">' + row.post_title  + '</a></strong><div><small>地図中心から直線距離で</small>' + distanceStr  + '</div></div>';
    
    
    return sbhtml;
}

function openInfoWindow(id){
    loadedJson[id].marker.openInfoWindowHtml(loadedJson[id].windowHTML);
}


function makeMarker(row){
    
    
    var point = new GLatLng(row.lat,row.long);
    
    if ( row.icon != '' ){
    var markerIcon = new GIcon();
        markerIcon.image = "http://www.retro-line.net/wp-content/assets/map/icons/" + row.icon + ".png";
        markerIcon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/msmarker.shadow.png'
        markerIcon.iconSize = new GSize(33, 33);
        markerIcon.shadowSize = new GSize(50, 33);
        markerIcon.iconAnchor = new GPoint(16, 33);
        markerIcon.infoWindowAnchor = new GPoint(16, 0);
        
        var marker = new GMarker(point, {icon:markerIcon}); 
    }else{
    
        var marker = new GMarker(point); 
    }
    
    loadedJson[row.ID].marker = marker;
    loadedJson[row.ID].windowHTML = "<div><strong><a href=\"/?p=" + row.ID + "\">"+ row.post_title+"</a></strong>";
    
    
    
    if ( typeof(row.metaData.thumbnail) != 'undefined' && row.metaData.thumbnail != '' ){
        loadedJson[row.ID].windowHTML += '<div style="align:center;"><img src="http://www.retro-line.net/wp-content/uploads/site_maker/thumbnails/s/'+ row.metaData.thumbnail +'" width="208" height="117" /></div>';
    }
    if ( typeof(row.metaData.description) != 'undefined' && row.metaData.description != '' ){
        loadedJson[row.ID].windowHTML += '<div>' + row.metaData.description + '</div>';
    }
    
    loadedJson[row.ID].windowHTML += '</div>';
    
    // クリックしたマーカーに該当する情報を表示 
    if ( typeof(loadedJson[row.ID].windowHTML) != 'undefined' ){
        GEvent.addListener(marker, "click", function(){ 
        //マーカーにデータを保持させる方法
            marker.openInfoWindowHtml(loadedJson[row.ID].windowHTML);
    }); 
    
    }
    return marker;
}


