4 * Ajatus - Distributed CRM
5 * @requires jQuery v1.2.1
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
16 $.ajatus = $.ajatus || {};
18 $.ajatus.renderer_defaults = {
21 max_item_before_pool: 20,
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);
35 $.extend($.ajatus.renderer.prototype, {
36 add_item: function(callback, args) {
37 this.handler.add_item(callback, args);
40 items_added: function(doc_count) {
41 if (typeof this.handler.items_added == 'function') {
42 this.handler.items_added(doc_count);
51 $.ajatus.renderer._block = function(settings, renderer) {
52 this.settings = $.extend({
54 max_item_before_pool: 20
56 this.render_lock = false;
60 this.renderer = renderer;
62 $.extend($.ajatus.renderer._block.prototype, {
63 add_item: function(callback, args) {
68 this.items.push(item);
69 $.ajatus.events.named_lock_pool.increase('block_renderer');
71 if (! this.render_lock) {
80 _on_tick: function() {
82 if (this.items.length == 0)
84 $.ajatus.events.named_lock_pool.clear('block_renderer')
87 this.items = $.grep(this.items, function(n, i){
88 if (i < _self.settings.tick_limit)
90 var functionToCall = eval(n.callback);
92 if (functionToCall.apply(functionToCall, n.args)) {
93 _self.done_items.push(i);
94 $.ajatus.events.named_lock_pool.decrease('block_renderer');
100 this.renderer.enable_sorting();
103 _create_lock: function() {
105 _self.render_lock = new $.ajatus.events.lock({
106 disable_application: false,
108 validate: function() {
110 return $.ajatus.events.named_lock_pool.count('block_renderer') == 0;
115 on_release: function() {
116 _self._lock_finished();
121 _lock_finished: function() {
125 $.ajatus.renderer._scroll = function(settings, renderer) {
126 this.settings = $.extend({
128 preload_distance: 900,
131 render_item_after_load: true
134 this.render_lock = false;
136 this.renderer = renderer;
139 this.done_items = [];
140 this.started = false;
142 this.status_holder = null;
145 this.from_back_btn = false;
147 this.scroller_id = $.ajatus.utils.generate_id();
148 this.mouse_state = 'up';
154 this.indicator = new $.ajatus.elements.indicator();
156 $.extend($.ajatus.renderer._scroll.prototype, {
157 add_item: function() {
159 if (typeof arguments[0] == 'object')
165 if ( arguments.length >= 1
166 && typeof arguments[0] == 'string')
169 callback: arguments[0],
170 args: arguments[1] || []
175 this.items.push(item);
176 $.ajatus.events.named_lock_pool.increase('scroll_renderer');
179 items_added: function(total_docs) {
180 if (! this.started) {
184 if ( this.settings.use_db
185 && typeof total_docs != 'undefined')
187 this.total_docs = total_docs;
188 this.page_count = (total_docs / this.settings.items_per_page);
190 this.page_count = (this.items.length / this.settings.items_per_page);
193 $('div.renderer_scroll_status_holder .total_pages').val(this.page_count);
196 load_items: function(d) {
197 // console.log("load_items: ");
200 this.indicator.show();
202 if ( typeof d == 'undefined'
209 if (typeof this.settings.db.static != 'undefined') {
210 var d = $.jqCouch.connection('view').get($.ajatus.preferences.client.content_database, this.settings.db.static, opts).rows[0];
212 var d = $.jqCouch.connection('view').temp($.ajatus.preferences.client.content_database, this.settings.db.temp, opts).rows[0];
217 var on_success = function(data) {
218 $.each(data.rows, function(i,doc){
219 var doc = new $.ajatus.document(doc);
220 if (_self.settings.render_item_after_load) {
221 _self.renderer.render_item(doc, i);
227 _self.indicator.hide();
234 startkey: '"'+d.key+'"',
235 startkey_docid: d._id || d.id,
236 count: this.settings.items_per_page,
239 if (typeof this.settings.db.static != 'undefined') {
240 $.jqCouch.connection('view', on_success).get($.ajatus.preferences.client.content_database, this.settings.db.static, opts);
242 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, this.settings.db.temp, opts);
251 $.ajatus.events.named_lock_pool.clear('scroll_renderer');
253 if (this.status_holder == null) {
254 this.status_holder = $('<div class="renderer_scroll_status_holder" />').appendTo($.ajatus.application_content_area).hide();
255 $('<input type="hidden" name="scroll_id" class="scroll_id" />').val(this.scroller_id).appendTo(this.status_holder);
256 $('<input type="hidden" name="scroll_total_pages" class="total_pages" />').val('1').appendTo(this.status_holder);
257 $('<input type="hidden" name="scroll_history_index" class="history_index" />').val('').appendTo(this.status_holder);
258 $('<input type="hidden" name="scroll_mouse_state" class="mouse_state" />').val('up').appendTo(this.status_holder);
261 if (this.spacer == null) {
262 this.spacer = $('<div class="renderer_scroll_spacer" />').appendTo($.ajatus.application_content_area).css({
263 position: 'absolute',
271 $(document).mousedown(function(e){
272 $('.mouse_state', _self.status_holder).val('down');
273 _self.mouse_state = 'down';
275 $(document).mouseup(function(e){
276 $('.mouse_state', _self.status_holder).val('up');
277 _self.mouse_state = 'up';
280 $('.history_index', this.status_holder).val('1');
284 $.ajatus.views.on_change_actions.add('$.ajatus.events.named_lock_pool.clear("scroll_renderer");');
289 _on_tick: function() {
292 if ( !this.settings.use_db
293 && this.items.length == 0)
295 $.ajatus.events.named_lock_pool.clear('scroll_renderer');
299 // console.log("this.total_docs: "+this.total_docs);
300 // console.log("this.done_items: "+this.done_items);
301 // console.log("_on_tick this.page_count: "+this.page_count);
302 // console.log("_on_tick history_index: "+$('.history_index', this.status_holder).val());
303 // console.log("_on_tick this.items.length: "+this.items.length);
305 if (this.mouse_state == 'up' && $(document).height() - $(document).scrollTop() < this.settings.preload_distance) {
306 if (this.settings.use_db) {
307 this.indicator.show();
310 $.each(this.items, function(i,n){
311 if (typeof n['doc'] != 'undefined') {
314 if (_self.renderer.render_item(n.doc, i)) {
315 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
316 _self.done_items += 1;
322 last_doc = n.args[1];
324 var functionToCall = eval(n.callback);
326 if (functionToCall.apply(functionToCall, n.args)) {
327 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
328 _self.done_items += 1;
333 if (this.done_items < this.total_docs) {
334 this.load_items(last_doc);
337 this.indicator.show();
339 this.items = $.grep(this.items, function(n, i){
340 if (i < _self.settings.items_per_page)
342 if (typeof n['doc'] != 'undefined') {
343 if (_self.renderer.render_item(n.doc, i)) {
344 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
350 var functionToCall = eval(n.callback);
352 if (functionToCall.apply(functionToCall, n.args)) {
353 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
360 this.indicator.hide();
363 var hi = $('.history_index', this.status_holder).val();
364 $('.history_index', this.status_holder).val(parseInt(hi)+1);
365 this.renderer.enable_sorting();
368 if (parseInt($('.history_index', this.status_holder).val()) > this.page_count && this.page_count != 1 && this.items.length <= 0) {
369 $.ajatus.events.named_lock_pool.clear('scroll_renderer');
374 _create_lock: function() {
376 $.ajatus.events.named_lock_pool.increase('scroll_renderer');
378 _self.render_lock = new $.ajatus.events.lock({
379 disable_application: false,
381 validate: function() {
383 return $.ajatus.events.named_lock_pool.count('scroll_renderer') == 0;
389 on_release: function() {
390 _self._lock_finished();
395 _lock_finished: function() {
396 this.indicator.close();