/* Copyright (c) 2009, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.net/yui/license.txt version: 3.0.0 build: 1549 */ YUI.add('datasource-local', function(Y) { /** * The DataSource utility provides a common configurable interface for widgets to * access a variety of data, from JavaScript arrays to online database servers. * * @module datasource */ /** * Provides the base DataSource implementation, which can be extended to * create DataSources for specific data protocols, such as the IO Utility, the * Get Utility, or custom functions. * * @module datasource * @submodule datasource-local */ /** * Base class for the DataSource Utility. * @class DataSource.Local * @extends Base * @constructor */ var LANG = Y.Lang, DSLocal = function() { DSLocal.superclass.constructor.apply(this, arguments); }; ///////////////////////////////////////////////////////////////////////////// // // DataSource static properties // ///////////////////////////////////////////////////////////////////////////// Y.mix(DSLocal, { /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceLocal" */ NAME: "dataSourceLocal", ///////////////////////////////////////////////////////////////////////////// // // DataSource Attributes // ///////////////////////////////////////////////////////////////////////////// ATTRS: { /** * @attribute source * @description Pointer to live data. * @type MIXED * @default null */ source: { value: null } }, /** * Global transaction counter. * * @property DataSource._tId * @type Number * @static * @private * @default 0 */ _tId: 0, /** * Executes a given callback. The third param determines whether to execute * * @method DataSource.issueCallback * @param callback {Object} The callback object. * @param params {Array} params to be passed to the callback method * @param error {Boolean} whether an error occurred * @static */ issueCallback: function (e) { if(e.callback) { var callbackFunc = (e.error && e.callback.failure) || e.callback.success; if (callbackFunc) { callbackFunc(e); } } } }); Y.extend(DSLocal, Y.Base, { /** * Internal init() handler. * * @method initializer * @param config {Object} Config object. * @private */ initializer: function(config) { this._initEvents(); }, /** * This method creates all the events for this module. * @method _initEvents * @private */ _initEvents: function() { /** * Fired when a data request is received. * * @event request * @param e {Event.Facade} Event Facade with the following properties: *
*
tId (Number)
Unique transaction ID.
*
request (Object)
The request.
*
callback (Object)
The callback object.
*
cfg (Object)
Configuration object.
*
* @preventable _defRequestFn */ this.publish("request", {defaultFn: Y.bind("_defRequestFn", this), queuable:true}); /** * Fired when raw data is received. * * @event data * @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.
*
data (Object)
Raw data.
*
* @preventable _defDataFn */ this.publish("data", {defaultFn: Y.bind("_defDataFn", this), queuable:true}); /** * Fired when response is returned. * * @event response * @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.
*
data (Object)
Raw data.
*
response (Object)
Normalized response object with the following properties: *
*
results (Object)
Parsed results.
*
meta (Object)
Parsed meta data.
*
error (Boolean)
Error flag.
*
*
*
* @preventable _defResponseFn */ this.publish("response", {defaultFn: Y.bind("_defResponseFn", this), queuable:true}); /** * Fired when an error is encountered. * * @event error * @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.
*
data (Object)
Raw data.
*
response (Object)
Normalized response object with the following properties: *
*
results (Object)
Parsed results.
*
meta (Object)
Parsed meta data.
*
error (Object)
Error object.
*
*
*
*/ }, /** * Manages request/response transaction. Must fire response * event when response is received. This method should be implemented by * subclasses to achieve more complex behavior such as accessing remote data. * * @method _defRequestFn * @param e {Event.Facade} Event Facadewith 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 data = this.get("source"); // Problematic data if(LANG.isUndefined(data)) { e.error = new Error("Local source undefined"); } if(e.error) { this.fire("error", e); } this.fire("data", Y.mix({data:data}, e)); }, /** * Normalizes raw data into a response that includes results and meta properties. * * @method _defDataFn * @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.
*
data (Object)
Raw data.
*
* @protected */ _defDataFn: function(e) { var data = e.data, meta = e.meta, response = { results: (LANG.isArray(data)) ? data : [data], meta: (meta) ? meta : {} }; this.fire("response", Y.mix({response: response}, e)); }, /** * Sends data as a normalized response to callback. * * @method _defResponseFn * @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.
*
data (Object)
Raw data.
*
response (Object)
Normalized response object with the following properties: *
*
results (Object)
Parsed results.
*
meta (Object)
Parsed meta data.
*
error (Boolean)
Error flag.
*
*
*
* @protected */ _defResponseFn: function(e) { // Send the response back to the callback DSLocal.issueCallback(e); }, /** * Generates a unique transaction ID and fires request event. * * @method sendRequest * @param request {Object} Request. * @param callback {Object} An object literal with the following properties: *
*
success
*
The function to call when the data is ready.
*
failure
*
The function to call upon a response failure condition.
*
argument
*
Arbitrary data payload that will be passed back to the success and failure handlers.
*
* @param cfg {Object} Configuration object * @return {Number} Transaction ID. */ sendRequest: function(request, callback, cfg) { var tId = DSLocal._tId++; this.fire("request", {tId:tId, request:request, callback:callback, cfg:cfg || {}}); return tId; } }); Y.namespace("DataSource").Local = DSLocal; }, '3.0.0' ,{requires:['base']}); YUI.add('datasource-io', function(Y) { /** * Provides a DataSource implementation which can be used to retrieve data via the IO Utility. * * @module datasource * @submodule datasource-io */ /** * IO subclass for the DataSource Utility. * @class DataSource.IO * @extends DataSource.Local * @constructor */ var DSIO = function() { DSIO.superclass.constructor.apply(this, arguments); }; ///////////////////////////////////////////////////////////////////////////// // // DataSource.IO static properties // ///////////////////////////////////////////////////////////////////////////// Y.mix(DSIO, { /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceIO" */ NAME: "dataSourceIO", ///////////////////////////////////////////////////////////////////////////// // // DataSource.IO Attributes // ///////////////////////////////////////////////////////////////////////////// ATTRS: { /** * Pointer to IO Utility. * * @attribute io * @type Y.io * @default Y.io */ io: { value: Y.io, cloneDefaultValue: false } } }); Y.extend(DSIO, Y.DataSource.Local, { /** * Internal init() handler. * * @method initializer * @param config {Object} Config object. * @private */ initializer: function(config) { this._queue = {interval:null, conn:null, requests:[]}; }, /** * @property _queue * @description Object literal to manage asynchronous request/response * cycles enabled if queue needs to be managed (asyncMode/ioConnMode): *
*
interval {Number}
*
Interval ID of in-progress queue.
*
conn
*
In-progress connection identifier (if applicable).
*
requests {Object[]}
*
Array of queued request objects: {request:request, callback:callback}.
*
* @type Object * @default {interval:null, conn:null, requests:[]} * @private */ _queue: null, /** * Passes query string to IO. 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"), io = this.get("io"), request = e.request, cfg = Y.mix(e.cfg, { on: { success: function (id, response, e) { this.fire("data", Y.mix({data:response}, e)); }, failure: function (id, response, e) { e.error = new Error("IO data failure"); this.fire("error", Y.mix({data:response}, e)); this.fire("data", Y.mix({data:response}, e)); } }, context: this, arguments: e }); // Support for POST transactions if(Y.Lang.isString(request)) { if(cfg.method && (cfg.method.toUpperCase() === "POST")) { cfg.data = cfg.data ? cfg.data+request : request; } else { uri += request; } } io(uri, cfg); return e.tId; } }); Y.DataSource.IO = DSIO; }, '3.0.0' ,{requires:['datasource-local', 'io']}); 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); }; ///////////////////////////////////////////////////////////////////////////// // // DataSource.Get static properties // ///////////////////////////////////////////////////////////////////////////// Y.mix(DSGet, { /** * 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(self, id) { return "&" + self.get("scriptCallbackParam") + "=YUI.Env.DataSource.callbacks["+id+"]" ; } } }, /** * Global array of callback functions, one for each request sent. * * @property callbacks * @type Function[] * @static */ callbacks : [], /** * Unique ID to track requests. * * @property _tId * @type Number * @private * @static */ _tId : 0 }); 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"), id = DSGet._tId++, self = this; // Dynamically add handler function with a closure to the callback stack YUI.Env.DataSource.callbacks[id] = Y.rbind(function(response) { if((self.get("asyncMode") !== "ignoreStaleResponses")|| (id === DSGet.callbacks.length-1)) { // Must ignore stale responses self.fire("data", Y.mix({data:response}, e)); } else { } delete DSGet.callbacks[id]; }, this, id); // We are now creating a request uri += e.request + this.get("generateRequestCallback")(this, id); //uri = this.doBefore(sUri); get.script(uri, { autopurge: true, // Works in Firefox only.... onFailure: Y.bind(function(e) { e.error = new Error("Script node data failure"); this.fire("error", e); }, this, e) }); return e.tId; } }); Y.DataSource.Get = DSGet; YUI.namespace("Env.DataSource.callbacks"); }, '3.0.0' ,{requires:['datasource-local', 'get']}); YUI.add('datasource-function', function(Y) { /** * Provides a DataSource implementation which can be used to retrieve data from a custom function. * * @module datasource * @submodule datasource-function */ /** * Function subclass for the DataSource Utility. * @class DataSource.Function * @extends DataSource.Local * @constructor */ var LANG = Y.Lang, DSFn = function() { DSFn.superclass.constructor.apply(this, arguments); }; ///////////////////////////////////////////////////////////////////////////// // // DataSource.Function static properties // ///////////////////////////////////////////////////////////////////////////// Y.mix(DSFn, { /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceFunction" */ NAME: "dataSourceFunction", ///////////////////////////////////////////////////////////////////////////// // // DataSource.Function Attributes // ///////////////////////////////////////////////////////////////////////////// ATTRS: { /** * @attribute source * @description Pointer to live data. * @type MIXED * @default null */ source: { validator: LANG.isFunction } } }); Y.extend(DSFn, Y.DataSource.Local, { /** * Passes query string to IO. 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 fn = this.get("source"), response; if(fn) { try { response = fn(e.request, this, e); this.fire("data", Y.mix({data:response}, e)); } catch(error) { e.error = error; this.fire("error", e); } } else { e.error = new Error("Function data failure"); this.fire("error", e); } return e.tId; } }); Y.DataSource.Function = DSFn; }, '3.0.0' ,{requires:['datasource-local']}); YUI.add('datasource-cache', function(Y) { /** * Extends DataSource with caching functionality. * * @module datasource * @submodule datasource-cache */ /** * Adds cacheability to the DataSource Utility. * @class DataSourceCache * @extends Cache */ var DataSourceCache = function() { DataSourceCache.superclass.constructor.apply(this, arguments); }; Y.mix(DataSourceCache, { /** * The namespace for the plugin. This will be the property on the host which * references the plugin instance. * * @property NS * @type String * @static * @final * @value "cache" */ NS: "cache", /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceCache" */ NAME: "dataSourceCache", ///////////////////////////////////////////////////////////////////////////// // // DataSourceCache Attributes // ///////////////////////////////////////////////////////////////////////////// ATTRS: { } }); Y.extend(DataSourceCache, Y.Cache, { /** * Internal init() handler. * * @method initializer * @param config {Object} Config object. * @private */ initializer: function(config) { this.doBefore("_defRequestFn", this._beforeDefRequestFn); this.doBefore("_defResponseFn", this._beforeDefResponseFn); }, /** * First look for cached response, then send request to live data. * * @method _beforeDefRequestFn * @param e {Event.Facade} Event Facade with the following properties: *
*
tId (Number)
Unique transaction ID.
*
request (Object)
The request.
*
callback (Object)
The callback object.
*
cfg (Object)
Configuration object.
*
* @protected */ _beforeDefRequestFn: function(e) { // Is response already in the Cache? var entry = (this.retrieve(e.request)) || null; if(entry && entry.response) { this.get("host").fire("response", Y.mix({response: entry.response}, e)); return new Y.Do.Halt("DataSourceCache plugin halted _defRequestFn"); } }, /** * Adds data to cache before returning data. * * @method _beforeDefResponseFn * @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.
*
*
*
data (Object)
Raw data.
*
response (Object)
Normalized response object with the following properties: *
*
cached (Object)
True when response is cached.
*
results (Object)
Parsed results.
*
meta (Object)
Parsed meta data.
*
error (Object)
Error object.
*
*
*
cfg (Object)
Configuration object.
*
* @protected */ _beforeDefResponseFn: function(e) { // Add to Cache before returning if(e.response && !e.response.cached) { e.response.cached = true; this.add(e.request, e.response, (e.callback && e.callback.argument)); } } }); Y.namespace('Plugin').DataSourceCache = DataSourceCache; }, '3.0.0' ,{requires:['datasource-local', 'cache']}); YUI.add('datasource-jsonschema', function(Y) { /** * Extends DataSource with schema-parsing on JSON data. * * @module datasource * @submodule datasource-jsonschema */ /** * Adds schema-parsing to the DataSource Utility. * @class DataSourceJSONSchema * @extends Plugin.Base */ var DataSourceJSONSchema = function() { DataSourceJSONSchema.superclass.constructor.apply(this, arguments); }; Y.mix(DataSourceJSONSchema, { /** * The namespace for the plugin. This will be the property on the host which * references the plugin instance. * * @property NS * @type String * @static * @final * @value "schema" */ NS: "schema", /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceJSONSchema" */ NAME: "dataSourceJSONSchema", ///////////////////////////////////////////////////////////////////////////// // // DataSourceJSONSchema Attributes // ///////////////////////////////////////////////////////////////////////////// ATTRS: { schema: { //value: {} } } }); Y.extend(DataSourceJSONSchema, Y.Plugin.Base, { /** * Internal init() handler. * * @method initializer * @param config {Object} Config object. * @private */ initializer: function(config) { this.doBefore("_defDataFn", this._beforeDefDataFn); }, /** * Parses raw data into a normalized response. * * @method _beforeDefDataFn *
*
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.
*
*
*
data (Object)
Raw data.
*
* @protected */ _beforeDefDataFn: function(e) { var data = (Y.DataSource.IO && (this.get("host") instanceof Y.DataSource.IO) && Y.Lang.isString(e.data.responseText)) ? e.data.responseText : e.data, response = Y.DataSchema.JSON.apply(this.get("schema"), data); // Default if(!response) { response = { meta: {}, results: data }; } this.get("host").fire("response", Y.mix({response:response}, e)); return new Y.Do.Halt("DataSourceJSONSchema plugin halted _defDataFn"); } }); Y.namespace('Plugin').DataSourceJSONSchema = DataSourceJSONSchema; }, '3.0.0' ,{requires:['plugin', 'datasource-local', 'dataschema-json']}); YUI.add('datasource-xmlschema', function(Y) { /** * Extends DataSource with schema-parsing on XML data. * * @module datasource * @submodule datasource-xmlschema */ /** * Adds schema-parsing to the DataSource Utility. * @class DataSourceXMLSchema * @extends Plugin.Base */ var DataSourceXMLSchema = function() { DataSourceXMLSchema.superclass.constructor.apply(this, arguments); }; Y.mix(DataSourceXMLSchema, { /** * The namespace for the plugin. This will be the property on the host which * references the plugin instance. * * @property NS * @type String * @static * @final * @value "schema" */ NS: "schema", /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceXMLSchema" */ NAME: "dataSourceXMLSchema", ///////////////////////////////////////////////////////////////////////////// // // DataSourceXMLSchema Attributes // ///////////////////////////////////////////////////////////////////////////// ATTRS: { schema: { //value: {} } } }); Y.extend(DataSourceXMLSchema, Y.Plugin.Base, { /** * Internal init() handler. * * @method initializer * @param config {Object} Config object. * @private */ initializer: function(config) { this.doBefore("_defDataFn", this._beforeDefDataFn); }, /** * Parses raw data into a normalized response. * * @method _beforeDefDataFn *
*
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.
*
*
*
data (Object)
Raw data.
*
* @protected */ _beforeDefDataFn: function(e) { var data = (Y.DataSource.IO && (this.get("host") instanceof Y.DataSource.IO) && e.data.responseXML && (e.data.responseXML.nodeType === 9)) ? e.data.responseXML : e.data, response = Y.DataSchema.XML.apply(this.get("schema"), data); // Default if(!response) { response = { meta: {}, results: data }; } this.get("host").fire("response", Y.mix({response:response}, e)); return new Y.Do.Halt("DataSourceXMLSchema plugin halted _defDataFn"); } }); Y.namespace('Plugin').DataSourceXMLSchema = DataSourceXMLSchema; }, '3.0.0' ,{requires:['plugin', 'datasource-local', 'dataschema-xml']}); YUI.add('datasource-arrayschema', function(Y) { /** * Extends DataSource with schema-parsing on array data. * * @module datasource * @submodule datasource-arrayschema */ /** * Adds schema-parsing to the DataSource Utility. * @class DataSourceArraySchema * @extends Plugin.Base */ var DataSourceArraySchema = function() { DataSourceArraySchema.superclass.constructor.apply(this, arguments); }; Y.mix(DataSourceArraySchema, { /** * The namespace for the plugin. This will be the property on the host which * references the plugin instance. * * @property NS * @type String * @static * @final * @value "schema" */ NS: "schema", /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceArraySchema" */ NAME: "dataSourceArraySchema", ///////////////////////////////////////////////////////////////////////////// // // DataSourceArraySchema Attributes // ///////////////////////////////////////////////////////////////////////////// ATTRS: { schema: { //value: {} } } }); Y.extend(DataSourceArraySchema, Y.Plugin.Base, { /** * Internal init() handler. * * @method initializer * @param config {Object} Config object. * @private */ initializer: function(config) { this.doBefore("_defDataFn", this._beforeDefDataFn); }, /** * Parses raw data into a normalized response. * * @method _beforeDefDataFn *
*
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.
*
*
*
data (Object)
Raw data.
*
* @protected */ _beforeDefDataFn: function(e) { var data = (Y.DataSource.IO && (this.get("host") instanceof Y.DataSource.IO) && Y.Lang.isString(e.data.responseText)) ? e.data.responseText : e.data, response = Y.DataSchema.Array.apply(this.get("schema"), data); // Default if(!response) { response = { meta: {}, results: data }; } this.get("host").fire("response", Y.mix({response:response}, e)); return new Y.Do.Halt("DataSourceArraySchema plugin halted _defDataFn"); } }); Y.namespace('Plugin').DataSourceArraySchema = DataSourceArraySchema; }, '3.0.0' ,{requires:['plugin', 'datasource-local', 'dataschema-array']}); YUI.add('datasource-textschema', function(Y) { /** * Extends DataSource with schema-parsing on text data. * * @module datasource * @submodule datasource-textschema */ /** * Adds schema-parsing to the DataSource Utility. * @class DataSourceTextSchema * @extends Plugin.Base */ var DataSourceTextSchema = function() { DataSourceTextSchema.superclass.constructor.apply(this, arguments); }; Y.mix(DataSourceTextSchema, { /** * The namespace for the plugin. This will be the property on the host which * references the plugin instance. * * @property NS * @type String * @static * @final * @value "schema" */ NS: "schema", /** * Class name. * * @property NAME * @type String * @static * @final * @value "dataSourceTextSchema" */ NAME: "dataSourceTextSchema", ///////////////////////////////////////////////////////////////////////////// // // DataSourceTextSchema Attributes // ///////////////////////////////////////////////////////////////////////////// ATTRS: { schema: { //value: {} } } }); Y.extend(DataSourceTextSchema, Y.Plugin.Base, { /** * Internal init() handler. * * @method initializer * @param config {Object} Config object. * @private */ initializer: function(config) { this.doBefore("_defDataFn", this._beforeDefDataFn); }, /** * Parses raw data into a normalized response. * * @method _beforeDefDataFn *
*
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.
*
*
*
data (Object)
Raw data.
*
* @protected */ _beforeDefDataFn: function(e) { var data = (Y.DataSource.IO && (this.get("host") instanceof Y.DataSource.IO) && Y.Lang.isString(e.data.responseText)) ? e.data.responseText : e.data, response = Y.DataSchema.Text.apply(this.get("schema"), data); // Default if(!response) { response = { meta: {}, results: data }; } this.get("host").fire("response", Y.mix({response:response}, e)); return new Y.Do.Halt("DataSourceTextSchema plugin halted _defDataFn"); } }); Y.namespace('Plugin').DataSourceTextSchema = DataSourceTextSchema; }, '3.0.0' ,{requires:['plugin', 'datasource-local', 'dataschema-text']}); YUI.add('datasource-polling', function(Y) { /** * Extends DataSource with polling functionality. * * @module datasource * @submodule datasource-polling */ /** * Adds polling to the DataSource Utility. * @class Pollable * @extends DataSource.Local */ var LANG = Y.Lang, Pollable = function() { this._intervals = {}; }; Pollable.prototype = { /** * @property _intervals * @description Hash of polling interval IDs that have been enabled, * stored here to be able to clear all intervals. * @private */ _intervals: null, /** * Sets up a polling mechanism to send requests at set intervals and forward * responses to given callback. * * @method setInterval * @param msec {Number} Length of interval in milliseconds. * @param request {Object} Request object. * @param callback {Object} An object literal with the following properties: *
*
success
*
The function to call when the data is ready.
*
failure
*
The function to call upon a response failure condition.
*
argument
*
Arbitrary data that will be passed back to the success and failure handlers.
*
* @return {Number} Interval ID. */ setInterval: function(msec, request, callback) { var x = Y.later(msec, this, this.sendRequest, [request, callback], true); this._intervals[x.id] = x; return x.id; }, /** * Disables polling mechanism associated with the given interval ID. * * @method clearInterval * @param id {Number} Interval ID. */ clearInterval: function(id, key) { // In case of being called by clearAllIntervals() id = key || id; if(this._intervals[id]) { // Clear the interval this._intervals[id].cancel(); // Clear from tracker delete this._intervals[id]; } }, /** * Clears all intervals. * * @method clearAllIntervals */ clearAllIntervals: function() { Y.each(this._intervals, this.clearInterval, this); } }; Y.augment(Y.DataSource.Local, Pollable); }, '3.0.0' ,{requires:['datasource-local']}); YUI.add('datasource', function(Y){}, '3.0.0' ,{use:['datasource-local','datasource-io','datasource-get','datasource-function','datasource-cache','datasource-jsonschema','datasource-xmlschema','datasource-arrayschema','datasource-textschema','datasource-polling']});