/* Copyright (c) 2010, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.html version: 3.3.0 build: 3167 */ YUI.add('datasource-get', function(Y) { /** * Provides a DataSource implementation which can be used to retrieve data via the Get Utility. * * @module datasource * @submodule datasource-get */ /** * Get Utility subclass for the DataSource Utility. * @class DataSource.Get * @extends DataSource.Local * @constructor */ var DSGet = function() { DSGet.superclass.constructor.apply(this, arguments); }; Y.DataSource.Get = Y.extend(DSGet, Y.DataSource.Local, { /** * Passes query string to Get Utility. Fires response event when * response is received asynchronously. * * @method _defRequestFn * @param e {Event.Facade} Event Facade with the following properties: *
*
tId (Number)
Unique transaction ID.
*
request (Object)
The request.
*
callback (Object)
The callback object with the following properties: *
*
success (Function)
Success handler.
*
failure (Function)
Failure handler.
*
*
*
cfg (Object)
Configuration object.
*
* @protected */ _defRequestFn: function(e) { var uri = this.get("source"), get = this.get("get"), guid = Y.guid().replace(/\-/g, '_'), generateRequest = this.get( "generateRequestCallback" ), o; /** * Stores the most recent request id for validation against stale * response handling. * * @property _last * @type {String} * @protected */ this._last = guid; // Dynamically add handler function with a closure to the callback stack // for access to guid YUI.Env.DataSource.callbacks[guid] = Y.bind(function(response) { delete YUI.Env.DataSource.callbacks[guid]; delete Y.DataSource.Local.transactions[e.tId]; var process = this.get('asyncMode') !== "ignoreStaleResponses" || this._last === guid; if (process) { this.fire("data", Y.mix({ data: response }, e)); } else { } }, this); // Add the callback param to the request url uri += e.request + generateRequest.call( this, guid ); Y.DataSource.Local.transactions[e.tId] = get.script(uri, { autopurge: true, // Works in Firefox only.... onFailure: Y.bind(function(e, o) { delete YUI.Env.DataSource.callbacks[guid]; delete Y.DataSource.Local.transactions[e.tId]; e.error = new Error(o.msg || "Script node data failure"); this.fire("data", e); }, this, e), onTimeout: Y.bind(function(e, o) { delete YUI.Env.DataSource.callbacks[guid]; delete Y.DataSource.Local.transactions[e.tId]; e.error = new Error(o.msg || "Script node data timeout"); this.fire("data", e); }, this, e) }); return e.tId; }, /** * Default method for adding callback param to url. See * generateRequestCallback attribute. * * @method _generateRequest * @param guid {String} unique identifier for callback function wrapper * @protected */ _generateRequest: function (guid) { return "&" + this.get("scriptCallbackParam") + "=YUI.Env.DataSource.callbacks." + guid; } }, { /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceGet" */ NAME: "dataSourceGet", //////////////////////////////////////////////////////////////////////////// // // DataSource.Get Attributes // //////////////////////////////////////////////////////////////////////////// ATTRS: { /** * Pointer to Get Utility. * * @attribute get * @type Y.Get * @default Y.Get */ get: { value: Y.Get, cloneDefaultValue: false }, /** * Defines request/response management in the following manner: *
* *
ignoreStaleResponses
*
Send all requests, but handle only the response for the most * recently sent request.
*
allowAll
*
Send all requests and handle all responses.
*
* * @attribute asyncMode * @type String * @default "allowAll" */ asyncMode: { value: "allowAll" }, /** * Callback string parameter name sent to the remote script. By default, * requests are sent to * <URI>?<scriptCallbackParam>=callbackFunction * * @attribute scriptCallbackParam * @type String * @default "callback" */ scriptCallbackParam : { value: "callback" }, /** * Accepts the DataSource instance and a callback ID, and returns a callback * param/value string that gets appended to the script URI. Implementers * can customize this string to match their server's query syntax. * * @attribute generateRequestCallback * @type Function */ generateRequestCallback : { value: function () { return this._generateRequest.apply(this, arguments); } } } }); YUI.namespace("Env.DataSource.callbacks"); }, '3.3.0' ,{requires:['datasource-local', 'get']});