ym4r-mapstraction 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,977 @@
1
+ try{
2
+ var testCommons = new MQObject();
3
+ testCommons = null;
4
+ }catch(error){
5
+ throw "You must include mqcommon.js or toolkit api script prior to mqexec.js.";
6
+ }
7
+ /**
8
+ * Constructs new MQExec Object
9
+ *
10
+ * @class Provides communication layer for requests to a server. Most, but
11
+ * not all, of the functions generate actual requests to the MapQuest
12
+ * Server. Within the context of this object, a Session object is used
13
+ * to maintain information concerning the current client's requests.
14
+ *
15
+ * @param {String/MQExec} strServerNameORmqeObj MapQuest Server name (or) MQExec
16
+ * object to copy the server information.
17
+ * @param {String} strPathToServer Path to the Server
18
+ * @param {int} nServerPort HTTP Port of the Server
19
+ * @param {String} strProxyServerName Name of the server hosting the Proxy page
20
+ * @param (String} strPathToProxyServerPage Path to the Proxy Server page
21
+ * @param {int} nProxyServerPort Port of the Server hosting the Proxy page
22
+ *
23
+ * strServerName, strPathToServer, and nServerPort are required properties
24
+ * that need to be set before the first request. If these properties are not
25
+ * specified, the defaults used for initialization are:
26
+ *
27
+ * MapServer = localhost
28
+ * PathToServer = mq
29
+ * HTTPPort = 80
30
+ *
31
+ * Please Note: These defaults are not likely to match your configuration.
32
+ *
33
+ * If MQExec object is provided as the first parameter, remaining parameters
34
+ * will be ignored and server information will be copied from the provided object.
35
+ *
36
+ *
37
+ * @see MQDBLayerQueryCollection
38
+ * @see MQDTCollection
39
+ * @see MQFeatureCollection
40
+ * @see MQLocation
41
+ * @see MQLocationCollection
42
+ * @see MQMapState
43
+ * @see MQLatLng
44
+ * @see MQPoint
45
+ * @see MQSession
46
+ * @see MQRouteOptions
47
+ * @see MQRouteResults
48
+ * @see MQGeocodeOptionsCollection
49
+ * @see MQStringCollection
50
+ * @see MQRecordSet
51
+ * @see MQLatLngCollection
52
+ * @see MQPointCollection
53
+ * @see MQSearchCriteria
54
+ * @see MQMapCommand
55
+ * @see MQQualityType
56
+ * @see MQMatchType
57
+ */
58
+ function MQExec ( strServerNameORmqeObj, strPathToServer, nServerPort,
59
+ strProxyServerName, strPathToProxyServerPage, nProxyServerPort )
60
+ {
61
+
62
+
63
+ var m_strServerName;
64
+ var m_strServerPath;
65
+ var m_nServerPort;
66
+ var m_strProxyServerPath ;
67
+ var m_strProxyServerName;
68
+ var m_nProxyServerPort;
69
+ var m_lSocketTimeout;
70
+ var m_strXInfo = "";
71
+
72
+ if( typeof strServerNameORmqeObj == "string" ) {
73
+ m_strServerName = strServerNameORmqeObj || "localhost";
74
+ m_strServerPath = strPathToServer || "mq";
75
+ m_nServerPort = nServerPort || 80;
76
+ m_strProxyServerPath = strPathToProxyServerPage || "";
77
+ m_strProxyServerName = strProxyServerName || "";
78
+ m_nProxyServerPort = nProxyServerPort || 0;
79
+ m_lSocketTimeout = 0;
80
+
81
+ } else if(strServerNameORmqeObj.getClassName() &&
82
+ strServerNameORmqeObj.getClassName() == "MQExec" ) {
83
+ m_strServerName = strServerNameORmqeObj.getServerName();
84
+ m_strServerPath = strServerNameORmqeObj.getServerPath();
85
+ m_nServerPort = strServerNameORmqeObj.getServerPort();
86
+ m_strProxyServerName = strServerNameORmqeObj.getProxyServerName();
87
+ m_nProxyServerPort = strServerNameORmqeObj.getProxyServerPort();
88
+ m_strProxyServerPath = strServerNameORmqeObj.getProxyServerPath();
89
+ m_lSocketTimeout = strServerNameORmqeObj.m_lSocketTimeout;
90
+ }
91
+
92
+
93
+ /**
94
+ * Sets the name of the server which is to be used to satisfy this request.
95
+ * @param {String} strServerName The name of the MapQuest Server which is to
96
+ * be used to satisfy this request.
97
+ * @type void
98
+ */
99
+
100
+ this.setServerName = function(strServerName) {
101
+ m_strServerName = strServerName;
102
+
103
+ };
104
+
105
+ /**
106
+ * Returns the name of the server which will be used to satisfy this
107
+ * request.
108
+ *
109
+ * @return The name of the server which will be used to satisfy
110
+ * this request.
111
+ * @type String
112
+ */
113
+
114
+ this.getServerName= function() {
115
+ return m_strServerName;
116
+ };
117
+
118
+
119
+ /**
120
+ * Sets the path to the server which is to be used to satisfy this request.
121
+ *
122
+ * @param {String} strServerPath The path to the server which is to be used
123
+ * to satisfy this request.
124
+ * @type void
125
+ */
126
+
127
+ this.setServerPath = function(strServerPath) {
128
+ m_strServerPath = strServerPath;
129
+ };
130
+
131
+
132
+ /**
133
+ * Returns the path to the server which will be used to satisfy this
134
+ * request.
135
+ *
136
+ * @return The path to the server which will be used to satisfy this
137
+ * request.
138
+ * @type String
139
+ */
140
+
141
+ this.getServerPath= function() {
142
+ return m_strServerPath;
143
+ };
144
+
145
+
146
+ /**
147
+ * Sets the port number to the server which is to be used to satisfy this
148
+ * request.
149
+ *
150
+ * @param {int} nServerPort The port number of the server which is to be
151
+ * used to satisfy this request.
152
+ * @type void
153
+ */
154
+
155
+ this.setServerPort = function(nServerPort) {
156
+ m_nServerPort = nServerPort;
157
+
158
+ };
159
+
160
+ /**
161
+ * Returns the port number of the server which will be used to satisfy
162
+ * this request.
163
+ *
164
+ * @return The port number of the server which will be used to satisfy
165
+ * this request.
166
+ * @type int
167
+ */
168
+
169
+ this.getServerPort= function() {
170
+ return m_nServerPort;
171
+ };
172
+
173
+
174
+
175
+ /**
176
+ * Sets the name or IP of the proxy server to connect to.
177
+ * The name should not contain any leading or trailing slashes ("/").
178
+ *
179
+ * @param {String} strProxyServerName The name of the proxy server.
180
+ * @type void
181
+ */
182
+
183
+ this.setProxyServerName = function(strProxyServerName) {
184
+ m_strProxyServerName = strProxyServerName;
185
+
186
+ };
187
+
188
+ /**
189
+ * Returns the name or IP of the proxy server to connect to.
190
+ *
191
+ * @return The name of the proxy server.
192
+ * @type String
193
+ */
194
+
195
+ this.getProxyServerName = function() {
196
+
197
+ return m_strProxyServerName;
198
+
199
+ };
200
+
201
+ /**
202
+ * Sets the path to the proxy server which is to be used to satisfy this request.
203
+ *
204
+ * @param (String} strProxyServerPath The path to the server which is to be used
205
+ * to satisfy this request.
206
+ * @type void
207
+ */
208
+
209
+ this.setProxyServerPath = function(strProxyServerPath) {
210
+ m_strProxyServerPath = strProxyServerPath;
211
+
212
+ };
213
+
214
+
215
+ /**
216
+ * Returns the path to the proxy server page which will be used to satisfy this
217
+ * request.
218
+ *
219
+ * @return The path to the proxy server page which will be used to satisfy this
220
+ * request.
221
+ * @type String
222
+ */
223
+
224
+ this.getProxyServerPath = function() {
225
+ return m_strProxyServerPath;
226
+ };
227
+
228
+ /**
229
+ * Sets the port to connect to the proxy server with.
230
+ *
231
+ * @param {int} nProxyServerPort The proxy server port number.
232
+ * @type void
233
+ */
234
+
235
+ this.setProxyServerPort = function(nProxyServerPort) {
236
+ m_nProxyServerPort = nProxyServerPort;
237
+
238
+ };
239
+
240
+ /**
241
+ * Returns the port number to connect to the proxy server with.
242
+ *
243
+ * @return The proxy server port number.
244
+ * @type int
245
+ */
246
+
247
+ this.getProxyServerPort = function() {
248
+ return m_nProxyServerPort;
249
+ };
250
+
251
+
252
+ /**
253
+ * Sets data to be passed to the server to be logged with any
254
+ * subsequent requests in the transaction log. (Max 8 characters)
255
+ *
256
+ * @param {String} strXInfo Transaction Info.
257
+ *
258
+ * @type void
259
+ */
260
+
261
+ this.setTransactionInfo = function(strXInfo) {
262
+ if (strXInfo.length > 32)
263
+ m_strXInfo = strXInfo.substring(0, 32);
264
+ else
265
+ m_strXInfo = strXInfo;
266
+
267
+ };
268
+
269
+
270
+ /**
271
+ * Gets data to be passed to the server to be logged with any
272
+ * subsequent requests in the transaction log.
273
+ *
274
+ * @return Transaction Information
275
+ * @type String
276
+ */
277
+
278
+ this.getTransactionInfo = function() {
279
+ return m_strXInfo;
280
+ };
281
+
282
+
283
+ }
284
+
285
+ /* Defined transaction versions */
286
+ MQExec.prototype.ROUTE_VERSION = "2";
287
+ MQExec.prototype.SEARCH_VERSION = "0";
288
+ MQExec.prototype.GEOCODE_VERSION = "1";
289
+ MQExec.prototype.ROUTEMATRIX_VERSION = "0";
290
+ MQExec.prototype.GETRECORDINFO_VERSION = "0";
291
+ MQExec.prototype.REVERSEGEOCODE_VERSION = "0";
292
+ MQExec.prototype.GETSESSION_VERSION = "1";
293
+
294
+
295
+ /**
296
+ * Prepares request XML data to be sent to the server for a given transaction
297
+ * and set of request objects.
298
+ *
299
+ * @param {String} strTransaction Name of the transaction
300
+ *
301
+ * @param {Array} arrRequest Array of request objects to form the XML
302
+ *
303
+ * @param {String} strVersion Version of the transaction implementation
304
+ *
305
+ * @type void
306
+ *
307
+ * @private
308
+ */
309
+ MQExec.prototype.getRequestXml = function(strTransaction, arrRequest, strVersion) {
310
+
311
+ var arrXmlBuf = new Array();
312
+ var version = strVersion || "0";
313
+ arrXmlBuf.push("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
314
+ arrXmlBuf.push("<" + strTransaction + " Version=\"" + version + "\">\n");
315
+ for (var i=0; i < arrRequest.length; i++) {
316
+ arrXmlBuf.push(arrRequest[i].saveXml());
317
+ arrXmlBuf.push("\n");
318
+ }
319
+ arrXmlBuf.push("</" + strTransaction + ">");
320
+ return arrXmlBuf.join("");
321
+
322
+ };
323
+
324
+ /**
325
+ * Performs the given transaction by making AJAX call to the Proxy Server page.
326
+ *
327
+ * @param {String} strTransaction Name of the transaction
328
+ *
329
+ * @param {Array} arrRequest Array of request objects
330
+ *
331
+ * @type void
332
+ *
333
+ * @private
334
+ */
335
+ MQExec.prototype.doTransaction = function(strTransaction, arrRequest, strVersion ) {
336
+
337
+ var xmlDoc;
338
+ var strResXml;
339
+ var http_request = mqXMLHttpRequest();
340
+ var strUrl = "";
341
+ arrRequest.push( new MQAuthentication(this.getTransactionInfo()));
342
+ var strReqXml = this.getRequestXml(strTransaction, arrRequest, strVersion);
343
+
344
+ if(this.getProxyServerName() != "") {
345
+ strUrl += "http://" + this.getProxyServerName();
346
+ if(this.getProxyServerPort() != 0) {
347
+ strUrl += ":" + this.getProxyServerPort();
348
+ }
349
+ strUrl += "/";
350
+ }
351
+
352
+ strUrl += this.getProxyServerPath();
353
+ strUrl += "?sname=" + this.getServerName();
354
+ strUrl += "&spath=" + this.getServerPath();
355
+ strUrl += "&sport=" + this.getServerPort();
356
+ display("mqXmlLogs", "Request URL: ", strUrl, "rURL", "mqDisplay");
357
+ display("mqXmlLogs", "Request XML: ", strReqXml, "", "mqDisplay");
358
+
359
+ http_request.open("POST", strUrl, false);
360
+ http_request.send(strReqXml);
361
+ if (http_request.status == 200) {
362
+ xmlDoc= http_request.responseXML;
363
+ }
364
+ else {
365
+ alert( "HTTP Status: " + http_request.status +
366
+ " (" + http_request.statusText + ")\n" +
367
+ "Details: \n" + http_request.responseText
368
+ );
369
+ xmlDoc = null;
370
+ }
371
+ display("mqXmlLogs", "Response XML: ", mqXmlToStr(xmlDoc), "resXML", "mqDisplay");
372
+ return xmlDoc;
373
+ };
374
+
375
+
376
+ /**
377
+ * Method to geocode an address or an intersection. Geocode options supply
378
+ * the QualityType and MatchType.
379
+ *
380
+ * @param {MQAddress} mqaAddress The Address object containing the necessary info for
381
+ * the address.
382
+ * (Please Note: This object will not be updated, it is simply used for the request.)
383
+ *
384
+ * @param {MQLocationCollection} mqlcLocations The LocationCollection to hold the results of the
385
+ * geocode.
386
+ *
387
+ * @param {MQAutoGeocodeCovSwitch/MQGeocodeOptionsCollection} theOptions
388
+ * The AutoGeocodeCovSwitch or MQGeocodeOptionsCollection to select a set of
389
+ * options stored on the server.
390
+ * (Please Note: This object will not be updated, it is simply used for the request.)
391
+ *
392
+ * @type void
393
+ */
394
+
395
+ MQExec.prototype.geocode = function(mqaAddress, mqlcLocations, theOptions) {
396
+
397
+ var xmlDoc;
398
+ var strXml;
399
+ var arrRequest = new Array();
400
+
401
+ if(mqaAddress == null || (mqaAddress.getClassName() !== "MQAddress" && mqaAddress.getClassName() !== "MQSingleLineAddress")) {
402
+ throw "Null or Illegal Argument passed for MQAddress";
403
+ } else {
404
+ arrRequest.push(mqaAddress);
405
+ }
406
+
407
+ if(mqlcLocations == null || mqlcLocations.getClassName() !== "MQLocationCollection") {
408
+ throw "Null or Illegal Argument passed for MQLocationCollection";
409
+ }
410
+
411
+ if(theOptions != null) {
412
+ if(theOptions.getClassName() !== "MQAutoGeocodeCovSwitch" &&
413
+ theOptions.getClassName() !== "MQGeocodeOptionsCollection" ) {
414
+ throw "Illegal Argument passed for Geocode Options";
415
+ } else {
416
+ arrRequest.push(theOptions);
417
+ }
418
+ }
419
+
420
+ mqLogTime("MQExec.geocode: Transaction Start");
421
+ xmlDoc = this.doTransaction("Geocode", arrRequest, this.GEOCODE_VERSION);
422
+ mqLogTime("MQExec.geocode: Transaction End");
423
+
424
+ mqLogTime("MQExec.geocode: Loading of GeocodeResponse Start");
425
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/GeocodeResponse/LocationCollection"));
426
+ mqlcLocations.loadXml(strXml);
427
+ mqLogTime("MQExec.geocode: Loading of GeocodeResponse End");
428
+
429
+ display("results", "Response", mqXmlToStr(xmlDoc), "", "mqDisplay");
430
+
431
+ };
432
+
433
+
434
+
435
+ /**
436
+ * Method to batch geocode a collection of locations. Geocode options supply
437
+ * the QualityType and MatchType.
438
+ *
439
+ * @param {MQLocationCollection} mqlcLocations The LocationCollection containing the
440
+ * necessary info for the addresses to be geocode.
441
+ * (Please Note: This object will not be updated, it is simply used for the request.)
442
+ *
443
+ * @param {MQLocationCollectionCollection} mqlccLocations The LocationCollectionCollection
444
+ * used to hold the results of the geocode.
445
+ *
446
+ * @param {MQAutoGeocodeCovSwitch/MQGeocodeOptionsCollection} theOptions
447
+ * The AutoGeocodeCovSwitch or MQGeocodeOptionsCollection to select a set of
448
+ * options stored on the server.
449
+ * (Please Note: This object will not be updated, it is simply used for the request.)
450
+ *
451
+ * @type void
452
+ */
453
+
454
+ MQExec.prototype.batchGeocode = function(mqlcLocations, mqlccLocations, theOptions) {
455
+
456
+ var xmlDoc;
457
+ var strXml;
458
+ var arrRequest = new Array();
459
+
460
+ if(mqlcLocations == null || mqlcLocations.getClassName() !== "MQLocationCollection") {
461
+ throw "Null or Illegal Argument passed for MQLocationCollection";
462
+ } else {
463
+ arrRequest.push(mqlcLocations);
464
+ }
465
+
466
+ if(mqlccLocations == null || mqlccLocations.getClassName() !== "MQLocationCollectionCollection") {
467
+ throw "Null or Illegal Argument passed for MQLocationCollectionCollection";
468
+ }
469
+
470
+ if(theOptions != null) {
471
+ if(theOptions.getClassName() !== "MQAutoGeocodeCovSwitch" &&
472
+ theOptions.getClassName() !== "MQGeocodeOptionsCollection" ) {
473
+ throw "Illegal Argument passed for Geocode Options";
474
+ } else {
475
+ arrRequest.push(theOptions);
476
+ }
477
+ }
478
+
479
+ mqLogTime("MQExec.batchGeocode: Transaction Start");
480
+ xmlDoc = this.doTransaction("BatchGeocode", arrRequest, this.GEOCODE_VERSION);
481
+ mqLogTime("MQExec.batchGeocode: Transaction End");
482
+
483
+ mqLogTime("MQExec.batchGeocode: Loading of GeocodeResponse Start");
484
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/BatchGeocodeResponse/LocationCollectionCollection"));
485
+ mqlccLocations.loadXml(strXml);
486
+ mqLogTime("MQExec.batchGeocode: Loading of GeocodeResponse End");
487
+
488
+ display("results", "Response", mqXmlToStr(xmlDoc), "", "mqDisplay");
489
+
490
+ };
491
+
492
+
493
+
494
+ /**
495
+ * Calculates a route using a collection of locations as origin and
496
+ * destination. These locations can be Address, GeoAddress,
497
+ * Intersection, or GeoIntersection objects.
498
+ *
499
+ * @param {MQLocationCollection} mqlcLocations Collection of locations.
500
+ * (Please Note: This object will not be updated, it is simply used for the request.)
501
+ *
502
+ * @param {MQRouteOptions} mqroOptions Route options object, to modify
503
+ * behavior of route.
504
+ * (Please Note: This object will not be updated, it is simply used for the request.)
505
+ *
506
+ * @param {MQRouteResults} mqrrResults The results of the route request.
507
+ *
508
+ * @param {String} strSessionUID The unique Session ID.
509
+ *
510
+ * @param {MQRectLL} mqRectLL The bounding box to provide to the TileMap
511
+ * ToolKit. This parameter is optional
512
+ *
513
+ * @type void
514
+ */
515
+
516
+ MQExec.prototype.doRoute = function(mqlcLocations, mqroOptions, mqrrResults, strSessionUID, mqRectLL) {
517
+
518
+ var xmlDoc;
519
+ var strXml;
520
+ var arrRequest = new Array();
521
+
522
+ if(mqlcLocations == null || mqlcLocations.getClassName() !== "MQLocationCollection") {
523
+ throw "Null or Illegal Argument passed for MQLocationCollection";
524
+ } else {
525
+ arrRequest.push(mqlcLocations);
526
+ }
527
+ if(mqroOptions == null || mqroOptions.getClassName() !== "MQRouteOptions") {
528
+ throw "Null or Illegal Argument passed for MQRouteOptions";
529
+ } else {
530
+ arrRequest.push(mqroOptions);
531
+ }
532
+ if(mqrrResults == null || mqrrResults.getClassName() !== "MQRouteResults") {
533
+ throw "Null or Illegal Argument passed for MQRouteResults";
534
+ } else {
535
+ var sessionId = strSessionUID || "";
536
+ arrRequest.push(new MQXmlNodeObject("SessionID",sessionId) );
537
+ }
538
+
539
+ mqLogTime("MQExec.doRoute: Transaction Start");
540
+ xmlDoc = this.doTransaction("DoRoute", arrRequest, this.ROUTE_VERSION);
541
+ mqLogTime("MQExec.doRoute: Transaction End");
542
+
543
+ mqLogTime("MQExec.doRoute: Loading of RouteResults Start");
544
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/DoRouteResponse/RouteResults"));
545
+ mqrrResults.loadXml(strXml);
546
+ mqLogTime("MQExec.doRoute: Loading of RouteResults End");
547
+
548
+ display("results", "Response", mqXmlToStr(xmlDoc), "", "mqDisplay");
549
+
550
+ if(mqRectLL !== null && sessionId !== ""){
551
+ this.getRouteBoundingBoxFromSessionResponse(sessionId, mqRectLL);
552
+ }
553
+
554
+ };
555
+
556
+ /**
557
+ * Generates a request to the MapQuest server (as specified by the
558
+ * server name, path, and port number) to create a user Session.
559
+ * The Session is assigned a unique identifier which is used to
560
+ * access and update the Session information.
561
+ *
562
+ * @param {MQSession} mqsSession Object containing objects for the session.
563
+ * (Please Note: This object will not be updated, it is simply used for the request.)
564
+ *
565
+ * @return The unique Session identifier.
566
+ *
567
+ * @type String
568
+ */
569
+
570
+ MQExec.prototype.createSessionEx = function(mqsSession) {
571
+
572
+ var xmlDoc;
573
+ var strSessId;
574
+ var arrRequest = new Array();
575
+ if(mqsSession == null || mqsSession.getClassName() !== "MQSession") {
576
+ throw "Null or Illegal Argument passed for MQSession";
577
+ } else {
578
+ arrRequest.push(mqsSession);
579
+ }
580
+
581
+ xmlDoc = this.doTransaction("CreateSession", arrRequest);
582
+ strSessId = mqGetNodeText(mqGetNode(xmlDoc, "/CreateSessionResponse/SessionID"));
583
+
584
+ return strSessId;
585
+ };
586
+
587
+
588
+ MQExec.prototype.getSession = function(strSessionID, mqObj) {
589
+
590
+ // TO-DO: do class name validations.
591
+ var xmlDoc;
592
+ var strXml;
593
+ var sessionId = strSessionID || "";
594
+ var arrRequest = new Array();
595
+ arrRequest.push(new MQXmlNodeObject("SessionID",sessionId) );
596
+
597
+ xmlDoc = this.doTransaction("GetSession", arrRequest, this.GETSESSION_VERSION);
598
+ if(mqObj.getClassName()==="MQMapState"){
599
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/GetSessionResponse/Session/MapState"));
600
+ mqObj.loadXml(strXml);
601
+ } else if(mqObj.getClassName()==="MQSession"){
602
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/GetSessionResponse/Session"));
603
+ mqObj.loadXml(strXml);
604
+ }
605
+ };
606
+
607
+
608
+ /**
609
+ * Calculates a route matrix. Either a drive time (many-to-many) or a
610
+ * multi-destination (one-to-many) route.
611
+ *
612
+ * @param {MQLocationCollection} mqlcLocations Collection of location objects.
613
+ * The first member of the collection is the origin. If allToAll is true then
614
+ * the last member is the destination. Each location must be a GeoAddress
615
+ * (Please Note: This object will not be updated, it is simply used for the request.)
616
+ *
617
+ * @param {boolean} bAllToAll If true then a matrix of time and distance from
618
+ * each location to all others is found. If false, time and distance from the
619
+ * first location (origin) to all others is found.
620
+ *
621
+ * @param {MQRouteOptions} mqroOptions Specifies options for the route (fastest vs.
622
+ * shortest, coverage to use, roads to avoid, etc.).
623
+ * (Please Note: This object will not be updated, it is simply used for the request.)
624
+ *
625
+ * @param {MQRouteMatrixResults} mqrmrResults Contains the time and distance matrix as
626
+ * well as the status of the call (success, failure, partial success)
627
+ *
628
+ * @type void
629
+ *
630
+ */
631
+
632
+ MQExec.prototype.doRouteMatrix = function(mqlcLocations, bAllToAll, mqroOptions, mqrmrResults) {
633
+
634
+ var xmlDoc;
635
+ var strXml;
636
+ var arrRequest = new Array();
637
+
638
+ if(mqlcLocations == null || mqlcLocations.getClassName() !== "MQLocationCollection") {
639
+ throw "Null or Illegal Argument passed for MQLocationCollection";
640
+ } else {
641
+ arrRequest.push(mqlcLocations);
642
+ }
643
+ if( bAllToAll == null || typeof bAllToAll != "boolean") {
644
+ throw "Null or Illegal Argument passed for bAllToAll";
645
+ } else {
646
+ var iAllToAll = bAllToAll ? 1 : 0;
647
+ arrRequest.push(new MQXmlNodeObject("AllToAll", iAllToAll));
648
+ }
649
+ if(mqroOptions == null || mqroOptions.getClassName() !== "MQRouteOptions") {
650
+ throw "Null or Illegal Argument passed for MQRouteOptions";
651
+ } else {
652
+ arrRequest.push(mqroOptions);
653
+ }
654
+ if(mqrmrResults == null || mqrmrResults.getClassName() !== "MQRouteMatrixResults") {
655
+ throw "Null or Illegal Argument passed for MQRouteMatrixResults";
656
+ }
657
+
658
+ mqLogTime("MQExec.doRoute: Transaction Start");
659
+ xmlDoc = this.doTransaction("DoRouteMatrix", arrRequest, this.ROUTEMATRIX_VERSION);
660
+ mqLogTime("MQExec.doRoute: Transaction End");
661
+
662
+ mqLogTime("MQExec.doRoute: Loading of RouteResults Start");
663
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/DoRouteMatrixResponse/RouteMatrixResults"));
664
+ mqrmrResults.loadXml(strXml);
665
+ mqLogTime("MQExec.doRoute: Loading of RouteResults End");
666
+
667
+ display("results", "Response", mqXmlToStr(xmlDoc), "", "mqDisplay");
668
+
669
+ };
670
+
671
+
672
+ /**
673
+ * Generates a request to the MapQuest server (as specified by the server
674
+ * name, path, and port number) to perform a DB Search based on either the
675
+ * recordIds received or the extraCriteria info of the dblayerquery. The
676
+ * resulting recordset contains fields specified by the scFieldNames param.
677
+ *
678
+ * @param {MQStringCollection} mqscFieldNames containing the names of the fields
679
+ * to return, or blank for all fields.
680
+ * (Please Note: This object will not be updated, it is simply used for the request.)
681
+ *
682
+ * @param {MQDBLayerQuery} mqdlqQuery Contains the name of the dblayer/table to query.
683
+ * Optionally contains ExtraCriteria. Utilized only if RecordIds are empty.
684
+ * (Please Note: This object will not be updated, it is simply used for the request.)
685
+ *
686
+ * @param {MQRecordSet} mqrsResults The Returned RecordSet containg the records and
687
+ * fields matching the input parameters.
688
+ *
689
+ * @param {MQStringCollection} mqscRecIds RecordIdentifiers of the records to return
690
+ * stored in a StringCollection.
691
+ * (Please Note: This object will not be updated, it is simply used for the request.)
692
+ *
693
+ * @type void
694
+ *
695
+ */
696
+
697
+ MQExec.prototype.getRecordInfo = function(mqscFieldNames, mqdlqQuery, mqrsResults, mqscRecIds) {
698
+
699
+ var xmlDoc;
700
+ var strXml;
701
+ var arrRequest = new Array();
702
+
703
+ if( mqscFieldNames == null || mqscFieldNames.getClassName() !== "MQStringCollection" ) {
704
+ throw "Null or Illegal Argument passed for MQStringCollection";
705
+ } else {
706
+ var fields = new MQStringCollection();
707
+ fields.setM_Xpath("Fields");
708
+ fields.append(mqscFieldNames);
709
+ arrRequest.push(fields);
710
+ }
711
+ if( mqdlqQuery == null || mqdlqQuery.getClassName() !== "MQDBLayerQuery" ) {
712
+ throw "Null or Illegal Argument passed for MQDBLayerQuery";
713
+ } else {
714
+ arrRequest.push(mqdlqQuery);
715
+ }
716
+ if( mqrsResults == null || mqrsResults.getClassName() !== "MQRecordSet" ) {
717
+ throw "Null or Illegal Argument passed for MQRecordSet";
718
+ }
719
+ if( mqscRecIds == null || mqscRecIds.getClassName() !== "MQStringCollection") {
720
+ throw "Null or Illegal Argument passed for MQStringCollection";
721
+ } else {
722
+ var recordIds = new MQStringCollection();
723
+ recordIds.setM_Xpath("RecordIds");
724
+ recordIds.append(mqscRecIds);
725
+ arrRequest.push(recordIds);
726
+ }
727
+
728
+ mqLogTime("MQExec.getRecordInfo: Transaction Start");
729
+ xmlDoc = this.doTransaction("GetRecordInfo", arrRequest, this.GETRECORDINFO_VERSION);
730
+ mqLogTime("MQExec.getRecordInfo: Transaction End");
731
+
732
+ mqLogTime("MQExec.getRecordInfo: Loading of RecordSet Start");
733
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/GetRecordInfoResponse/RecordSet"));
734
+ mqrsResults.loadXml(strXml);
735
+ mqLogTime("MQExec.getRecordInfo: Loading of RecordSet End");
736
+
737
+ display("results", "Response", mqXmlToStr(xmlDoc), "", "mqDisplay");
738
+
739
+ };
740
+
741
+
742
+ /**
743
+ * Finds the address at a given latitude/longitude position.
744
+ *
745
+ * @param {MQLatLng} mqllLatLng The latitude/longitude position to use for
746
+ * the reverse geocode.
747
+ * (Please Note: This object will not be updated, it is simply used for the request.)
748
+ *
749
+ * @param {MQLocationCollection} mqlcLocations A LocationCollection in
750
+ * which to return the results of the reverse geocode. It will contain
751
+ * only GeoAddress objects.
752
+ *
753
+ * @param {String} strMapCovName The name of the mapping coverage to be
754
+ * used for the reverse geocode.
755
+ *
756
+ * @param {String} strGeocodeCovName An optional parameter, specifies the
757
+ * geocode coverage to use for the reverse geocode. If specified, using
758
+ * this geocode coverage, a ZIP code lookup will be performed on the addresses
759
+ * found in the mapping data to verify and fill in the city/state information
760
+ * for the address. If not specified, only ZIP code and, if available, street
761
+ * information found in the mapping data will be returned.
762
+ *
763
+ * @type void
764
+ *
765
+ */
766
+
767
+ MQExec.prototype.reverseGeocode = function(mqllLatLng, mqlcLocations, strMapCovName, strGeocodeCovName) {
768
+
769
+ var xmlDoc;
770
+ var strXml;
771
+ var arrRequest = new Array();
772
+
773
+ if( mqllLatLng == null || mqllLatLng.getClassName() !== "MQLatLng" ) {
774
+ throw "Null or Illegal Argument passed for MQLatLng";
775
+ } else {
776
+ arrRequest.push(mqllLatLng);
777
+ }
778
+ if( mqlcLocations == null || mqlcLocations.getClassName() !== "MQLocationCollection" ) {
779
+ throw "Null or Illegal Argument passed for MQLocationCollection";
780
+ }
781
+ var mapPool = strMapCovName || "";
782
+ arrRequest.push(new MQXmlNodeObject("MapPool", mapPool));
783
+
784
+ var geocodePool = strGeocodeCovName || "";
785
+ arrRequest.push(new MQXmlNodeObject("GeocodePool", geocodePool));
786
+
787
+ mqLogTime("MQExec.reverseGeocode: Transaction Start");
788
+ xmlDoc = this.doTransaction("ReverseGeocode", arrRequest, this.REVERSEGEOCODE_VERSION);
789
+ mqLogTime("MQExec.reverseGeocode: Transaction End");
790
+
791
+ mqLogTime("MQExec.reverseGeocode: Loading of Response Start");
792
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/ReverseGeocodeResponse/LocationCollection"));
793
+ mqlcLocations.loadXml(strXml);
794
+ mqLogTime("MQExec.reverseGeocode: Loading of Response End");
795
+
796
+ display("results", "Response", mqXmlToStr(xmlDoc), "", "mqDisplay");
797
+
798
+ };
799
+
800
+
801
+ /**
802
+ * Generates a request to the MapQuest server (as specified by the
803
+ * server name, path, and port number) to perform a search and
804
+ * return the results in a FeatureCollection object.
805
+ *
806
+ * @param {MQSearchCriteria} mqscCriteria Spatial parameters for the search.
807
+ * (Please Note: This object will not be updated, it is simply used for the request.)
808
+ *
809
+ * @param {MQFeatureCollection} mqfcSearchResults Search results.
810
+ *
811
+ * @param {String} strCoverageName The name of the map data coverage if searching
812
+ * for features in the map data.
813
+ *
814
+ * @param {MQDBLayerQueryCollection} mqdlqcDbLayers Database parameters for the search.
815
+ * (Please Note: This object will not be updated, it is simply used for the request.)
816
+ *
817
+ * @param {MQFeatureCollection} mqfcFeatures A FeatureCollection to also be searched
818
+ * based on the spatial criteria.
819
+ * (Please Note: This object will not be updated, it is simply used for the request.)
820
+ *
821
+ * @param {MQDTCollection} mqdcDisplayTypes A DTCollection to narrow the search. Only those
822
+ * features with display types corresponding to those in this collection will be returned.
823
+ * (Please Note: This object will not be updated, it is simply used for the request.)
824
+ *
825
+ * @type void
826
+ */
827
+
828
+ MQExec.prototype.search = function(mqscCriteria, mqfcSearchResults, strCoverageName,
829
+ mqdlqcDbLayers, mqfcFeatures, mqdcDisplayTypes) {
830
+ var xmlDoc;
831
+ var strXml;
832
+ var arrRequest = new Array();
833
+ var strName = mqscCriteria ? mqscCriteria.getClassName(): null;
834
+
835
+ if( strName == null || (strName !== "MQSearchCriteria" &&
836
+ strName !== "MQRadiusSearchCriteria" && strName !== "MQRectSearchCriteria" &&
837
+ strName !== "MQPolySearchCriteria" && strName !== "MQCorridorSearchCriteria" )) {
838
+ throw "Null or Illegal Argument passed for Search Criteria";
839
+ } else {
840
+ arrRequest.push(mqscCriteria);
841
+ }
842
+ if(mqfcSearchResults == null || mqfcSearchResults.getClassName() !== "MQFeatureCollection") {
843
+ throw "Null or Illegal Argument passed for MQFeatureCollection";
844
+ }
845
+ if( typeof strCoverageName !== "string" ) {
846
+ throw "Illegal Argument passed for strCoverageName";
847
+ } else {
848
+ arrRequest.push(new MQXmlNodeObject("CoverageName", strCoverageName));
849
+ }
850
+
851
+ if(mqdlqcDbLayers != null && mqdlqcDbLayers.getClassName() !== "MQDBLayerQueryCollection") {
852
+ throw "Illegal Argument passed for MQRouteOptions";
853
+ } else if(mqdlqcDbLayers == null) {
854
+ mqdlqcDbLayers = new MQDBLayerQueryCollection();
855
+ }
856
+ arrRequest.push(mqdlqcDbLayers);
857
+
858
+ if(mqfcFeatures != null && mqfcFeatures.getClassName() !== "MQFeatureCollection") {
859
+ throw "Illegal Argument passed for MQFeatureCollection";
860
+ } else if( mqfcFeatures == null ) {
861
+ mqfcFeatures = new MQFeatureCollection();
862
+ }
863
+ arrRequest.push(mqfcFeatures);
864
+
865
+ if(mqdcDisplayTypes != null && mqdcDisplayTypes.getClassName() !== "MQDTCollection") {
866
+ throw "Illegal Argument passed for MQDTCollection";
867
+ } else if(mqdcDisplayTypes == null ) {
868
+ mqdcDisplayTypes = new MQDTCollection();
869
+ }
870
+ arrRequest.push(mqdcDisplayTypes);
871
+
872
+ mqLogTime("MQExec.Search: Transaction Start");
873
+ xmlDoc = this.doTransaction("Search", arrRequest, this.SEARCH_VERSION);
874
+ mqLogTime("MQExec.Search: Transaction End");
875
+
876
+ mqLogTime("MQExec.Search: Loading of Search results Start");
877
+ strXml = mqXmlToStr(mqGetNode(xmlDoc, "/SearchResponse/FeatureCollection"));
878
+ mqfcSearchResults.loadXml(strXml);
879
+ mqLogTime("MQExec.Search: Loading of Search results End");
880
+
881
+ display("results", "Response", mqXmlToStr(xmlDoc), "", "mqDisplay");
882
+
883
+ };
884
+
885
+ /**
886
+ * Sets the mqRectLL appropriately for tilemaps routing
887
+ *
888
+ * @param {String} strSessionUID The unique Session ID.
889
+ *
890
+ * @param {MQRectLL} mqRectLL The bounding box for the route in the session.
891
+ *
892
+ * @type void
893
+ * @private
894
+ */
895
+
896
+ MQExec.prototype.getRouteBoundingBoxFromSessionResponse = function(sessionId, mqRectLL) {
897
+
898
+ var xmlDoc;
899
+ var strXml;
900
+ var arrRequest = new Array();
901
+
902
+ if(mqRectLL == null) {
903
+ throw "Null or Illegal Argument passed for MQRectLL";
904
+ }
905
+ arrRequest.push(new MQXmlNodeObject("SessionID",sessionId) );
906
+
907
+ xmlDoc = this.doTransaction("GetRouteBoundingBoxFromSession", arrRequest);
908
+
909
+ mqLogTime("MQExec.doRoute: Loading of MQRectLL Start");
910
+ var nodes = xmlDoc.documentElement.childNodes;
911
+ var ul = new MQLatLng();
912
+ ul.loadXml(mqXmlToStr(nodes[0]));
913
+ var lr = new MQLatLng();
914
+ lr.loadXml(mqXmlToStr(nodes[1]));
915
+ mqRectLL.setUpperLeft(ul);
916
+ mqRectLL.setLowerRight(lr);
917
+ mqLogTime("MQExec.doRoute: Loading of MQRectLL End");
918
+ };
919
+
920
+ /**
921
+ * Returns a value indicating whether or not this object has been
922
+ * initialized to a map server and port number.
923
+ *
924
+ * @return <code><b>true</b></code> if the port number or the Server
925
+ * name is not equal to their uninitialized values, <code><b>
926
+ * false</b></code> otherwise.
927
+ *
928
+ * @type boolean
929
+ *
930
+ * @private
931
+ */
932
+
933
+ MQExec.prototype.isAlive = function() {
934
+
935
+ if( this.getServerPort() == -1 || this.getServerName() == "" )
936
+ return false;
937
+ return true;
938
+
939
+ };
940
+
941
+
942
+ /**
943
+ * Returns the string which specifies the coverage information requested
944
+ * directly via an http request.
945
+ *
946
+ * @param {int} lType Type of info to return,
947
+ * 0=CoverageInfo, 1=MapDataSelectorInfo.
948
+ *
949
+ * @return The string which specifies the server information.
950
+ *
951
+ * @type Document
952
+ */
953
+
954
+ MQExec.prototype.getServerInfo = function( lType ) {
955
+
956
+ if (!this.isAlive())
957
+ return null;
958
+
959
+ var strReqXml;
960
+ var xmlDoc;
961
+ var strXml;
962
+ var type = lType || 0;
963
+ var arrRequest = new Array();
964
+ if( typeof type !== "number" ) {
965
+ throw "Illegal Argument passed for lType";
966
+ } else {
967
+ arrRequest.push(new MQXmlNodeObject("Type", type));
968
+ }
969
+
970
+ mqLogTime("MQExec.GetServerInfo: Transaction Start");
971
+ xmlDoc = this.doTransaction("GetServerInfo", arrRequest);
972
+ mqLogTime("MQExec.GetServerInfo: Transaction End");
973
+ display("results", "Response", mqXmlToStr(xmlDoc), "", "mqDisplay");
974
+ return xmlDoc;
975
+
976
+ };
977
+