1 2function RaceDataItem() { 3 this.Time = 0; 4 this.Distance = 0; 5 this.Power = 0; 6 this.Pulse = 0; 7 this.RPM = 0; 8 this.Speed = 0; 9 this.Grade = 0; 10 this.IsRunning = 1; 11} 12function TourDataItem() { 13 this.Distance = 0; 14 this.Height = 0; 15} 16function RaceUserData() { 17 this.ID = 0; 18 this.Username = ""; 19 this.TeamShortName = ""; 20 this.Data = new Array(); 21} 22RaceUserData.prototype.GetData = function (time) { 23 for (var i = 1; i < this.Data.length; i++) { 24 if (time >= this.Data[i-1].Time && time < this.Data[i].Time) { 25 return this.Data[i-1]; 26 } 27 } 28 return (this.Data.length > 0 ? (time >= this.Data[this.Data.length-1].Time ? this.Data[this.Data.length-1] : this.Data[0]) : null); 29} 30RaceUserData.prototype.IsAtEnd = function (time) { 31 return (this.Data.length > 0 ? this.Data[this.Data.length - 1].Time <= time : false); 32} 33RaceUserData.prototype.GetDuration = function () { 34 return (this.Data.length > 0 ? this.Data[this.Data.length - 1].Time : 0); 35} 36function RaceMetaItem() { 37 this.ID = 0; 38 this.Title = ""; 39 this.StartTime = ""; 40 this.Users = new Array(); 41} 42function KWTRaceDataPortal() { 43 this._listeners = {}; 44 this.RaceID = 0; 45 this.Title = ""; 46 this.Description = ""; 47 this.StartTime = ""; 48 this.EndTime = ""; 49 this.TourName = ""; 50 this.TourLength = 0.0; 51 this.CourseID = ""; 52 this.RaceLength = 0.0; 53 this.StartDistance = -1; 54 this.TargetDistance = -1; 55 this.Users = new Array(); 56 this.TourData = new Array(); 57 this.Races = new Array(); 58} 59 60KWTRaceDataPortal.prototype.getRaceLength = function () { 61 return dateDiff(this.EndTime, this.StartTime)/1000; 62} 63 64KWTRaceDataPortal.prototype.getRaceData = function (raceID, userNum) { 65 var postData = "{req: {API_KEY: \"" + api_key + "\", SessionID: \"{00000000-0000-0000-0000-000000000000}\", RaceID: " + raceID + ", UserNum: " + userNum + ", UserID: 0}}"; 66 $.ajax( 67 { 68 type: "POST", 69 url: "/KWTPortal2/RaceDataPortal.asmx/GetRaceData", 70 dataType: "json", 71 contentType: "application/json; charset=utf-8", 72 success: this.OnKWTRaceDataLoaded, 73 error: this.OnKWTRaceDataError, 74 data: postData 75 } 76 ); 77} 78 79KWTRaceDataPortal.prototype.OnKWTRaceDataLoaded = function (msg, textStatus, jqXHR) { 80 raceDataPortal.loadRaceDataObject(msg.d); 81 raceDataPortal.fire({ type: "OnKWTRaceDataLoaded", Result: 1 }); 82} 83 84KWTRaceDataPortal.prototype.OnKWTRaceDataError = function (jqXHR, textStatus, errorThrown) { 85 raceDataPortal.fire({ type: "OnKWTRaceDataLoaded", Result: -1 }); 86} 87 88KWTRaceDataPortal.prototype.getRaceRecorderData = function (raceID) { 89 var postData = "{req: {API_KEY: \"" + api_key + "\", SessionID: \"{00000000-0000-0000-0000-000000000000}\", RaceID: " + raceID + "}}"; 90 $.ajax( 91 { 92 type: "POST", 93 url: "/KWTPortal2/RaceDataPortal.asmx/GetRaceRecorderData", 94 dataType: "json", 95 contentType: "application/json; charset=utf-8", 96 success: this.OnKWTRaceRecorderDataLoaded, 97 error: this.OnKWTRaceRecorderDataError, 98 data: postData 99 } 100 ); 101} 102 103 KWTRaceDataPortal.prototype.OnKWTRaceRecorderDataLoaded = function (msg, textStatus, jqXHR) { 104 raceDataPortal.loadRaceRecorderDataObject(msg.d); 105 raceDataPortal.fire({ type: "OnKWTRaceRecorderDataLoaded", Result: 1 }); 106} 107 108KWTRaceDataPortal.prototype.OnKWTRaceRecorderDataError = function (jqXHR, textStatus, errorThrown) { 109 raceDataPortal.fire({ type: "OnKWTRaceRecorderDataLoaded", Result: -1 }); 110} 111 112KWTRaceDataPortal.prototype.getRaces = function () { 113 var postData = "{req: {API_KEY: \"" + api_key + "\", SessionID: \"{00000000-0000-0000-0000-000000000000}\"}}"; 114 $.ajax( 115 { 116 type: "POST", 117 url: "/KWTPortal2/RaceDataPortal.asmx/GetRaces", 118 dataType: "json", 119 contentType: "application/json; charset=utf-8", 120 success: this.OnKWTRacesLoaded, 121 error: this.OnKWTRacesError, 122 data: postData 123 } 124 ); 125} 126 127KWTRaceDataPortal.prototype.OnKWTRacesLoaded = function (msg, textStatus, jqXHR) { 128 raceDataPortal.loadRaceMetaItems(msg.d); 129 raceDataPortal.fire({ type: "OnKWTRacesLoaded", Result: 1 }); 130} 131 132KWTRaceDataPortal.prototype.OnKWTRacesError = function (jqXHR, textStatus, errorThrown) { 133 raceDataPortal.fire({ type: "OnKWTRacesLoaded", Result: -1 }); 134} 135 136function jsonDateTimeToDate(js) { 137 var dpart = js.substr(6, js.length - 8); 138 var dt = new Date(); 139 dt.setTime(dpart * 1); 140 return new Date(Date.UTC(dt.getFullYear(), dt.getMonth(), dt.getDate(), dt.getHours(), dt.getMinutes(), dt.getSeconds(), dt.getMilliseconds())); 141} 142 143KWTRaceDataPortal.prototype.loadRaceMetaItems = function (jo) { 144 if (jo == null) return; 145 raceDataPortal.Races = new Array(); 146 if (jo.ResultCode < 0) return; 147 for (var i = 0; i < jo.Races.length; i++) { 148 var rj = jo.Races[i]; 149 var rmi = new RaceMetaItem(); 150 rmi.ID = rj.ID;
151 rmi.Title = rj.Title; 152 rmi.StartTime = jsonDateTimeToDate(rj.StartTime); 153 if (rj.Users != null) { 154 for (var j = 0; j < rj.Users.length; j++) { 155 var uj = rj.Users[j]; 156 var u = new RaceUserData(); 157 u.ID = uj.ID; 158 u.Username = uj.Username; 159 u.TeamShortName = uj.TeamShortName; 160 rmi.Users.push(u); 161 } 162 } 163 raceDataPortal.Races.push(rmi); 164 } 165} 166 167KWTRaceDataPortal.prototype.loadRaceDataObject = function (jo) { 168 if (jo == null) return null; 169 if (jo.ResultCode < 0) return; 170 raceDataPortal.RaceID = jo.RaceID; 171 raceDataPortal.Title = jo.Title; 172 raceDataPortal.Description = jo.Description; 173 raceDataPortal.StartTime = jsonDateTimeToDate(jo.StartTime); 174 raceDataPortal.EndTime = jsonDateTimeToDate(jo.EndTime); 175 raceDataPortal.TourName = jo.TourName; 176 raceDataPortal.TourLength = jo.TourLength; 177 raceDataPortal.CourseID = jo.CourseID; 178 raceDataPortal.RaceLength = jo.RaceLength; 179 raceDataPortal.StartDistance = jo.StartDistance; 180 raceDataPortal.TargetDistance = jo.TargetDistance; 181 raceDataPortal.Users = new Array(); 182 if (jo.Users != null) { 183 for (var i = 0; i < jo.Users.length; i++) { 184 var uj = jo.Users[i]; 185 var u = new RaceUserData(); 186 u.ID = uj.ID; 187 u.Username = uj.Username; 188 u.TeamShortName = uj.TeamShortName; 189 if (uj.Data != null) { 190 191 for (var j = 0; j < uj.Data.length; j++) { 192 var dj = uj.Data[j]; 193 var d = new RaceDataItem(); 194 d.Distance = dj.Distance; 195 d.Time = dj.Time; 196 d.Power = dj.Power; 197 d.Pulse = dj.Pulse; 198 d.RPM = dj.RPM; 199 d.Speed = dj.Speed; 200 d.Grade = dj.Grade; 201 u.Data.push(d); 202 } 203 } 204 raceDataPortal.Users.push(u); 205 } 206 } 207 raceDataPortal.TourData = new Array(); 208 if (jo.TourData != null) { 209 for (var i = 0; i < jo.TourData.length; i++) { 210 var tj = jo.TourData[i]; 211 var t = new TourDataItem(); 212 t.Distance = tj.Distance; 213 t.Height = tj.Height; 214 raceDataPortal.TourData.push(t); 215 } 216 } 217} 218 219 220KWTRaceDataPortal.prototype.loadRaceRecorderDataObject = function (jo) { 221 if (jo == null) return null; 222 if (jo.ResultCode < 0) return; 223 raceDataPortal.RaceID = jo.RaceID; 224 raceDataPortal.Title = jo.Title; 225 raceDataPortal.Description = jo.Description; 226 raceDataPortal.StartTime = jsonDateTimeToDate(jo.StartTime); 227 raceDataPortal.EndTime = jsonDateTimeToDate(jo.EndTime); 228 raceDataPortal.TourName = jo.TourName; 229 raceDataPortal.TourLength = jo.TourLength; 230 raceDataPortal.CourseID = jo.CourseID; 231 raceDataPortal.RaceLength = jo.RaceLength; 232 raceDataPortal.StartDistance = jo.StartDistance; 233 raceDataPortal.TargetDistance = jo.TargetDistance; 234 raceDataPortal.Users = new Array(); 235 if (jo.Users != null) { 236 for (var i = 0; i < jo.Users.length; i++) { 237 var uj = jo.Users[i]; 238 var u = new RaceUserData(); 239 u.ID = uj.ID; 240 u.Username = uj.U; 241 u.TeamShortName = uj.T; 242 if (uj.D != null) { 243 244 for (var j = 0; j < uj.D.length; j++) { 245 var dj = uj.D[j]; 246 var d = new RaceDataItem(); 247 d.Distance = dj.D; 248 d.Time = dj.T; 249 d.Speed = dj.S; 250 d.IsRunning = dj.R; 251 u.Data.push(d); 252 } 253 } 254 raceDataPortal.Users.push(u); 255 } 256 } 257 raceDataPortal.TourData = new Array(); 258} 259 260KWTRaceDataPortal.prototype.addListener = function (type, listener) { 261 if (typeof this._listeners[type] == "undefined") { 262 this._listeners[type] = []; 263 } 264 265 this._listeners[type].push(listener); 266};
267 268KWTRaceDataPortal.prototype.fire = function (event) { 269 if (typeof event == "string") { 270 event = { type: event }; 271 } 272 if (!event.target) { 273 event.target = this; 274 } 275 276 if (!event.type) { //falsy 277 throw new Error("Event object missing 'type' property."); 278 } 279 280 if (this._listeners[event.type] instanceof Array) { 281 var listeners = this._listeners[event.type]; 282 for (var i = 0, len = listeners.length; i < len; i++) { 283 listeners[i].call(this, event); 284 } 285 } 286}; 287 288KWTRaceDataPortal.prototype.removeListener = function (type, listener) { 289 if (this._listeners[type] instanceof Array) { 290 var listeners = this._listeners[type]; 291 for (var i = 0, len = listeners.length; i < len; i++) { 292 if (listeners[i] === listener) { 293 listeners.splice(i, 1); 294 break; 295 } 296 } 297 } 298};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.