Project

General

Profile

« Previous | Next » 

Revision 1263

Added by Dietmar over 14 years ago

updated YUI 2.4.1 to 2.8.0r4

View differences:

branches/2.8.x/CHANGELOG
12 12
 
13 13
------------------------------------- 2.8.1 -------------------------------------
14 14
21-Jan-2010 Dietmar Woellbrink (Luisehahne)
15
!	updated YUI 2.4.1 to 2.8.0r4
16
21-Jan-2010 Dietmar Woellbrink (Luisehahne)
15 17
!	Beginning header information update
16 18
21-Jan-2010 Dietmar Woellbrink (Luisehahne)
17 19
#	fix login_form.php sometimes produce javascript errors in IE
branches/2.8.x/wb/include/yui/connection/connection_core.js
1
/*
2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
3
Code licensed under the BSD License:
4
http://developer.yahoo.net/yui/license.txt
5
version: 2.8.0r4
6
*/
7
/**
8
 * The Connection Manager provides a simplified interface to the XMLHttpRequest
9
 * object.  It handles cross-browser instantiantion of XMLHttpRequest, negotiates the
10
 * interactive states and server response, returning the results to a pre-defined
11
 * callback you create.
12
 *
13
 * @namespace YAHOO.util
14
 * @module connection
15
 * @requires yahoo
16
 * @requires event
17
 */
18

  
19
/**
20
 * The Connection Manager singleton provides methods for creating and managing
21
 * asynchronous transactions.
22
 *
23
 * @class Connect
24
 */
25

  
26
YAHOO.util.Connect =
27
{
28
  /**
29
   * @description Array of MSFT ActiveX ids for XMLHttpRequest.
30
   * @property _msxml_progid
31
   * @private
32
   * @static
33
   * @type array
34
   */
35
	_msxml_progid:[
36
		'Microsoft.XMLHTTP',
37
		'MSXML2.XMLHTTP.3.0',
38
		'MSXML2.XMLHTTP'
39
		],
40

  
41
  /**
42
   * @description Object literal of HTTP header(s)
43
   * @property _http_header
44
   * @private
45
   * @static
46
   * @type object
47
   */
48
	_http_headers:{},
49

  
50
  /**
51
   * @description Determines if HTTP headers are set.
52
   * @property _has_http_headers
53
   * @private
54
   * @static
55
   * @type boolean
56
   */
57
	_has_http_headers:false,
58

  
59
 /**
60
  * @description Determines if a default header of
61
  * Content-Type of 'application/x-www-form-urlencoded'
62
  * will be added to any client HTTP headers sent for POST
63
  * transactions.
64
  * @property _use_default_post_header
65
  * @private
66
  * @static
67
  * @type boolean
68
  */
69
    _use_default_post_header:true,
70

  
71
 /**
72
  * @description The default header used for POST transactions.
73
  * @property _default_post_header
74
  * @private
75
  * @static
76
  * @type boolean
77
  */
78
    _default_post_header:'application/x-www-form-urlencoded; charset=UTF-8',
79

  
80
 /**
81
  * @description The default header used for transactions involving the
82
  * use of HTML forms.
83
  * @property _default_form_header
84
  * @private
85
  * @static
86
  * @type boolean
87
  */
88
    _default_form_header:'application/x-www-form-urlencoded',
89

  
90
 /**
91
  * @description Determines if a default header of
92
  * 'X-Requested-With: XMLHttpRequest'
93
  * will be added to each transaction.
94
  * @property _use_default_xhr_header
95
  * @private
96
  * @static
97
  * @type boolean
98
  */
99
    _use_default_xhr_header:true,
100

  
101
 /**
102
  * @description The default header value for the label
103
  * "X-Requested-With".  This is sent with each
104
  * transaction, by default, to identify the
105
  * request as being made by YUI Connection Manager.
106
  * @property _default_xhr_header
107
  * @private
108
  * @static
109
  * @type boolean
110
  */
111
    _default_xhr_header:'XMLHttpRequest',
112

  
113
 /**
114
  * @description Determines if custom, default headers
115
  * are set for each transaction.
116
  * @property _has_default_header
117
  * @private
118
  * @static
119
  * @type boolean
120
  */
121
    _has_default_headers:true,
122

  
123
 /**
124
  * @description Determines if custom, default headers
125
  * are set for each transaction.
126
  * @property _has_default_header
127
  * @private
128
  * @static
129
  * @type boolean
130
  */
131
    _default_headers:{},
132

  
133
 /**
134
  * @description Collection of polling references to the polling mechanism in handleReadyState.
135
  * @property _poll
136
  * @private
137
  * @static
138
  * @type object
139
  */
140
    _poll:{},
141

  
142
 /**
143
  * @description Queue of timeout values for each transaction callback with a defined timeout value.
144
  * @property _timeOut
145
  * @private
146
  * @static
147
  * @type object
148
  */
149
    _timeOut:{},
150

  
151
  /**
152
   * @description The polling frequency, in milliseconds, for HandleReadyState.
153
   * when attempting to determine a transaction's XHR readyState.
154
   * The default is 50 milliseconds.
155
   * @property _polling_interval
156
   * @private
157
   * @static
158
   * @type int
159
   */
160
     _polling_interval:50,
161

  
162
  /**
163
   * @description A transaction counter that increments the transaction id for each transaction.
164
   * @property _transaction_id
165
   * @private
166
   * @static
167
   * @type int
168
   */
169
     _transaction_id:0,
170

  
171
  /**
172
   * @description Custom event that fires at the start of a transaction
173
   * @property startEvent
174
   * @private
175
   * @static
176
   * @type CustomEvent
177
   */
178
	startEvent: new YAHOO.util.CustomEvent('start'),
179

  
180
  /**
181
   * @description Custom event that fires when a transaction response has completed.
182
   * @property completeEvent
183
   * @private
184
   * @static
185
   * @type CustomEvent
186
   */
187
	completeEvent: new YAHOO.util.CustomEvent('complete'),
188

  
189
  /**
190
   * @description Custom event that fires when handleTransactionResponse() determines a
191
   * response in the HTTP 2xx range.
192
   * @property successEvent
193
   * @private
194
   * @static
195
   * @type CustomEvent
196
   */
197
	successEvent: new YAHOO.util.CustomEvent('success'),
198

  
199
  /**
200
   * @description Custom event that fires when handleTransactionResponse() determines a
201
   * response in the HTTP 4xx/5xx range.
202
   * @property failureEvent
203
   * @private
204
   * @static
205
   * @type CustomEvent
206
   */
207
	failureEvent: new YAHOO.util.CustomEvent('failure'),
208

  
209
  /**
210
   * @description Custom event that fires when a transaction is successfully aborted.
211
   * @property abortEvent
212
   * @private
213
   * @static
214
   * @type CustomEvent
215
   */
216
	abortEvent: new YAHOO.util.CustomEvent('abort'),
217

  
218
  /**
219
   * @description A reference table that maps callback custom events members to its specific
220
   * event name.
221
   * @property _customEvents
222
   * @private
223
   * @static
224
   * @type object
225
   */
226
	_customEvents:
227
	{
228
		onStart:['startEvent', 'start'],
229
		onComplete:['completeEvent', 'complete'],
230
		onSuccess:['successEvent', 'success'],
231
		onFailure:['failureEvent', 'failure'],
232
		onUpload:['uploadEvent', 'upload'],
233
		onAbort:['abortEvent', 'abort']
234
	},
235

  
236
  /**
237
   * @description Member to add an ActiveX id to the existing xml_progid array.
238
   * In the event(unlikely) a new ActiveX id is introduced, it can be added
239
   * without internal code modifications.
240
   * @method setProgId
241
   * @public
242
   * @static
243
   * @param {string} id The ActiveX id to be added to initialize the XHR object.
244
   * @return void
245
   */
246
	setProgId:function(id)
247
	{
248
		this._msxml_progid.unshift(id);
249
	},
250

  
251
  /**
252
   * @description Member to override the default POST header.
253
   * @method setDefaultPostHeader
254
   * @public
255
   * @static
256
   * @param {boolean} b Set and use default header - true or false .
257
   * @return void
258
   */
259
	setDefaultPostHeader:function(b)
260
	{
261
		if(typeof b == 'string'){
262
			this._default_post_header = b;
263
		}
264
		else if(typeof b == 'boolean'){
265
			this._use_default_post_header = b;
266
		}
267
	},
268

  
269
  /**
270
   * @description Member to override the default transaction header..
271
   * @method setDefaultXhrHeader
272
   * @public
273
   * @static
274
   * @param {boolean} b Set and use default header - true or false .
275
   * @return void
276
   */
277
	setDefaultXhrHeader:function(b)
278
	{
279
		if(typeof b == 'string'){
280
			this._default_xhr_header = b;
281
		}
282
		else{
283
			this._use_default_xhr_header = b;
284
		}
285
	},
286

  
287
  /**
288
   * @description Member to modify the default polling interval.
289
   * @method setPollingInterval
290
   * @public
291
   * @static
292
   * @param {int} i The polling interval in milliseconds.
293
   * @return void
294
   */
295
	setPollingInterval:function(i)
296
	{
297
		if(typeof i == 'number' && isFinite(i)){
298
			this._polling_interval = i;
299
		}
300
	},
301

  
302
  /**
303
   * @description Instantiates a XMLHttpRequest object and returns an object with two properties:
304
   * the XMLHttpRequest instance and the transaction id.
305
   * @method createXhrObject
306
   * @private
307
   * @static
308
   * @param {int} transactionId Property containing the transaction id for this transaction.
309
   * @return object
310
   */
311
	createXhrObject:function(transactionId)
312
	{
313
		var obj,http,i;
314
		try
315
		{
316
			// Instantiates XMLHttpRequest in non-IE browsers and assigns to http.
317
			http = new XMLHttpRequest();
318
			//  Object literal with http and tId properties
319
			obj = { conn:http, tId:transactionId, xhr: true };
320
		}
321
		catch(e)
322
		{
323
			for(i=0; i<this._msxml_progid.length; ++i){
324
				try
325
				{
326
					// Instantiates XMLHttpRequest for IE and assign to http
327
					http = new ActiveXObject(this._msxml_progid[i]);
328
					//  Object literal with conn and tId properties
329
					obj = { conn:http, tId:transactionId, xhr: true };
330
					break;
331
				}
332
				catch(e1){}
333
			}
334
		}
335
		finally
336
		{
337
			return obj;
338
		}
339
	},
340

  
341
  /**
342
   * @description This method is called by asyncRequest to create a
343
   * valid connection object for the transaction.  It also passes a
344
   * transaction id and increments the transaction id counter.
345
   * @method getConnectionObject
346
   * @private
347
   * @static
348
   * @return {object}
349
   */
350
	getConnectionObject:function(t)
351
	{
352
		var o, tId = this._transaction_id;
353

  
354
		try
355
		{
356
			if(!t){
357
				o = this.createXhrObject(tId);
358
			}
359
			else{
360
				o = {tId:tId};
361
				if(t==='xdr'){
362
					o.conn = this._transport;
363
					o.xdr = true;
364
				}
365
				else if(t==='upload'){
366
					o.upload = true;
367
				}
368
			}
369

  
370
			if(o){
371
				this._transaction_id++;
372
			}
373
		}
374
		catch(e){}
375
		return o;
376
	},
377

  
378
  /**
379
   * @description Method for initiating an asynchronous request via the XHR object.
380
   * @method asyncRequest
381
   * @public
382
   * @static
383
   * @param {string} method HTTP transaction method
384
   * @param {string} uri Fully qualified path of resource
385
   * @param {callback} callback User-defined callback function or object
386
   * @param {string} postData POST body
387
   * @return {object} Returns the connection object
388
   */
389
	asyncRequest:function(method, uri, callback, postData)
390
	{
391
		var o,t,args = (callback && callback.argument)?callback.argument:null;
392

  
393
		if(this._isFileUpload){
394
			t = 'upload';
395
		}
396
		else if(callback.xdr){
397
			t = 'xdr';
398
		}
399

  
400
		o = this.getConnectionObject(t);
401
		if(!o){
402
			return null;
403
		}
404
		else{
405

  
406
			// Intialize any transaction-specific custom events, if provided.
407
			if(callback && callback.customevents){
408
				this.initCustomEvents(o, callback);
409
			}
410

  
411
			if(this._isFormSubmit){
412
				if(this._isFileUpload){
413
					this.uploadFile(o, callback, uri, postData);
414
					return o;
415
				}
416

  
417
				// If the specified HTTP method is GET, setForm() will return an
418
				// encoded string that is concatenated to the uri to
419
				// create a querystring.
420
				if(method.toUpperCase() == 'GET'){
421
					if(this._sFormData.length !== 0){
422
						// If the URI already contains a querystring, append an ampersand
423
						// and then concatenate _sFormData to the URI.
424
						uri += ((uri.indexOf('?') == -1)?'?':'&') + this._sFormData;
425
					}
426
				}
427
				else if(method.toUpperCase() == 'POST'){
428
					// If POST data exist in addition to the HTML form data,
429
					// it will be concatenated to the form data.
430
					postData = postData?this._sFormData + "&" + postData:this._sFormData;
431
				}
432
			}
433

  
434
			if(method.toUpperCase() == 'GET' && (callback && callback.cache === false)){
435
				// If callback.cache is defined and set to false, a
436
				// timestamp value will be added to the querystring.
437
				uri += ((uri.indexOf('?') == -1)?'?':'&') + "rnd=" + new Date().valueOf().toString();
438
			}
439

  
440
			// Each transaction will automatically include a custom header of
441
			// "X-Requested-With: XMLHttpRequest" to identify the request as
442
			// having originated from Connection Manager.
443
			if(this._use_default_xhr_header){
444
				if(!this._default_headers['X-Requested-With']){
445
					this.initHeader('X-Requested-With', this._default_xhr_header, true);
446
				}
447
			}
448

  
449
			//If the transaction method is POST and the POST header value is set to true
450
			//or a custom value, initalize the Content-Type header to this value.
451
			if((method.toUpperCase() === 'POST' && this._use_default_post_header) && this._isFormSubmit === false){
452
				this.initHeader('Content-Type', this._default_post_header);
453
			}
454

  
455
			if(o.xdr){
456
				this.xdr(o, method, uri, callback, postData);
457
				return o;
458
			}
459

  
460
			o.conn.open(method, uri, true);
461
			//Initialize all default and custom HTTP headers,
462
			if(this._has_default_headers || this._has_http_headers){
463
				this.setHeader(o);
464
			}
465

  
466
			this.handleReadyState(o, callback);
467
			o.conn.send(postData || '');
468

  
469
			// Reset the HTML form data and state properties as
470
			// soon as the data are submitted.
471
			if(this._isFormSubmit === true){
472
				this.resetFormState();
473
			}
474

  
475
			// Fire global custom event -- startEvent
476
			this.startEvent.fire(o, args);
477

  
478
			if(o.startEvent){
479
				// Fire transaction custom event -- startEvent
480
				o.startEvent.fire(o, args);
481
			}
482

  
483
			return o;
484
		}
485
	},
486

  
487
  /**
488
   * @description This method creates and subscribes custom events,
489
   * specific to each transaction
490
   * @method initCustomEvents
491
   * @private
492
   * @static
493
   * @param {object} o The connection object
494
   * @param {callback} callback The user-defined callback object
495
   * @return {void}
496
   */
497
	initCustomEvents:function(o, callback)
498
	{
499
		var prop;
500
		// Enumerate through callback.customevents members and bind/subscribe
501
		// events that match in the _customEvents table.
502
		for(prop in callback.customevents){
503
			if(this._customEvents[prop][0]){
504
				// Create the custom event
505
				o[this._customEvents[prop][0]] = new YAHOO.util.CustomEvent(this._customEvents[prop][1], (callback.scope)?callback.scope:null);
506

  
507
				// Subscribe the custom event
508
				o[this._customEvents[prop][0]].subscribe(callback.customevents[prop]);
509
			}
510
		}
511
	},
512

  
513
  /**
514
   * @description This method serves as a timer that polls the XHR object's readyState
515
   * property during a transaction, instead of binding a callback to the
516
   * onreadystatechange event.  Upon readyState 4, handleTransactionResponse
517
   * will process the response, and the timer will be cleared.
518
   * @method handleReadyState
519
   * @private
520
   * @static
521
   * @param {object} o The connection object
522
   * @param {callback} callback The user-defined callback object
523
   * @return {void}
524
   */
525

  
526
    handleReadyState:function(o, callback)
527

  
528
    {
529
		var oConn = this,
530
			args = (callback && callback.argument)?callback.argument:null;
531

  
532
		if(callback && callback.timeout){
533
			this._timeOut[o.tId] = window.setTimeout(function(){ oConn.abort(o, callback, true); }, callback.timeout);
534
		}
535

  
536
		this._poll[o.tId] = window.setInterval(
537
			function(){
538
				if(o.conn && o.conn.readyState === 4){
539

  
540
					// Clear the polling interval for the transaction
541
					// and remove the reference from _poll.
542
					window.clearInterval(oConn._poll[o.tId]);
543
					delete oConn._poll[o.tId];
544

  
545
					if(callback && callback.timeout){
546
						window.clearTimeout(oConn._timeOut[o.tId]);
547
						delete oConn._timeOut[o.tId];
548
					}
549

  
550
					// Fire global custom event -- completeEvent
551
					oConn.completeEvent.fire(o, args);
552

  
553
					if(o.completeEvent){
554
						// Fire transaction custom event -- completeEvent
555
						o.completeEvent.fire(o, args);
556
					}
557

  
558
					oConn.handleTransactionResponse(o, callback);
559
				}
560
			}
561
		,this._polling_interval);
562
    },
563

  
564
  /**
565
   * @description This method attempts to interpret the server response and
566
   * determine whether the transaction was successful, or if an error or
567
   * exception was encountered.
568
   * @method handleTransactionResponse
569
   * @private
570
   * @static
571
   * @param {object} o The connection object
572
   * @param {object} callback The user-defined callback object
573
   * @param {boolean} isAbort Determines if the transaction was terminated via abort().
574
   * @return {void}
575
   */
576
    handleTransactionResponse:function(o, callback, isAbort)
577
    {
578
		var httpStatus, responseObject,
579
			args = (callback && callback.argument)?callback.argument:null,
580
			xdrS = (o.r && o.r.statusText === 'xdr:success')?true:false,
581
			xdrF = (o.r && o.r.statusText === 'xdr:failure')?true:false,
582
			xdrA = isAbort;
583

  
584
		try
585
		{
586
			if((o.conn.status !== undefined && o.conn.status !== 0) || xdrS){
587
				// XDR requests will not have HTTP status defined. The
588
				// statusText property will define the response status
589
				// set by the Flash transport.
590
				httpStatus = o.conn.status;
591
			}
592
			else if(xdrF && !xdrA){
593
				// Set XDR transaction failure to a status of 0, which
594
				// resolves as an HTTP failure, instead of an exception.
595
				httpStatus = 0;
596
			}
597
			else{
598
				httpStatus = 13030;
599
			}
600
		}
601
		catch(e){
602

  
603
			 // 13030 is a custom code to indicate the condition -- in Mozilla/FF --
604
			 // when the XHR object's status and statusText properties are
605
			 // unavailable, and a query attempt throws an exception.
606
			httpStatus = 13030;
607
		}
608

  
609
		if((httpStatus >= 200 && httpStatus < 300) || httpStatus === 1223 || xdrS){
610
			responseObject = o.xdr ? o.r : this.createResponseObject(o, args);
611
			if(callback && callback.success){
612
				if(!callback.scope){
613
					callback.success(responseObject);
614
				}
615
				else{
616
					// If a scope property is defined, the callback will be fired from
617
					// the context of the object.
618
					callback.success.apply(callback.scope, [responseObject]);
619
				}
620
			}
621

  
622
			// Fire global custom event -- successEvent
623
			this.successEvent.fire(responseObject);
624

  
625
			if(o.successEvent){
626
				// Fire transaction custom event -- successEvent
627
				o.successEvent.fire(responseObject);
628
			}
629
		}
630
		else{
631
			switch(httpStatus){
632
				// The following cases are wininet.dll error codes that may be encountered.
633
				case 12002: // Server timeout
634
				case 12029: // 12029 to 12031 correspond to dropped connections.
635
				case 12030:
636
				case 12031:
637
				case 12152: // Connection closed by server.
638
				case 13030: // See above comments for variable status.
639
					// XDR transactions will not resolve to this case, since the
640
					// response object is already built in the xdr response.
641
					responseObject = this.createExceptionObject(o.tId, args, (isAbort?isAbort:false));
642
					if(callback && callback.failure){
643
						if(!callback.scope){
644
							callback.failure(responseObject);
645
						}
646
						else{
647
							callback.failure.apply(callback.scope, [responseObject]);
648
						}
649
					}
650

  
651
					break;
652
				default:
653
					responseObject = (o.xdr) ? o.response : this.createResponseObject(o, args);
654
					if(callback && callback.failure){
655
						if(!callback.scope){
656
							callback.failure(responseObject);
657
						}
658
						else{
659
							callback.failure.apply(callback.scope, [responseObject]);
660
						}
661
					}
662
			}
663

  
664
			// Fire global custom event -- failureEvent
665
			this.failureEvent.fire(responseObject);
666

  
667
			if(o.failureEvent){
668
				// Fire transaction custom event -- failureEvent
669
				o.failureEvent.fire(responseObject);
670
			}
671

  
672
		}
673

  
674
		this.releaseObject(o);
675
		responseObject = null;
676
    },
677

  
678
  /**
679
   * @description This method evaluates the server response, creates and returns the results via
680
   * its properties.  Success and failure cases will differ in the response
681
   * object's property values.
682
   * @method createResponseObject
683
   * @private
684
   * @static
685
   * @param {object} o The connection object
686
   * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback
687
   * @return {object}
688
   */
689
    createResponseObject:function(o, callbackArg)
690
    {
691
		var obj = {}, headerObj = {},
692
			i, headerStr, header, delimitPos;
693

  
694
		try
695
		{
696
			headerStr = o.conn.getAllResponseHeaders();
697
			header = headerStr.split('\n');
698
			for(i=0; i<header.length; i++){
699
				delimitPos = header[i].indexOf(':');
700
				if(delimitPos != -1){
701
					headerObj[header[i].substring(0,delimitPos)] = YAHOO.lang.trim(header[i].substring(delimitPos+2));
702
				}
703
			}
704
		}
705
		catch(e){}
706

  
707
		obj.tId = o.tId;
708
		// Normalize IE's response to HTTP 204 when Win error 1223.
709
		obj.status = (o.conn.status == 1223)?204:o.conn.status;
710
		// Normalize IE's statusText to "No Content" instead of "Unknown".
711
		obj.statusText = (o.conn.status == 1223)?"No Content":o.conn.statusText;
712
		obj.getResponseHeader = headerObj;
713
		obj.getAllResponseHeaders = headerStr;
714
		obj.responseText = o.conn.responseText;
715
		obj.responseXML = o.conn.responseXML;
716

  
717
		if(callbackArg){
718
			obj.argument = callbackArg;
719
		}
720

  
721
		return obj;
722
    },
723

  
724
  /**
725
   * @description If a transaction cannot be completed due to dropped or closed connections,
726
   * there may be not be enough information to build a full response object.
727
   * The failure callback will be fired and this specific condition can be identified
728
   * by a status property value of 0.
729
   *
730
   * If an abort was successful, the status property will report a value of -1.
731
   *
732
   * @method createExceptionObject
733
   * @private
734
   * @static
735
   * @param {int} tId The Transaction Id
736
   * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback
737
   * @param {boolean} isAbort Determines if the exception case is caused by a transaction abort
738
   * @return {object}
739
   */
740
    createExceptionObject:function(tId, callbackArg, isAbort)
741
    {
742
		var COMM_CODE = 0,
743
			COMM_ERROR = 'communication failure',
744
			ABORT_CODE = -1,
745
			ABORT_ERROR = 'transaction aborted',
746
			obj = {};
747

  
748
		obj.tId = tId;
749
		if(isAbort){
750
			obj.status = ABORT_CODE;
751
			obj.statusText = ABORT_ERROR;
752
		}
753
		else{
754
			obj.status = COMM_CODE;
755
			obj.statusText = COMM_ERROR;
756
		}
757

  
758
		if(callbackArg){
759
			obj.argument = callbackArg;
760
		}
761

  
762
		return obj;
763
    },
764

  
765
  /**
766
   * @description Method that initializes the custom HTTP headers for the each transaction.
767
   * @method initHeader
768
   * @public
769
   * @static
770
   * @param {string} label The HTTP header label
771
   * @param {string} value The HTTP header value
772
   * @param {string} isDefault Determines if the specific header is a default header
773
   * automatically sent with each transaction.
774
   * @return {void}
775
   */
776
	initHeader:function(label, value, isDefault)
777
	{
778
		var headerObj = (isDefault)?this._default_headers:this._http_headers;
779

  
780
		headerObj[label] = value;
781
		if(isDefault){
782
			this._has_default_headers = true;
783
		}
784
		else{
785
			this._has_http_headers = true;
786
		}
787
	},
788

  
789

  
790
  /**
791
   * @description Accessor that sets the HTTP headers for each transaction.
792
   * @method setHeader
793
   * @private
794
   * @static
795
   * @param {object} o The connection object for the transaction.
796
   * @return {void}
797
   */
798
	setHeader:function(o)
799
	{
800
		var prop;
801
		if(this._has_default_headers){
802
			for(prop in this._default_headers){
803
				if(YAHOO.lang.hasOwnProperty(this._default_headers, prop)){
804
					o.conn.setRequestHeader(prop, this._default_headers[prop]);
805
				}
806
			}
807
		}
808

  
809
		if(this._has_http_headers){
810
			for(prop in this._http_headers){
811
				if(YAHOO.lang.hasOwnProperty(this._http_headers, prop)){
812
					o.conn.setRequestHeader(prop, this._http_headers[prop]);
813
				}
814
			}
815

  
816
			this._http_headers = {};
817
			this._has_http_headers = false;
818
		}
819
	},
820

  
821
  /**
822
   * @description Resets the default HTTP headers object
823
   * @method resetDefaultHeaders
824
   * @public
825
   * @static
826
   * @return {void}
827
   */
828
	resetDefaultHeaders:function(){
829
		this._default_headers = {};
830
		this._has_default_headers = false;
831
	},
832

  
833
  /**
834
   * @description Method to terminate a transaction, if it has not reached readyState 4.
835
   * @method abort
836
   * @public
837
   * @static
838
   * @param {object} o The connection object returned by asyncRequest.
839
   * @param {object} callback  User-defined callback object.
840
   * @param {string} isTimeout boolean to indicate if abort resulted from a callback timeout.
841
   * @return {boolean}
842
   */
843
	abort:function(o, callback, isTimeout)
844
	{
845
		var abortStatus,
846
			args = (callback && callback.argument)?callback.argument:null;
847
			o = o || {};
848

  
849
		if(o.conn){
850
			if(o.xhr){
851
				if(this.isCallInProgress(o)){
852
					// Issue abort request
853
					o.conn.abort();
854

  
855
					window.clearInterval(this._poll[o.tId]);
856
					delete this._poll[o.tId];
857

  
858
					if(isTimeout){
859
						window.clearTimeout(this._timeOut[o.tId]);
860
						delete this._timeOut[o.tId];
861
					}
862

  
863
					abortStatus = true;
864
				}
865
			}
866
			else if(o.xdr){
867
				o.conn.abort(o.tId);
868
				abortStatus = true;
869
			}
870
		}
871
		else if(o.upload){
872
			var frameId = 'yuiIO' + o.tId;
873
			var io = document.getElementById(frameId);
874

  
875
			if(io){
876
				// Remove all listeners on the iframe prior to
877
				// its destruction.
878
				YAHOO.util.Event.removeListener(io, "load");
879
				// Destroy the iframe facilitating the transaction.
880
				document.body.removeChild(io);
881

  
882
				if(isTimeout){
883
					window.clearTimeout(this._timeOut[o.tId]);
884
					delete this._timeOut[o.tId];
885
				}
886

  
887
				abortStatus = true;
888
			}
889
		}
890
		else{
891
			abortStatus = false;
892
		}
893

  
894
		if(abortStatus === true){
895
			// Fire global custom event -- abortEvent
896
			this.abortEvent.fire(o, args);
897

  
898
			if(o.abortEvent){
899
				// Fire transaction custom event -- abortEvent
900
				o.abortEvent.fire(o, args);
901
			}
902

  
903
			this.handleTransactionResponse(o, callback, true);
904
		}
905

  
906
		return abortStatus;
907
	},
908

  
909
  /**
910
   * @description Determines if the transaction is still being processed.
911
   * @method isCallInProgress
912
   * @public
913
   * @static
914
   * @param {object} o The connection object returned by asyncRequest
915
   * @return {boolean}
916
   */
917
	isCallInProgress:function(o)
918
	{
919
		o = o || {};
920
		// if the XHR object assigned to the transaction has not been dereferenced,
921
		// then check its readyState status.  Otherwise, return false.
922
		if(o.xhr && o.conn){
923
			return o.conn.readyState !== 4 && o.conn.readyState !== 0;
924
		}
925
		else if(o.xdr && o.conn){
926
			return o.conn.isCallInProgress(o.tId);
927
		}
928
		else if(o.upload === true){
929
			return document.getElementById('yuiIO' + o.tId)?true:false;
930
		}
931
		else{
932
			return false;
933
		}
934
	},
935

  
936
  /**
937
   * @description Dereference the XHR instance and the connection object after the transaction is completed.
938
   * @method releaseObject
939
   * @private
940
   * @static
941
   * @param {object} o The connection object
942
   * @return {void}
943
   */
944
	releaseObject:function(o)
945
	{
946
		if(o && o.conn){
947
			//dereference the XHR instance.
948
			o.conn = null;
949

  
950

  
951
			//dereference the connection object.
952
			o = null;
953
		}
954
	}
955
};
956

  
957
YAHOO.register("connection_core", YAHOO.util.Connect, {version: "2.8.0r4", build: "2449"});
0 958

  
branches/2.8.x/wb/include/yui/connection/connection_core-min.js
1
/*
2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
3
Code licensed under the BSD License:
4
http://developer.yahoo.net/yui/license.txt
5
version: 2.8.0r4
6
*/
7
YAHOO.util.Connect={_msxml_progid:["Microsoft.XMLHTTP","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP"],_http_headers:{},_has_http_headers:false,_use_default_post_header:true,_default_post_header:"application/x-www-form-urlencoded; charset=UTF-8",_default_form_header:"application/x-www-form-urlencoded",_use_default_xhr_header:true,_default_xhr_header:"XMLHttpRequest",_has_default_headers:true,_default_headers:{},_poll:{},_timeOut:{},_polling_interval:50,_transaction_id:0,startEvent:new YAHOO.util.CustomEvent("start"),completeEvent:new YAHOO.util.CustomEvent("complete"),successEvent:new YAHOO.util.CustomEvent("success"),failureEvent:new YAHOO.util.CustomEvent("failure"),abortEvent:new YAHOO.util.CustomEvent("abort"),_customEvents:{onStart:["startEvent","start"],onComplete:["completeEvent","complete"],onSuccess:["successEvent","success"],onFailure:["failureEvent","failure"],onUpload:["uploadEvent","upload"],onAbort:["abortEvent","abort"]},setProgId:function(A){this._msxml_progid.unshift(A);},setDefaultPostHeader:function(A){if(typeof A=="string"){this._default_post_header=A;}else{if(typeof A=="boolean"){this._use_default_post_header=A;}}},setDefaultXhrHeader:function(A){if(typeof A=="string"){this._default_xhr_header=A;}else{this._use_default_xhr_header=A;}},setPollingInterval:function(A){if(typeof A=="number"&&isFinite(A)){this._polling_interval=A;}},createXhrObject:function(F){var D,A,B;try{A=new XMLHttpRequest();D={conn:A,tId:F,xhr:true};}catch(C){for(B=0;B<this._msxml_progid.length;++B){try{A=new ActiveXObject(this._msxml_progid[B]);D={conn:A,tId:F,xhr:true};break;}catch(E){}}}finally{return D;}},getConnectionObject:function(A){var C,D=this._transaction_id;try{if(!A){C=this.createXhrObject(D);}else{C={tId:D};if(A==="xdr"){C.conn=this._transport;C.xdr=true;}else{if(A==="upload"){C.upload=true;}}}if(C){this._transaction_id++;}}catch(B){}return C;},asyncRequest:function(G,D,F,A){var E,C,B=(F&&F.argument)?F.argument:null;if(this._isFileUpload){C="upload";}else{if(F.xdr){C="xdr";}}E=this.getConnectionObject(C);if(!E){return null;}else{if(F&&F.customevents){this.initCustomEvents(E,F);}if(this._isFormSubmit){if(this._isFileUpload){this.uploadFile(E,F,D,A);return E;}if(G.toUpperCase()=="GET"){if(this._sFormData.length!==0){D+=((D.indexOf("?")==-1)?"?":"&")+this._sFormData;}}else{if(G.toUpperCase()=="POST"){A=A?this._sFormData+"&"+A:this._sFormData;}}}if(G.toUpperCase()=="GET"&&(F&&F.cache===false)){D+=((D.indexOf("?")==-1)?"?":"&")+"rnd="+new Date().valueOf().toString();}if(this._use_default_xhr_header){if(!this._default_headers["X-Requested-With"]){this.initHeader("X-Requested-With",this._default_xhr_header,true);}}if((G.toUpperCase()==="POST"&&this._use_default_post_header)&&this._isFormSubmit===false){this.initHeader("Content-Type",this._default_post_header);}if(E.xdr){this.xdr(E,G,D,F,A);return E;}E.conn.open(G,D,true);if(this._has_default_headers||this._has_http_headers){this.setHeader(E);}this.handleReadyState(E,F);E.conn.send(A||"");if(this._isFormSubmit===true){this.resetFormState();}this.startEvent.fire(E,B);if(E.startEvent){E.startEvent.fire(E,B);}return E;}},initCustomEvents:function(A,C){var B;for(B in C.customevents){if(this._customEvents[B][0]){A[this._customEvents[B][0]]=new YAHOO.util.CustomEvent(this._customEvents[B][1],(C.scope)?C.scope:null);A[this._customEvents[B][0]].subscribe(C.customevents[B]);}}},handleReadyState:function(C,D){var B=this,A=(D&&D.argument)?D.argument:null;if(D&&D.timeout){this._timeOut[C.tId]=window.setTimeout(function(){B.abort(C,D,true);},D.timeout);}this._poll[C.tId]=window.setInterval(function(){if(C.conn&&C.conn.readyState===4){window.clearInterval(B._poll[C.tId]);delete B._poll[C.tId];if(D&&D.timeout){window.clearTimeout(B._timeOut[C.tId]);delete B._timeOut[C.tId];}B.completeEvent.fire(C,A);if(C.completeEvent){C.completeEvent.fire(C,A);}B.handleTransactionResponse(C,D);}},this._polling_interval);},handleTransactionResponse:function(B,I,D){var E,A,G=(I&&I.argument)?I.argument:null,C=(B.r&&B.r.statusText==="xdr:success")?true:false,H=(B.r&&B.r.statusText==="xdr:failure")?true:false,J=D;try{if((B.conn.status!==undefined&&B.conn.status!==0)||C){E=B.conn.status;}else{if(H&&!J){E=0;}else{E=13030;}}}catch(F){E=13030;}if((E>=200&&E<300)||E===1223||C){A=B.xdr?B.r:this.createResponseObject(B,G);if(I&&I.success){if(!I.scope){I.success(A);}else{I.success.apply(I.scope,[A]);}}this.successEvent.fire(A);if(B.successEvent){B.successEvent.fire(A);}}else{switch(E){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:A=this.createExceptionObject(B.tId,G,(D?D:false));if(I&&I.failure){if(!I.scope){I.failure(A);}else{I.failure.apply(I.scope,[A]);}}break;default:A=(B.xdr)?B.response:this.createResponseObject(B,G);if(I&&I.failure){if(!I.scope){I.failure(A);}else{I.failure.apply(I.scope,[A]);}}}this.failureEvent.fire(A);if(B.failureEvent){B.failureEvent.fire(A);}}this.releaseObject(B);A=null;},createResponseObject:function(A,G){var D={},I={},E,C,F,B;try{C=A.conn.getAllResponseHeaders();F=C.split("\n");for(E=0;E<F.length;E++){B=F[E].indexOf(":");if(B!=-1){I[F[E].substring(0,B)]=YAHOO.lang.trim(F[E].substring(B+2));}}}catch(H){}D.tId=A.tId;D.status=(A.conn.status==1223)?204:A.conn.status;D.statusText=(A.conn.status==1223)?"No Content":A.conn.statusText;D.getResponseHeader=I;D.getAllResponseHeaders=C;D.responseText=A.conn.responseText;D.responseXML=A.conn.responseXML;if(G){D.argument=G;}return D;},createExceptionObject:function(H,D,A){var F=0,G="communication failure",C=-1,B="transaction aborted",E={};E.tId=H;if(A){E.status=C;E.statusText=B;}else{E.status=F;E.statusText=G;}if(D){E.argument=D;}return E;},initHeader:function(A,D,C){var B=(C)?this._default_headers:this._http_headers;B[A]=D;if(C){this._has_default_headers=true;}else{this._has_http_headers=true;}},setHeader:function(A){var B;if(this._has_default_headers){for(B in this._default_headers){if(YAHOO.lang.hasOwnProperty(this._default_headers,B)){A.conn.setRequestHeader(B,this._default_headers[B]);}}}if(this._has_http_headers){for(B in this._http_headers){if(YAHOO.lang.hasOwnProperty(this._http_headers,B)){A.conn.setRequestHeader(B,this._http_headers[B]);
8
}}this._http_headers={};this._has_http_headers=false;}},resetDefaultHeaders:function(){this._default_headers={};this._has_default_headers=false;},abort:function(E,G,A){var D,B=(G&&G.argument)?G.argument:null;E=E||{};if(E.conn){if(E.xhr){if(this.isCallInProgress(E)){E.conn.abort();window.clearInterval(this._poll[E.tId]);delete this._poll[E.tId];if(A){window.clearTimeout(this._timeOut[E.tId]);delete this._timeOut[E.tId];}D=true;}}else{if(E.xdr){E.conn.abort(E.tId);D=true;}}}else{if(E.upload){var C="yuiIO"+E.tId;var F=document.getElementById(C);if(F){YAHOO.util.Event.removeListener(F,"load");document.body.removeChild(F);if(A){window.clearTimeout(this._timeOut[E.tId]);delete this._timeOut[E.tId];}D=true;}}else{D=false;}}if(D===true){this.abortEvent.fire(E,B);if(E.abortEvent){E.abortEvent.fire(E,B);}this.handleTransactionResponse(E,G,true);}return D;},isCallInProgress:function(A){A=A||{};if(A.xhr&&A.conn){return A.conn.readyState!==4&&A.conn.readyState!==0;}else{if(A.xdr&&A.conn){return A.conn.isCallInProgress(A.tId);}else{if(A.upload===true){return document.getElementById("yuiIO"+A.tId)?true:false;}else{return false;}}}},releaseObject:function(A){if(A&&A.conn){A.conn=null;A=null;}}};YAHOO.register("connection_core",YAHOO.util.Connect,{version:"2.8.0r4",build:"2449"});
0 9

  
branches/2.8.x/wb/include/yui/connection/connection_core-debug.js
1
/*
2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
3
Code licensed under the BSD License:
4
http://developer.yahoo.net/yui/license.txt
5
version: 2.8.0r4
6
*/
7
/**
8
 * The Connection Manager provides a simplified interface to the XMLHttpRequest
9
 * object.  It handles cross-browser instantiantion of XMLHttpRequest, negotiates the
10
 * interactive states and server response, returning the results to a pre-defined
11
 * callback you create.
12
 *
13
 * @namespace YAHOO.util
14
 * @module connection
15
 * @requires yahoo
16
 * @requires event
17
 */
18

  
19
/**
20
 * The Connection Manager singleton provides methods for creating and managing
21
 * asynchronous transactions.
22
 *
23
 * @class Connect
24
 */
25

  
26
YAHOO.util.Connect =
27
{
28
  /**
29
   * @description Array of MSFT ActiveX ids for XMLHttpRequest.
30
   * @property _msxml_progid
31
   * @private
32
   * @static
33
   * @type array
34
   */
35
	_msxml_progid:[
36
		'Microsoft.XMLHTTP',
37
		'MSXML2.XMLHTTP.3.0',
38
		'MSXML2.XMLHTTP'
39
		],
40

  
41
  /**
42
   * @description Object literal of HTTP header(s)
43
   * @property _http_header
44
   * @private
45
   * @static
46
   * @type object
47
   */
48
	_http_headers:{},
49

  
50
  /**
51
   * @description Determines if HTTP headers are set.
52
   * @property _has_http_headers
53
   * @private
54
   * @static
55
   * @type boolean
56
   */
57
	_has_http_headers:false,
58

  
59
 /**
60
  * @description Determines if a default header of
61
  * Content-Type of 'application/x-www-form-urlencoded'
62
  * will be added to any client HTTP headers sent for POST
63
  * transactions.
64
  * @property _use_default_post_header
65
  * @private
66
  * @static
67
  * @type boolean
68
  */
69
    _use_default_post_header:true,
70

  
71
 /**
72
  * @description The default header used for POST transactions.
73
  * @property _default_post_header
74
  * @private
75
  * @static
76
  * @type boolean
77
  */
78
    _default_post_header:'application/x-www-form-urlencoded; charset=UTF-8',
79

  
80
 /**
81
  * @description The default header used for transactions involving the
82
  * use of HTML forms.
83
  * @property _default_form_header
84
  * @private
85
  * @static
86
  * @type boolean
87
  */
88
    _default_form_header:'application/x-www-form-urlencoded',
89

  
90
 /**
91
  * @description Determines if a default header of
92
  * 'X-Requested-With: XMLHttpRequest'
93
  * will be added to each transaction.
94
  * @property _use_default_xhr_header
95
  * @private
96
  * @static
97
  * @type boolean
98
  */
99
    _use_default_xhr_header:true,
100

  
101
 /**
102
  * @description The default header value for the label
103
  * "X-Requested-With".  This is sent with each
104
  * transaction, by default, to identify the
105
  * request as being made by YUI Connection Manager.
106
  * @property _default_xhr_header
107
  * @private
108
  * @static
109
  * @type boolean
110
  */
111
    _default_xhr_header:'XMLHttpRequest',
112

  
113
 /**
114
  * @description Determines if custom, default headers
115
  * are set for each transaction.
116
  * @property _has_default_header
117
  * @private
118
  * @static
119
  * @type boolean
120
  */
121
    _has_default_headers:true,
122

  
123
 /**
124
  * @description Determines if custom, default headers
125
  * are set for each transaction.
126
  * @property _has_default_header
127
  * @private
128
  * @static
129
  * @type boolean
130
  */
131
    _default_headers:{},
132

  
133
 /**
134
  * @description Collection of polling references to the polling mechanism in handleReadyState.
135
  * @property _poll
136
  * @private
137
  * @static
138
  * @type object
139
  */
140
    _poll:{},
141

  
142
 /**
143
  * @description Queue of timeout values for each transaction callback with a defined timeout value.
144
  * @property _timeOut
145
  * @private
146
  * @static
147
  * @type object
148
  */
149
    _timeOut:{},
150

  
151
  /**
152
   * @description The polling frequency, in milliseconds, for HandleReadyState.
153
   * when attempting to determine a transaction's XHR readyState.
154
   * The default is 50 milliseconds.
155
   * @property _polling_interval
156
   * @private
157
   * @static
158
   * @type int
159
   */
160
     _polling_interval:50,
161

  
162
  /**
163
   * @description A transaction counter that increments the transaction id for each transaction.
164
   * @property _transaction_id
165
   * @private
166
   * @static
167
   * @type int
168
   */
169
     _transaction_id:0,
170

  
171
  /**
172
   * @description Custom event that fires at the start of a transaction
173
   * @property startEvent
174
   * @private
175
   * @static
176
   * @type CustomEvent
177
   */
178
	startEvent: new YAHOO.util.CustomEvent('start'),
179

  
180
  /**
181
   * @description Custom event that fires when a transaction response has completed.
182
   * @property completeEvent
183
   * @private
184
   * @static
185
   * @type CustomEvent
186
   */
187
	completeEvent: new YAHOO.util.CustomEvent('complete'),
188

  
189
  /**
190
   * @description Custom event that fires when handleTransactionResponse() determines a
191
   * response in the HTTP 2xx range.
192
   * @property successEvent
193
   * @private
194
   * @static
195
   * @type CustomEvent
196
   */
197
	successEvent: new YAHOO.util.CustomEvent('success'),
198

  
199
  /**
200
   * @description Custom event that fires when handleTransactionResponse() determines a
201
   * response in the HTTP 4xx/5xx range.
202
   * @property failureEvent
203
   * @private
204
   * @static
205
   * @type CustomEvent
206
   */
207
	failureEvent: new YAHOO.util.CustomEvent('failure'),
208

  
209
  /**
210
   * @description Custom event that fires when a transaction is successfully aborted.
211
   * @property abortEvent
212
   * @private
213
   * @static
214
   * @type CustomEvent
215
   */
216
	abortEvent: new YAHOO.util.CustomEvent('abort'),
217

  
218
  /**
219
   * @description A reference table that maps callback custom events members to its specific
220
   * event name.
221
   * @property _customEvents
222
   * @private
223
   * @static
224
   * @type object
225
   */
226
	_customEvents:
227
	{
228
		onStart:['startEvent', 'start'],
229
		onComplete:['completeEvent', 'complete'],
230
		onSuccess:['successEvent', 'success'],
231
		onFailure:['failureEvent', 'failure'],
232
		onUpload:['uploadEvent', 'upload'],
233
		onAbort:['abortEvent', 'abort']
234
	},
235

  
236
  /**
237
   * @description Member to add an ActiveX id to the existing xml_progid array.
238
   * In the event(unlikely) a new ActiveX id is introduced, it can be added
239
   * without internal code modifications.
240
   * @method setProgId
241
   * @public
242
   * @static
243
   * @param {string} id The ActiveX id to be added to initialize the XHR object.
244
   * @return void
245
   */
246
	setProgId:function(id)
247
	{
248
		this._msxml_progid.unshift(id);
249
		YAHOO.log('ActiveX Program Id  ' + id + ' added to _msxml_progid.', 'info', 'Connection');
250
	},
251

  
252
  /**
253
   * @description Member to override the default POST header.
254
   * @method setDefaultPostHeader
255
   * @public
256
   * @static
257
   * @param {boolean} b Set and use default header - true or false .
258
   * @return void
259
   */
260
	setDefaultPostHeader:function(b)
261
	{
262
		if(typeof b == 'string'){
263
			this._default_post_header = b;
264
			YAHOO.log('Default POST header set to  ' + b, 'info', 'Connection');
265
		}
266
		else if(typeof b == 'boolean'){
267
			this._use_default_post_header = b;
268
		}
269
	},
270

  
271
  /**
272
   * @description Member to override the default transaction header..
273
   * @method setDefaultXhrHeader
274
   * @public
275
   * @static
276
   * @param {boolean} b Set and use default header - true or false .
277
   * @return void
278
   */
279
	setDefaultXhrHeader:function(b)
280
	{
281
		if(typeof b == 'string'){
282
			this._default_xhr_header = b;
283
			YAHOO.log('Default XHR header set to  ' + b, 'info', 'Connection');
284
		}
285
		else{
286
			this._use_default_xhr_header = b;
287
		}
288
	},
289

  
290
  /**
291
   * @description Member to modify the default polling interval.
292
   * @method setPollingInterval
293
   * @public
294
   * @static
295
   * @param {int} i The polling interval in milliseconds.
296
   * @return void
297
   */
298
	setPollingInterval:function(i)
299
	{
300
		if(typeof i == 'number' && isFinite(i)){
301
			this._polling_interval = i;
302
			YAHOO.log('Default polling interval set to ' + i +'ms', 'info', 'Connection');
303
		}
304
	},
305

  
306
  /**
307
   * @description Instantiates a XMLHttpRequest object and returns an object with two properties:
308
   * the XMLHttpRequest instance and the transaction id.
309
   * @method createXhrObject
310
   * @private
311
   * @static
312
   * @param {int} transactionId Property containing the transaction id for this transaction.
313
   * @return object
314
   */
315
	createXhrObject:function(transactionId)
316
	{
317
		var obj,http,i;
318
		try
319
		{
320
			// Instantiates XMLHttpRequest in non-IE browsers and assigns to http.
321
			http = new XMLHttpRequest();
322
			//  Object literal with http and tId properties
323
			obj = { conn:http, tId:transactionId, xhr: true };
324
			YAHOO.log('XHR object created for transaction ' + transactionId, 'info', 'Connection');
325
		}
326
		catch(e)
327
		{
328
			for(i=0; i<this._msxml_progid.length; ++i){
329
				try
330
				{
331
					// Instantiates XMLHttpRequest for IE and assign to http
332
					http = new ActiveXObject(this._msxml_progid[i]);
333
					//  Object literal with conn and tId properties
334
					obj = { conn:http, tId:transactionId, xhr: true };
335
					YAHOO.log('ActiveX XHR object created for transaction ' + transactionId, 'info', 'Connection');
336
					break;
337
				}
338
				catch(e1){}
339
			}
340
		}
341
		finally
342
		{
343
			return obj;
344
		}
345
	},
346

  
347
  /**
348
   * @description This method is called by asyncRequest to create a
349
   * valid connection object for the transaction.  It also passes a
350
   * transaction id and increments the transaction id counter.
351
   * @method getConnectionObject
352
   * @private
353
   * @static
354
   * @return {object}
355
   */
356
	getConnectionObject:function(t)
357
	{
358
		var o, tId = this._transaction_id;
359

  
360
		try
361
		{
362
			if(!t){
363
				o = this.createXhrObject(tId);
364
			}
365
			else{
366
				o = {tId:tId};
367
				if(t==='xdr'){
368
					o.conn = this._transport;
369
					o.xdr = true;
370
				}
371
				else if(t==='upload'){
372
					o.upload = true;
373
				}
374
			}
375

  
376
			if(o){
377
				this._transaction_id++;
378
			}
379
		}
380
		catch(e){}
381
		return o;
382
	},
383

  
384
  /**
385
   * @description Method for initiating an asynchronous request via the XHR object.
386
   * @method asyncRequest
387
   * @public
388
   * @static
389
   * @param {string} method HTTP transaction method
390
   * @param {string} uri Fully qualified path of resource
391
   * @param {callback} callback User-defined callback function or object
392
   * @param {string} postData POST body
393
   * @return {object} Returns the connection object
394
   */
395
	asyncRequest:function(method, uri, callback, postData)
396
	{
397
		var o,t,args = (callback && callback.argument)?callback.argument:null;
398

  
399
		if(this._isFileUpload){
400
			t = 'upload';
401
		}
402
		else if(callback.xdr){
403
			t = 'xdr';
404
		}
405

  
406
		o = this.getConnectionObject(t);
407
		if(!o){
408
			YAHOO.log('Unable to create connection object.', 'error', 'Connection');
409
			return null;
410
		}
411
		else{
412

  
413
			// Intialize any transaction-specific custom events, if provided.
414
			if(callback && callback.customevents){
415
				this.initCustomEvents(o, callback);
416
			}
417

  
418
			if(this._isFormSubmit){
419
				if(this._isFileUpload){
420
					this.uploadFile(o, callback, uri, postData);
421
					return o;
422
				}
423

  
424
				// If the specified HTTP method is GET, setForm() will return an
425
				// encoded string that is concatenated to the uri to
426
				// create a querystring.
427
				if(method.toUpperCase() == 'GET'){
428
					if(this._sFormData.length !== 0){
429
						// If the URI already contains a querystring, append an ampersand
430
						// and then concatenate _sFormData to the URI.
431
						uri += ((uri.indexOf('?') == -1)?'?':'&') + this._sFormData;
432
					}
433
				}
434
				else if(method.toUpperCase() == 'POST'){
435
					// If POST data exist in addition to the HTML form data,
436
					// it will be concatenated to the form data.
437
					postData = postData?this._sFormData + "&" + postData:this._sFormData;
438
				}
439
			}
440

  
441
			if(method.toUpperCase() == 'GET' && (callback && callback.cache === false)){
442
				// If callback.cache is defined and set to false, a
443
				// timestamp value will be added to the querystring.
444
				uri += ((uri.indexOf('?') == -1)?'?':'&') + "rnd=" + new Date().valueOf().toString();
445
			}
446

  
447
			// Each transaction will automatically include a custom header of
448
			// "X-Requested-With: XMLHttpRequest" to identify the request as
449
			// having originated from Connection Manager.
450
			if(this._use_default_xhr_header){
451
				if(!this._default_headers['X-Requested-With']){
452
					this.initHeader('X-Requested-With', this._default_xhr_header, true);
453
					YAHOO.log('Initialize transaction header X-Request-Header to XMLHttpRequest.', 'info', 'Connection');
454
				}
455
			}
456

  
457
			//If the transaction method is POST and the POST header value is set to true
458
			//or a custom value, initalize the Content-Type header to this value.
459
			if((method.toUpperCase() === 'POST' && this._use_default_post_header) && this._isFormSubmit === false){
460
				this.initHeader('Content-Type', this._default_post_header);
461
				YAHOO.log('Initialize header Content-Type to application/x-www-form-urlencoded; UTF-8 for POST transaction.', 'info', 'Connection');
462
			}
463

  
464
			if(o.xdr){
465
				this.xdr(o, method, uri, callback, postData);
466
				return o;
467
			}
468

  
469
			o.conn.open(method, uri, true);
470
			//Initialize all default and custom HTTP headers,
471
			if(this._has_default_headers || this._has_http_headers){
472
				this.setHeader(o);
473
			}
474

  
475
			this.handleReadyState(o, callback);
476
			o.conn.send(postData || '');
477
			YAHOO.log('Transaction ' + o.tId + ' sent.', 'info', 'Connection');
478

  
479
			// Reset the HTML form data and state properties as
480
			// soon as the data are submitted.
481
			if(this._isFormSubmit === true){
482
				this.resetFormState();
483
			}
484

  
485
			// Fire global custom event -- startEvent
486
			this.startEvent.fire(o, args);
487

  
488
			if(o.startEvent){
489
				// Fire transaction custom event -- startEvent
490
				o.startEvent.fire(o, args);
491
			}
492

  
493
			return o;
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff