/* 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-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, /** * Global in-progress transaction objects. * * @property DataSource.transactions * @type Object * @static */ transactions: {}, /** * Returns data to callback. * * @method DataSource.issueCallback * @param e {EventFacade} Event Facade. * @param caller {DataSource} Calling DataSource instance. * @static */ issueCallback: function (e, caller) { var error = (e.error || e.response.error); if(error) { e.error = e.error || e.response.error; caller.fire("error", e); } if(e.callback) { var callbackFunc = (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"); } 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, this); }, /** * Generates a unique transaction ID and fires request event. * * @method sendRequest * @param request {Object} An object literal with the following properties: *
*
request
*
The request to send to the live data source, if any.
*
callback
*
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.
*
*
*
cfg
*
Configuration object, if any.
*
* @return {Number} Transaction ID. */ sendRequest: function(request) { request = request || {}; var tId = DSLocal._tId++; this.fire("request", {tId:tId, request:request.request, callback:request.callback, cfg:request.cfg || {}}); return tId; } }); Y.namespace("DataSource").Local = DSLocal; }, '3.3.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 }, /** * Default IO Config. * * @attribute ioConfig * @type Object * @default null */ ioConfig: { value: null } } }); 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:[]}; }, /** * IO success callback. * * @method successHandler * @param id {String} Transaction ID. * @param response {String} Response. * @param e {Event.Facade} Event facade. * @private */ successHandler: function (id, response, e) { var defIOConfig = this.get("ioConfig"); delete Y.DataSource.Local.transactions[e.tId]; this.fire("data", Y.mix({data:response}, e)); if (defIOConfig && defIOConfig.on && defIOConfig.on.success) { defIOConfig.on.success.apply(defIOConfig.context || Y, arguments); } }, /** * IO failure callback. * * @method failureHandler * @param id {String} Transaction ID. * @param response {String} Response. * @param e {Event.Facade} Event facade. * @private */ failureHandler: function (id, response, e) { var defIOConfig = this.get("ioConfig"); delete Y.DataSource.Local.transactions[e.tId]; e.error = new Error("IO data failure"); this.fire("data", Y.mix({data:response}, e)); if (defIOConfig && defIOConfig.on && defIOConfig.on.failure) { defIOConfig.on.failure.apply(defIOConfig.context || Y, arguments); } }, /** * @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"), defIOConfig = this.get("ioConfig"), request = e.request, cfg = Y.merge(defIOConfig, e.cfg, { on: Y.merge(defIOConfig, { success: this.successHandler, failure: this.failureHandler }), 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; } } Y.DataSource.Local.transactions[e.tId] = io(uri, cfg); return e.tId; } }); Y.DataSource.IO = DSIO; }, '3.3.0' ,{requires:['datasource-local', 'io-base']}); 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']}); 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("data", e); } } else { e.error = new Error("Function data failure"); this.fire("data", e); } return e.tId; } }); Y.DataSource.Function = DSFn; }, '3.3.0' ,{requires:['datasource-local']}); YUI.add('datasource-cache', function(Y) { /** * Plugs DataSource with caching functionality. * * @module datasource * @submodule datasource-cache */ /** * DataSourceCache extension binds Cache to DataSource. * @class DataSourceCacheExtension */ var DataSourceCacheExtension = function() { }; Y.mix(DataSourceCacheExtension, { /** * 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 "dataSourceCacheExtension" */ NAME: "dataSourceCacheExtension" }); DataSourceCacheExtension.prototype = { /** * 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(entry, e)); return new Y.Do.Halt("DataSourceCache extension 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.cached) { this.add(e.request, e.response); } } }; Y.namespace("Plugin").DataSourceCacheExtension = DataSourceCacheExtension; /** * DataSource plugin adds cache functionality. * @class DataSourceCache * @extends Cache * @uses Plugin.Base, DataSourceCachePlugin */ function DataSourceCache(config) { var cache = config && config.cache ? config.cache : Y.Cache, tmpclass = Y.Base.create("dataSourceCache", cache, [Y.Plugin.Base, Y.Plugin.DataSourceCacheExtension]), tmpinstance = new tmpclass(config); tmpclass.NS = "tmpClass"; return tmpinstance; } 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" }); Y.namespace("Plugin").DataSourceCache = DataSourceCache; }, '3.3.0' ,{requires:['datasource-local', 'cache-base']}); 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. To accommodate XHR responses, * will first look for data in data.responseText. Otherwise will just work * with data. * * @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 = e.data ? (e.data.responseText ? e.data.responseText : e.data) : e.data, response = Y.DataSchema.JSON.apply.call(this, 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.3.0' ,{requires:['datasource-local', 'plugin', '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.call(this, 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.3.0' ,{requires:['datasource-local', 'plugin', '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.call(this, 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.3.0' ,{requires:['datasource-local', 'plugin', '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.call(this, 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.3.0' ,{requires:['datasource-local', 'plugin', '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 */ function Pollable() { 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} An object literal with the following properties: *
*
request
*
The request to send to the live data source, if any.
*
callback
*
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.
*
*
*
cfg
*
Configuration object, if any.
*
* @return {Number} Interval ID. */ setInterval: function(msec, callback) { var x = Y.later(msec, this, this.sendRequest, [ 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.3.0' ,{requires:['datasource-local']}); YUI.add('datasource', function(Y){}, '3.3.0' ,{use:['datasource-local','datasource-io','datasource-get','datasource-function','datasource-cache','datasource-jsonschema','datasource-xmlschema','datasource-arrayschema','datasource-textschema','datasource-polling']});