/*
 * googlemap_simple_viewer
 * 一般地図表示用プラグイン
 *
 * 指定された緯度経度、倍率の地図を表示し、その中央にマーカー（アイコン）を表示
 * 作成したgooglemapを保持
 * $.googlemapSimpleViews[id] = {
 *   map: map,
 *   markers: markers,
 *   eventHandles: eventHandles
 * }
 *
 * @require jquery.js
 * @require GOOGLE MAP API JS
 *
 * @example $.googlemapSimpleViewer("id");
 * @example $.googlemapSimpleViewer("id", {key1: value1, key2: value2...});
 *
 * @example $.googlemapSimpleViewer.defaults.showLargeMapControl = false;
 * @example $.extend($.googlemapSimpleViewer.defaults, {showLargeMapControl: true, zoom: 20});
 *
 * @example $.googlemapSimpleViewer.markerConfig.iconImage = "icon.gif";
 *
 * @example $.googlemapSimpleViewer.infoConfig.useDom = false;
 * 
 * @example var created = $.googlemapSimpleViewes["test"];
 *
 * @example $("test").triggerHandler("googlemapSimpleView_addMarker", [{key1: value1, key2: value2...}]);
 *
 * @see Google Maps API refference http://code.google.com/intl/ja/apis/maps/documentation/reference.html
 */
(function($) {

	$.googlemapSimpleViewer = function(id, options){

		//互換性チェック
		if (!GBrowserIsCompatible()) {
			return false;
		}

		//対象のエレメントがなければ終了
		var target = $("#" + id);
		if (target.size() != 1)
		{
			return false;
		}

		//すでに作成済みであれば終了
		if($.googlemapSimpleViews[id])
		{
			return false;
		}
		
		//オプション拡張
		options = $.extend( {}, $.googlemapSimpleViewer.defaults, options );

		//map生成
		var map = initMap(target.get(0));
		
		//mapオブジェクトを初期化、保持
		$.googlemapSimpleViews[id] = {
			map: map,
			markers: [],
			eventHandles: {}
		};

		//mapオブジェクトのショートカット
		var map = $.googlemapSimpleViews[id].map;
		var markers = $.googlemapSimpleViews[id].markers;
		var eventHandles = $.googlemapSimpleViews[id].eventHandles;

		//マーカーの追加
		if(options.markers){
			for(var i = 0; i < options.markers.length; i++){
				addMarker(options.markers[i]);
			}
		}

		//イベントの初期化
		initEvents();

		//マーカが存在する場合
		if(markers[0])
		{
			//1つ目をクリックしてウィンドウを表示
			GEvent.trigger(markers[0],'click');
		}

		return true;

		//地図初期化
		function initMap(domMap){
	
			var map = new GMap2(domMap);
			
			if (options.showLargeMapControl)
			{
				map.addControl(new GLargeMapControl());
			}
			if (options.showSmallMapControl)
			{
				map.addControl(new GSmallMapControl());
			}
			if (options.showSmallZoomControl)
			{
				map.addControl(new GSmallZoomControl());
			}
			if (options.showScaleControl)
			{
				map.addControl(new GScaleControl());
			}
			if (options.showMapTypeControl)
			{
				map.addControl(new GMapTypeControl());
			}
			if (options.showMenuMapTypeControl)
			{
				map.addControl(new GMenuMapTypeControl());
			}
			if (options.showOverviewMapControl)
			{
				map.addControl(new GOverviewMapControl());
			}

			if(options.latlng != undefined)
			{
				map.setCenter(new GLatLng(options.latlng[0], options.latlng[1]), options.zoom);
			}

			if (options.enableScrollWheelZoom)
			{
				map.enableScrollWheelZoom();
			}
			else
			{
				map.disableScrollWheelZoom();
			}
	
			return map;
		}

		//マーカーの追加
		function addMarker(markerOption){
			if(!options.showMarker || markerOption == undefined)
			{
				return;
			}
			
			var markerOption = $.extend( {}, $.googlemapSimpleViewer.markerConfig, markerOption );

			//マーカー表示位置
			if(markerOption.latlng == undefined)
			{
				return;
			}
			var latlng = new GLatLng(markerOption.latlng[0], markerOption.latlng[1]);

			//オプション
			var opts = {};
			
			//アイコン
			if(markerOption.iconImage != undefined)
			{
				try {
					opts.icon = new GIcon(G_DEFAULT_ICON);
					//アイコン画像
					opts.icon.image = markerOption.iconImage;
					//アイコンサイズ
					if(markerOption.iconSize != undefined)
					{
						opts.icon.iconSize = new GSize(markerOption.iconSize[0], markerOption.iconSize[1]);
					}
					//アイコン配置
					if(markerOption.iconAnchor != undefined)
					{
						opts.icon.iconAnchor = new GPoint(markerOption.iconAnchor[0], markerOption.iconAnchor[1]);
					}
					//影画像
					if(markerOption.iconShadowImage != undefined)
					{
						opts.icon.shadow = markerOption.iconShadowImage;
					}
					//影サイズ
					if(markerOption.iconShadowSize != undefined)
					{
						opts.icon.shadowSize = new GSize(markerOption.iconShadowSize[0], markerOption.iconShadowSize[1]);
					}
					//情報ウィンドウ位置
					if(markerOption.infoWindowAnchor)
					{
						opts.icon.infoWindowAnchor = new GPoint(markerOption.infoWindowAnchor[0], markerOption.infoWindowAnchor[1]);
					}
					//IEでの範囲画像（メインアイコン画像の不透明度1% の24ビット PNG）
					if(markerOption.transparentImage != undefined)
					{
						opts.icon.transparent = markerOption.transparentImage;
					}
					//IE以外での範囲指定
					if(markerOption.imageMap != undefined)
					{
						opts.icon.imageMap = markerOption.imageMap;
					}
					//印刷画像
					if(markerOption.printImage != undefined)
					{
						opts.icon.printImage = markerOption.printImage;
					}
					//Mozilla用印刷画像
					if(markerOption.mozPrintImage != undefined)
					{
						opts.icon.mozPrintImage = markerOption.mozPrintImage;
					}
					//印刷用影画像
					if(markerOption.printShadowImage != undefined)
					{
						opts.icon.printShadow = markerOption.printShadowImage;
					}
				}
				catch (e)
				{
					delete opts.icon;
				}
			}
			//タイトル
			if(markerOption.title != undefined)
			{
				opts.title = markerOption.title;
			}
			//クリック
			if(markerOption.clickable != undefined)
			{
				opts.clickable = markerOption.clickable;
			}
			//ドラッグ
			if(markerOption.draggable != undefined)
			{
				opts.draggable = markerOption.draggable;
			}

			var marker = new GMarker(latlng, opts);
			map.addOverlay(marker);

			bindInfoToMarker(marker, markerOption.info);
			markers.push(marker);
		}
		
		//情報ウィンドウバインド
		function bindInfoToMarker(marker, infoOption){
			if(!options.showInfo || infoOption == undefined)
			{
				return;
			}

			var infoOption = $.extend( {}, $.googlemapSimpleViewer.infoConfig, infoOption );
			
			//オプション
			var opts = {};

			//最大幅
			if(infoOption.maxWidth != undefined)
			{
				opts.maxWidth = infoOption.maxWidth;
			}
			//地図クリック時に閉じるかどうか
			if(infoOption.closeOnClick != undefined)
			{
				opts.noCloseOnClick = !infoOption.closeOnClick;
			}
			
			//HTMLの場合
			if(!infoOption.useDom)
			{
				marker.bindInfoWindowHtml(infoOption.content, opts);
			}
			//jQueryの場合
			else
			{
				marker.bindInfoWindow($(infoOption.content).get(0), opts);
			}
		}
	
		//イベント初期化
		function initEvents(){
			//アンロード
			$(window).unload(function(){GUnload()});

			//マーカー追加イベント
			target.bind(
				"googlemapSimpleView_addMarker",
				function(e, markerOption) {
					addMarker(markerOption);
				}
			);

		}
	}

	//googlemapオブジェクト保持
	$.googlemapSimpleViews = {};
	
	//設定
	$.googlemapSimpleViewer.defaults = {
		//デフォルト地図
		latlng: [35.7004, 139.7725],
		zoom: 16,
		//コントロール
		showLargeMapControl: false,
		showSmallMapControl:  true,
		showSmallZoomControl:  false,
		showScaleControl:  false,
		showMapTypeControl: false,
		showMenuMapTypeControl: true,
		showOverviewMapControl: false,
		enableScrollWheelZoom: false,
		//マーカー表示
		showMarker: true,
		//情報表示
		showInfo: true,
		//マーカー指定
		markers: null
	}

	//マーカー指定デフォルト設定
	$.googlemapSimpleViewer.markerConfig = {
		clickable: true, //クリック可能かどうか
		draggable: false, //ドラッグ可能かどうか
		iconImage: null, //アイコン画像パス
		iconSize: null, //アイコン画像サイズ（配列）
		iconAnchor: null, //アイコン固定座標（配列）
		iconShadowImage: null, //影画像パス
		iconShadowSize: null, //影画像サイズ（配列）
		infoWindowAnchor: null, //情報ウィンドウ固定座標X（アイコン左上基準、配列）
		transparentImage: null, //IEでの範囲画像（メインアイコン画像の不透明度1% の24ビット PNG）
		imageMap: null, //IE以外での範囲指定
		printImage: null, //印刷用アイコン画像パス（アイコンと同じサイズ）
		mozPrintImage: null, //Firefox/Mozillaのアイコン印刷用画像パス（アイコンと同じサイズ）
		printShadowImage: null, //印刷用影画像パス（GIF、アイコンと同じサイズ）
		info: null //情報ウィンドウ指定
	}

	//情報ウィンドウ指定デフォルト設定
	$.googlemapSimpleViewer.infoConfig = {
		useDom: false, //内容をDOM指定するかどうか（false = HTML指定）
		closeOnClick: true, //地図クリック時にウィンドウを閉じるかどうか
		maxWidth: null, //ウィンドウの最大幅,
		content: null //内容
	}

	//マーカー設定
	$.extend(
		$.googlemapSimpleViewer.markerConfig,
		{
			iconImage: "/common/img/googlemap_icon.png",
			iconSize: [25,43],
			iconAnchor: [0,43],
			iconShadowImage: "/common/img/googlemap_icon_shadow.png",
			iconShadowSize: [35,43],
			infoWindowAnchor: [25,0],
			transparentImage: null,
			imageMap: [0,0,0,25,25,43,43,0],
			printImage: "/common/img/googlemap_icon_print.gif",
			mozPrintImage: "/common/img/googlemap_icon_print.gif",
			printShadowImage: "/common/img/googlemap_icon_print_shadow.gif"
		}
	);
	//情報ウィンドウ設定
	$.extend(
		$.googlemapSimpleViewer.infoConfig,
		{
			closeOnClick: false,
			maxWidth: 500
		}
	);

})(jQuery);


