src/cm/media/js/lib/yui/yui_3.0.0b1/build/io/io-upload-iframe.js
author raph
Mon, 23 Nov 2009 15:14:29 +0100
changeset 0 40c8f766c9b8
permissions -rw-r--r--
import from internal svn r 4007
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
Code licensed under the BSD License:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
http://developer.yahoo.net/yui/license.txt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
version: 3.0.0b1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
build: 1163
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
YUI.add('io-upload-iframe', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
   /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
   	* Extends the IO base class to enable file uploads, with HTML forms,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
   	* using an iframe as the transport medium.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
	* @module io
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
	* @submodule io-upload-iframe
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
	*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
	var w = Y.config.win;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
   /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
	* @description Parses the POST data object and creates hidden form elements
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
	* for each key-value, and appends them to the HTML form object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
	* @method appendData
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
	* @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
	* @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
	* @param {object} d The key-value hash map.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
	* @return {array} e Array of created fields.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
	*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
	function _addData(f, d) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
		var e = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
			p, i;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
		for (p in d) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
			if (d.hasOwnProperty(d, p)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
				e[i] = document.createElement('input');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
				e[i].type = 'hidden';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
				e[i].name = p;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
				e[i].value = d[p].
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
				f.appendChild(e[i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
		return e;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
	function _removeData(f, e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
		var i, l;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
		if (e && e.length > 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
			for(i = 0, l = e.length; i < l; i++){
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
				f.removeChild(e[i]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
	function _create(o, c) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
		var i = Y.Node.create('<iframe id="ioupload' + o.id + '" name="ioupload' + o.id + '" />'),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
			cfg = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
				position: 'absolute',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
				top: '-1000px',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
				left: '-1000px'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
			};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
		i.setStyles(cfg);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
		Y.get('body').appendChild(i);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
		// Bind the onload handler to the iframe to detect the file upload response.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
		Y.on("load", function() { _handle(o, c) }, '#ioupload' + o.id);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
	// Create the upload callback handler that fires when the iframe
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
	// receives the load event.  Subsequently, the event handler is detached
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
	// and the iframe removed from the document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
	function _handle(o, c) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
		var p,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
		    b = Y.get('#ioupload' + o.id).get('contentWindow.document.body');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
		if (c.timeout) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
			_clearTimeout(o.id);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
		// When a response Content-Type of "text/plain" is used, Firefox and Safari
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
		// will wrap the response string with <pre></pre>.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
		p = b.query('pre:first-child');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
		o.c.responseText = (p) ? p.get('innerHTML') : b.get('innerHTML');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
		Y.io.complete(o, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
		// The transaction is complete, so call _destroy to remove
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
		// the event listener bound to the iframe transport, and then
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
		// destroy the iframe.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
		setTimeout( function() { _destroy(o.id); }, 0);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
   /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
	* @description Starts timeout count if the configuration object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
	* has a defined timeout property.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
	*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
	* @method _startTimeout
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
	* @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
	* @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
    * @param {object} o Transaction object generated by _create().
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
    * @param {object} c Configuration object passed to YUI.io().
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
    * @return void
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
	*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
	function _startTimeout(o, c) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
		Y.io._timeout[o.id] = w.setTimeout(function() { Y.io.abort(o, c); }, c.timeout);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
   /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
	* @description Clears the timeout interval started by _startTimeout().
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
	*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
	* @method _clearTimeout
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
	* @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
	* @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
    * @param {number} id - Transaction id.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
    * @return void
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
	*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
	function _clearTimeout(id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
		w.clearTimeout(Y.io._timeout[id]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
		delete Y.io._timeout[id];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
	function _destroy(id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
		Y.Event.purgeElement('#ioupload' + id, false);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
		Y.get('body').removeChild(Y.get('#ioupload' + id));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
	Y.mix(Y.io, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
	   /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
		* @description Uploads HTML form, inclusive of files/attachments, using the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
		* iframe created in createFrame to facilitate the transaction.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
		* @method _upload
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
		* @private
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
		* @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
		* @param {o} o The transaction object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
		* @param {object} uri Qualified path to transaction resource.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
		* @param {object} c Configuration object for the transaction.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
		* @return {void}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
		*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
		_upload: function(o, uri, c) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
			var f = (typeof c.form.id === 'string') ? document.getElementById(c.form.id) : c.form.id,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
				e, fields, i, p, attr;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
			_create(o, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
			// Track original HTML form attribute values.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
			attr = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
				action: f.getAttribute('action'),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
				target: f.getAttribute('target')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
			};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
			// Initialize the HTML form properties in case they are
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
			// not defined in the HTML form.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
			f.setAttribute('action', uri);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
			f.setAttribute('method', 'POST');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
			f.setAttribute('target', 'ioupload' + o.id );
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
			f.setAttribute((Y.UA.ie && !document.documentMode) ? 'encoding' : 'enctype', 'multipart/form-data');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
			if (c.data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
				fields = _addData(f, c.data);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
			// Start polling if a callback is present and the timeout
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
			// property has been defined.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
			if (c.timeout) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
				_startTimeout(o, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
			// Start file upload.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
			f.submit();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
			Y.io.start(o.id, c);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
			if (c.data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
				_removeData(f, fields);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
			// Restore HTML form attributes to their original
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
			// values prior to file upload.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
			for (p in attr) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
				if (attr.hasOwnProperty(attr, p)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
					if (attr[p]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
				  		f.setAttribute(p, f[prop]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
					}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
					else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
				  		f.removeAttribute(p);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
					}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
			  	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
	});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
}, '3.0.0b1' ,{requires:['io-base']});