diff options
Diffstat (limited to 'slick.remotemodel.js')
-rw-r--r-- | slick.remotemodel.js | 276 |
1 files changed, 140 insertions, 136 deletions
diff --git a/slick.remotemodel.js b/slick.remotemodel.js index 4dce1b8..0ffa555 100644 --- a/slick.remotemodel.js +++ b/slick.remotemodel.js @@ -18,166 +18,170 @@ function EventHelper() { } - -/*** - * A sample AJAX data store implementation. - * Right now, it's hooked up to load all Apple-related Digg stories, but can - * easily be extended to support and JSONP-compatible backend that accepts paging parameters. - */ -function RemoteModel() { - // private - var PAGESIZE = 50; - var data = {length:0}; - var searchstr = "apple"; - var sortcol = null; - var sortdir = 1; - var h_request = null; - var req = null; // ajax request - var req_page; - - // events - var onDataLoading = new EventHelper(); - var onDataLoaded = new EventHelper(); - - - function init() { - } - - - function isDataLoaded(from,to) { - for (var i=from; i<=to; i++) { - if (data[i] == undefined || data[i] == null) - return false; - } +(function() { + /*** + * A sample AJAX data store implementation. + * Right now, it's hooked up to load all Apple-related Digg stories, but can + * easily be extended to support and JSONP-compatible backend that accepts paging parameters. + */ + function RemoteModel() { + // private + var PAGESIZE = 50; + var data = {length:0}; + var searchstr = "apple"; + var sortcol = null; + var sortdir = 1; + var h_request = null; + var req = null; // ajax request + var req_page; - return true; - } - - - function clear() { - for (var key in data) { - delete data[key]; + // events + var onDataLoading = new EventHelper(); + var onDataLoaded = new EventHelper(); + + + function init() { } - data.length = 0; - } - - - function ensureData(from,to) { - if (from < 0) - from = 0; - var fromPage = Math.floor(from / PAGESIZE); - var toPage = Math.floor(to / PAGESIZE); - while (data[fromPage * PAGESIZE] !== undefined && fromPage < toPage) - fromPage++; + function isDataLoaded(from,to) { + for (var i=from; i<=to; i++) { + if (data[i] == undefined || data[i] == null) + return false; + } + + return true; + } + - while (data[toPage * PAGESIZE] !== undefined && fromPage < toPage) - toPage--; + function clear() { + for (var key in data) { + delete data[key]; + } + data.length = 0; + } + + + function ensureData(from,to) { + if (from < 0) + from = 0; - if (fromPage > toPage || ((fromPage == toPage) && data[fromPage*PAGESIZE] !== undefined)) { - // TODO: lookeahead + var fromPage = Math.floor(from / PAGESIZE); + var toPage = Math.floor(to / PAGESIZE); - //if () + while (data[fromPage * PAGESIZE] !== undefined && fromPage < toPage) + fromPage++; - return; - } + while (data[toPage * PAGESIZE] !== undefined && fromPage < toPage) + toPage--; + + if (fromPage > toPage || ((fromPage == toPage) && data[fromPage*PAGESIZE] !== undefined)) { + // TODO: lookeahead + + //if () + + return; + } + + + var url = "http://services.digg.com/search/stories?query=" + searchstr + "&offset=" + (fromPage * PAGESIZE) + "&count=" + (((toPage-fromPage)*PAGESIZE)+PAGESIZE) + "&appkey=http://slickgrid.googlecode.com&type=javascript" + + switch (sortcol) { + case "diggs": + url += ("&sort=" + ((sortdir>0)?"digg_count-asc":"digg_count-desc")); + break; + } - var url = "http://services.digg.com/search/stories?query=" + searchstr + "&offset=" + (fromPage * PAGESIZE) + "&count=" + (((toPage-fromPage)*PAGESIZE)+PAGESIZE) + "&appkey=http://slickgrid.googlecode.com&type=javascript" - - - switch (sortcol) { - case "diggs": - url += ("&sort=" + ((sortdir>0)?"digg_count-asc":"digg_count-desc")); - break; + + if (req) { + req.abort(); + data[req_page*PAGESIZE] = undefined; + } + + if (h_request != null) + clearTimeout(h_request); + + h_request = setTimeout(function() { + for (var i=fromPage; i<=toPage; i++) + data[i*PAGESIZE] = null; // null indicates a 'requested but not available yet' + + req_page = fromPage; + + onDataLoading.notify({from:from, to:to}); + + req = $.jsonp({ + url: url, + callbackParameter: "callback", + cache: true, // Digg doesn't accept the autogenerated cachebuster param + success: onSuccess, + error: function(){ + onError(fromPage, toPage) + } + }); + }, 50); } - if (req) { - req.abort(); - data[req_page*PAGESIZE] = undefined; + function onError(fromPage,toPage) { + alert("error loading pages " + fromPage + " to " + toPage); } - if (h_request != null) - window.clearTimeout(h_request); - - h_request = window.setTimeout(function() { - for (var i=fromPage; i<=toPage; i++) - data[i*PAGESIZE] = null; // null indicates a 'requested but not available yet' + function onSuccess(resp) { + var from = resp.offset, to = resp.offset + resp.count; + data.length = parseInt(resp.total); - req_page = fromPage; + for (var i = 0; i < resp.stories.length; i++) { + data[from + i] = resp.stories[i]; + data[from + i].index = from + i; + } - onDataLoading.notify({from:from, to:to}); + req = null; - req = $.jsonp({ - url: url, - callbackParameter: "callback", - cache: true, // Digg doesn't accept the autogenerated cachebuster param - success: onSuccess, - error: function(){ - onError(fromPage, toPage) - } - }); - }, 50); - } - - - function onError(fromPage,toPage) { - alert("error loading pages " + fromPage + " to " + toPage); - } - - function onSuccess(resp) { - var from = resp.offset, to = resp.offset + resp.count; - data.length = parseInt(resp.total); + onDataLoaded.notify({from:from, to:to}); + } - for (var i = 0; i < resp.stories.length; i++) { - data[from + i] = resp.stories[i]; - data[from + i].index = from + i; + + function reloadData(from,to) { + for (var i=from; i<=to; i++) + delete data[i]; + + ensureData(from,to); } - req = null; - onDataLoaded.notify({from:from, to:to}); - } + function setSort(column,dir) { + sortcol = column; + sortdir = dir; + clear(); + } + + function setSearch(str) { + searchstr = str; + clear(); + } - function reloadData(from,to) { - for (var i=from; i<=to; i++) - delete data[i]; + init(); + + return { + // properties + "data": data, - ensureData(from,to); + // methods + "clear": clear, + "isDataLoaded": isDataLoaded, + "ensureData": ensureData, + "reloadData": reloadData, + "setSort": setSort, + "setSearch": setSearch, + + // events + "onDataLoading": onDataLoading, + "onDataLoaded": onDataLoaded + }; } - - - function setSort(column,dir) { - sortcol = column; - sortdir = dir; - clear(); - } - - function setSearch(str) { - searchstr = str; - clear(); - } - - - init(); - - return { - // properties - "data": data, - - // methods - "clear": clear, - "isDataLoaded": isDataLoaded, - "ensureData": ensureData, - "reloadData": reloadData, - "setSort": setSort, - "setSearch": setSearch, - // events - "onDataLoading": onDataLoading, - "onDataLoaded": onDataLoaded - }; -} + // Slick.Data.RemoteModel + $.extend(true, window, { Slick: { Data: { RemoteModel: RemoteModel }}}); +})(); |