// vim: et:ts=4:sw=4:sts=4:ft=javascript /*@ Ox.App <f> Basic application instance that communicates with a JSON API () -> <f> App object (options) -> <f> App object options <o> Options object timeout <n> request timeout type <s> HTTP Request type, i.e. 'GET' or 'POST' url <s> JSON API url self <o> Shared private variable load <!> app loaded @*/ Ox.App = function(options) { options = options || {}; var self = { options: Ox.extend({ timeout: 60000, type: 'POST', url: '/api/', }, options || {}), time: new Date() }, that = Ox.Element({}, self); that.api = { api: function(callback) { Ox.Request.send({ url: self.options.url, data: { action: 'api' }, callback: callback }); }, cancel: function(id) { Ox.Request.cancel(id); } }; $.ajaxSetup({ timeout: self.options.timeout, type: self.options.type, url: self.options.url }); /*@ api <o> bakcend API [action] <f> all api requests available on backend cancel <f> cancel a request options <f> get or set options @*/ that.api.api(function(result) { Ox.forEach(result.data.actions, function(val, key) { that.api[key] = function(data, callback) { if (arguments.length == 1 && Ox.isFunction(data)) { callback = data; data = {}; } return Ox.Request.send($.extend({ url: self.options.url, data: { action: key, data: JSON.stringify(data) }, callback: callback }, !val.cache ? {age: 0}: {})); }; }); that.api.init(getUserData(), function(result) { //Ox.UI.hideLoadingScreen(); that.triggerEvent({ load: result.data }); }); }); function getUserData() { return { document: { referrer: document.referrer }, history: { length: history.length }, navigator: { cookieEnabled: navigator.cookieEnabled, plugins: $.map(navigator.plugins, function(plugin, i) { return plugin.name; }), userAgent: navigator.userAgent }, screen: screen, time: (+new Date() - self.time) / 1000, window: { innerHeight: window.innerHeight, innerWidth: window.innerWidth, outerHeight: window.outerHeight, outerWidth: window.outerWidth, screenLeft: window.screenLeft, screenTop: window.screenTop } }; } /*@ change <f> change key/value (key, value) -> <u> currently not implemented @*/ self.change = function(key, value) { }; /*@ options <f> get/set options, see Ox.getset () -> <o> get options (options) -> <o> update/set options @*/ that.options = function() { return Ox.getset(self.options, Array.prototype.slice.call(arguments), self.change, that); }; return that; };