/*
License: GNU General Public License

This file is part of VisuGps

VisuGps is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

VisuGps is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with VisuGps; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

Copyright (c) 2007 Victor Berchet, <http://www.victorb.fr>

Credits:
        - This script uses a modified version of chart by WebFX.
          <http://webfx.eae.net/dhtml/chart/chart.html>
        - Some code is inspired from by the Google Maps API tutorial of
          Mike Williams <http://www.econym.demon.co.uk/googlemaps/index.htm>

*/
var Charts=new Class({Implements:[Events,Options],options:{cursor:true,keySupport:true,onMouseMove:$empty,onMouseDown:$empty,onMouseWheel:$empty},initialize:function(div,options){this.setOptions(options);this.chartDiv=$(div);this.charts=[];this.sortable=null;this.curPos=0;this.position=0;if(this.options.cursor){this.cursorDiv=new Element('div',{'styles':{'position':'absolute','border-left':'dashed 1px #508','width':0,'z-index':80,'visibility':'hidden'}}).inject($(div)).addEvents({'mousedown':this._down.bindWithEvent(this),'mousewheel':this._wheel.bindWithEvent(this)});}
$(div).addEvents({'mousemove':this._move.bindWithEvent(this),'mousedown':this._down.bindWithEvent(this),'mousewheel':this._wheel.bindWithEvent(this)});if(this.options.keySupport)document.addEvent('keydown',this._move.bindWithEvent(this));function stopEvent(event,notOnSort){new Event(event).stop();};this.sliderPanel=new Element('div',{'events':{'mousedown':stopEvent,'mousewheel':stopEvent},'id':'vgps-sliderPanel'}).inject($(div));var handle=new Element('div',{'id':'sliderPanel-handle'}).inject(this.sliderPanel);this.sliders=new Element('div').inject(this.sliderPanel);this.sliderPanel.makeDraggable({'handle':handle,'container':this.chartDiv});},draw:function(){if(this.charts.length){this.charts.each(function(chart){chart.draw();});if(!this.sortable){function stopSort(){var order=this.sortable.serialize();order.each(function(item,index){$(item.replace('slider','chart')).setStyle('z-index',20-index);});};this.sortable=new Sortables(this.sliders,{'handle':'.handle','onComplete':stopSort.bind(this),'constrain':this.sliders});}
if(this.options.cursor){var dim=this.charts[0].getCoordinates();this.cursorDiv.setStyles({'top':dim.top,'height':dim.height});}}},add:function(label,opacity,color,options){label=$pick(label,'label');opacity=$pick(opacity.limit(0,1),1);color=$pick(color,'#f00');function setOpacity(opacity){div.setStyle('opacity',opacity/100);}
var idNum=this.charts.length;var div=new Element('div',{'class':'chart vgps-chart','styles':{'opacity':opacity},'id':'chart-'+idNum}).inject(this.chartDiv,'top');var chart=new Chart(div,$pick(options,{}));this.charts.push(chart);new Element('table',{'id':'slider-'+idNum}).adopt(new Element('tbody').adopt(new Element('tr').adopt([new Element('td',{'class':'handle','id':'hanlde-'+idNum,'html':label}),new Element('td',{'class':'bar','id':'bar-'+idNum})]))).inject(this.sliders);new SliderProgress($('bar-'+idNum),{'color':color,'onChange':setOpacity}).set(opacity*100);return chart;},setCursor:function(pos){if(this.options.cursor&&this.charts.length){var dim=this.charts[0].getCoordinates();this.position=pos=pos.limit(0,1000);var left=dim.left+this.chartDiv.getPosition().x;var x=(pos*dim.width/1000)+left;this.cursorDiv.setStyle('left',x);this.showCursor();}},showCursor:function(visible){if(this.options.cursor){visible=$pick(visible,true);this.cursorDiv.setStyle('visibility',visible?'visible':'hidden');}},clean:function(){this.showCursor(false);this.chartDiv.empty();},_move:function(event){if(this.charts.length){var pos=this.position;if(event.type.contains('key')){var offset=0;if(event.key==='left')offset=-1;if(event.key==='right')offset=1;if(offset!=0)event.stop();offset=event.shift?10*offset:offset;pos+=offset;}else{var x=event.page.x;var dim=this.charts[0].getCoordinates();var left=dim.left+this.chartDiv.getPosition().x;x=x<left?left:x;x=x>(left+dim.width)?left+dim.width:x;pos=(1000*(x-left)/dim.width).toInt();}
pos=pos.limit(0,1000);this.setCursor(pos);this.fireEvent('onMouseMove',pos);}},_down:function(event){this.fireEvent('onMouseDown',this.position);},_wheel:function(event){this.fireEvent('onMouseWheel',[this.position,event.wheel]);}});var SliderProgress=new Class({Implements:[Events,Options],options:{onChange:$empty,onComplete:$empty,mode:'horizontal',steps:100,color:'#f00',border:1,opacity:0.6},initialize:function(el,options){this.setOptions(options);var opt=this.options;this.element=$(el);opt.border?this.element.setStyle('border-width',opt.border):opt.boder=0;this.capture=false;this._mouseMoveWrapper=this._mouseMove.bindWithEvent(this);this._updateDim();switch(opt.mode){case'horizontal':this.valStyle='width';this.valRef='left';this.valMod='x';this.max=this.dim.width;break;case'vertical':this.valStyle='height';this.valRef='top';this.valMod='y';this.max=this.dim.height;break;}
this.bar=new Element('div',{'styles':{'height':this.dim.height,'width':this.dim.width,'float':'left','background':opt.color,'opacity':opt.opacity}}).inject(this.element);this.value=0;this.element.addEvents({'mouseup':this._mouseUp.bindWithEvent(this),'mouseleave':this._mouseUp.bindWithEvent(this),'mousedown':this._mouseDown.bindWithEvent(this)});if(opt.initialize)opt.initialize.call(this);},set:function(value){this._checkValue(value);this._update(this._toPosition(this.value));return this;},_mouseDown:function(event){this._startCapture();this._updateDim();this._update(event.page[this.valMod]-this.dim[this.valRef]);},_mouseUp:function(event){if(!this.capture){return;}
this._endCapture();var position=event.page[this.valMod]-this.dim[this.valRef];this._update(position);var value=this._toStep(position);this._change('onChange',value);this._change('onComplete',value);},_mouseMove:function(event){var position=event.page[this.valMod]-this.dim[this.valRef];this._update(position);this._checkValue(this._toStep(position));},_checkValue:function(value){if(this.value!=value){this.value=value;this._change('onChange',value);}},_toStep:function(position){return(position/this.dim[this.valStyle]*this.options.steps).round();},_toPosition:function(value){return this.dim[this.valStyle]*value/this.options.steps;},_update:function(pos){this.bar.setStyle(this.valStyle,pos.limit(0,this.max));},_change:function(event,value){this.fireEvent(event,value.limit(0,this.options.steps))},_startCapture:function(){this.element.addEvent('mousemove',this._mouseMoveWrapper);this.capture=true;},_endCapture:function(){this.element.removeEvent('mousemove',this._mouseMoveWrapper);this.capture=false;},_updateDim:function(){this.dim=this.element.getCoordinates();this.dim.width-=2*this.options.border;this.dim.height-=2*this.options.border;}});var VisuGps=new Class({Implements:Options,options:{mapDiv:'map',chartDiv:'vgps-chartcont',loadDiv:'load',elevTileUrl:null,weatherTileUrl:null,measure:true,measureCfd:true,maxSpeed:80,maxVario:10,maxElev:9999,showIgnMap:true},initialize:function(options){this.setOptions(options);this.map={};this.track={};this.points=[];this.charts=null;this.marker={};this.marker3d=null;this.model3d=null;this.init3dMap=true;this.orientation=null;this.path=null;this.timer=null;this.infoCtrl={};this.titleCtrl={};this.nfo=null;this.animTimer=null;this.animPos=0;this.animDelay={'min':1,'max':120,'val':60};this.mapTitle='VisuGps';this.ge=null;this.iFrameShim=false;this.mapSwitcher=null;this.ignMap=null;this.distPts={};this.distState=0;this.distLine={};if(GBrowserIsCompatible()){var map=$(this.options.mapDiv);if(!map)return;this.map=new google.maps.Map2(map,{mapTypes:[G_PHYSICAL_MAP,G_HYBRID_MAP,G_SATELLITE_MAP,G_NORMAL_MAP,G_SATELLITE_3D_MAP]});this.map.setCenter(new google.maps.LatLng(46.73986,2.17529),5,G_PHYSICAL_MAP);this.map.addControl(new google.maps.MapTypeControl());this.map.addControl(new google.maps.LargeMapControl());this.map.addControl(new google.maps.ScaleControl());this.map.enableScrollWheelZoom();this.map.disableDoubleClickZoom();this._createTitleControl('VisuGps');this.map.addControl(this.titleCtrl);}},clean:function(){google.maps.Unload();frames.ign.destroy();if(this.charts)this.charts.clean();window.removeEvents('resize');},setTrack:function(track){this.track=track;var opt=this.options;var load=$(opt.loadDiv);if($defined(track.error)){if(load){load.set('html',track.error);new Fx.Styles(load,{transition:Fx.Transitions.linear}).start({'opacity':0.9,'background-color':'#ff2222'});}
return;}
if($defined(track.kmlUrl)){var me=this;var kml=new google.maps.GeoXml(track.kmlUrl,function(){if(kml.loadedCorrectly()){kml.gotoDefaultViewport(me.map);me.map.addOverlay(kml);if(load){load.fade('out');}
$(me.options.chartDiv).set('html','<p style="text-align:center;margin:20px;font:10px Verdana, Arial, sans-serif;">'+'<b>No graph available for KML files</b>'+'</p>');}});}else{this._createInfoControl();this.map.addControl(this.infoCtrl);this.nfo=$('vgps-nfofield');var bounds=new google.maps.LatLngBounds();var point={};for(var i=0;i<this.track.nbTrackPt;i++){point=new google.maps.LatLng(this.track.lat[i],this.track.lon[i]);this.points.push(point);bounds.extend(point);}
var maxSpeed=opt.maxSpeed;var maxVario=opt.maxVario;var minVario=-maxVario;var maxElev=opt.maxElev;for(i=this.track.nbChartPt-1;i>=0;i--){this.track.speed[i]=this.track.speed[i].limit(0,maxSpeed);this.track.vario[i]=this.track.vario[i].limit(minVario,maxVario);this.track.elev[i]=this.track.elev[i].limit(0,maxElev);}
this.map.setCenter(bounds.getCenter(),this.map.getBoundsZoomLevel(bounds));this._displayTrack();this.marker=new google.maps.Marker(this.points[0],{clickable:false});this._showMarker(0);this.map.addOverlay(this.marker);google.maps.Event.addListener(this.map,'moveend',this._displayTrack.bind(this));google.maps.Event.addListener(this.map,'maptypechanged',this._mapTypeChanged.bind(this));window.addEvent('resize',this._resize.bind(this));this.mapTitle=[this.track.date.day,this.track.date.month,this.track.date.year].join('/');if((this.mapTitle!=='0/0/0')&&($type(opt.weatherTileUrl)==='array')){this._createModisMap(this.track.date.day,this.track.date.month,this.track.date.year);}
if(this.track.pilot)this.mapTitle+='<br/>'+this.track.pilot;this.titleCtrl.setText(this.mapTitle);if($type(opt.elevTileUrl)==='array'){this._createSrtmMap();}
var h=$('vgps-anim').getParent().getCoordinates().height+
$('vgps-anim').getCoordinates().height;$('vgps-anim').getParent().setStyle('height',h);this._initGraph();if(load){load.fade('out');}}
if(opt.showIgnMap){document.getElementById('ign').src='./ign.html';}
google.maps.Event.addListener(this.map,'click',this._leftClick.bind(this));if(opt.measure){google.maps.Event.addListener(this.map,'singlerightclick',this._rightClick.bind(this));}},initIgnMap:function(){this.ignMap=frames.ign;if($defined(this.track.kmlUrl)){this.ignMap.setTrackKml('php/vg_directproxy.php?url=',this.track.kmlUrl);}else{this.ignMap.setTrack(this.track.lat,this.track.lon);}
this.mapSwitcher=new Element('div',{'id':'vgps-mapSwitcher'}).inject(this.options.chartDiv,'top');this.mapSwitcher.set('html','google');this.mapSwitcher.addEvent('click',this._switchMap.bind(this));},ignLeftClick:function(lat,lon){this._leftClick(null,new google.maps.LatLng(lat,lon));},_switchMap:function(){if(this.mapSwitcher.get('html')=='google'){$('ignwrap').setStyle('left',0);$(this.options.mapDiv).setStyle('left',-5000);this.mapSwitcher.set('html','ign');this._resize();}else{$('ignwrap').setStyle('left',-5000);$(this.options.mapDiv).setStyle('left',0);this.mapSwitcher.set('html','google');}},_gePluginInit:function(ge){if(!$defined(this.track.kmlUrl)){this.ge=ge;var lineString;lineString=ge.createLineString('');var lineStringPlacemark=ge.createPlacemark('');lineStringPlacemark.setGeometry(lineString);lineString.setTessellate(false);var text='';for(var i=0;i<this.track.nbTrackPt;i++){lineString.getCoordinates().pushLatLngAlt(this.track.lat[i],this.track.lon[i],this._getTrackElevation(i));}
ge.getFeatures().appendChild(lineStringPlacemark);lineString.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);google.earth.addEventListener(ge.getWindow(),"mousedown",this._leftClick3d.bind(this));if(!lineStringPlacemark.getStyleSelector()){lineStringPlacemark.setStyleSelector(ge.createStyle(''));}
var lineStyle=lineStringPlacemark.getStyleSelector().getLineStyle();lineStyle.setWidth(1);lineStyle.getColor().set('ff0000ff');var placemark=ge.createPlacemark('Pilot');ge.getFeatures().appendChild(placemark);this.model3d=ge.createModel('');var link=ge.createLink('');link.setHref('http://victorb.fr/visugps/img/paraglider.dae');this.model3d.setLink(link);placemark.setGeometry(this.model3d);this.marker3d=ge.createLocation('');this.model3d.setLocation(this.marker3d);this.orientation=ge.createOrientation('');this.model3d.setOrientation(this.orientation);var scale=ge.createScale('');scale.set(50,50,50);this.model3d.setScale(scale);this.model3d.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);this._set3dPosition(0);}},_set3dPosition:function(index){this.marker3d.setLatLngAlt(this.track.lat[index],this.track.lon[index],this._getTrackElevation(index));var i=index+1;if(i>=this.track.nbTrackPt)j=this.track.nbTrackPt-1;var angle;var deltaLat=this.track.lat[i]-this.track.lat[index];var deltaLon=this.track.lon[i]-this.track.lon[index];if(deltaLon==0){angle=deltaLat>0?Math.PI/2:3*Math.PI/2;}else{angle=Math.atan(deltaLat/deltaLon);if(deltaLon<0){angle=Math.PI+angle;}}
angle=angle*180/Math.PI;angle=90-angle;angle=angle+255;if(angle<0)angle+=360;if(angle>360)angle-=360;this.orientation.setHeading(angle);},_leftClick3d:function(kmlEvent){var point=new google.maps.LatLng(kmlEvent.getLatitude(),kmlEvent.getLongitude());this._leftClick(null,point);},_mapTypeChanged:function(){if(this.map.getCurrentMapType()==G_SATELLITE_3D_MAP){if(this.path){this.map.removeOverlay(this.path);if(this.init3dMap){this.map.getEarthInstance(this._gePluginInit.bind(this));this.init3dMap=false;}
new IFrame({src:'javascript:false','frameborder':0,'scrolling':'no',styles:{width:'100%',height:'100%',border:'0',position:'absolute',font:'1px',top:0,left:0,zIndex:-10000}}).inject(this.titleCtrl.div);new IFrame({src:'javascript:false','frameborder':0,'scrolling':'no',styles:{width:'100%',height:'100%',border:'0',position:'absolute',font:'1px',top:0,left:0,zIndex:-10000}}).inject(this.infoCtrl.div);this.iFrameShim=true;}}else{if(this.iFrameShim){this.titleCtrl.div.getFirst('iframe').dispose();this.infoCtrl.div.getFirst('iframe').dispose();this.iFrameShim=false;}
this._displayTrack();}},_getTrackElevation:function(index){index=index*(this.track.nbChartPt-1)/(this.track.nbTrackPt-1);var i=index.round();var j=i+1;if(j>=this.track.nbChartPt)j=this.track.nbChartPt-1;return this.track.elev[i]+(index-i)*(this.track.elev[j]-this.track.elev[i]);},downloadTrack:function(url){new Request.JSON({'url':'php/vg_proxy.php?track='+url,onSuccess:this.setTrack.bind(this)}).send();},_toggleAnim:function(e){if(e.rightClick){this.animPos=0;$clear(this.animTimer);this.animTimer=null;var playGif=$('vgps-anim').getStyle('background-image').replace(/pause/,'play');$('vgps-anim').setStyle('background-image',playGif);this._animate();}else{if(this.animTimer===null){this.animTimer=this._animate.periodical(this.animDelay.val,this);this.charts.showCursor(true);var pauseGif=$('vgps-anim').getStyle('background-image').replace(/play/,'pause');$('vgps-anim').setStyle('background-image',pauseGif);}else{$clear(this.animTimer);this.animTimer=null;var playGif=$('vgps-anim').getStyle('background-image').replace(/pause/,'play');$('vgps-anim').setStyle('background-image',playGif);}}},_setAnimDelay:function(val){this.animDelay.val=this.animDelay.min+
(100-val)/100*(this.animDelay.max-this.animDelay.min);if(this.animTimer!==null){$clear(this.animTimer);this.animTimer=this._animate.periodical(this.animDelay.val,this);}},_animate:function(){if(this.animPos>=1000){this.animPos=0;$clear(this.animTimer);this.animTimer=null;var playGif=$('vgps-anim').getStyle('background-image').replace(/pause/,'play');$('vgps-anim').setStyle('background-image',playGif);}else{this._showMarker(this.animPos);this.charts.setCursor(this.animPos++);if(!this.map.getBounds().contains(this.marker.getPoint())){this.map.setCenter(this.marker.getPoint());}}},_rightClick:function(point){this.distState++;switch(this.distState){case 1:var ptll=this.map.fromContainerPixelToLatLng(point);this.distPts=[ptll];this.distLine=null;google.maps.Event.addListener(this.map,'mousemove',this._mouseMove.bind(this));this._mouseMove(ptll);break;case 2:google.maps.Event.clearListeners(this.map,'mousemove');break;case 3:if(this.distLine)this.map.removeOverlay(this.distLine);this.titleCtrl.setText(this.mapTitle);default:this.distState=0;}},_mouseMove:function(point){var dPts=this.distPts.concat([point]);if(this.distLine){this.map.removeOverlay(this.distLine);this.distLine=null;}
this.distLine=new google.maps.Polyline(dPts,'#ffff00',4,0.6,{'clickable':false});this.map.addOverlay(this.distLine);var dist=this.distLine.getLength();var legend;if(dist<1000){legend=dist.round(2)+' m';}else{legend=(dist/1000).round(2)+' km';}
if(this.options.measureCfd){var type=null;var coef=1.2;switch(dPts.length){case 2:type='DL';coef=1;break;case 3:if(dPts[0].distanceFrom(dPts[2])<3000){type='AR'}else{type='DL1';coef=1;}
break;case 4:if(dPts[0].distanceFrom(dPts[3])<3000){var fai=true;for(var idx=0;idx<3;idx++){if(dPts[idx].distanceFrom(dPts[idx+1])<0.28*dist){fai=false;break;}}
type=fai?'FAI':'TR';coef=fai?1.4:1.2;}else{type='DL2';coef=1;}
break;case 5:if(dPts[0].distanceFrom(dPts[4])<3000){type='QD';}
break;default:}
if(type!==null){legend+='<br/>'+type+' '+(coef*dist/1000).round(2)+' pts';}}
this.titleCtrl.setText(legend);},_leftClick:function(marker,point){if(point===null)return;switch(this.distState){case 1:this.distPts.push(point);this._mouseMove(point);break;default:if(this.points.length){var bestIdx=0;var bestDst=this.points[0].distanceFrom(point);var dst;for(var i=this.points.length-1;i>=0;i--){dst=this.points[i].distanceFrom(point);if(dst<bestDst){bestIdx=i;bestDst=dst;}}
this.marker.setPoint(this.points[bestIdx]);if(this.marker3d){this._set3dPosition(bestIdx);}
if(this.ignMap!=null){this.ignMap.setMarker(this.track.lat[bestIdx],this.track.lon[bestIdx]);}
var pos=(1000*bestIdx/this.track.nbTrackPt).toInt();this.charts.setCursor(pos);this._showInfo(pos);}}},_initGraph:function(){this.charts=new Charts($(this.options.chartDiv),{onMouseMove:this._showMarker.bind(this),onMouseDown:this._showMarkerCenter.bind(this),onMouseWheel:this._showMarkerCenterZoom.bind(this)});var chart=this.charts.add('h',0.9,'#ff0000');chart.setGridDensity(this.track.nbChartLbl,4);chart.setHorizontalLabels(this.track.time.label);chart.add('hV','#ff0000',this.track.elev,CHART_LINE);chart.add('hS','#755545',this.track.elevGnd,CHART_AREA);chart=this.charts.add('Vx',0.2,'#00ff00');chart.setGridDensity(this.track.nbChartLbl,4);chart.setHorizontalLabels(this.track.time.label);chart.add('Vx','#00ff00',this.track.speed,CHART_LINE);chart=this.charts.add('Vz',0.2,'#0000ff');chart.setLabelPrecision(1);chart.setGridDensity(this.track.nbChartLbl,4);chart.setHorizontalLabels(this.track.time.label);chart.add('Vz','#0000ff',this.track.vario,CHART_LINE);this._drawGraph();},_resize:function(){if(this.charts)this.charts.showCursor(false);if(this.timer)$clear(this.timer);this.timer=this._drawGraph.delay(100,this);if(this.ignMap!=null){var size=$('ignwrap').getSize();this.ignMap.reSize(size.x,size.y);}},_drawGraph:function(){if(this.points.length<5)return;this.charts.draw();},_displayTrack:function(){if(this.points.length<5||this.map.getCurrentMapType()==G_SATELLITE_3D_MAP)return;var path=new google.maps.Polyline(this._getReducedTrack(),"#ff0000",1,1,{'clickable':false});if(this.path){this.map.removeOverlay(this.path);}
this.map.addOverlay(this.path=path);},_getReducedTrack:function(){var Sw=this.map.getBounds().getSouthWest();var Ne=this.map.getBounds().getNorthEast();var deltaLat=Ne.lat()-Sw.lat();var deltaLng=Ne.lng()-Sw.lng();var bufSw=new google.maps.LatLng(Sw.lat()-deltaLat,Sw.lng()-deltaLng);var bufNe=new google.maps.LatLng(Ne.lat()+deltaLat,Ne.lng()+deltaLng);var scrollBuffer=new google.maps.LatLngBounds(bufSw,bufNe);var minStepLat=3*deltaLat/this.map.getSize().width;var minStepLng=3*deltaLng/this.map.getSize().height;var lastLat=this.points[0].lat();var lastLng=this.points[0].lng();var shortTrack=[];var point={};shortTrack.push(this.points[this.points.length-1]);for(var i=this.points.length-1;i>=0;i--){point=this.points[i];if(scrollBuffer.contains(point)&&(((point.lat()-lastLat).abs()>minStepLat)||((point.lng()-lastLng).abs()>minStepLng))){shortTrack.unshift(point);lastLat=point.lat();lastLng=point.lng();}}
return shortTrack;},_showMarker:function(pos,center){center=$pick(center,false);var idx=(pos*(this.track.nbTrackPt-1)/1000).toInt();this.marker.setPoint(this.points[idx]);if(this.marker3d){this._set3dPosition(idx);}
if(this.map.getCurrentMapType()==G_SATELLITE_3D_MAP){if(center||(this.animTimer!=null)){var lookAt=this.ge.getView().copyAsLookAt(this.ge.ALTITUDE_ABSOLUTE);lookAt.setLatitude(this.track.lat[idx]);lookAt.setLongitude(this.track.lon[idx]);this.ge.getView().setAbstractView(lookAt);}}else{if(center){this.map.panTo(this.points[idx]);}}
if(this.ignMap!=null){this.ignMap.setMarker(this.track.lat[idx],this.track.lon[idx]);if(center){this.ignMap.setCenter(this.track.lat[idx],this.track.lon[idx]);}}
this._showInfo(pos);if(this.map.getCurrentMapType()==G_SATELLITE_3D_MAP){this.marker.hide();}else{this.marker.show();}},_showMarkerCenter:function(pos){this._showMarker(pos,true);},_showMarkerCenterZoom:function(pos,wheel){if(wheel>0){this.map.zoomIn();if(this.ignMap!=null){this.ignMap.zoom('in');}}else{this.map.zoomOut();if(this.ignMap!=null){this.ignMap.zoom('out');}}
this._showMarker(pos,true);},_showInfo:function(pos){var idx=(pos*(this.track.nbChartPt-1)/1000).toInt();this.nfo.set('html',this.track.elev[idx]+'m [hV]<br/>'+
this.track.elevGnd[idx]+'m [hS]<br/>'+
(0).max((this.track.elev[idx]-this.track.elevGnd[idx]))+'m [hR]<br/>'+
this.track.vario[idx]+'m/s [Vz]<br/>'+
this.track.speed[idx]+'km/h [Vx]<br/>'+
this._NbToStrW(this.track.time.hour[idx],2)+':'+
this._NbToStrW(this.track.time.min[idx],2)+':'+
this._NbToStrW(this.track.time.sec[idx],2)+'[Th]');if(this.ignMap)this.ignMap.setInfo(this.nfo.get('html'));},_createTitleControl:function(title){function TitleControl(title){this.div=null;this.title=title;}
TitleControl.prototype=new google.maps.Control();TitleControl.prototype.initialize=function(map){this.div=new Element('div',{'styles':{'color':'#000','border':'1px inset #555555','padding':'2px','font':'10px Verdana, Arial, sans-serif','marginBottom':'3px','background':'#FFFFCC','text-align':'right'}}).set('html',this.title).inject(map.getContainer());return this.div;}
TitleControl.prototype.getDefaultPosition=function(){return new google.maps.ControlPosition(G_ANCHOR_TOP_RIGHT,new GSize(7,30));}
TitleControl.prototype.setText=function(title){this.title=title;this.div.set('html',title);}
this.titleCtrl=new TitleControl(title);},_createInfoControl:function(){function InfoControl(){this.div=null;}
var me=this;InfoControl.prototype=new google.maps.Control();InfoControl.prototype.selectable=function(){return false;}
InfoControl.prototype.initialize=function(map){this.div=new Element('div',{'styles':{'border':'1px inset #555555','padding':'2px','margin':'1px','background':'#FFFFCC','text-align':'right','font':'10px Verdana, Arial, sans-serif'}}).set('html','<p class="vgps-info"><strong>...iNfO</strong></p>'+'<p class="vgps-info" id="vgps-nfofield"></p>'+'<div id="vgps-anim"><div id="vgps-play"></div></div>'+'</div>').inject(map.getContainer());$('vgps-play').addEvent('mousedown',function(event){(new Event(event)).stop();});$('vgps-anim').addEvent('mousedown',me._toggleAnim.bindWithEvent(me));new SliderProgress('vgps-play',{'color':'#FF850C','onChange':me._setAnimDelay.bind(me)}).set(50);return this.div;}
InfoControl.prototype.getDefaultPosition=function(){return new google.maps.ControlPosition(G_ANCHOR_BOTTOM_RIGHT,new GSize(2,12));}
this.infoCtrl=new InfoControl();},_createSrtmMap:function(){var srtmCpy=new google.maps.Copyright(1,new google.maps.LatLngBounds(new google.maps.LatLng(-90,-180),new google.maps.LatLng(90,180)),0,"SRTM");var srtmCpyC=new google.maps.CopyrightCollection();srtmCpyC.addCopyright(srtmCpy);var url=this.options.elevTileUrl;url.map(function(item,idx){return item.replace(/\/$/,'');});var srtmTL=[new google.maps.TileLayer(srtmCpyC,0,16)];srtmTL[0].getTileUrl=function(point,zoom){var count=url.length;var n=(point.x+point.y)%count;return'http://'+url[n]+'/vg_tilesrtm.php?x='+point.x+'&y='+point.y+'&z='+zoom;}
var srtmMap=new google.maps.MapType(srtmTL,new google.maps.MercatorProjection(18),'Elevation');this.map.addMapType(srtmMap);},_createModisMap:function(day,month,year){function EuclideanProjection(){}
EuclideanProjection.prototype=new google.maps.Projection();EuclideanProjection.prototype.fromLatLngToPixel=function(point,zoom){var size=(2).pow(zoom)*256;var x=(point.lng()+180)*size/360;var y=(90-point.lat())*size/180;return new google.maps.Point(x.round(),y.round());}
EuclideanProjection.prototype.fromPixelToLatLng=function(point,zoom,unbounded){var size=(2).pow(zoom)*256;var lng=point.x*360/size-180;var lat=90-(point.y*180/size);return new GLatLng(lat,lng,unbounded);}
EuclideanProjection.prototype.tileCheckRange=function(tile,zoom,unbounded){var size=(2).pow(zoom);if(tile.y<0||tile.y>=size)return false;if(tile.x<0||tile.x>=size){tile.x%=size;if(tile.x<0)tile.x+=size;}
return true;}
EuclideanProjection.prototype.getWrapWidth=function(zoom){return(2).pow(zoom)*256;}
function getDayNumber(day,month,year){var now=new Date;now.setUTCFullYear(year,month-1,day);var ny=new Date;ny.setUTCFullYear(year,0,1);return(now-ny)/(1000*3600*24)+1;}
var dayNum=this._NbToStrW(getDayNumber(day,month,year),3);var date=year.toString()+dayNum;var modisCpy=new google.maps.Copyright(1,new google.maps.LatLngBounds(new google.maps.LatLng(-90,-180),new google.maps.LatLng(90,180)),0,"MODIS");var modisCpyC=new google.maps.CopyrightCollection();modisCpyC.addCopyright(modisCpy);var url=this.options.weatherTileUrl;url.map(function(item,idx){return item.replace(/\/$/,'');});var modisTL=[new google.maps.TileLayer(modisCpyC,0,9)];modisTL[0].getTileUrl=function(point,zoom){var count=url.length;var n=(point.x+point.y)%count;return'http://'+url[n]+'/vg_tilemodis.php?x='+point.x+'&y='+point.y+'&z='+zoom+'&date='+date;}
var modisMap=new google.maps.MapType(modisTL,new EuclideanProjection(18),"Weather");this.map.addMapType(modisMap);},_NbToStrW:function(nb,w){var nbs=nb.toString();while(nbs.length<w)nbs='0'+nbs;return nbs;}});var CanvasChartPainter=new Class({calc:function(w,h,xlen,ymin,ymax,xgd,ygd){this.range=ymax-ymin;this.xstep=w/(xlen-1);this.xgrid=xgd?w/(xgd-1):0;this.ygrid=ygd?h/(ygd-1):0;this.ymin=ymin;this.ymax=ymax;},initialize:function(el,xlen,ymin,ymax,xgd,ygd,bLegendLabels){this.el=el=$(el);el.empty();var dim=el.getCoordinates();this.w=this.chartw=dim.width;this.h=this.charth=dim.height;this.canvas=new Element('canvas',{'styles':{'width':this.w,'height':this.h}}).inject(el);this.canvas.width=this.w;this.canvas.height=this.h;if((!this.canvas.getContext)&&(typeof G_vmlCanvasManager!="undefined")){this.canvas=G_vmlCanvasManager.initElement(this.canvas);}
this.ctx=this.canvas.getContext('2d');this.chartx=0;this.charty=0;this.xlen=xlen;this.ymin=ymin;this.ymax=ymax;this.xgd=xgd;this.ygd=ygd;this.calc(this.chartw,this.charth,xlen,ymin,ymax,xgd,ygd);},drawLegend:function(series){var legend,list;legend=new Element('div',{'styles':{'position':'absolute','right':0},'class':'legend'});list=new Element('ul').inject(legend.inject(this.el));series.each(function(serie){new Element('span',{'styles':{'color':'black'}}).appendText(serie.label).inject(new Element('li',{'styles':{'color':serie.color}}).inject(list));});this.legend=legend.setStyle('top',this.charty+(this.charth-legend.offsetHeight)/2);this.chartw=this.w-(this.legend.offsetWidth+5);this.calc(this.chartw,this.charth,this.xlen,this.ymin,this.ymax,this.xgd,this.ygd);},drawVerticalLabels:function(ygd,precision,labelPos){var item,y,ty,pos;var xLblIn=(labelPos.x.toLowerCase()=='in');var yLblIn=(labelPos.y.toLowerCase()=='in');var multiplier=(10).pow(precision);var step=this.range/(ygd-1);var axis=new Element('div',{'styles':{'position':'absolute','left':yLblIn?10:0,'top':0,'textAlign':'right'}}).inject(this.el);this.ctx.fillStyle='black';var w=0;var items=[];for(n=0,i=this.ymax;(i>this.ymin)&&(n<ygd-1);i-=step,n++){item=new Element('span').set('text',parseInt(i*multiplier)/multiplier).inject(axis);items.push([i,item]);w=(w).max(item.offsetWidth);}
item=new Element('span').set('text',this.ymin).inject(axis);items.push([this.ymin,item]);w=(w).max(item.offsetWidth);var lblWidth=yLblIn?5:w+5;var lblHeight=xLblIn?(item.offsetHeight/2).max(5):item.offsetHeight+5;this.chartx=lblWidth;this.charty=item.offsetHeight/2;this.charth=this.h-(lblHeight+this.charty);this.chartw=this.w-((this.legend?this.legend.offsetWidth:0)+5+lblWidth);this.calc(this.chartw,this.charth,this.xlen,this.ymin,this.ymax,this.xgd,this.ygd);axis.setStyle('width',w+10);var n=this.range/this.charth;var yoffset=this.ymin/n;items.each(function(item){label=item[1];pos=item[0];if(pos==this.ymin){y=this.charty+this.charth-1;}else{y=this.charty+(this.charth-(pos/n)+yoffset);}
this.ctx.fillRect(this.chartx-5,y,5,1);ty=y-(label.offsetHeight/2);label.setStyles({'position':'absolute','top':ty,'background':'white'});label.setStyle(yLblIn?'left':'right',0);},this);},drawHorizontalLabels:function(xlen,labels,xgd,precision,labelPos){var axis,item,step,x,tx;var xLblIn=(labelPos.x.toLowerCase()=='in');var multiplier=(10).pow(precision);var n=this.chartw/(xgd-1);axis=new Element('div',{'styles':{'position':'absolute','left':0,'top':this.charty+this.charth+5,'width':this.w}}).inject(this.el);this.ctx.fillStyle='black';for(i=0;i<xgd;i++){item=new Element('span').set('text',labels[i]).inject(axis);x=this.chartx+(n*i);tx=x-(item.offsetWidth/2);tx=tx.limit(this.chartx,this.chartx+this.chartw-item.offsetWidth);item.setStyles({'position':'absolute','left':tx,'top':0});this.ctx.fillRect(x,this.charty+this.charth,1,5);}
if(xLblIn){axis.setStyle('top',this.charty+this.charth-item.offsetHeight);}},drawAxis:function(){this.ctx.fillStyle='black';this.ctx.fillRect(this.chartx,this.charty,1,this.charth-1);this.ctx.fillRect(this.chartx,this.charty+this.charth-1,this.chartw+1,1);},drawBackground:function(){this.ctx.fillStyle='white';this.ctx.fillRect(0,0,this.w,this.h);},drawGrid:function(){this.ctx.fillStyle='silver';if(this.xgrid){for(i=this.xgrid;i<this.chartw;i+=this.xgrid){this.ctx.fillRect(this.chartx+i,this.charty,1,this.charth-1);}}
if(this.ygrid){for(i=this.charth-this.ygrid;i>0;i-=this.ygrid){this.ctx.fillRect(this.chartx+1,this.charty+i,this.chartw,1);}
if((this.ymin*this.ymax)<0){this.ctx.fillStyle='#FFA07A';var y0=this.ymax*this.charth/(this.ymax-this.ymin);this.ctx.fillRect(this.chartx+1,this.charty+y0,this.chartw,1);}}},drawArea:function(color,values){var i,x,y;var n=this.range/this.charth;var yoffset=this.ymin/n;var len=values.length;if(len){this.ctx.fillStyle=color;x=this.chartx+1;this.ctx.beginPath();this.ctx.moveTo(x,this.charty+this.charth-1);y=this.charty+this.charth-(values[0]/n)+yoffset;this.ctx.lineTo(x,y);for(i=1;i<len;i++){y=this.charty+this.charth-(values[i]/n)+yoffset;x+=this.xstep;this.ctx.lineTo(x,y);}
this.ctx.lineTo(x,this.charty+this.charth-1);this.ctx.closePath();this.ctx.fill();}},drawLine:function(color,values){var i,x,y;var n=this.range/this.charth;var yoffset=(this.ymin/n);var len=values.length;if(len){this.ctx.lineWidth=1;this.ctx.strokeStyle=color;x=this.chartx+1;y=this.charty+this.charth-(values[0]/n)+yoffset;this.ctx.beginPath();this.ctx.moveTo(x,y);for(i=1;i<len;i++){y=this.charty+this.charth-(values[i]/n)+yoffset;x+=this.xstep;this.ctx.lineTo(x,y);}
this.ctx.stroke();}},drawBars:function(color,values,xlen,xoffset,width){var i,x,y;var n=this.range/this.charth;var yoffset=(this.ymin/n);var len=values.length;if(len>xlen){len=xlen;}
if(len){this.ctx.fillStyle=color;x=this.chartx+xoffset+1;for(i=0;i<len;i++){y=this.charty+this.charth-(values[i]/n)+yoffset;this.ctx.beginPath();this.ctx.moveTo(x,this.charty+this.charth-1);this.ctx.lineTo(x,y);this.ctx.lineTo(x+width,y);this.ctx.lineTo(x+width,this.charty+this.charth-1);this.ctx.closePath();this.ctx.fill();x+=this.xstep;}}},getCoordinates:function(){return{left:this.chartx,top:this.charty,width:this.chartw,height:this.charth};}});var CHART_LINE=1;var CHART_AREA=2;var CHART_BAR=4;var CHART_STACKED=8;var Chart=new Class({Implements:Options,options:{xGridDensity:0,yGridDensity:0,defaultFlags:0,labelPrecision:0,labelPos:{'x':'out','y':'in'},xLabels:[],barWidth:10,barDistance:2,showLegend:false},initialize:function(el,options){this.setOptions(options);this._cont=$(el);this._bar=0;this._series=[];this._chartCoordinates={};},setLabelPrecision:function(p){this.options.labelPrecision=p;},setShowLegend:function(b){this.options.showLegend=b;},setGridDensity:function(dx,dy){this.options.xGridDensity=dx;this.options.yGridDensity=dy;},setHorizontalLabels:function(labels){this.options.xLabels=labels;},add:function(label,color,values,flags){var offset;var opt=this.options;flags=$pick(flags,this._flags);if(flags&CHART_BAR){offset=opt.barDistance+this._bars*(opt.barWidth+opt.barDistance);this._bars++;}else{offset=0;}
this._series.push({'label':label,'color':color,'values':values,'flags':flags,'offset':offset});},draw:function(){var i,j,o,o2,len;if(!window.CanvasRenderingContext2D||!this._series){return;}
var series=[];var xlen=0;var ymin=this._series[0].values[0];var ymax=this._series[0].values[0];var opt=this.options;this._series.each(function(serie){if(serie.flags&CHART_STACKED)series.push(serie);});for(i=series.length-2;i>=0;i--){o=series[i].values;o2=series[i+1].values;len=o2.length.max(o.length);for(j=0;j<len;j++){if((o[j])&&(!o2[j])){continue;}
if((!o[j])&&(o2[j])){o[j]=o2[j];}
else{o[j]=parseInt(o[j])+parseFloat(o2[j]);}}}
this._series.each(function(serie){if(!(serie.flags&CHART_STACKED))series.push(serie);});series.each(function(serie){xlen=xlen.max(serie.values.length);for(i=serie.values.length-1;i>=0;i--){o=serie.values[i];ymin=ymin.min(o);ymax=ymax.max(o);}});if(ymin==ymax){ymin-=1;ymax+=1;}
if(this._series.length==this._bars){xlen++;opt.xGridDensity++;}
var bLabels=(opt.xGridDensity&&opt.yGridDensity&&(opt.xLabels.length>=opt.xGridDensity));var painter=new CanvasChartPainter(this._cont,xlen,ymin,ymax,opt.xGridDensity,opt.yGridDensity,bLabels);painter.drawBackground();if(opt.showLegend){painter.drawLegend(series);}
if(bLabels){painter.drawVerticalLabels(opt.yGridDensity,opt.labelPrecision,opt.labelPos);painter.drawHorizontalLabels(xlen,opt.xLabels,opt.xGridDensity,opt.labelPrecision,opt.labelPos);}
painter.drawGrid();series.each(function(serie){switch(serie.flags&~CHART_STACKED){case CHART_LINE:painter.drawLine(serie.color,serie.values);break;case CHART_AREA:painter.drawArea(serie.color,serie.values);break;case CHART_BAR:painter.drawBars(serie.color,serie.values,xlen-1,serie.offset,opt.barWidth);break;default:;};});painter.drawAxis();this._chartCoordinates=painter.getCoordinates();},getCoordinates:function(){return this._chartCoordinates;}});document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_||b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d<c.length;d++)this.initElement(c[d])},initElement:function(b){if(!b.getContext){b.getContext=X;b.innerHTML="";b.attachEvent("onpropertychange",Z);b.attachEvent("onresize",$);var a=b.attributes;if(a.width&&a.width.specified)b.style.width=a.width.nodeValue+"px";else b.width=b.clientWidth;if(a.height&&a.height.specified)b.style.height=a.height.nodeValue+"px";else b.height=b.clientHeight}return b}};function Z(b){var a=b.srcElement;switch(b.propertyName){case"width":a.style.width=a.attributes.width.nodeValue+"px";a.getContext().clearRect();break;case"height":a.style.height=a.attributes.height.nodeValue+"px";a.getContext().clearRect();break}}function $(b){var a=b.srcElement;if(a.firstChild){a.firstChild.style.width=a.clientWidth+"px";a.firstChild.style.height=a.clientHeight+"px"}}M.init();var N=[],B=0;for(;B<16;B++){var C=0;for(;C<16;C++)N[B*16+C]=B.toString(16)+C.toString(16)}function I(){return[[1,0,0],[0,1,0],[0,0,1]]}function y(b,a){var c=I(),d=0;for(;d<3;d++){var f=0;for(;f<3;f++){var h=0,g=0;for(;g<3;g++)h+=b[d][g]*a[g][f];c[d][f]=h}}return c}function O(b,a){a.fillStyle=b.fillStyle;a.lineCap=b.lineCap;a.lineJoin=b.lineJoin;a.lineWidth=b.lineWidth;a.miterLimit=b.miterLimit;a.shadowBlur=b.shadowBlur;a.shadowColor=b.shadowColor;a.shadowOffsetX=b.shadowOffsetX;a.shadowOffsetY=b.shadowOffsetY;a.strokeStyle=b.strokeStyle;a.globalAlpha=b.globalAlpha;a.arcScaleX_=b.arcScaleX_;a.arcScaleY_=b.arcScaleY_;a.lineScale_=b.lineScale_}function P(b){var a,c=1;b=String(b);if(b.substring(0,3)=="rgb"){var d=b.indexOf("(",3),f=b.indexOf(")",d+
1),h=b.substring(d+1,f).split(",");a="#";var g=0;for(;g<3;g++)a+=N[Number(h[g])];if(h.length==4&&b.substr(3,1)=="a")c=h[3]}else a=b;return{color:a,alpha:c}}function aa(b){switch(b){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function H(b){this.m_=I();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=k*1;this.globalAlpha=1;this.canvas=b;var a=b.ownerDocument.createElement("div");a.style.width=b.clientWidth+"px";a.style.height=b.clientHeight+"px";a.style.overflow="hidden";a.style.position="absolute";b.appendChild(a);this.element_=a;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}var i=H.prototype;i.clearRect=function(){this.element_.innerHTML=""};i.beginPath=function(){this.currentPath_=[]};i.moveTo=function(b,a){var c=this.getCoords_(b,a);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};i.lineTo=function(b,a){var c=this.getCoords_(b,a);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};i.bezierCurveTo=function(b,a,c,d,f,h){var g=this.getCoords_(f,h),l=this.getCoords_(b,a),e=this.getCoords_(c,d);Q(this,l,e,g)};function Q(b,a,c,d){b.currentPath_.push({type:"bezierCurveTo",cp1x:a.x,cp1y:a.y,cp2x:c.x,cp2y:c.y,x:d.x,y:d.y});b.currentX_=d.x;b.currentY_=d.y}i.quadraticCurveTo=function(b,a,c,d){var f=this.getCoords_(b,a),h=this.getCoords_(c,d),g={x:this.currentX_+
0.6666666666666666*(f.x-this.currentX_),y:this.currentY_+0.6666666666666666*(f.y-this.currentY_)};Q(this,g,{x:g.x+(h.x-this.currentX_)/3,y:g.y+(h.y-this.currentY_)/3},h)};i.arc=function(b,a,c,d,f,h){c*=k;var g=h?"at":"wa",l=b+G(d)*c-v,e=a+F(d)*c-v,m=b+G(f)*c-v,r=a+F(f)*c-v;if(l==m&&!h)l+=0.125;var n=this.getCoords_(b,a),o=this.getCoords_(l,e),q=this.getCoords_(m,r);this.currentPath_.push({type:g,x:n.x,y:n.y,radius:c,xStart:o.x,yStart:o.y,xEnd:q.x,yEnd:q.y})};i.rect=function(b,a,c,d){this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath()};i.strokeRect=function(b,a,c,d){var f=this.currentPath_;this.beginPath();this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath();this.stroke();this.currentPath_=f};i.fillRect=function(b,a,c,d){var f=this.currentPath_;this.beginPath();this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath();this.fill();this.currentPath_=f};i.createLinearGradient=function(b,a,c,d){var f=new D("gradient");f.x0_=b;f.y0_=a;f.x1_=c;f.y1_=d;return f};i.createRadialGradient=function(b,a,c,d,f,h){var g=new D("gradientradial");g.x0_=b;g.y0_=a;g.r0_=c;g.x1_=d;g.y1_=f;g.r1_=h;return g};i.drawImage=function(b){var a,c,d,f,h,g,l,e,m=b.runtimeStyle.width,r=b.runtimeStyle.height;b.runtimeStyle.width="auto";b.runtimeStyle.height="auto";var n=b.width,o=b.height;b.runtimeStyle.width=m;b.runtimeStyle.height=r;if(arguments.length==3){a=arguments[1];c=arguments[2];h=g=0;l=d=n;e=f=o}else if(arguments.length==5){a=arguments[1];c=arguments[2];d=arguments[3];f=arguments[4];h=g=0;l=n;e=o}else if(arguments.length==9){h=arguments[1];g=arguments[2];l=arguments[3];e=arguments[4];a=arguments[5];c=arguments[6];d=arguments[7];f=arguments[8]}else throw Error("Invalid number of arguments");var q=this.getCoords_(a,c),t=[];t.push(" <g_vml_:group",' coordsize="',k*10,",",k*10,'"',' coordorigin="0,0"',' style="width:',10,"px;height:",10,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]){var E=[];E.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",j(q.x/k),",","Dy=",j(q.y/k),"");var p=q,z=this.getCoords_(a+d,c),w=this.getCoords_(a,c+f),x=this.getCoords_(a+d,c+f);p.x=s.max(p.x,z.x,w.x,x.x);p.y=s.max(p.y,z.y,w.y,x.y);t.push("padding:0 ",j(p.x/k),"px ",j(p.y/k),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",E.join(""),", sizingmethod='clip');")}else t.push("top:",j(q.y/k),"px;left:",j(q.x/k),"px;");t.push(' ">','<g_vml_:image src="',b.src,'"',' style="width:',k*d,"px;"," height:",k*f,'px;"',' cropleft="',h/n,'"',' croptop="',g/o,'"',' cropright="',(n-h-l)/n,'"',' cropbottom="',(o-g-e)/o,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("<g_vml_:shape",' filled="',!!b,'"',' style="position:absolute;width:',10,"px;height:",10,'px;"',' coordorigin="0 0" coordsize="',k*10," ",k*10,'"',' stroked="',!b,'"',' path="');var h={x:null,y:null},g={x:null,y:null},l=0;for(;l<this.currentPath_.length;l++){var e=this.currentPath_[l];switch(e.type){case"moveTo":a.push(" m ",j(e.x),",",j(e.y));break;case"lineTo":a.push(" l ",j(e.x),",",j(e.y));break;case"close":a.push(" x ");e=null;break;case"bezierCurveTo":a.push(" c ",j(e.cp1x),",",j(e.cp1y),",",j(e.cp2x),",",j(e.cp2y),",",j(e.x),",",j(e.y));break;case"at":case"wa":a.push(" ",e.type," ",j(e.x-this.arcScaleX_*e.radius),",",j(e.y-this.arcScaleY_*e.radius)," ",j(e.x+this.arcScaleX_*e.radius),",",j(e.y+this.arcScaleY_*e.radius)," ",j(e.xStart),",",j(e.yStart)," ",j(e.xEnd),",",j(e.yEnd));break}if(e){if(h.x==null||e.x<h.x)h.x=e.x;if(g.x==null||e.x>g.x)g.x=e.x;if(h.y==null||e.y<h.y)h.y=e.y;if(g.y==null||e.y>g.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_),z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l<J;l++){var T=u[l];S.push(T.offset*q+
o+" "+T.color)}a.push('<g_vml_:fill type="',m.type_,'"',' method="none" focus="100%"',' color="',da,'"',' color2="',ea,'"',' colors="',S.join(","),'"',' opacity="',ga,'"',' g_o_:opacity2="',fa,'"',' angle="',r,'"',' focusposition="',n.x,",",n.y,'" />')}else a.push('<g_vml_:fill color="',d,'" opacity="',f,'" />');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("<g_vml_:stroke",' opacity="',f,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',aa(this.lineCap),'"',' weight="',K,'px"',' color="',d,'" />')}a.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(),this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a,0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager=M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})();
