/*
 * Load GoogleMapAPIv3 Plugin
 *	var 1.1β		08.04.2010	
 ************************************
 *	var 1.1β	08.04.2010	ルート
 */
$.fn.loadgmap3 = function(set){
	var directionsService = new google.maps.DirectionsService();
	var markers = new Array();
	var routes = new Array();
	var currentInfoWindow = null;

	var mapdiv = $(this).get(0);
	var config = jQuery.extend({
		zoom:14,
		lat: 37.363753,
		lng: 138.55544,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		scaleControl: true,
		mapTypeControl : false,
		navigationControl : true,
		navigationControlOptions : {
			style : google.maps.NavigationControlStyle.SMALL
		}
	},set);
	var mapconf = {
		zoom:config.zoom,
		center: new google.maps.LatLng(config.lat,config.lng),
		mapTypeId: config.mapTypeId,
		scaleControl: config.mapTypeId,
		mapTypeControl : config.mapTypeControl,
		navigationControl : config.navigationControl,
		navigationControlOptions : config.navigationControlOptions
	}
	
	// *** 処理開始 *** //
	var gmap = new google.maps.Map(mapdiv,mapconf);
	if(typeof config.markers != 'undefined'){
		for( var i in config.markers){
			//マーカーセット
			makemarker(config.markers[i]);
		}
	}
	if(typeof config.open != 'undefined'){
		//narkers[config.open]のクリックイベントを起こす
	}
	if(typeof config.routes != 'undefined'){
		for( var i in config.routes){
			makerute(config.routes[i].name,config.routes[i].markers);
		}
	}
	
	EventListener = google.maps.event.addListener(gmap, "idle", function() {
		markercheck();
	});
	
	
	// *** 以下API *** //
	
	//マーカーを追加する
	function makemarker(conf){
		var pos = new google.maps.LatLng(conf.lat,conf.lng);
		var markerconf = {
			position: pos,
			map: gmap, 
			title: conf.name,
			visible: true
		};
		if(typeof conf.icon != 'undefined'){
			markerconf["icon"] = conf.icon;
		}
		var marker = new google.maps.Marker(markerconf);
		var infowindow = new google.maps.InfoWindow({
			content: '<p><span class="title">'+conf.name+'</span><br />\n<span class="content">'+conf.content+'</span></p>',
			size: new google.maps.Size(200, 100)
		});
		markers[conf.name] = marker;
		google.maps.event.addListener(marker, 'click', function() {
			if (currentInfoWindow) {
				currentInfoWindow.close();
			}
			infowindow.open(gmap, marker);
			currentInfoWindow = infowindow;
		});
	};
	
	//ルートを追加する
	function makerute(name,markerset){
		var s_marker = markerset.shift();
		var e_marker = markerset.pop();
		var start = markers[s_marker].getPosition();
		var end = markers[e_marker].getPosition();
		var waypoints = new Array();
		for (var i = 0; i < markerset.length; i ++) {
			waypoints.push({location:markers[markerset[i]].getPosition()});
		}
		var route = new google.maps.DirectionsRenderer();
		route.setMap(gmap);
		var request = {
			origin:start,
			destination:end,
			waypoints : waypoints,
			travelMode: google.maps.DirectionsTravelMode.DRIVING,
			unitSystem: google.maps.DirectionsUnitSystem.METRIC
		};
		directionsService.route(request, function(response, status) {
			if(status == google.maps.DirectionsStatus.OK) {
				route.set("avoidHighways",1);
				route.set("suppressMarkers",1);
				route.set("preserveViewport",1);
				route.set("suppressPolylines",0);
				route.setDirections(response);
			}
		});
		routes.push(route);
	}
	
	//表示していいマーカーかチェックする
	function markercheck(){
		var bounds = gmap.getBounds();
		for(var i=0;i<markers.length;i++){
			if(bounds.contains(markers[i].getPosition())){
				markers[i].setVisible(true);
			}
			else{
				markers[i].setVisible(false);
			}
		}
	}
	
	//表示するルートを切り替える
	function onrutes(i){
		for(c=0;c<routes.length;c++){
			if(i==c || i==-1){
				routes[c].set("suppressPolylines",1);
			}
			else{
				routeRs[c].set("suppressPolylines",0);
			}
			var dsobj = routes[c].getDirections();
			routes[c].setDirections(dsobj);
		}
	}
	
	//ズームの変更
	function SetZoom(z){
		config.zoom = z;
		lmap.setZoom(z);
	};
	//表示中心点移動
	function ViewMove(i,k){
		var p = new google.maps.LatLng(i,k);
		map.setCenter(p);
	};
	//マーカー表示属性の反転
	function MarkerViewChange(n){
		var v = markers[n].getVisible();
		markers[n].setVisible(!(v));
	};
	
	return this;
}
