/**
 * @file cms.googlemap.js
 * @brief GoogleMapを作成するjavascript. 
 * @date 2009/11/08
 * 
 * Copyright(C) Hitachi Government & Public Corporation
 * System Engineering, Ltd. 2009. All rights reserved.
 */

// 名前空間の定義:cms
var cms;
if(!cms)
    cms = {};
else if(typeof cms != "object")
    throw new Error("cms already exits and is not an object");

// 名前空間の定義:cms.googlemap
if(!cms.googlemap)
    cms.googlemap = {};
else if(typeof cms.googlemap != "object")
    throw new Error("cms.googlemap already exits and is not an object");

/**
 * googleMapAPIが利用可能かを判定する
 */
function isGoogleMapAvailable() {
	
	if(typeof(google) != "object"
		|| typeof(google.maps) != "object"
		|| typeof(cms) != "object"
		|| typeof(cms.googlemap) != "object") {
		return false;
	}

	return true;
}

/**
 * マップの初期化
 * 
 * @param  id     マップのid
 * @param  lat    経度情報
 * @param  lng    緯度情報
 * @param  zoomLevel ズーム情報
 * @param  isControl マップコントロールの表示有無
 * @return マップオブジェクト
 */
if(!cms.googlemap.initializeMap)
cms.googlemap.initializeMap = function(id, lat, lng, zoomLevel, isControl) {
	// googleMap API利用可能か調査
	if (isGoogleMapAvailable() == false) {
		
		var el = document.getElementById(id);
		if(el == null || el == undefined ) {
			return null;
		}
		
		// エラーメッセージの埋め込み
		el.style.backgroundColor="#FFFFCC";
		el.style.border="solid 1px #CCCCCC";
		el.innerHTML = '<p style="font-size: 80%;">現在、地図を表示することはできません。<br>しばらくしてから、再度アクセスしてください。</p>';
		
		return null;
	}
	
	var myOptions = {
		zoom: zoomLevel,
		center: new google.maps.LatLng(lat, lng),
		mapTypeControl: false,
		navigationControl: isControl,
		navigationControlOptions : {
			style : google.maps.NavigationControlStyle.SMALL,
			position : google.maps.ControlPosition.TOP_LEFT
		},
		scaleControl: isControl,
		scrollwheel : false,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		disableDoubleClickZoom: true,
		streetViewControl: isControl
	};
	
	var map = new google.maps.Map(document.getElementById(id), myOptions);
	
    return(map);

}

/**
 * 地図表示の初期化
 *  body.onload()で呼び出してください.
 */
if(!cms.googlemap.initMap)
cms.googlemap.initMap = function(){
    if (cms.googlemap.isInitMap == true){
        for(var func in cms.googlemap.initFuncList){
            eval(cms.googlemap.initFuncList[func]);
        }
    } else {
      var s = document.getElementById("mapLib");
      s.src="./js/dummy.js";
    }
}

/**
 * マーカの追加
 * 
 * @param  map    マップオブジェクト
 * @param  lat    経度情報
 * @param  lng    緯度情報
 * @param  cap    メッセージ
 * @param  title  タイトル
 */
cms.googlemap.addMarker = function(map, lat, lng, cap, title) {
	
	if (isGoogleMapAvailable() == false) {
		return null;
	}
	
	var marker = new google.maps.Marker({
		position: new google.maps.LatLng(lat, lng),
		map: map
		//title: cap
	});
	cms.googlemap.addMarkerCaption(marker, cap, title);
	
	return marker;
}

/**
 * マーカーにキャプションなどのイベントを追加する。
 * @param marker マーカー
 * @param title タイトル
 * @param cap キャプション
 */
cms.googlemap.addMarkerCaption = function(marker, cap, title) {
	
	var map = marker.getMap();
	if(title != null && title != "") {
		marker.setTitle(title);
		
	}
	
	var capHtml = cap;
	
	var infoWindow = null;
	if(cap != null && cap != ""){
		infoWindow = new google.maps.InfoWindow();
		infoWindow.setContent(capHtml);
		google.maps.event.addListener(marker, "mouseover", function() {
			infoWindow.open(map, marker);
		});
		
		google.maps.event.addListener(marker, "mouseout", function() {
			infoWindow.close();
		});
	}
	
	return infoWindow;
	
}

/**
 * 任意のマーカーを作成する
 */
cms.googlemap.createPintypeMarkerIcon =  function (mopts, opts) {
	opts = (opts)? opts : {};
	var fillColor = opts.fillColor || "FF776D";
	var letter = escapeUserText_(opts.letter) || "";
	var letterColor = opts.letterColor || "000000";
	var icon = opts.icon || "";
	var pinStyle = "pin";
	var starFillColor = (opts.pinStyle==="star" && !opts.starFillColor)?"FFFF00":opts.starFillColor;
	var label = (letter||icon)?(letter||icon):"+";
	switch(opts.pinStyle){
		case "star": pinStyle = "pin_star"; break;
		case "left": pinStyle = "pin_sleft"; break;
		case "right": pinStyle = "pin_sright"; break;
		default: pinStyle = "pin";
	}
	var pinProgram = (icon) ? "_icon":"_letter";
	var baseUrl = "http://chart.apis.google.com/chart?chst=d_map_xpin"+pinProgram+"&chld=";
	var iconUrl = baseUrl+""+pinStyle+"|"+(label)+"|"+fillColor;
	if(label==="+") iconUrl += "|"; else if(letter) iconUrl += "|"+letterColor;
	if(opts.pinStyle==="star") iconUrl += "|"+starFillColor;
	if(isEmpty(opts)===false) mopts.icon=iconUrl;
	if(isEmpty(opts)===false && mopts.flat!==false){
		var shadowUrl = (pinStyle === "pin"||opts.pinStyle==="star")? "http://maps.google.com/mapfiles/shadow50.png":"http://chart.apis.google.com/chart?chst=d_map_xpin_shadow&chld="+pinStyle;
		var anc = (pinStyle === "pin"||opts.pinStyle==="star")? new google.maps.Point(10, 34):new google.maps.Point(14, 35)
		var shadow = new google.maps.MarkerImage(shadowUrl,
		new google.maps.Size(37, 34), new google.maps.Point(0,0), anc);
		mopts.shadow = shadow;
		
	}
	
	var m = new google.maps.Marker(mopts);
	return m;
	function escapeUserText_(text) {
	  if (text === undefined) {
		return null;
	  }
	  text = text.replace(/@/g, "@@");
	  text = text.replace(/\\/g, "@\\");
	  text = text.replace(/'/g, "@'");
	  text = text.replace(/\[/g, "@[");
	  text = text.replace(/\]/g, "@]");
	  return encodeURIComponent(text);
	};
	function isEmpty(hash) {
	  for ( var i in hash ) return false;
	  return true;
	};
};


