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: 1000,
133 this.render_lock = false;
135 this.renderer = renderer;
138 this.done_items = [];
139 this.started = false;
141 this.status_holder = null;
144 this.from_back_btn = false;
146 this.scroller_id = $.ajatus.utils.generate_id();
147 this.mouse_state = 'up';
153 $.extend($.ajatus.renderer._scroll.prototype, {
154 add_item: function(callback, args) {
159 this.items.push(item);
160 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
163 items_added: function(total_docs) {
164 if (! this.started) {
168 if ( this.settings.use_db
169 && typeof total_docs != 'undefined')
171 this.total_docs = total_docs;
172 this.page_count = (total_docs / this.settings.items_per_page);
174 this.page_count = (this.items.length / this.settings.items_per_page);
177 $('div.renderer_scroll_status_holder .total_pages').val(this.page_count);
180 load_items: function(d) {
181 if ( typeof d == 'undefined'
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];
191 var d = $.jqCouch.connection('view').temp($.ajatus.preferences.client.content_database, this.settings.db.temp, opts).rows[0];
196 var on_success = function(data) {
197 $.each(data.rows, function(i,doc){
198 var doc = new $.ajatus.document(doc);
200 _self.renderer.render_item(doc, i);
209 startkey_docid: d._id || d.id,
210 count: this.settings.items_per_page
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);
215 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, this.settings.db.temp, opts);
224 $.ajatus.events.named_lock_pool.clear('scroll_renderer');
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);
234 if (this.spacer == null) {
235 this.spacer = $('<div class="renderer_scroll_spacer" />').appendTo($.ajatus.application_content_area).css({
236 position: 'absolute',
244 $(document).mousedown(function(e){
245 $('.mouse_state', _self.status_holder).val('down');
246 _self.mouse_state = 'down';
248 $(document).mouseup(function(e){
249 $('.mouse_state', _self.status_holder).val('up');
250 _self.mouse_state = 'up';
253 $('.history_index', this.status_holder).val('1');
257 $.ajatus.views.on_change_actions.add('$.ajatus.events.named_lock_pool.clear("scroll_renderer");');
262 _on_tick: function() {
265 if ( !this.settings.use_db
266 && this.items.length == 0)
268 $.ajatus.events.named_lock_pool.clear('scroll_renderer');
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);
276 if (this.mouse_state == 'up' && $(document).height() - $(document).scrollTop() < this.settings.preload_distance) {
277 if (this.settings.use_db) {
279 $.each(this.items, function(i,n){
280 last_doc = n.args[1];
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;
291 if (this.done_items < this.total_docs) {
292 this.load_items(last_doc);
295 this.items = $.grep(this.items, function(n, i){
296 if (i < _self.settings.items_per_page)
298 var functionToCall = eval(n.callback);
300 if (functionToCall.apply(functionToCall, n.args)) {
301 $.ajatus.events.named_lock_pool.decrease('scroll_renderer');
309 var hi = $('.history_index', this.status_holder).val();
310 $('.history_index', this.status_holder).val(parseInt(hi)+1);
311 this.renderer.enable_sorting();
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');
320 _create_lock: function() {
322 _self.render_lock = new $.ajatus.events.lock({
323 disable_application: false,
325 validate: function() {
327 return $.ajatus.events.named_lock_pool.count('scroll_renderer') == 0;
333 on_release: function() {
334 _self._lock_finished();
339 _lock_finished: function() {