(function($) { var Alpaca = $.alpaca; Alpaca.CloudCmsConnector = Alpaca.Connector.extend( /** * @lends Alpaca.CloudCmsConnector.prototype */ { /** * Makes initial connections to data source. * * @param {Function} onSuccess onSuccess callback. * @param {Function} onError onError callback. */ connect: function (onSuccess, onError) { var self = this; Gitana.connect(this.config, function(err) { if (err) { onError(err); return; } self.gitana = this; self.gitana.datastore("content").readBranch("master").then(function() { self.branch = this; self.bindHelperFunctions(self.branch); // also store a reference on Alpaca for global use Alpaca.branch = self.branch; onSuccess(); }); }); }, bindHelperFunctions: function(branch) { if (!branch.loadAlpacaSchema) { branch.loadAlpacaSchema = function(schemaIdentifier, resources, callback) { var uriFunction = function() { return branch.getUri() + "/alpaca/schema"; }; var params = {}; params["id"] = schemaIdentifier; return this.chainGetResponse(this, uriFunction, params).then(function(response) { callback.call(this, null, response); }); }; } if (!branch.loadAlpacaOptions) { branch.loadAlpacaOptions = function(optionsIdentifier, resources, callback) { var uriFunction = function() { return branch.getUri() + "/alpaca/options"; }; var params = {}; params["schemaId"] = resources.schemaSource; params["id"] = optionsIdentifier; return this.chainGetResponse(this, uriFunction, params).then(function(response) { callback.call(this, null, response); }); }; } if (!branch.loadAlpacaData) { branch.loadAlpacaData = function(dataIdentifier, resources, callback) { var uriFunction = function() { return branch.getUri() + "/alpaca/data"; }; var params = {}; params["id"] = dataIdentifier; return this.chainGetResponse(this, uriFunction, params).then(function(response) { callback.call(this, null, response); }); }; } }, /** * Loads data from Cloud CMS. * * @param {String} nodeId the node id to load * @param {Object} resources Map of resources * @param {Function} onSuccess onSuccess callback * @param {Function} onError onError callback */ loadData: function (nodeId, resources, successCallback, errorCallback) { var self = this; self.branch.loadAlpacaData(nodeId, resources, function(err, data) { if (err) { errorCallback(err); return; } var obj = null; if (data) { obj = JSON.parse(JSON.stringify(data)); } successCallback(obj); }); }, /** * Loads json schema from Cloud CMS. * * @param {Object|String} schemaIdentifier the definition qname to load * @param {Object} resources Map of resources * @param {Function} onSuccess onSuccess callback. * @param {Function} onError onError callback. */ loadSchema: function (schemaIdentifier, resources, successCallback, errorCallback) { var self = this; self.branch.loadAlpacaSchema(schemaIdentifier, resources, function(err, schema) { if (err) { errorCallback(err); return; } // TODO: cleanup schema successCallback(schema); }); }, /** * Loads json options from Cloud CMS. * * @param {Object|String} optionsIdentifier the form key to load * @param {Object} resources Map of resources * @param {Function} onSuccess onSuccess callback. * @param {Function} onError onError callback. */ loadOptions: function (optionsIdentifier, resources, successCallback, errorCallback) { var self = this; self.branch.loadAlpacaOptions(optionsIdentifier, resources, function(err, options) { if (err) { errorCallback(err); return; } if (!options) { options = {}; } // TODO: cleanup options // mix in buttons onto form options.form.buttons = { "submit": { "title": "Submit", "click": function(e) { var form = this; var value = this.getValue(); if (!value) { value = {}; } var promise = this.ajaxSubmit({ "xhrFields": { "withCredentials": true }, "crossDomain": true, "processData": false, "data": JSON.stringify(value), "contentType": "application/json; charset=utf-8" }); promise.done(function () { form.topControl.trigger("formSubmitSuccess"); }); promise.fail(function () { form.topControl.trigger("formSubmitFail"); }); } } }; if (typeof(options.focus) === "undefined") { options.focus = true; } // adjust the action handler relative to baseURL options.form.attributes.action = self.config.baseURL + options.form.attributes.action; successCallback(options); }); }, /** * Loads a referenced JSON schema by it's qname from Cloud CMS. * * @param {Object|String} schemaIdentifier schema to load * @param {Function} onSuccess onSuccess callback. * @param {Function} onError onError callback. */ loadReferenceSchema: function (schemaIdentifier, successCallback, errorCallback) { var self = this; return self.loadSchema(schemaIdentifier, successCallback, errorCallback); }, /** * Loads referenced JSON options by it's form key from Cloud CMS. * * @param {Object|String} optionsIdentifier form to load. * @param {Function} onSuccess onSuccess callback. * @param {Function} onError onError callback. */ loadReferenceOptions: function (optionsIdentifier, successCallback, errorCallback) { var self = this; return self.loadOptions(optionsIdentifier, successCallback, errorCallback); } }); Alpaca.registerConnectorClass("cloudcms", Alpaca.CloudCmsConnector); })(jQuery);