SHOW:
|
|
- or go back to the newest paste.
1 | /* WITHIN JQUERY success: function() */ | |
2 | var postcodes = jQuery.parseJSON(data2); | |
3 | var extraSkip = 0; | |
4 | var skipCounter = []; | |
5 | if ( postcodes.length > 10 ) | |
6 | { | |
7 | ||
8 | // split and rebuild long routes | |
9 | var batches = []; | |
10 | var itemsPerBatch = 8; // google API max - 1 start, 1 stop, and 8 waypoints | |
11 | var itemsCounter = 0; | |
12 | var wayptsExist = postcodes.length > 0; | |
13 | var skipCounter = []; | |
14 | while (wayptsExist) { | |
15 | var subBatch = []; | |
16 | var subitemsCounter = 0; | |
17 | ||
18 | for (var j = itemsCounter; j < postcodes.length; j++) { | |
19 | ||
20 | var skipThisPoint = false; | |
21 | if (postcodes[j] == 'noplot') | |
22 | { | |
23 | // use the previous location's postcode for the non-plottable waypt | |
24 | skipThisPoint = true; | |
25 | skipCounter.push(j); | |
26 | } | |
27 | else if (postcodes[j] == 'skip') | |
28 | { | |
29 | // completely skip this point, but still increment number | |
30 | skipThisPoint = true; | |
31 | skipCounter.push(j); | |
32 | ||
33 | } | |
34 | else | |
35 | { | |
36 | postcodeToUse = postcodes[j]; | |
37 | } | |
38 | ||
39 | ||
40 | subitemsCounter++; | |
41 | ||
42 | if (!skipThisPoint) | |
43 | { | |
44 | subBatch.push({ | |
45 | location: postcodeToUse, | |
46 | stopover: true | |
47 | }); | |
48 | } | |
49 | ||
50 | if (subitemsCounter == itemsPerBatch) break; | |
51 | ||
52 | } | |
53 | ||
54 | itemsCounter += subitemsCounter; | |
55 | batches.push(subBatch); | |
56 | wayptsExist = itemsCounter < postcodes.length; | |
57 | ||
58 | } | |
59 | ||
60 | ||
61 | // START OF MARKER MAPPING | |
62 | routeMapping.calcLongRoute(batches, directionsService, directionsDisplay, | |
63 | function(route) | |
64 | { | |
65 | ||
66 | var totalMilage = 0; | |
67 | var thisMilage = ''; | |
68 | ||
69 | if (route.legs[0].start_address != route.legs[route.legs.length-1].end_address) | |
70 | { | |
71 | routeMapping.makeMarker( route.legs[0].start_location, routeMapping.iconWaypointDepot('C0FFC0'), 'Depot (Departure)' ); | |
72 | routeMapping.makeMarker( route.legs[route.legs.length-1].end_location, routeMapping.iconWaypointDepot('FFC0C0'), 'Depot (Return)' ); | |
73 | } | |
74 | else | |
75 | { | |
76 | routeMapping.makeMarker( route.legs[0].start_location, routeMapping.iconWaypointDepot('A3D7EF'), 'Depot (Depart/Return)' ); | |
77 | } | |
78 | ||
79 | for (i = 0; i < route.legs.length; i++ ) { | |
80 | ||
81 | // account for missing legs. not the paraplegic kind, the non-plottable kind. | |
82 | j = i; | |
83 | for (x = 0; x < skipCounter.length; x++) | |
84 | { | |
85 | if ( i == skipCounter[x] - 1 ) | |
86 | { | |
87 | j = j + 1; | |
88 | extraSkip++; | |
89 | } | |
90 | else | |
91 | { | |
92 | j = j + extraSkip; | |
93 | } | |
94 | } | |
95 | ||
96 | var isLastLeg = false; | |
97 | var isFirstLeg = false; | |
98 | if (i == (route.legs.length - 1)) isLastLeg = true; | |
99 | if (i == 0) isFirstLeg = true; | |
100 | ||
101 | ||
102 | if (!isLastLeg) | |
103 | { | |
104 | if (!isFirstLeg) | |
105 | { | |
106 | if ( (route.legs[i-1].end_location == route.legs[i].end_location) ) | |
107 | { | |
108 | // this leg ends up in the same location as another leg, so attempt to alter colour. | |
109 | routeMapping.makeMarker( route.legs[i].end_location, routeMapping.iconWaypointNum(j+1, 'DC5C00'), route.legs[i].end_address ); | |
110 | } | |
111 | else | |
112 | { | |
113 | routeMapping.makeMarker( route.legs[i].end_location, routeMapping.iconWaypointNum(j+1), route.legs[i].end_address ); | |
114 | } | |
115 | } | |
116 | else | |
117 | { | |
118 | routeMapping.makeMarker( route.legs[i].end_location, routeMapping.iconWaypointNum(j+1), route.legs[i].end_address ); | |
119 | } | |
120 | } | |
121 | ||
122 | $j('.legDistance' + i).html( route.legs[i].distance.text ); | |
123 | ||
124 | ||
125 | thisMilage = route.legs[i].distance.text; | |
126 | var isInFeet = (thisMilage.indexOf("ft") != -1) ? true : false; | |
127 | if (isInFeet) | |
128 | { | |
129 | thisMilage = thisMilage.replace(' ft', ''); | |
130 | var milageFloat = parseFloat(thisMilage); | |
131 | milageFloat = milageFloat * 0.000189393939; // 1 foot = 0.000189393939 miles | |
132 | } | |
133 | else | |
134 | { | |
135 | thisMilage = thisMilage.replace(' mi', ''); | |
136 | var milageFloat = parseFloat(thisMilage); | |
137 | } | |
138 | ||
139 | totalMilage = totalMilage + milageFloat; | |
140 | ||
141 | } | |
142 | ||
143 | // update milage | |
144 | var originalMilage = $j('.runSelected').children('td:last').prev().prev().prev().html(); | |
145 | $j('.runSelected').children('td:last').prev().prev().prev().html(totalMilage.toFixed(2) + ' mi'); | |
146 | $j('.totalMilageCell').children('strong').html(totalMilage.toFixed(2) + ' mi'); | |
147 | ||
148 | if ( originalMilage != totalMilage + ' mi' ) | |
149 | { | |
150 | $j.ajax( | |
151 | { | |
152 | type: 'get', | |
153 | async: true, | |
154 | url: '/runAllocation/setTotalMilageForRun', | |
155 | data: 'mi=' + totalMilage + '&rh=' + clickedLink.prev('.hiddenAnchor').attr('name'), | |
156 | cache: false | |
157 | } | |
158 | ); | |
159 | } | |
160 | ||
161 | // plot current driver location - only doing this on 'initial' lookup | |
162 | // as there's no point to doing this everytime the route is updated | |
163 | $j.ajax( | |
164 | { | |
165 | type: 'get', | |
166 | async: true, | |
167 | url: '/runAllocation/getCurrentDriverLocation', | |
168 | data: 'run=' + clickedLink.prev('.hiddenAnchor').attr('name'), | |
169 | cache: false, | |
170 | success: function (driverLocationData) | |
171 | { | |
172 | ||
173 | var result = jQuery.parseJSON(driverLocationData); | |
174 | ||
175 | if (result.success && result.location != '') | |
176 | { | |
177 | var locationCoords = new google.maps.LatLng(result.lat,result.lng); | |
178 | routeMapping.makeMarker( locationCoords, routeMapping.iconWaypointDriver(), 'Approximate location of ' + result.driverName ); | |
179 | } | |
180 | ||
181 | } | |
182 | } | |
183 | ); | |
184 | ||
185 | } | |
186 | ); | |
187 | // END OF MARKER MAPPING | |
188 | ||
189 | } | |
190 | ||
191 | /* Route Calc object - there's more to this than pasted here */ | |
192 | routeMapping = { | |
193 | calcLongRoute: function (batches, directionsService, directionsDisplay, callback) | |
194 | { | |
195 | var combinedResults; | |
196 | var directionsResultsReturned = 0; | |
197 | ||
198 | var totalCombinedResults = []; | |
199 | var startEndRefArray = []; | |
200 | ||
201 | ||
202 | // make a reference to start and ending so that we can compare it to the passed-through 'first and last' waypts | |
203 | var nextBatchStartPoint = []; | |
204 | for (var b = 0; b < batches.length; b++) { | |
205 | ||
206 | var lastIndex = batches[b].length - 1; | |
207 | var pointHelper = []; | |
208 | ||
209 | if (b == 0) | |
210 | - | } |
210 | + | |
211 | var start = batches[b][0].location; | |
212 | nextBatchStartPoint[b+1] = batches[b][lastIndex].location | |
213 | } | |
214 | else | |
215 | { | |
216 | var start = nextBatchStartPoint[b]; | |
217 | nextBatchStartPoint[b+1] = batches[b][lastIndex].location | |
218 | } | |
219 | ||
220 | pointHelper.push(b, start, batches[b][lastIndex].location); | |
221 | ||
222 | startEndRefArray.push(pointHelper); | |
223 | } | |
224 | ||
225 | ||
226 | // now loop through points again, and | |
227 | var nextBatchStartPoint = []; | |
228 | for (var k = 0; k < batches.length; k++) { | |
229 | ||
230 | var lastIndex = batches[k].length - 1; | |
231 | var waypts = []; | |
232 | ||
233 | waypts = batches[k]; | |
234 | ||
235 | if (k == 0) | |
236 | { | |
237 | var start = batches[k][0].location; | |
238 | nextBatchStartPoint[k+1] = batches[k][lastIndex].location | |
239 | } | |
240 | else | |
241 | { | |
242 | var start = nextBatchStartPoint[k]; | |
243 | nextBatchStartPoint[k+1] = batches[k][lastIndex].location | |
244 | } | |
245 | ||
246 | ||
247 | var end = batches[k][lastIndex].location; | |
248 | ||
249 | //if this is the VERY first item (i.e. the starting depot) we want to remove it to remove duplicates on map | |
250 | if (k == 0) | |
251 | { | |
252 | waypts.splice(0, 1); | |
253 | } | |
254 | ||
255 | // trim last entry from array | |
256 | waypts.splice(waypts.length - 1, 1); | |
257 | ||
258 | var request = { | |
259 | origin: start, | |
260 | destination: end, | |
261 | waypoints: waypts, | |
262 | optimizeWaypoints: false, | |
263 | unitSystem: google.maps.UnitSystem.IMPERIAL, | |
264 | travelMode: google.maps.DirectionsTravelMode.DRIVING | |
265 | }; | |
266 | ||
267 | // keeping nasty commented code in here in case things go wrong | |
268 | directionsService.route(request, function (result, status) | |
269 | { | |
270 | if (status == window.google.maps.DirectionsStatus.OK) | |
271 | { | |
272 | ||
273 | // check if expected results are found before looping through all this and getting ugly errors. | |
274 | // Google appears to be changing the variable name passed through the results. routes and status | |
275 | // are fine, but the 'original request' one has changed 3 times now. So this should accommodate | |
276 | // changes to this. | |
277 | ||
278 | //var passedRequest = result.Zf; // pass-through of original request object | |
279 | var passoverArray = ['routes','status']; // keys that are allowed to be skipped. | |
280 | var extraKeyCount = 0; | |
281 | var passedRequest; | |
282 | for (key in result) | |
283 | { | |
284 | if ( key in tools.isInArray(passoverArray) ) | |
285 | { | |
286 | // do nothing | |
287 | } | |
288 | else | |
289 | { | |
290 | extraKeyCount++; | |
291 | passedRequest = result[key]; | |
292 | } | |
293 | ||
294 | } | |
295 | ||
296 | if (extraKeyCount == 1) // there should only be one left. If Google adds more, we need to look | |
297 | { // so this should error out gracefully if this happens | |
298 | // do nothing, because we can continue | |
299 | } | |
300 | else if (extraKeyCount > 1) // will not happen unless Google adds another object | |
301 | { | |
302 | alert ('There appears to be an error with the route, which could not be calculated. The error code was "TOO_MANY_RESULT_OBJECTS".'); | |
303 | return false; | |
304 | } | |
305 | else // should not happen ever, unless google completely removes all variables other than those passed over | |
306 | { | |
307 | alert ('There appears to be an error with the route, which could not be calculated. The error code was "KEY_COUNT_IS_ZERO".'); | |
308 | return false; | |
309 | } | |
310 | ||
311 | ||
312 | ||
313 | if (directionsResultsReturned == 0) { // first bunch of results in. new up the combinedResults object | |
314 | combinedResults = result; | |
315 | ||
316 | for (b = 0; b < startEndRefArray.length; b++) | |
317 | { | |
318 | ||
319 | if ( passedRequest.origin == startEndRefArray[b][1] && passedRequest.destination == startEndRefArray[b][2]) | |
320 | { | |
321 | ||
322 | totalCombinedResults[startEndRefArray[b][0]] = result; | |
323 | directionsResultsReturned++; | |
324 | ||
325 | } | |
326 | else | |
327 | { | |
328 | // no match, so do nothing | |
329 | } | |
330 | ||
331 | } | |
332 | ||
333 | } | |
334 | else | |
335 | { | |
336 | // only building up legs, overview_path, and bounds in my consolidated object. This is not a complete | |
337 | // directionResults object, but enough to draw a path on the map, which is all we need | |
338 | for (b = 0; b < startEndRefArray.length; b++) | |
339 | { | |
340 | ||
341 | if ( passedRequest.origin == startEndRefArray[b][1] && passedRequest.destination == startEndRefArray[b][2]) | |
342 | { | |
343 | ||
344 | totalCombinedResults[startEndRefArray[b][0]] = result; | |
345 | directionsResultsReturned++; | |
346 | ||
347 | } | |
348 | else | |
349 | { | |
350 | // no match, so do nothing | |
351 | } | |
352 | ||
353 | } | |
354 | ||
355 | } | |
356 | ||
357 | ||
358 | ||
359 | if (directionsResultsReturned == batches.length) | |
360 | { | |
361 | ||
362 | // now we're done building results, so sort and extract the 'original' combined results. | |
363 | var combinedResultsResorted = []; | |
364 | var combinedResultsResortedTemp = []; | |
365 | ||
366 | var combinedResultsFinal; | |
367 | for (t = 0; t < totalCombinedResults.length; t++) | |
368 | { | |
369 | ||
370 | if (t == 0) | |
371 | { | |
372 | combinedResultsFinal = totalCombinedResults[t]; | |
373 | } | |
374 | else | |
375 | { | |
376 | var previousRoutes = totalCombinedResults[t].routes[0]; | |
377 | ||
378 | combinedResultsFinal.routes[0].legs = combinedResultsFinal.routes[0].legs.concat( totalCombinedResults[t].routes[0].legs ); | |
379 | combinedResultsFinal.routes[0].overview_path = combinedResultsFinal.routes[0].overview_path.concat( totalCombinedResults[t].routes[0].overview_path ); | |
380 | } | |
381 | ||
382 | } | |
383 | ||
384 | directionsDisplay.setDirections(combinedResultsFinal); | |
385 | callback(combinedResultsFinal.routes[0]); | |
386 | ||
387 | } | |
388 | ||
389 | ||
390 | } | |
391 | else | |
392 | { | |
393 | alert ('Unfortunately there was an error plotting your map. We\'re sorry about that! The error returned was ' + status); | |
394 | } | |
395 | ||
396 | }); | |
397 | ||
398 | ||
399 | } | |
400 | ||
401 | ||
402 | } | |
403 | } |