TcxActivityFactory.js
Summary
Garmin.TcxActivityFactory - A factory for producing tcx activity and data.
Version: 1.0
Author: Bobby Yang bobby.yang.at.garmin.com
if (Garmin == undefined) var Garmin = {};
Garmin.TcxActivityFactory = function(){};
Garmin.TcxActivityFactory = {
parseString: function(tcxString) {
var tcxDocument = Garmin.XmlConverter.toDocument(tcxString);
return Garmin.TcxActivityFactory.parseDocument(tcxDocument);
},
parseDocument: function(tcxDocument) {
if( tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.activities).length == 0
&& tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.courses).length == 0) {
throw new Error("ERROR: Unable to parse TCX document.");
}
var parsedDocument;
if( tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.activity).length > 0) {
if( tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.track).length > 0) {
parsedDocument = Garmin.TcxActivityFactory._parseTcxActivities(tcxDocument);
}
else {
parsedDocument = Garmin.TcxActivityFactory._parseTcxHistoryDirectory(tcxDocument);
}
}
else if(tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.course).length > 0) {
if( tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.lap).length > 0) {
parsedDocument = Garmin.TcxActivityFactory._parseTcxCourses(tcxDocument);
}
else {
parsedDocument = Garmin.TcxActivityFactory._parseTcxCourseDirectory(tcxDocument);
}
}
return parsedDocument;
},
produceString: function(activities) {
var tcxString = "";
tcxString += '<?xml version="1.0" encoding="UTF-8" standalone="no" ?>';
tcxString += '\n<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd http://www.garmin.com/xmlschemas/FatCalories/v1 http://www.garmin.com/xmlschemas/fatcalorieextensionv1.xsd">';
tcxString += '\n <Activities>';
if (activities != null && activities.length > 0) {
for (var i = 0; i < activities.length; i++) {
tcxString += "\n " + Garmin.TcxActivityFactory._produceActivityString(activities[i]);
}
tcxString += '\n </Activities>';
var activityDom = activities[0].getAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom);
if (activityDom != null) {
var authorDom = activityDom.ownerDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.author);
if (authorDom.length > 0) {
tcxString += "\n " + Garmin.XmlConverter.toString(authorDom[0]);
}
}
}
tcxString += '\n</TrainingCenterDatabase>';
return tcxString;
},
finishLoadingSample: function(domNode, sample) {
Garmin.TcxActivityFactory._parseTcxTrackPoint(domNode, sample);
sample.isLazyLoaded = false;
},
_produceActivityString: function(activity) {
var activityString = "";
if (activity != null) {
var activityDom = activity.getAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom);
if (activityDom != null) {
activityString = Garmin.XmlConverter.toString(activityDom);
}
}
return activityString;
},
_parseTcxHistoryDirectory: function(tcxDocument) {
var activities = new Array();
var activityNodes;
activityNodes = tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.activity);
for (var i = 0; i < activityNodes.length; i++) {
var activity = Garmin.TcxActivityFactory._parseTcxActivity(activityNodes[i], Garmin.TcxActivityFactory.SCHEMA_TAGS.activity);
var lapNodes = activityNodes[i].getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.lap);
if (lapNodes.length > 0) {
var activityStartTimeMS = lapNodes[0].getAttribute(Garmin.TcxActivityFactory.SCHEMA_TAGS.lapStartTime);
var activityDurationMS = 0;
}
for (var j = 0; j < lapNodes.length; j++) {
var lapTotalTime = Garmin.TcxActivityFactory._tagValue(lapNodes[j], Garmin.TcxActivityFactory.SCHEMA_TAGS.lapTotalTime);
activityDurationMS += parseFloat(lapTotalTime + "e+3");
}
if ( lapNodes.length > 0) {
activityStartTimeObj = (new Garmin.DateTimeFormat()).parseXsdDateTime(activityStartTimeMS);
activityEndTimeObj = new Garmin.DateTimeFormat();
activityEndTimeObj.date = new Date(activityStartTimeObj.getDate().getTime() + activityDurationMS);
activity.setSummaryValue(Garmin.Activity.SUMMARY_KEYS.startTime, activityStartTimeObj);
activity.setSummaryValue(Garmin.Activity.SUMMARY_KEYS.endTime, activityEndTimeObj);
}
activities.push(activity);
}
return activities;
},
_parseTcxCourseDirectory: function(tcxDocument) {
var activities = new Array();
var activityNodes;
activityNodes = tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.course);
for (var i = 0; i < activityNodes.length; i++) {
var activity = Garmin.TcxActivityFactory._parseTcxActivity(activityNodes[i], Garmin.TcxActivityFactory.SCHEMA_TAGS.course);
activities.push(activity);
}
return activities;
},
_parseTcxActivities: function(tcxDocument) {
var activities = new Array();
var activityNodes;
activityNodes = tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.activity);
for (var i = 0; i < activityNodes.length; i++) {
var activity = Garmin.TcxActivityFactory._parseTcxActivity(activityNodes[i], Garmin.TcxActivityFactory.SCHEMA_TAGS.activity);
var historySeries = new Garmin.Series(Garmin.Series.TYPES.history);
var lapNodes = activityNodes[i].getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.lap);
if (lapNodes.length > 0) {
var activityStartTimeMS = lapNodes[0].getAttribute(Garmin.TcxActivityFactory.SCHEMA_TAGS.lapStartTime);
var activityDurationMS = 0;
}
for (var j = 0; j < lapNodes.length; j++) {
var lapTotalTime = Garmin.TcxActivityFactory._tagValue(lapNodes[j], Garmin.TcxActivityFactory.SCHEMA_TAGS.lapTotalTime);
activityDurationMS += parseFloat(lapTotalTime + "e+3");
var trackNodes = lapNodes[j].getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.track);
for (var k = 0; k < trackNodes.length; k++) {
var trackPointNodes = trackNodes[k].getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPoint);
for (var l = 0; l < trackPointNodes.length; l++) {
var trackPoint = new Garmin.Sample();
trackPoint.setLazyLoading(true, Garmin.TcxActivityFactory, trackPointNodes[l]);
historySeries.addSample(trackPoint);
}
}
}
if ( lapNodes.length > 0) {
activityStartTimeObj = (new Garmin.DateTimeFormat()).parseXsdDateTime(activityStartTimeMS);
activityEndTimeObj = new Garmin.DateTimeFormat();
activityEndTimeObj.date = new Date(activityStartTimeObj.getDate().getTime() + activityDurationMS);
activity.setSummaryValue(Garmin.Activity.SUMMARY_KEYS.startTime, activityStartTimeObj);
activity.setSummaryValue(Garmin.Activity.SUMMARY_KEYS.endTime, activityEndTimeObj);
}
if (historySeries.getSamplesLength() > 0) {
activity.addSeries(historySeries);
}
activities.push(activity);
}
return activities;
},
_parseTcxCourses: function(tcxDocument) {
var activities = new Array();
var activityNodes;
activityNodes = tcxDocument.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.course);
for (var i = 0; i < activityNodes.length; i++) {
var activity = Garmin.TcxActivityFactory._parseTcxActivity(activityNodes[i], Garmin.TcxActivityFactory.SCHEMA_TAGS.course);
var historySeries = new Garmin.Series(Garmin.Series.TYPES.course);
var lapNodes = activityNodes[i].getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.lap);
if (lapNodes.length > 0) {
var activityDurationMS = 0;
}
for (var j = 0; j < lapNodes.length; j++) {
var lapTotalTime = Garmin.TcxActivityFactory._tagValue(lapNodes[j], Garmin.TcxActivityFactory.SCHEMA_TAGS.lapTotalTime);
activityDurationMS += parseFloat(lapTotalTime + "e+3");
}
var trackNodes = activityNodes[i].getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.track);
for (var k = 0; k < trackNodes.length; k++) {
var trackPointNodes = trackNodes[k].getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPoint);
for (var l = 0; l < trackPointNodes.length; l++) {
var trackPoint = new Garmin.Sample();
trackPoint.setLazyLoading(true, Garmin.TcxActivityFactory, trackPointNodes[l]);
historySeries.addSample(trackPoint);
}
}
if (historySeries.getSamplesLength() > 0) {
activity.addSeries(historySeries);
}
activities.push(activity);
}
return activities;
},
_parseTcxActivity: function(activityNode, activityType) {
var activity = new Garmin.Activity();
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.isLazyLoaded, true);
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.factory, Garmin.TcxActivityFactory);
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.dom, activityNode);
var id;
if(activityType == Garmin.TcxActivityFactory.SCHEMA_TAGS.activity) {
id = Garmin.TcxActivityFactory._tagValue(activityNode, Garmin.TcxActivityFactory.SCHEMA_TAGS.activityId);
} else {
id = Garmin.TcxActivityFactory._tagValue(activityNode, Garmin.TcxActivityFactory.SCHEMA_TAGS.courseName);
}
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.activityName, id)
var sport = activityNode.getAttribute(Garmin.TcxActivityFactory.SCHEMA_TAGS.activitySport);
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.activitySport, sport);
var creator = activityNode.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.creator);
if (creator != null && creator.length > 0) {
var creatorName = Garmin.TcxActivityFactory._tagValue(creator[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.creatorName);
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.creatorName, creatorName);
var unitId = Garmin.TcxActivityFactory._tagValue(creator[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.creatorUnitID);
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.creatorUnitId, unitId);
var prodId = Garmin.TcxActivityFactory._tagValue(creator[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.creatorProductID);
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.creatorProdId, prodId);
var version = Garmin.TcxActivityFactory._parseTcxVersion(creator[0]);
if (version != null) {
activity.setAttribute(Garmin.Activity.ATTRIBUTE_KEYS.creatorVersion, version);
}
}
return activity;
},
_parseTcxTrackPoint: function(trackPointNode, trackPointSample) {
if (trackPointSample == null) {
trackPointSample = new Garmin.Sample();
}
var time = Garmin.TcxActivityFactory._tagValue(trackPointNode, Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPointTime);
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.time, (new Garmin.DateTimeFormat()).parseXsdDateTime(time));
var position = trackPointNode.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.position);
if (position.length > 0) {
var latitude = Garmin.TcxActivityFactory._tagValue(position[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.positionLatitude);
var longitude = Garmin.TcxActivityFactory._tagValue(position[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.positionLongitude);
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.latitude, latitude);
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.longitude, longitude);
}
var elevation = Garmin.TcxActivityFactory._tagValue(trackPointNode, Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPointElevation);
if (elevation != null) {
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.elevation, elevation);
}
var distance = Garmin.TcxActivityFactory._tagValue(trackPointNode, Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPointDistance);
if (distance != null) {
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.distance, distance);
}
var heartRateNode = trackPointNode.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPointHeartRate);
if (heartRateNode.length > 0) {
var heartRate = Garmin.TcxActivityFactory._tagValue(heartRateNode[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPointHeartRateValue);
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.heartRate, heartRate);
}
var cadence = Garmin.TcxActivityFactory._tagValue(trackPointNode, Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPointCadence);
if (cadence != null) {
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.cadence, cadence);
}
var sensorState = Garmin.TcxActivityFactory._tagValue(trackPointNode, Garmin.TcxActivityFactory.SCHEMA_TAGS.trackPointSensorState);
if (sensorState != null) {
trackPointSample.setMeasurement(Garmin.Sample.MEASUREMENT_KEYS.sensorState, sensorState);
}
return trackPointSample;
},
_parseTcxVersion: function(parentNode) {
var versionNodes = parentNode.getElementsByTagName(Garmin.TcxActivityFactory.SCHEMA_TAGS.version);
if (versionNodes.length > 0) {
var vMajor = Garmin.TcxActivityFactory._tagValue(versionNodes[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.versionMajor);
var vMinor = Garmin.TcxActivityFactory._tagValue(versionNodes[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.versionMinor);
var bMajor = Garmin.TcxActivityFactory._tagValue(versionNodes[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.versionBuildMajor);
var bMinor = Garmin.TcxActivityFactory._tagValue(versionNodes[0], Garmin.TcxActivityFactory.SCHEMA_TAGS.versionBuildMinor);
if ((bMajor != null) && (bMinor != null)) {
return { versionMajor: vMajor, versionMinor: vMinor, buildMajor: bMajor, buildMinor: bMinor };
} else {
return { versionMajor: vMajor, versionMinor: vMinor };
}
} else {
return null;
}
},
_tagValue: function(parentNode, tagName) {
var subNode = parentNode.getElementsByTagName(tagName);
return subNode.length > 0 ? subNode[0].childNodes[0].nodeValue : null;
},
toString: function() {
return "[TcxActivityFactory]";
}
};
Garmin.TcxActivityFactory.DETAIL = {
creator: "Garmin Communicator Plugin API - http://www.garmin.com/"
};
Garmin.TcxActivityFactory.SCHEMA_TAGS = {
activities: "Activities",
activity: "Activity",
activityId: "Id",
activitySport: "Sport",
author: "Author",
course: "Course",
courses: "Courses",
courseName: "Name",
creator: "Creator",
creatorName: "Name",
creatorUnitID: "UnitId",
creatorProductID: "ProductID",
lap: "Lap",
lapAverageHeartRate: "AverageHeartRateBpm",
lapCadence: "Cadence",
lapCalories: "Calories",
lapDistance: "DistanceMeters",
lapIntensity: "Intensity",
lapMaxHeartRate: "MaximumHeartRateBpm",
lapMaxSpeed: "MaximumSpeed",
lapNotes: "Notes",
lapStartTime: "StartTime",
lapTotalTime: "TotalTimeSeconds",
lapTriggerMethod: "TriggerMethod",
position: "Position",
positionLatitude: "LatitudeDegrees",
positionLongitude: "LongitudeDegrees",
track: "Track",
trackPoint: "Trackpoint",
trackPointCadence: "Cadence",
trackPointDistance: "DistanceMeters",
trackPointElevation: "AltitudeMeters",
trackPointHeartRate: "HeartRateBpm",
trackPointHeartRateValue: "Value",
trackPointSensorState: "SensorState",
trackPointTime: "Time",
version: "Version",
versionBuildMajor: "BuildMajor",
versionBuildMinor: "BuildMinor",
versionMajor: "VersionMajor",
versionMinor: "VersionMinor"
};
Documentation generated by
JSDoc on Wed Feb 27 11:54:53 2008