var mapObj ;
var maps ;

/**
 * 创建map , key为map索引
 * @param bindObj
 * @param key
 * @return
 */
var createMap = function(bindObj , key , lat , lng , zoom , mapTypeId){
	if(!maps)
		maps = [];
	//if(!maps[key]){
		var mapOptions = {          
	        zoom: zoom,                //缩放级别      //将地图的中心设置为指定的地理点 可以使用 0（最低缩放级别，在地图上可以看到整个世界）到 19（最高缩放级别，可以看到独立建筑物）之间的缩放级别
	        center: new google.maps.LatLng(lat , lng),           
	        mapTypeId: mapTypeId?mapTypeId : google.maps.MapTypeId.ROADMAP,   //ROADMAP-默认视图 SATELLITE-显示Google地球卫星图像 HYBRID-混合显示普通视图和卫星视图 TERRAIN-地形图     
	        scaleControl: true,    //比例尺    
	        mapTypeControl: false,
	        navigationControl : true,   //导航
	        disableDoubleClickZoom : false,   //双击放大
	        scrollwheel : false,   //滚轮
	        streetViewControl : false, //街景是否打开
	        mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}    
    	};
        maps[key] = new google.maps.Map(bindObj,mapOptions);//编写 JavaScript 函数创建“map”对象
	//}
	
	return maps[key];
};

/**
 * 获取map  ， 通过key索引获取对应map
 * @param key
 * @return
 */
var map = function(key){
	if(key)
		return maps[key] ? maps[key] : null;
	else
		return mapObj;
			
};

/**
 * 划线
 * @param start
 * @param end
 * @param strokeColor
 * @param strokeOpacity
 * @param strokeWeight
 * @param desc
 * @return
 */
var drawLine =  function(start , end , strokeColor , strokeOpacity , strokeWeight , desc){
	var flightPlanCoordinates = [start,end]; 
	var flightPath = new google.maps.Polyline({
		 path: flightPlanCoordinates,
		 strokeColor: strokeColor,
		 strokeOpacity: strokeOpacity>1?1:strokeOpacity,
		 strokeWeight: strokeWeight
	}); 
	flightPath.setMap(desc);
	return flightPath;
};

/**
 * 划多条线
 * @param markers
 * @param strokeColor
 * @param strokeOpacity
 * @param strokeWeight
 * @param desc
 * @return
 */
var drawPloygonLine =  function(markers, strokeColor , strokeOpacity , strokeWeight , desc){
	var flightPlanCoordinates = [markers]; 
	var flightPath = new google.maps.Polyline({
		 path: flightPlanCoordinates,
		 strokeColor: strokeColor,
		 strokeOpacity: strokeOpacity>1?1:strokeOpacity,
		 strokeWeight: strokeWeight
	}); 
	flightPath.setMap(desc);
	return flightPath;
};

/**
 * 划多边形
 * @param markers
 * @param strokeColor
 * @param strokeOpacity
 * @param strokeWeight
 * @param desc
 * @return
 */
var drawPloygon =  function(markers, strokeColor , strokeOpacity , strokeWeight , desc){
	var flightPlanCoordinates = [markers]; 
	var flightPath = new google.maps.Polygon({
		 path: flightPlanCoordinates,
		 strokeColor: strokeColor,
		 strokeOpacity: strokeOpacity>1?1:strokeOpacity,
		 strokeWeight: strokeWeight
	}); 
	flightPath.setMap(desc);
	return flightPath;
};

/**
 * 画点
 * @param lat
 * @param lng
 * @param title
 * @param icon
 * @param desc
 * @return
 */
var drawMarker = function(lat , lng , title , icon , desc,draggable,module){
	var _marker = new google.maps.Marker({
		position: new google.maps.LatLng(lat , lng), 
        map: desc ? desc : map(),
        title : title,
        icon: icon,
        draggable : draggable ? true : false
	});
	
	if(module)
		return markerControl.push(module,_marker);
	else
		return _marker;
};



function addMarker(latlng , desc , index) {
    var _marker = drawMarker(
			          			latlng.lat(),
			          			latlng.lng(), 
						        String.fromCharCode(index + 65),
						        "http://maps.google.com/mapfiles/marker" + String.fromCharCode(index + 65) + ".png",
						        desc
		        			);
	return _marker;   
	//markers.push(_marker); 
};

function parseLatLng(value) {
	  value.replace('/\s//g');
	  var coords = value.split(',');
	  var lat = parseFloat(coords[0]);
	  var lng = parseFloat(coords[1]);
	  if (isNaN(lat) || isNaN(lng)) {
	    return null;
	  } else {
	    return new google.maps.LatLng(lat, lng);
	  }
};

var EARTH_RADIUS = 6378137.0;    //单位M
var PI = Math.PI;
    
function getRad(d){
    return d*PI/180.0;
}


function boundZoom(map){
	var zoom = map.getZoom();
	if(zoom > 12){
		map.setZoom(12);
	}
}

/**
 * 获得两个点距离
 * approx distance between two points on earth ellipsoid
 * @param {Object} lat1
 * @param {Object} lng1
 * @param {Object} lat2
 * @param {Object} lng2
 */
var getFlatternDistance  = function(lat1,lng1,lat2,lng2){
    var f = getRad((lat1 + lat2)/2);
    var g = getRad((lat1 - lat2)/2);
    var l = getRad((lng1 - lng2)/2);
    
    var sg = Math.sin(g);
    var sl = Math.sin(l);
    var sf = Math.sin(f);
    
    var s,c,w,r,d,h1,h2;
    var a = EARTH_RADIUS;
    var fl = 1/298.257;
    
    sg = sg*sg;
    sl = sl*sl;
    sf = sf*sf;
    
    s = sg*(1-sl) + (1-sf)*sl;
    c = (1-sg)*(1-sl) + sf*sl;
    
    w = Math.atan(Math.sqrt(s/c));
    r = Math.sqrt(s*c)/w;
    d = 2*w*a;
    h1 = (3*r -1)/2/c;
    h2 = (3*r +1)/2/s;
    return d*(1 + fl*(h1*sf*(1-sg) - h2*(1-sf)*sg));
};

/**
 * 地标控制类
 */
var markerControl =  function(){
	
	var markerArray  = [];
	var defalueModule = "defulaeModule";
	markerControl.push = function(module,marker){
		module = module?module:defalueModule;
		var position = marker.getPosition();
		var latLng = position.lat()+position.lng()+Math.random(100);
		if(!markerArray[module])
			markerArray[module] = [];
		markerArray[module][latLng] = marker;
		return latLng;
	};
	
	markerControl.get = function(module,id){
		module = module?module:defalueModule;
		return markerArray[module][id];
	};
	
	markerControl.clear = function(module){
		module = module?module:defalueModule;
		var mks = markerArray[module];
		for(var i in mks){
			markerControl.removeMarker(module,i);
		}
	};
	
	markerControl.setSize = function(module,code,width,hight){
		module = module?module:defalueModule;
		var marker = markerArray[module][code];
		if(marker)
			marker.setIcon(new google.maps.MarkerImage(marker.getIcon(),new google.maps.Size(width,hight)));
	};
	
	markerControl.setIcon = function(module,code,icon){
		module = module?module:defalueModule;
		var marker = markerArray[module][code];
		if(marker)
			marker.setIcon(icon);
	};
	
	markerControl.setLatLng = function(module,code,latLng){
		module = module?module:defalueModule;
		var marker = markerArray[module][code];
		if(marker){
			marker.setPosition(new google.maps.LatLng(latLng.lat(),latLng.lng()));
			
		}
	};
	
	markerControl.getLatLng = function(module,code){
		module = module?module:defalueModule;
		var marker = markerArray[module][code];
		if(marker)
			return marker.getPosition();
	};
	
	markerControl.removeMarker = function(module,id){
		module = module?module:defalueModule;
		var marker = markerArray[module][id];
		if(marker)
			marker.setMap(null);
	};
	
	markerControl.fit = function(module,codes,cb){
		var bounds = new google.maps.LatLngBounds(); //将所有轨迹点显示于屏幕内
		var map  = null;
		for(var i in codes){
			var code = codes[i];
			if(typeof(codes[i]) == "object")
				code = codes[i].code;
			var marker = markerArray[module][code];
			if(marker){
				bounds.extend(marker.getPosition());
			}
			map = marker.getMap();
		}
		map.fitBounds(bounds);
		if(map.getZoom() == 21 ||  codes.length == 1){
			window.setTimeout(function(){
				map.setZoom(14);
				if(cb)
				   cb();
			}, 100);
			return false;
		}else{
			if(cb)
				cb();
		}
	};
	
};

/**
 * 事件控制
 */
var mapEventControl = function(){

	var eventArray = [];
	
	mapEventControl.bind = function(module,code,param,events,cb){
		var marker = markerControl.get(module,code);
		marker.param = param;
		var et = google.maps.event.addListener(marker, events, function(event) {
			cb(event,this.param,this.getMap());
		});
		if(!mapEventControl[module])
			mapEventControl[module] = [];
		mapEventControl[module].push(et);
	};
};
/**
 * 地图泡泡控制
 */
var balloonControl = function(){
	
		var _this = this;
		this.balloon = null;
		this.param = null;
		this.show = function(param){
				 if(param)
					 this.param = param;
				 else
					 param = this.param;
				 if(param.lat && param.lng)
					   param.map.setCenter(new google.maps.LatLng(parseFloat(param.lat)+1.1, parseFloat(param.lng)));
			      var myLatlng = new google.maps.LatLng(parseFloat(param.lat), parseFloat(param.lng));
			      var content =param.content;
			      
			      if (_this.balloon) {
			    	  _this.balloon.close();
			    	  _this.balloon.setContent(content[0]);
			    	  _this.balloon.setPosition(myLatlng);
			    	  _this.balloon.open(param.map,param.marker);
			    	  _this.setMapZoom(param.map,myLatlng);
			      } else {
			    	  _this.balloon = new google.maps.InfoWindow({
			              position: myLatlng,
			              content: content[0],
			              maxWidth: 400,
			              size: new google.maps.Size(1, 1)
			          });
			    	  _this.balloon.open(param.map,param.marker);
			    	  _this.setMapZoom(param.map,myLatlng);
			      } 
		};
		
		this.close =  function(){
			if(_this.balloon)
				_this.balloon.close();
		};
		
		this.setMapZoom = function(map,latLng){
			
//			window.setTimeout(function(){
//				var lat = null;
//				var lng = null;
//				var mapLatLng =  null;
//				if(map.getZoom() >= 12 && map.getZoom() <= 15){
//					lat = parseFloat(latLng.lat());
//					lng = parseFloat(latLng.lng());
//					mapLatLng = new google.maps.LatLng(lat,lng);
//					map.setCenter(mapLatLng);
//				}
//			}, 500);
		};
		return this;
};

var MSDOverlay = function(bounds, srcImage, map){
	USGSOverlay.prototype = new google.maps.OverlayView();
	function USGSOverlay(bounds, image, map) {
		 
	    this.bounds_ = bounds;
	    this.image_ = image;
	    this.map_ = map;

	    this.div_ = null;
	    this.setMap(map);
	  }
	USGSOverlay.prototype.onAdd = function() {
			    var div = document.createElement('DIV');
			    div.style.borderStyle = "none";
			    div.style.borderWidth = "0px";
			    div.style.position = "absolute";

			    var img = document.createElement("img");
			    img.src = this.image_;
			    div.appendChild(img);
			    this.img_ = img;
			    this.div_ = div;

			    var panes = this.getPanes();
			    panes.overlayImage.appendChild(div);
			  };
	USGSOverlay.prototype.draw = function() {
			    var overlayProjection = this.getProjection();
			    var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest());
			    var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast());

			    var div = this.div_;
			    div.style.left = sw.x + 'px';
			    div.style.top = ne.y + 'px';
			    div.style.width = (ne.x - sw.x) + 'px';
			    div.style.height = (sw.y - ne.y) + 'px';
			  };

	USGSOverlay.prototype.onRemove = function(cb) {
				
			    this.div_.parentNode.removeChild(this.div_);
			    this.div_ = null;
			    if(cb)
			    	cb();
			    this.setMap(null);
			    
			  };
	USGSOverlay.prototype.onHde = function() {
				$(this.div_).hide();
		    };			  
	
		 var  overlay = new USGSOverlay(bounds, srcImage, map);
		 return overlay;
		
};

/**
 * param.list : [{lat,lng,color,label,icon}]
 * param.maptype,
 * param.sizewidth
 * param.sizeheight
 * param.zoom
 * @return
 */
var staticMapsImage  = function(param){
	var url = "";
	for(var i in param.list){
		url += "&markers=icon:"+param.list[i].icon+"|color:"+param.list[i].color+"|label:"+param.list[i].label+"|"+param.list[i].lat+","+param.list[i].lng+"";
	}
	var size = param.sizewidth+"x"+param.sizeheight;
	return  "http://maps.google.com/maps/api/staticmap?center="+param.list[0].lat+","+param.list[0].lng+"&zoom="+param.zoom+"&size="+size+"&maptype="+param.maptype+url+"&sensor=false";	
};

markerControl();
mapEventControl();

