UNPKG

alpaca

Version:

Alpaca provides the easiest and fastest way to generate interactive forms for the web and mobile devices. It runs simply as HTML5 or more elaborately using Bootstrap, jQuery Mobile or jQuery UI. Alpaca uses Handlebars to process JSON schema and provide

271 lines (232 loc) 6.33 kB
/*jshint -W014 */ // bad line breaking /*jshint -W004 */ // duplicate variables (function($) { var Alpaca = $.alpaca; Alpaca.listenerId = function() { var x = 0; return function() { return "listener-" + (x++); }; }(); /** * Subscribes a function handler to an observable. * * @param [String] scope optional scope * @param {String} id the variable id * @param {Function} callbackFunction the callback function * * @return descriptor */ Alpaca.subscribe = function() { var args = Alpaca.makeArray(arguments); var scope = null; var id = null; var listener = null; if (args.length == 2) { scope = "global"; id = args.shift(); listener = args.shift(); } else { scope = args.shift(); id = args.shift(); listener = args.shift(); } // pick off path if id is a field if (id && Alpaca.isObject(id)) { id = id.path; } if (!id) { Alpaca.logError("Missing observable subscribe id: " + id); return null; } // function identifier var listenerId = listener._lfid; if (!listenerId) { listenerId = Alpaca.listenerId(); listener._lfid = listenerId; } // wrap function into a closure var func = function(that) { return function() { return listener.apply(that, arguments); }; }(this); func._lfid = listener._lfid; var observables = Alpaca.ScopedObservables.get(scope); var observable = observables.observable(id); // tell the observable to subscribe observable.subscribe(listenerId, func); return { "scope": scope, "id": id, "listenerId": listenerId }; }; /** * Unsubscribes a function handler from an observable. * * @param [String] scope optional scope * @param {String} id the variable id * @param {String|Function} listener either the function or listener id * @return descriptor */ Alpaca.unsubscribe = function() { var args = Alpaca.makeArray(arguments); var scope = null; var id = null; var listenerOrId = null; if (args.length == 2) { scope = "global"; id = args.shift(); listenerOrId = args.shift(); } else if (args.length == 3) { scope = args.shift(); id = args.shift(); listenerOrId = args.shift(); } var listenerId = listenerOrId; if (Alpaca.isFunction(listenerId)) { listenerId = listenerId._lfid; } // pick off path if id is a field if (id && Alpaca.isObject(id)) { id = id.path; } if (!id) { Alpaca.logError("Missing observable id: " + id); return null; } var observables = Alpaca.ScopedObservables.get(scope); var observable = observables.observable(id); // tell the observable to unsubscribe observable.unsubscribe(listenerId); return { "scope": scope, "id": id, "listenerId": listenerId }; }; /** * Gets or sets an observable in the given scope. * * @param [String] scope optional scope * @param {String} id the variable id */ Alpaca.observable = function() { var scope; var id; var args = Alpaca.makeArray(arguments); if (args.length == 1) { scope = "global"; id = args.shift(); } else if (args.length == 2) { scope = args.shift(); id = args.shift(); } // pick off path if id is a field if (id && Alpaca.isObject(id)) { id = id.path; } if (!id) { Alpaca.logError("Missing observable id: " + JSON.stringify(args)); } else { var observables = Alpaca.ScopedObservables.get(scope); observable = observables.observable(id); } return observable; }; Alpaca.clearObservable = function() { var scope; var id; var args = Alpaca.makeArray(arguments); if (args.length == 1) { scope = "global"; id = args.shift(); } else if (args.length == 2) { scope = args.shift(); id = args.shift(); } // pick off path if id is a field if (id && Alpaca.isObject(id)) { id = id.path; } if (!id) { Alpaca.logError("Missing observable id: " + JSON.stringify(args)); } var observables = Alpaca.ScopedObservables.get(scope); var observable = observables.observable(id); observable.clear(); }; /** * Declares and gets a dependent observable in a given scope * * @param scope * @param id * @param func */ Alpaca.dependentObservable = function() { var scope = null; var id = null; var func = null; var args = Alpaca.makeArray(arguments); if (args.length == 2) { scope = "global"; id = args.shift(); func = args.shift(); } else if (args.length == 3) { scope = args.shift(); id = args.shift(); func = args.shift(); } else { Alpaca.error("Wrong number of arguments"); return; } // pick off path if id is a field if (id && Alpaca.isObject(id)) { id = id.path; } if (!id) { Alpaca.logError("Missing observable id: " + JSON.stringify(args)); } var observables = Alpaca.ScopedObservables.get(scope); return observables.dependentObservable(id, func); }; })(jQuery);