// vim: et:ts=4:sw=4:sts=4:ft=javascript /*@ Ox.Request Basic request handler object FIXME: options is not a property, just documenting defaults options Options object timeout request timeout type request type, possible values POST, GET, PUT, DELETE url request url @*/ Ox.Request = function(options) { var cache = {}, //dfd = $.Deferred(), pending = {}, requests = {}, self = { options: $.extend({ timeout: 60000, type: 'POST', url: '/api/' }, options) }; return { /*@ cancel cancel pending requests () -> cancel all requests (f) -> cancel all requests where function returns true (n) -> cancel request by id @*/ cancel: function() { if (arguments.length == 0) { // cancel all requests requests = {}; } else if (Ox.isFunction(arguments[0])) { // cancel with function Ox.forEach(requests, function(req, id) { if (arguments[0](req)) { delete requests[id]; } }); } else { // cancel by id delete requests[arguments[0]]; } }, /*@ clearCache clear cached results () -> @*/ clearCache: function() { cache = {}; }, /*@ options get/set options () -> get options (options) -> set options options Options Object @*/ options: function(options) { return Ox.getset(self.options, options, $.noop(), this); }, /*@ requests pending requests () -> returns number of requests @*/ requests: function() { return Ox.len(requests); }, /*@ send send request (options) -> returns request id options Options Object age cache age id request id timeout overwrite default timeout type overwrite default type url overwrite default url @*/ send: function(options) { var options = $.extend({ age: -1, callback: null, id: Ox.uid(), timeout: self.options.timeout, type: self.options.type, url: self.options.url }, options), req = JSON.stringify({ url: options.url, data: options.data }); if (pending[options.id]) { setTimeout(function() { Ox.Request.send(options); }, 0); } else { requests[options.id] = { url: options.url, data: options.data }; if (cache[req] && (options.age == -1 || options.age > Ox.getTime() - cache[req].time)) { setTimeout(function() { callback && callback(cache[req].data); }, 0); } else { pending[options.id] = true; $.ajax({ data: options.data, dataType: 'json', error: error, success: success, timeout: options.timeout, type: options.type, url: options.url }); } } function callback(data) { delete requests[options.id]; //Ox.len(requests) == 0 && $body.trigger('requestStop'); options.callback && options.callback(data); } function debug(request) { var $iframe = $('