GpxActivityFactory.js
Summary
Garmin.GpxActivityFactory - A factory for producing gpx activity and data.
Version: 1.0
Author: Bobby Yang bobby.yang.at.garmin.com
if (Garmin == undefined) var Garmin = {};
Garmin.GpxActivityFactory = function(){};
Garmin.GpxActivityFactory = {
parseString: function(gpxString) {
var gpxDocument = Garmin.XmlConverter.toDocument(gpxString);
return Garmin.GpxActivityFactory.parseDocument(gpxDocument);
},
parseDocument: function(gpxDocument) {
var activities = new Array();
var routes = new Array();
var tracks = new Array();
var waypoints = new Array();
routes = Garmin.GpxActivityFactory._parseGpxRoutes(gpxDocument);
tracks = Garmin.GpxActivityFactory._parseGpxTracks(gpxDocument);
waypoints = Garmin.GpxActivityFactory._parseGpxWaypoints(gpxDocument);
activities = waypoints.concat(routes).concat(tracks);
return activities;
},
produceString: function(activities) {
var gpxString = "";
var creator = Garmin.GpxActivityFactory.DETAIL.creator;
var metadata = "\n <metadata>";
metadata += "\n <link href=\"http:
metadata += "\n <text>Garmin International</text>";
metadata += "\n </link>";
metadata += "\n </metadata>";
if (activities != null && activities.length > 0) {
var activityDom = activities[0].getAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom);
var gpxNode = activityDom.ownerDocument.getElementsByTagName(Garmin.GpxActivityFactory.SCHEMA_TAGS.gpx);
if (gpxNode.length > 0) {
var creatorStr = gpxNode[0].getAttribute(Garmin.GpxActivityFactory.SCHEMA_TAGS.creator);
if (creatorStr != null && creatorStr != "") {
creator = creatorStr;
}
var metadataNode = gpxNode[0].getElementsByTagName(Garmin.GpxActivityFactory.SCHEMA_TAGS.metadata);
if (metadataNode.length > 0) {
metadata = Garmin.XmlConverter.toString(metadataNode[0]);
}
}
}
gpxString += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>";
gpxString += "\n<gpx xmlns=\"http:
gpxString += "\n " + metadata;
if (activities != null) {
for(var i = 0; i < activities.length; i++) {
gpxString += "\n " + Garmin.GpxActivityFactory._produceActivityString(activities[i]);
}
}
gpxString += "\n</gpx>";
return gpxString;
},
finishLoadingSample: function(domNode, sample) {
if (domNode.nodeName == Garmin.GpxActivityFactory.SCHEMA_TAGS.routePoint) {
Garmin.GpxActivityFactory._parseGpxRoutePoint(domNode, sample);
sample.isLazyLoaded = false;
} else if (domNode.nodeName == Garmin.GpxActivityFactory.SCHEMA_TAGS.trackPoint) {
Garmin.GpxActivityFactory._parseGpxTrackPoint(domNode, sample);
sample.isLazyLoaded = false;
}
},
_produceActivityString: function(activity) {
var activityString = "";
if (activity != null) {
var series = activity.getSeries();
for (var i = 0; i < series.length; i++) {
var currentSeries = series[i];
if (currentSeries.getSeriesType() == Garmin.Series.TYPES.history) {
var activityDom = activity.getAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom);
if (activityDom != null) {
activityString = Garmin.XmlConverter.toString(activityDom);
}
} else if (currentSeries.getSeriesType() == Garmin.Series.TYPES.waypoint) {
var activityDom = activity.getAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom);
if (activityDom != null) {
activityString = Garmin.XmlConverter.toString(activityDom);
}
}
}
}
return activityString;
},
_parseGpxRoutes: function(gpxDocument) {
var routes = new Array();
var routeNodes = gpxDocument.getElementsByTagName(Garmin.GpxActivityFactory.SCHEMA_TAGS.route);
for( var i=0; i < routeNodes.length; i++ ) {
var route = new Garmin.Activity();
var routeName = Garmin.GpxActivityFactory._tagValue(routeNodes[i], Garmin.GpxActivityFactory.SCHEMA_TAGS.routeName);
if (routeName == null) {
routeName = "";
}
route.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom, routeNodes[i]);
route.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.activityName, routeName);
var series = new Garmin.Series(Garmin.Series.TYPES.route);
route.addSeries(series);
var routePoints = routeNodes[i].getElementsByTagName(Garmin.GpxActivityFactory.SCHEMA_TAGS.routePoint);
if (routePoints.length > 0) {
for( var j=0; j < routePoints.length; j++ ) {
var routePoint = new Garmin.Sample();
routePoint.setLazyLoading(true, Garmin.GpxActivityFactory, routePoints[j]);
series.addSample(routePoint);
}
}
if (series.getSamplesLength() > 0) {
routes.push(route);
}
}
return routes;
},
_parseGpxRoutePoint: function(routePointNode, routePointSample) {
if (routePointSample == null) {
routePointSample = new Garmin.Sample();
}
routePointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.latitude, routePointNode.getAttribute(Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointLatitude));
routePointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.longitude, routePointNode.getAttribute(Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointLongitude));
var elevation = Garmin.GpxActivityFactory._tagValue(routePointNode,Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointElevation);
if (elevation != null) {
routePointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.elevation, elevation);
}
return routePointSample;
},
_parseGpxTracks: function(gpxDocument) {
var tracks = new Array();
var trackNodes = gpxDocument.getElementsByTagName(Garmin.GpxActivityFactory.SCHEMA_TAGS.track);
for( var i=0; i < trackNodes.length; i++ ) {
var track = new Garmin.Activity();
var trackName = Garmin.GpxActivityFactory._tagValue(trackNodes[i], Garmin.GpxActivityFactory.SCHEMA_TAGS.trackName);
if (trackName == null) {
trackName = "";
}
track.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom, trackNodes[i]);
track.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.activityName, trackName);
var series = new Garmin.Series(Garmin.Series.TYPES.history);
track.addSeries(series);
var trackSegments = trackNodes[i].getElementsByTagName(Garmin.GpxActivityFactory.SCHEMA_TAGS.trackSegment);
for( var j=0; j < trackSegments.length; j++ ) {
var trackPoints = trackSegments[j].getElementsByTagName(Garmin.GpxActivityFactory.SCHEMA_TAGS.trackPoint);
if (trackPoints.length > 0) {
var startTime = Garmin.GpxActivityFactory._tagValue(trackPoints[0], Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointTime);
var endTime = Garmin.GpxActivityFactory._tagValue(trackPoints[trackPoints.length - 1], Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointTime);
if (startTime != null && endTime != null) {
track.setSummaryValue(Garmin.Activity.SUMMARY_KEYS.startTime, (new Garmin.DateTimeFormat()).parseXsdDateTime(startTime));
track.setSummaryValue(Garmin.Activity.SUMMARY_KEYS.endTime, (new Garmin.DateTimeFormat()).parseXsdDateTime(endTime));
} else {
series.setSeriesType(Garmin.Series.TYPES.route);
}
for( var k=0; k < trackPoints.length; k++ ) {
var trackPoint = new Garmin.Sample();
trackPoint.setLazyLoading(true, Garmin.GpxActivityFactory, trackPoints[k]);
series.addSample(trackPoint);
}
tracks.push(track);
}
}
}
return tracks;
},
_parseGpxTrackPoint: function(trackPointNode, trackPointSample) {
if (trackPointSample == null) {
trackPointSample = new Garmin.Sample();
}
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.latitude, trackPointNode.getAttribute(Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointLatitude));
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.longitude, trackPointNode.getAttribute(Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointLongitude));
var elevation = Garmin.GpxActivityFactory._tagValue(trackPointNode,Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointElevation);
if (elevation != null) {
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.elevation, elevation);
}
var time = Garmin.GpxActivityFactory._tagValue(trackPointNode, Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointTime);
if (time != null) {
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.time, (new Garmin.DateTimeFormat()).parseXsdDateTime(time));
}
return trackPointSample;
},
_parseGpxWaypoints: function(gpxDocument) {
var waypoints = new Array();
var waypointNodes = gpxDocument.getElementsByTagName(Garmin.GpxActivityFactory.SCHEMA_TAGS.waypoint);
for( var i=0; i < waypointNodes.length; i++ ) {
waypoints.push(Garmin.GpxActivityFactory._parseGpxWaypoint(waypointNodes[i]));
}
return waypoints;
},
_parseGpxWaypoint: function(waypointNode) {
var waypoint = new Garmin.Activity();
var waypointSeries = new Garmin.Series(Garmin.Series.TYPES.waypoint);
var waypointSample = new Garmin.Sample();
waypoint.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom, waypointNode);
waypointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.latitude, waypointNode.getAttribute(Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointLatitude));
waypointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.longitude, waypointNode.getAttribute(Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointLongitude));
var elevation = Garmin.GpxActivityFactory._tagValue(waypointNode,Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointElevation);
if (elevation != null) {
waypointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.elevation, elevation);
}
var wptName = Garmin.GpxActivityFactory._tagValue(waypointNode,Garmin.GpxActivityFactory.SCHEMA_TAGS.waypointName);
if (wptName != null) {
waypoint.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.activityName, wptName);
}
waypointSeries.addSample(waypointSample);
waypoint.addSeries(waypointSeries);
return waypoint;
},
_tagValue: function(parentNode, tagName) {
var subNode = parentNode.getElementsByTagName(tagName);
return subNode.length > 0 ? subNode[0].childNodes[0].nodeValue : null;
},
toString: function() {
return "[GpxActivityFactory]";
}
};
Garmin.GpxActivityFactory.DETAIL = {
creator: "Garmin Communicator Plug-In API"
};
Garmin.GpxActivityFactory.SCHEMA_TAGS = {
creator: "creator",
gpx: "gpx",
metadata: "metadata",
route: "rte",
routeName: "name",
routePoint: "rtept",
track: "trk",
trackName: "name",
trackPoint: "trkpt",
trackSegment: "trkseg",
waypoint: "wpt",
waypointComment: "cmt",
waypointDGPSAge: "ageofdgpsdata",
waypointDGPSID: "dgpsid",
waypointDescription: "desc",
waypointGeoIdHeight: "geoidheight",
waypointHDOP: "hdop",
waypointMagVar: "magvar",
waypointName: "name",
waypointLatitude: "lat",
waypointLink: "link",
waypointLongitude: "lon",
waypointElevation: "ele",
waypointPDOP: "pdop",
waypointSatellites: "sat",
waypointSource: "src",
waypointSymbol: "sym",
waypointTime: "time",
waypointType: "type",
waypointVDOP: "vdop"
};
Documentation generated by
JSDoc on Wed Feb 27 11:54:53 2008