﻿Namespace.register("How2go.Api");
How2go.Api={
	
	TICity:''
	,
    Level:''
    ,
	Map:''
	,
	
    GetMap:function(iframe,mapViewSizeX, mapViewSizeY,lat,lon,zoom,adjustX, adjustY, destScaleLevel,traffic)
            {
				//How2go.Load.Hidden();
				//return;
                this.Map=window.frames[iframe.name];
				setTimeout(
				function()
				{
				//alert('action=18&MapViewSizeX='+mapViewSizeX+'&MapViewSizeY='+mapViewSizeY+'&Lat='+lat+'&Lon='+lon+'&Zoom='+zoom+'&AdjustX='+adjustX+'&AdjustY='+adjustY+'&DestScaleLevel='+destScaleLevel+'&Traffic='+traffic+'');	
				 How2go.Ajax.Post('How2go.cn.getmap',
            'action=18&MapViewSizeX='+mapViewSizeX+'&MapViewSizeY='+mapViewSizeY+'&Lat='+lat+'&Lon='+lon+'&Zoom='+zoom+'&AdjustX='+adjustX+'&AdjustY='+adjustY+'&DestScaleLevel='+zoom+'&Traffic='+traffic+'',{oncomplate:function(){
				//setTimeout(function(){
                var json=eval(How2go.Ajax.ResponseText['How2go.cn.getmap']);
                        if (!json[0].Status)
                        {                            
                            How2go.Api.Error();               
                        } 
						else
						{
							How2go.Api.getGRBSuccess(json);
						}
                   // },50);
                }
            }
        );	
			//	}
				// return;
//					
//                if (!traffic)
//                   {
//                    WebServices.MView.GetGRBJSON(
//                                mapViewSizeX,
//                                mapViewSizeY,
//                                zoom,
//                                lon,
//                                lat,
//                                adjustX,
//                                adjustY,
//                                zoom,
//                                How2go.Api.getGRBSuccess,How2go.Error);
//                      }
//                       else
//                       {
//                            WebServices.Traffic.GetGRBJSON(
//                                mapViewSizeX,
//                                mapViewSizeY,
//                                zoom,
//                                lon,
//                                lat,
//                                adjustX,
//                                adjustY,
//                                zoom,
//                                How2go.Api.getGRBSuccess,How2go.Api.Error);
//                       }
				}
				,10
				)
            }
			,Error:function()
			{
				alert('error');
			}
            ,
            getGRBSuccess:function(result)
	            {
					How2go.Api.Map.How2go.DMView(result);
	            }
			,getXY2LL:function(x,y,mapLat,mapLon,mapZoom) //把经纬度转为坐标系
			{
				if (mapZoom>=10){mapZoom=10};
					//How2go.Api.Level='1,10,8;
					var level=this.Level.split(';');
					var scaleLon=level[mapZoom-1].split(',')[2];//.ScaleLon;
					var scaleLat=level[mapZoom-1].split(',')[1];					
					var dx=-x;//parseFloat(x-parseInt(this.Width)/2);
					var dy=-y;//parseFloat(y-parseInt(this.Height)/2);
					var dLon=dx/scaleLon;
					var dLat=dy/scaleLat;					
					var ll=new Array();
					ll.Lon=parseFloat(mapLon) + parseFloat(dLon);
					ll.Lat=parseFloat(mapLat) - parseFloat(dLat);	
					return ll;					
			}
			,
			getLL2XY:function(lat,lon,mapLat,mapLon,mapZoom,mapWidth,mapHeight) //把经纬度转为坐标系
			{
				if (mapZoom>=10){mapZoom=10};
				var level=this.Level.split(';');
				var scaleLon=level[mapZoom-1].split(',')[2];//.ScaleLon;
				var scaleLat=level[mapZoom-1].split(',')[1];;	
				var dLon = parseFloat(lon) - parseFloat(mapLon);
				var dLat = parseFloat(lat) - parseFloat(mapLat);
				var dx = dLon * scaleLon;
				var dy = dLat * scaleLat;
				var xy=new Array();
				xy.X = parseInt(mapWidth) / 2 + parseFloat(dx); //注意四舍五入
				xy.Y = parseInt(mapHeight) / 2 - parseFloat(dy); //注意四舍五入
				return xy;
			}			
			,
			GetCLL:function(iframeName)
			{
				this.Map=window.frames[iframeName];
				var g=this.getXY2LL(parseInt(this.Map.How2go.Width)/2+parseInt(this.Map.How2go.OffsetX),parseInt(this.Map.How2go.Height)/2+parseInt(this.Map.How2go.OffsetY),this.Map.How2go.Lat,this.Map.How2go.Lon,this.Map.How2go.Zoom);	
				return g;
			}
			,GetCTCity:function(iframe,lat,lon,zoom)
			{
				//How2go.Load.Hidden();
				//return;
				this.Map=window.frames[iframe.name];
				//setTimeout(
//				function()
//				{
					
					 How2go.Ajax.Post('How2go.cn.getctcity',
            'action=19&Lat='+lat+'&Lon='+lon+'&Zoom='+zoom+'',{oncomplate:function(){
				//setTimeout(function(){
                var json=eval(How2go.Ajax.ResponseText['How2go.cn.getctcity']);
                       // if (!json[0].Status)
                       // {                            
                           // How2go.Api.Error();               
                        //} 
						//else
						//{
							How2go.Api.getCTCitySuccess(json);
						//}
                    //},500);
                }
            }
        );	
				//}
					 
				//WebServices.Traffic.GetCurrentCityInfoJSON(
//                                zoom,
//                                lon,
//                                lat,
//                                How2go.Api.getCTCitySuccess,How2go.Api.Error);
//				}
				//,100
//				)
			}
			,getCTCitySuccess:function(result)
			{
					How2go.Api.Map.How2go.SetCTCity(result);			
			}
			,
			ScaleLon:function(lat,lon,zoom)
			{
				if (zoom>=10){zoom=10};
				var level=this.Level.split(';');
				var scaleLon=level[zoom-1].split(',')[2];//.ScaleLon;
				
						var DEG2RAD = Math.PI / 180.0;
						var DIFF_LAT = (2 * Math.PI * 6378137.0) / 360.0;
						var d = lat;
						d *= DEG2RAD;   //DEG2RAD = PI/180.0
						d = DIFF_LAT * Math.cos(d); 
						var d2 = scaleLon;
						var scale=0;
						if (d2 > 0)
						{
							scale = 80/ d2;
							scale *= d;
						}
							var sl;
							var c=parseInt(parseInt(scale)/1000);
							if (c>=1)
							{
								sl=''+parseInt(parseInt(scale)/1000).toFixed(0)+'公里';
							}
							else
							{
								sl=''+scale.toFixed(0)+'米';
							}
				return sl;
			}
			
	,		
	Intersect:function(x1,y1,x2,y2,l,t,r,b,h)
	{
		var points=new Array();
        var exist=false;
        points.True=false;
		if (this.InArea(l,t,r,b,x1,y1))
		{
			exist=true;
            points.True=true;
			points.X=x1;
			points.Y=y1;
			//return points;
		}
		else
		{
			if (x1!=x2 && y1!=y2)
			{
			
					var poi=new Array();
						poi.length=4;
						poi[0]=this.IntersectPoi(x1,y1,x2,y2,l,b,l,t,l,t,r,b);
						poi[1]=this.IntersectPoi(x1,y1,x2,y2,l,t,r,t,l,t,r,b);
						poi[2]=this.IntersectPoi(x1,y1,x2,y2,r,b,r,t,l,t,r,b);
						poi[3]=this.IntersectPoi(x1,y1,x2,y2,l,b,r,b,l,t,r,b);
				var j=-1;
					var minX=999999999;
					var maxX=-999999999;
					for(var i=0;i<4;i++)
					{
						if (this.InArea(l,t,r,b,poi[i].X,poi[i].Y))
							{
								if (parseInt(x1)<=parseInt(x2))
								{
									if (parseInt(poi[i].X)<=parseInt(minX) && parseInt(x2)>=parseInt(poi[i].X) && parseInt(poi[i].X)>=parseInt(x1))
									{
										minX=poi[i].X;
										j=i;
									}
								}
								else
								{
									if (parseInt(poi[i].X)>=parseInt(maxX) && parseInt(x1)>=parseInt(poi[i].X) && parseInt(poi[i].X)>=parseInt(x2))
									{
										maxX=poi[i].X;
										j=i;
									}
								}
							}
					}
						if (j!=-1)
						{
							exist=true;
							points.True=true;
							points.X=poi[j].X;
							points.Y=poi[j].Y;
						}
			}
			
			else
			
			{
					if (x1==x2 || y1==y2)//是平行线
        {            
        	if (x1==x2)
            {
            	//相交两点 (x1,b);(x1,t)
                	if (y1<y2)//与下线相交
                    {
                    	if (y1<=b && b<=y2)
                        {
                        	points.True=true;
                            points.X=x1;
                            points.Y=b;
                        }
                    }
                    else
                    {
                    	if (y2<=t && t<=y1)//与上线相交
                        {
                        	points.True=true;
                            points.X=x1;
                            points.Y=t;
                        }
                    }
            }
            else (y1==y2)
            {
            	//相交两点 (l,y1);(r,y1)
                	if (x1<x2)//与左线相交
                    {
                    	if (x1<=l && l<=x2)
                        {
                        	points.True=true;
                            points.X=l;
                            points.Y=y1;
                        }
                    }
                    else
                    {
                    	if (x2<=r && r<=x1)//与右线相交
                        {
                        	points.True=true;
                            points.X=r;
                            points.Y=y1;
                        }
                    }
            }
			
        }
			
			
			}
			
		}	
		
        if (points.True)
        {
        	points.Y=h-points.Y;
        }
		return points;	
	}
	,
	IntersectPoi:function (x1,y1,x2,y2,x3,y3,x4,y4)
	{
		var xy=new Array();
		var d = (y2-y1)*(x4-x3)-(y4-y3)*(x2-x1);
		xy.True=true;
		xy.X= ((x2-x1)*(x4-x3)*(y3-y1)+(y2-y1)*(x4-x3)*x1-(y4-y3)*(x2-x1)*x3)/d; 
		xy.Y=  -((y2-y1)*(y4-y3)*(x3-x1)+(x2-x1)*(y4-y3)*y1-(x4-x3)*(y2-y1)*y3)/d;
		return xy;
	}
	,
	InArea:function(l,t,r,b,x,y)
	{
		if (l<=x && x<=r && b<=y && y<=t )
		{
			return(true);
		}
		else
		{
			return(false);
		}
	}
	,Convert:function(points,l,t,r,b,h,buffer,left,top)
	{
		var poi='';
		var pp=points.split(',');
		var xx=-888888;var yy=-888888;
		
		var xx=0;
		var yy=0;	
		var out=false;
		var exists=false;
	
		for (var i=0;i<((pp.length)/2-1);i++)
		{
			//w->300 h->200 buffer-50
			var x1;var y1;var x2;var y2;
	   
	   		if (i<=(pp.length/2-2))
				{
                x1=pp[i*2]-left;
				y1=pp[i*2+1]-top;
				x2=pp[(i+1)*2]-left;
				y2=pp[(i+1)*2+1]-top;
				}
				else
				{
					x1=pp[i*2]-left;
					y1=pp[i*2+1]-top;
					x2=pp[(i-1)*2]-left;
					y2=pp[(i-1)*2+1]-top;
				}
	   
	   
				
				
			var ect=this.Intersect(x1,(h-y1),x2,(h-y2),l,t,r,b,h);
			if (ect.True)
			{
			   // if (add)
				//{
					//add=false;
					if (exists && out)
					{
						if (xx==l)//最后点在左线
						{
							if (ect.Y==(-buffer))
							{
								poi +=','+(l+parseInt(left))+','+(-buffer+parseInt(top));
							}
							else if (ect.X==r)
							{
								poi +=','+(l+parseInt(left))+','+(-buffer+parseInt(top));
								poi +=','+(r+parseInt(left))+','+(-buffer+parseInt(top));
							}
							else if (ect.Y==(h+buffer))
							{
								poi +=','+(l+parseInt(left))+','+(h+buffer+parseInt(top));
							}
						}
						else if (xx==r)//最后点在右线
						{
							if (ect.Y==(-buffer))
							{
								poi +=','+(r+parseInt(left))+','+(-buffer+parseInt(top));
							}
							else if (ect.X==l)
							{
								poi +=','+(r+parseInt(left))+','+(-buffer+parseInt(top));
								poi +=','+(l+parseInt(left))+','+(-buffer+parseInt(top));
							}
							else if (ect.Y==(h+buffer))
							{
								poi +=','+(r+parseInt(left))+','+(h+buffer+parseInt(top));
							}
						}
						else
						{
							if (yy==(-buffer))//最后点在上线
								{
									if (ect.X==l)
										{
											poi +=','+(l+parseInt(left))+','+(-buffer+parseInt(top));
										}
										else if (ect.X==r)
										{
											poi +=','+(r+parseInt(left))+','+(-buffer+parseInt(top));
										}
										else if (ect.Y==(h+buffer))
										{
											poi +=','+(r+parseInt(left))+','+(-buffer+parseInt(top));
											poi +=','+(r+parseInt(left))+','+(h+buffer+parseInt(top));
										}
								}
								else if (yy==(h+buffer))//最后点在下线
								{
									if (ect.X==l)
										{
											poi +=','+(l+parseInt(left))+','+(h+buffer+parseInt(top));
										}
										else if (ect.X==r)
										{
											//alert('ccc');
											poi +=','+(r+parseInt(left))+','+(h+buffer+parseInt(top));
										}
										else if (ect.Y==(-buffer))
										{
											poi +=','+(r+parseInt(left))+','+(h+buffer+parseInt(top));
											poi +=','+(r+parseInt(left))+','+(-buffer+parseInt(top));
										}
								}
						}
					}
				//}
			   if (poi==''){poi=(ect.X+parseInt(left))+','+(ect.Y+parseInt(top));}else{poi +=','+(ect.X+parseInt(left))+','+(ect.Y+parseInt(top));}	 
				//if (poi==''){poi=ect.X+','+ect.Y;}else{poi +=','+ect.X+','+ect.Y;}	
				
						ect=this.Intersect(x2,(h-y2),x1,(h-y1),l,t,r,b,h);
						if (poi==''){poi=(ect.X+parseInt(left))+','+(ect.Y+parseInt(top));}else{poi +=','+(ect.X+parseInt(left))+','+(ect.Y+parseInt(top));}	
						xx=ect.X;
						yy=ect.Y;
						
				 xx=ect.X;
				   yy=ect.Y;
					
					out=false;
					exists=true;
		}
        else
        {
        	out=true;
        }
			
		}
			return poi;
	}
	,GetRectLevel:function( lowLat,lowLon, upLat, upLon,w,h)
        {

            var centerLon, centerLat;
            centerLon = (parseFloat(lowLon) + parseFloat(upLon)) / 2.0;
            centerLat = (parseFloat(lowLat) + parseFloat(upLat)) / 2.0;

            var dLon = upLon - lowLon;
            var dLat = upLat - lowLat;
            if (dLon < 0.0) dLon = -dLon;
            if (dLat < 0.0) dLat = -dLat;
            if (dLon <= 0.00000001)
            {
                return 1;
            }
            if (dLat <= 0.00000001)
            {
                return 1;
            }

            var iScaleLon = parseInt(w) / dLon;
            var iScaleLat = parseInt(h) / dLat;

var level=this.Level.split(';');
				//	var scaleLon=level[mapZoom-1].split(',')[2];//.ScaleLon;
				//	var scaleLat=level[mapZoom-1].split(',')[1];	
					
            var nLvl;
            var m_nLvlNum = 11;
            for (nLvl = 1; nLvl < m_nLvlNum; ++nLvl)
            {
                if (parseInt(level[nLvl-1].split(',')[2])> iScaleLon)
                    break;
                if ( parseInt(level[nLvl-1].split(',')[1]) > iScaleLat)
                    break;
            }
            nLvl =nLvl-1;
            if (nLvl == 0) nLvl = 1;
            return nLvl;
        }
		,GetScaleLength:function(x1,y1,x2,y2,lat,lon,zoom)
        {
			if (x1==x2 && y1==y2)
			{
				return 0;	
			}
			var nPixelLength=Math.sqrt(parseInt((x2-x1)*(x2-x1))+parseInt((y2-y1)*(y2-y1)));
			//nPixelLength
            var DEG2RAD = Math.PI / 180.0;
            var DIFF_LAT = (2 * Math.PI * 6378137.0) / 360.0;

            if (nPixelLength < 0)
                return 0;

            //var lon = this.Lon, lat = this.Lat;

            var d = lat;
            d *= DEG2RAD;   //DEG2RAD = PI/180.0
            d = DIFF_LAT * Math.cos(d);  //DIFF_LAT = (2 * PI * EARTH_RADIUSE) / 360.0,  EARTH_RADIUSE=6378137.0     //in m

            //double d2 = ScaleLon; //   ScaleLon is the scale of the current map view
			var level=this.Level.split(';'); 
			
            var d2 =level[zoom-1].split(',')[2];

            if (d2 <= 0)
                return 0;

            var scale = nPixelLength/ d2;
            scale *= d;
            return scale;
        }
	,Distance:function(length)
	{
		var cl='0米';
                var c=parseInt(parseInt(length)/1000);
                if (c>=1)
                {
                    var bl=parseInt(length-parseInt(c)*1000);
                    
                    if (bl==0)
                    {
                    	cl=c+' 公里';
                    }
                    else
                    {
                    	cl=c+'.'+(bl/1000).toFixed(1)*10+' 公里';
                    }
                }
                else
                {
                    cl=length.toFixed(1)+'米';
                }	
			return cl;
	}
	
		,Style:''
		,Code:''

}
