Fixed Archive views summary page items fetching
[ajatus.git] / js / ajatus.renderer.js
blob934519551709f72307c35f0b1b8795881438e9f8
1 /*
2  * This file is part of
3  *
4  * Ajatus - Distributed CRM
5  * @requires jQuery v1.2.1
6  * 
7  * Copyright (c) 2007 Jerry Jalava <jerry.jalava@gmail.com>
8  * Copyright (c) 2007 Nemein Oy <http://nemein.com>
9  * Website: http://ajatus.info
10  * Licensed under the GPL license
11  * http://www.gnu.org/licenses/gpl.html
12  * 
13  */
15 (function($){
16     $.ajatus = $.ajatus || {};
17     
18     $.ajatus.renderer_defaults = {
19         type: 'block',
20         tick_limit: 20,
21         max_item_before_pool: 20,
22         items_per_page: 40,
23         use_db_after: 500,
24     };
25     
26     $.ajatus.renderer = function(settings, r) {
27         this.settings = $.extend({}, $.ajatus.renderer_defaults, (settings || {}));
29         if (this.settings.type == 'block') {
30             this.handler = new $.ajatus.renderer._block(this.settings, r);
31         } else if (this.settings.type == 'scroll') {
32             this.handler = new $.ajatus.renderer._scroll(this.settings, r);
33         }
34         };
35         $.extend($.ajatus.renderer.prototype, {
36             add_item: function(callback, args) {
37             this.handler.add_item(callback, args);
38             },
39             
40             items_added: function(doc_count) {
41                 if (typeof this.handler.items_added == 'function') {
42                     this.handler.items_added(doc_count);
43             }
44             },
45             
46             start: function() {
47                 this.handler.start();
48             }
49         });
50         
51         $.ajatus.renderer._block = function(settings, renderer) {
52         this.settings = $.extend({
53             tick_limit: 20,
54             max_item_before_pool: 20
55         }, settings);
56         this.render_lock = false;           
57             this.items = [];
58             this.done_items = [];
59             
60             this.renderer = renderer;
61     };
62         $.extend($.ajatus.renderer._block.prototype, {
63             add_item: function(callback, args) {
64             var item = {
65                 callback: callback,
66                 args: args || []
67             };
68                 this.items.push(item);
69                 $.ajatus.events.named_lock_pool.increase('block_renderer');
70                 
71                 if (! this.render_lock) {
72                     this.start();
73                 }
74             },
75             
76             start: function() {
77             this._create_lock();
78             },
79             
80             _on_tick: function() {
81                 var _self = this;
82                 if (this.items.length == 0)
83                 {
84                     $.ajatus.events.named_lock_pool.clear('block_renderer')
85                     return true;
86                 }
87                 this.items = $.grep(this.items, function(n, i){
88                     if (i < _self.settings.tick_limit)
89                     {                   
90                         var functionToCall = eval(n.callback);
91                         
92                     if (functionToCall.apply(functionToCall, n.args)) {
93                         _self.done_items.push(i);
94                         $.ajatus.events.named_lock_pool.decrease('block_renderer');
95                     }
96                     } else {
97                         return true;
98                     }               
99                 });
100                 this.renderer.enable_sorting();
101             },
102             
103             _create_lock: function() {
104                 var _self = this;
105             _self.render_lock = new $.ajatus.events.lock({
106                 disable_application: false,
107                 watch: {                    
108                     validate: function() {
109                         _self._on_tick();
110                         return $.ajatus.events.named_lock_pool.count('block_renderer') == 0;
111                     },
112                     interval: 400,
113                     safety_runs: 2
114                 },
115                 on_release: function() {
116                     _self._lock_finished();
117                 }
118             });
119             },
120             
121             _lock_finished: function() {
122             }
123     });
125     $.ajatus.renderer._scroll = function(settings, renderer) {
126         this.settings = $.extend({
127             items_per_page: 40,
128             preload_distance: 1000,
129             use_db: false,
130             db: {}
131         }, settings);
132         
133         this.render_lock = false;
134         
135         this.renderer = renderer;
136         
137             this.items = [];
138             this.done_items = [];
139             this.started = false;
140             
141             this.status_holder = null;
142             this.spacer = null;
143             
144             this.from_back_btn = false;
145             
146             this.scroller_id = $.ajatus.utils.generate_id();
147             this.mouse_state = 'up';
148             this.page_count = 1;
149             this.total_docs = 0;
150             
151             this.done_items = 0;
152     };    
153     $.extend($.ajatus.renderer._scroll.prototype, {
154             add_item: function(callback, args) {
155             var item = {
156                 callback: callback,
157                 args: args || []
158             };
159                 this.items.push(item);
160                 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
161             },
162             
163             items_added: function(total_docs) {
164                 if (! this.started) {
165                     this.start();
166                 }
167             
168             if (   this.settings.use_db
169                 && typeof total_docs != 'undefined')
170             {
171                 this.total_docs = total_docs;
172                 this.page_count = (total_docs / this.settings.items_per_page);
173             } else {
174                 this.page_count = (this.items.length / this.settings.items_per_page);
175             }
176             
177                 $('div.renderer_scroll_status_holder .total_pages').val(this.page_count);
178             },
179             
180             load_items: function(d) {
181                 if (   typeof d == 'undefined'
182                     || d == null)
183                 {
184                     var opts = {
185                     descending: true,
186                     count: 1
187                 };
188                 if (typeof this.settings.db.static != 'undefined') {
189                     var d = $.jqCouch.connection('view').get($.ajatus.preferences.client.content_database, this.settings.db.static, opts).rows[0];
190                 } else {
191                     var d = $.jqCouch.connection('view').temp($.ajatus.preferences.client.content_database, this.settings.db.temp, opts).rows[0];
192                 }
193                 }
195             var _self = this;
196             var on_success = function(data) {                
197                 $.each(data.rows, function(i,doc){
198                     var doc = new $.ajatus.document(doc);
199                     
200                     _self.renderer.render_item(doc, i);
201                 });
203                 return data;
204             };
206             var opts = {
207                 descending: true,
208                 startkey: d.key,
209                 startkey_docid: d._id || d.id,
210                 count: this.settings.items_per_page
211             };
212             if (typeof this.settings.db.static != 'undefined') {
213                 $.jqCouch.connection('view', on_success).get($.ajatus.preferences.client.content_database, this.settings.db.static, opts);
214             } else {
215                 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, this.settings.db.temp, opts);
216             }
217             },
218             
219             start: function() {
220                 if (this.started) {
221                     return;
222             }
223             
224             $.ajatus.events.named_lock_pool.clear('scroll_renderer');
225             
226                 if (this.status_holder == null) {
227                     this.status_holder = $('<div class="renderer_scroll_status_holder" />').appendTo($.ajatus.application_content_area).hide();
228                     $('<input type="hidden" name="scroll_id" class="scroll_id" />').val(this.scroller_id).appendTo(this.status_holder);
229                     $('<input type="hidden" name="scroll_total_pages" class="total_pages" />').val('1').appendTo(this.status_holder);
230                     $('<input type="hidden" name="scroll_history_index" class="history_index" />').val('').appendTo(this.status_holder);
231                     $('<input type="hidden" name="scroll_mouse_state" class="mouse_state" />').val('up').appendTo(this.status_holder);
232                 }
233                 
234                 if (this.spacer == null) {
235                     this.spacer = $('<div class="renderer_scroll_spacer" />').appendTo($.ajatus.application_content_area).css({
236                         position: 'absolute',
237                         top: '0px',
238                         left: '0px',
239                         visibility: 'hidden'
240                     });
241                 }
242                 
243                 var _self = this;
244                 $(document).mousedown(function(e){
245                 $('.mouse_state', _self.status_holder).val('down');
246                 _self.mouse_state = 'down';
247                 });
248                 $(document).mouseup(function(e){
249                     $('.mouse_state', _self.status_holder).val('up');
250                     _self.mouse_state = 'up';
251                 });
252                 
253                 $('.history_index', this.status_holder).val('1');
254                 
255                 this._create_lock();
256                 
257                 $.ajatus.views.on_change_actions.add('$.ajatus.events.named_lock_pool.clear("scroll_renderer");');
258                 
259                 this.started = true;
260             },
261             
262             _on_tick: function() {
263                 var _self = this;
264                 
265                 if (   !this.settings.use_db
266                     && this.items.length == 0)
267                 {
268                     $.ajatus.events.named_lock_pool.clear('scroll_renderer');
269                     return true;
270                 }
271                 
272             // console.log("_on_tick this.page_count: "+this.page_count);
273             // console.log("_on_tick history_index: "+$('.history_index', this.status_holder).val());
274             // console.log("_on_tick this.items.length: "+this.items.length);
275                 
276                 if (this.mouse_state == 'up' && $(document).height() - $(document).scrollTop() < this.settings.preload_distance) {                  
277                     if (this.settings.use_db) {
278                         var last_doc = null;
279                         $.each(this.items, function(i,n){
280                             last_doc = n.args[1];
281                             
282                         var functionToCall = eval(n.callback);
284                         if (functionToCall.apply(functionToCall, n.args)) {
285                                 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
286                                 _self.done_items += 1;
287                         }
288                         });
290                         this.items = [];
291                         if (this.done_items < this.total_docs) {
292                             this.load_items(last_doc);
293                         }
294                 } else {
295                         this.items = $.grep(this.items, function(n, i){
296                             if (i < _self.settings.items_per_page)
297                             {
298                             var functionToCall = eval(n.callback);
300                             if (functionToCall.apply(functionToCall, n.args)) {
301                                 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
302                             }
303                             } else {
304                                 return true;
305                             }
306                         });
307                 }
308                     
309                 var hi = $('.history_index', this.status_holder).val();
310                 $('.history_index', this.status_holder).val(parseInt(hi)+1);
311                 this.renderer.enable_sorting();
312                 }
313                 
314                 if (parseInt($('.history_index', this.status_holder).val()) > this.page_count && this.page_count != 1 && this.items.length <= 0) {
315                     $.ajatus.events.named_lock_pool.clear('scroll_renderer');
316                     return true;
317             }
318             },
319             
320             _create_lock: function() {
321                 var _self = this;
322             _self.render_lock = new $.ajatus.events.lock({
323                 disable_application: false,
324                 watch: {                    
325                     validate: function() {
326                         _self._on_tick();
327                         return $.ajatus.events.named_lock_pool.count('scroll_renderer') == 0;
328                     },
329                     interval: 200,
330                     safety_runs: 2,
331                     max_runs: false
332                 },
333                 on_release: function() {
334                     _self._lock_finished();
335                 }
336             });
337             },
338             
339             _lock_finished: function() {
340             }
341     });
343 })(jQuery);