// 2007/09/28 making NSK k.matsuda
//
// <HTML> tag add ->  XMLNS:v="urn:schemas-microsoft-com:vml"
// example
// <HTML XMLNS="http://www.w3.org/1999/xhtml" XMLNS:v="urn:schemas-microsoft-com:vml">
//


/*

// example

var plist  = new movingon_polyline();

var mclist = { 'list' : [
{ id:'001-00000001',title:'xxxx xxx yyy',memo:'',lat:'36.5622448253664',lon:'136.650342119658',move_method:0,move_interval:'10Km 5分'},
{ id:'001-00000002',title:'aaaa bbb ccc',memo:'',lat:'36.5628003263556',lon:'136.650619848792',move_method:0,move_interval:'100m 3分'}
]};

var methoddata = [
 {id:'100', image:{ url:"/image/icon_man.png",  width:40, height:40, offsetw:undefined, offseth:undefined }, shadow:{ url:"/image/icon_man_shadow.png",  width:40, height:40, offsetw:undefined, offseth:undefined }, span:0.00005, name:'man' },
 {id:'200', image:{ url:"/image/icon_car.png",  width:40, height:40, offsetw:undefined, offseth:undefined }, shadow:{ url:"/image/icon_man_shadow.png",  width:40, height:40, offsetw:undefined, offseth:undefined }, span:0.0002, name:'car' },
];
 
var opt2 = {
         list: mclist.list,
         getgobjcall: (function(){return gitem.get_gmapobj();}),
         method: methoddata,
         showpolyline: 'on',
         start: 'on',
         set: { color: '#FF0000', pwidth: 20, alpha: 0.4 }
};

<BODY onLoad="plist.setup(opt2);">

*/


var movingon_polyline = function() { this.initialize.apply(this,arguments); };
movingon_polyline.prototype = {
	'initialize' : function()
	{
		this._gmapobj = undefined;
		this._points = [];
		this._method = [];
		this._timer = 100;
		this._cnt_max = 99999999;
		this._cnt = this._cnt_max;
		this._idx = -1;
		this._marker = undefined;
		this._cur = ( { lat:undefined, lon:undefined, point:undefined } );
		this._mapopt = ( { 'center':0, 'realtimefocus':0 } );
		this._run = 0;
		this._poly = ( { poly:[], color:"", width:1, alpha:1, gobj:undefined } );
		this._wait = ( { start:0, end:0, endflag:-1 } );
	},
	'settimer' : function(timer)
	{
		this._timer = timer;
	},
	'gmapobj_set' : function(gmapobj)
	{
		this._gmapobj = gmapobj;
                var selfthis = this;
                GEvent.addListener(this._gmapobj,"zoomend",function(ozoom,nzoom){selfthis.recalc_movemax();});
	},
	'method_add' : function(p)
	{
		var gicon = undefined;
		if(p.image.url != '')
		{
			var offsetw=0;
			var offseth=0;
			gicon = new GIcon();
			gicon.image = p.image.url;
			gicon.iconSize = new GSize(p.image.width,p.image.height);
			if(p.image.offsetw==undefined) { offsetw=Math.round(p.image.width/2);  } else { offsetw=p.image.offsetw; }
			if(p.image.offseth==undefined) { offseth=Math.round(p.image.height/2); } else { offseth=p.image.offseth; }
			gicon.iconAnchor = new GPoint(offsetw,offseth);
			// gicon.iconAnchor = new GPoint(0,0);

			if(p.shadow != undefined && p.shadow.url != undefined)
			{
// alert("image shadow : "+p.shadow.url);
				gicon.shadow = p.shadow.url;
				gicon.shadowSize = new GSize(p.shadow.width,p.shadow.height);
				gicon.shadowAnchor = new GSize(Math.round(p.shadow.width/2),-100);
			}
		}
		this._method[p.id] = { 'gicon':gicon, 'span':p.span, 'name':p.name };
	},
	'point_add' : function(lat,lon,method)
	{
		this._points.push( { 'lat':parseFloat(lat), 'lon':parseFloat(lon), 'method':method } );
		this._poly.poly.push(new GLatLng(parseFloat(lat),parseFloat(lon)));
	},
	'point_adds' : function(points)
	{
		for(var i=0;i<points.length;i++)
		{
			this.point_add(points[i].lat,points[i].lon,points[i].move_method);
		}
	},
	'go_move' : function()
	{
		if(this._wait.endflag!=1) { this._cnt++; }

		if(this._cnt>=this._cnt_max)
		{
			if(this._idx>=(this._points.length-2) && this._wait.endflag==0)
			{
				this._wait.endflag=1;
				this.start_wait(this._wait.end);
			}
			else
			{
				this._wait.endflag=0;

				this._go_move_startup();

				if(this._idx == 0)
				{
					this.start_wait(this._wait.start);
				}
				else
				{
					this.start_wait(this._wait.point);
				}
			}
		}

		var latw=(this._points[this._idx+1].lat-this._points[this._idx].lat)/this._cnt_max*this._cnt;
		var lonw=(this._points[this._idx+1].lon-this._points[this._idx].lon)/this._cnt_max*this._cnt;

		this._cur.lat = this._points[this._idx].lat+latw;
		this._cur.lon = this._points[this._idx].lon+lonw;

		this._cur.point = new GLatLng(this._cur.lat,this._cur.lon);
		this._marker.setPoint(this._cur.point);

		if(this._mapopt.realtimefocus && !this._gmapobj.getBounds().contains(this._cur.point)){this.focusnow();}
		if(this._mapopt.center) { this._gmapobj.setCenter(this._cur.point); }
		if(this._run) { var selfthis=this; setTimeout( (function(){selfthis.go_move();}), this._timer); }

	},
	'_go_move_startup' : function()
	{
		this._cnt = 0;
		this._idx++;
		if(this._idx>=(this._points.length-1)) { this._idx=0; }

		this.recalc_movemax();


/*
		var pp1 = { lat:this._points[this._idx  ].lat, lon:this._points[this._idx  ].lon };
		var pp2 = { lat:this._points[this._idx+1].lat, lon:this._points[this._idx+1].lon };
		var v = this.math_vect(pp1,pp2,2);
		this._cnt_max = (Math.round(v.rlen / this._method[ this._points[this._idx].method ].span));
		// this._cnt_max = (Math.round(v.rlen / this._method[ this._points[this._idx].method ].span))*(this._gmapobj.getZoom()/8);
		if(this._cnt_max<=0) { this._cnt_max=1; }
*/


		if(this._marker != undefined) { this._gmapobj.removeOverlay(this._marker); }

		this._marker = new GMarker(
			new GLatLng(this._points[this._idx].lat,this._points[this._idx].lon),
			{ 'icon' : this._method[ this._points[this._idx].method ].gicon }
			);

		this._gmapobj.addOverlay(this._marker);
	},
	'math_vect' : function(p1,p2,len)
	{
		var latwy = p2.lat - p1.lat;
		var lonwx = p2.lon - p1.lon;
		var rad = Math.atan2(latwy,lonwx);
		var rlatwy = Math.sin(rad) * len;
		var rlonwx = Math.cos(rad) * len;
		var rlen = 0;
		if(lonwx==0) { rlen = latwy / Math.sin(rad); } else { rlen = lonwx / Math.cos(rad); }
		return ({latw:rlatwy, lonw:rlonwx, rlen:rlen });
	},
        'recalc_movemax' : function()
	{
		var omax = this._cnt_max;
		var ocnt = this._cnt;

		var pp1 = { lat:this._points[this._idx  ].lat, lon:this._points[this._idx  ].lon };
		var pp2 = { lat:this._points[this._idx+1].lat, lon:this._points[this._idx+1].lon };
		var v = this.math_vect(pp1,pp2,2);

		var lw0 = this._gmapobj.fromDivPixelToLatLng(new GPoint(0,0));
		var lw1 = this._gmapobj.fromDivPixelToLatLng(new GPoint(this._method[ this._points[this._idx].method ].span,0));
		var llng = lw1.lng() - lw0.lng();

		// this._cnt_max = Math.round(v.rlen / this._method[ this._points[this._idx].method ].span);
		this._cnt_max = Math.round(v.rlen / llng);
		if(this._cnt_max<=0) { this._cnt_max=1; }

		this._cnt = Math.round( this._cnt_max * ocnt / omax);
	},
	'focusnow' : function()
	{
		this._gmapobj.panTo(this._cur.point);
	},
	'start' : function()
	{
		this._run = 1;
		this.go_move();
	},
	'stop' : function()
	{
		this._run = 0;
	},
	'start_wait' : function(waittime)
	{
		if(waittime != undefined && waittime>0)
		{
			var selfthis=this;
			this.stop();
			setTimeout((function(){selfthis.start();}),Math.round(waittime*1000));
		}
	},
	'end_wait' : function()
	{
		if(this._wait.end != undefined && this._wait.end>0)
		{
			var selfthis=this;
			this.stop();
			setTimeout((function(){selfthis.start_wait();}),this._wait.start*1000);
		}
	},
	'polyline_setup' : function(color,width,alpha)
	{
		this._poly.color = color;
		this._poly.width = width;
		this._poly.alpha = alpha;
	},
	'polyline_on' : function()
	{
		if(this._poly.gobj == undefined) { this._poly.gobj = new GPolyline(this._poly.poly, this._poly.color, this._poly.width, this._poly.alpha); }
		this._gmapobj.addOverlay(this._poly.gobj);
	},
	'polyline_off' : function()
	{
		this._gmapobj.removeOverlay(this._poly.gobj);
	},
	'setup' : function(p)
	{
		if(p.getgobjcall!=undefined) { this.gmapobj_set(p.getgobjcall()); }
		if(p.method!=undefined) { for(var i=0;i<p.method.length;i++){ this.method_add(p.method[i]); } }
		if(p.list!=undefined) { this.point_adds(p.list); }
		if(p.set!=undefined) { this.polyline_setup(p.set.color,p.set.pwidth,p.set.alpha); }
		if(p.showpolyline!=undefined && p.showpolyline=='on') { this.polyline_on(); }
		if(p.wait!=undefined && p.wait.start!=undefined) { this._wait.start=p.wait.start; }
		if(p.wait!=undefined && p.wait.point!=undefined) { this._wait.point=p.wait.point  }
		if(p.wait!=undefined && p.wait.end  !=undefined) { this._wait.end  =p.wait.end;   }
		if(p.start!=undefined && p.start=='on') { this.start(); }
	},
	'action_center' : function(flag)
	{
		if(flag=='on'    ) { this._mapopt.center =1; }
		if(flag=='off'   ) { this._mapopt.center =0; }
		if(flag=='toggle') { this._mapopt.center^=1; }
	},
	'action_realtimefocus' : function(flag)
	{
		if(flag=='on'    ) { this._mapopt.realtimefocus =1; }
		if(flag=='off'   ) { this._mapopt.realtimefocus =0; }
		if(flag=='toggle') { this._mapopt.realtimefocus^=1; }
	},
	'_get_center' : function(gmapobj,ar)
	{
		var lat,lon;
		var flag=0;
		var latmin=999;
		var lonmin=999;
		var latmax=-1;
		var lonmax=-1;
		var fitzoom = 16;
		var clat = 0;
		var clon = 0;

		for(var i=0;i<ar.length;i++)
		{
			var lat = parseFloat(ar[i].lat);
			var lon = parseFloat(ar[i].lon);

			if(latmin>lat){ latmin=lat; flag=1; }
			if(latmax<lat){ latmax=lat; flag=1; }
			if(lonmin>lon){ lonmin=lon; flag=1; }
			if(lonmax<lon){ lonmax=lon; flag=1; }
		}

		// gmapobj.setCenter(new GLatLng(clat,clon),setzoom);

		if(flag)
		{
			clat = (latmax+latmin)/2.0;
			clon = (lonmax+lonmin)/2.0;
			fitzoom = this._get_fitzoom(gmapobj,{lat:{max:latmax,min:latmin},lon:{max:lonmax,min:lonmin}});
		}

		return ({flag:flag, latmax:latmax, latmin:latmin, lonmax:lonmax, lonmin:lonmin, clat:clat, clon:clon, fitzoom:fitzoom });
	},
	'_get_fitzoom' : function (gmapobj,p)
	{
		var fitzoom = undefined;
		if(typeof(gmapobj)=='object')
		{
			fitzoom = gmapobj.getBoundsZoomLevel(
					new GLatLngBounds(
						new GLatLng(p.lat.min,p.lon.min),
						new GLatLng(p.lat.max,p.lon.max)
						)
					);
		}
		return fitzoom;
	},
	'_fitcenter' : function(gmapobj,ar)
	{
		var p = this._get_center(gmapobj,ar);
		// gmapobj.setCenter(new GLatLng(p.clat,p.clon),p.fitzoom);
		gmapobj.setZoom(p.fitzoom);
		gmapobj.panTo(new GLatLng(p.clat,p.clon));
	},
	'fitcenter' : function()
	{
		this._fitcenter(this._gmapobj,this._points);
	}
};


// var MovingPointline  = new movingon_polyline();


