Fixed hour reporting
[ajatus.git] / js / ajatus.core.js
blob97fe46c5d847cfd0686e5b92935d780193f22b74
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  */
16     TODO Tags are links
17     TODO Additional fields [widget, support]
18     TODO Skype widget -bergie
19     TODO Formatter service
20     TODO XMMP & Email formatter
21     TODO Gravatar widget
22     TODO Implement arhive view and action
23     TODO Implement file attachments
24     TODO Documentation (API)
25     TODO Auto-saving to forms (after 5 mins)
26     TODO Context syntax tags (me:, attn:, by:, for:)
29 if (typeof console == 'undefined') {
30     var console = {};
31     console.log = function(str){return;};
34 (function($){
35     $.ajatus = {};
36     $.ajatus.application_content_area = null;
37     
38     $.ajatus.version = [0, 0, 9];
39     
40     $.ajatus.active_type = null;
41     
42     $.ajatus.converter = {};
43     $.ajatus.converter.parseJSON = function (json_str) {
44         try
45         {
46             return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
47                     json_str.replace(/"(\\.|[^"\\])*"/g, ''))) &&
48                 eval('(' + json_str + ')');
49         }
50         catch (e)
51         {
52             return false;
53         }
54     }
55     $.ajatus.converter.toJSON = function (item,item_type) {
56         var m = {
57                 '\b': '\\b',
58                 '\t': '\\t',
59                 '\n': '\\n',
60                 '\f': '\\f',
61                 '\r': '\\r',
62                 '"' : '\\"',
63                 '\\': '\\\\'
64             },
65             s = {
66                 arr: function (x) {
67                     var a = ['['], b, f, i, l = x.length, v;
68                     for (i = 0; i < l; i += 1) {
69                         v = x[i];
70                         v = conv(v);
71                         if (typeof v == 'string') {
72                             if (b) {
73                                 a[a.length] = ',';
74                             }
75                             a[a.length] = v;
76                             b = true;
77                         }
78                     }
79                     a[a.length] = ']';
80                     return a.join('');
81                 },
82                 bool: function (x) {
83                     return String(x);
84                 },
85                 nul: function (x) {
86                     return "null";
87                 },
88                 num: function (x) {
89                     return isFinite(x) ? String(x) : 'null';
90                 },
91                 obj: function (x) {
92                     if (x) {
93                         if (x instanceof Array) {
94                             return s.arr(x);
95                         }
96                         var a = ['{'], b, f, i, v;
97                         for (i in x) {
98                             v = x[i];
99                             v = conv(v);
100                             if (typeof v == 'string') {
101                                 if (b) {
102                                     a[a.length] = ',';
103                                 }
104                                 a.push(s.str(i), ':', v);
105                                 b = true;
106                             }
107                         }
108                         a[a.length] = '}';
109                         return a.join('');
110                     }
111                     return 'null';
112                 },
113                 str: function (x) {
114                     if (/["\\\x00-\x1f]/.test(x)) {
115                         x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
116                             var c = m[b];
117                             if (c) {
118                                 return c;
119                             }
120                             c = b.charCodeAt();
121                             return '\\u00' +
122                                 Math.floor(c / 16).toString(16) +
123                                 (c % 16).toString(16);
124                         });
125                     }
126                     return '"' + x + '"';
127                 }
128             };
129             conv = function (x) {
130                 var itemtype = typeof x;
131                 switch(itemtype) {
132                         case "array":
133                           return s.arr(x);
134                           break;
135                         case "object":
136                           return s.obj(x);
137                           break;
138                         case "string":
139                           return s.str(x);
140                           break;
141                         case "number":
142                           return s.num(x);
143                           break;
144                         case "null":
145                           return s.nul(x);
146                           break;
147                         case "boolean":
148                           return s.bool(x);
149                           break;
150                 }
151             }
153         var itemtype = item_type || typeof item;
154         switch(itemtype) {
155                 case "array":
156                   return s.arr(item);
157                   break;
158                 case "object":
159                   return s.obj(item);
160                   break;
161                 case "string":
162                   return s.str(item);
163                   break;
164                 case "number":
165                   return s.num(item);
166                   break;
167                 case "null":
168                   return s.nul(item);
169                   break;
170                 case "boolean":
171                   return s.bool(item);
172                   break;                                
173                 default:
174                   throw("Unknown type for $.ajatus.converter.toJSON");
175                 }
176     }
177     
178     $.ajatus.formatter = {};
179     $.ajatus.formatter.date = {};
180     $.ajatus.formatter.date.fix_length = function(number){
181         return ((number < 10) ? '0' : '') + number;
182     };
183     $.ajatus.formatter.date.is_iso8601 = function(value) {
184         if (typeof(value) != 'string')
185         {
186             return false;
187         }
188         var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
189         var isod = value.match(new RegExp(regexp));
190         if (isod[10])
191         {
192             return true;
193         }
194         return false;
195     };
196     $.ajatus.formatter.date.js_to_iso8601 = function(date) {
197         var str = "";
198         str += date.getFullYear();
199         str += "-" + $.ajatus.formatter.date.fix_length(date.getMonth() + 1);
200         str += "-" + $.ajatus.formatter.date.fix_length(date.getDate());
201         str += "T" + $.ajatus.formatter.date.fix_length(date.getHours());
202         str += ":" + $.ajatus.formatter.date.fix_length(date.getMinutes());
203         str += ":" + $.ajatus.formatter.date.fix_length(date.getSeconds());
204         //str += 'Z';
205         
206         return str;
207     };
208     $.ajatus.formatter.date.iso8601_to_js = function(iso_date) {
209         var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
210         var isod = iso_date.match(new RegExp(regexp));
211         
212         if (   !isod
213             || isod.length < 11)
214         {
215             return new Date();
216         }
217         
218         var date = new Date(isod[1], 0, 1);
219         date.setMonth(isod[3] - 1);
220         date.setDate(isod[5]);
221         date.setHours(isod[7]);
222         date.setMinutes(isod[8]);
223         date.setSeconds(isod[10]);
224         
225         return date;
226     };
227     $.ajatus.formatter.date.caldate_to_iso8601 = function(caldate, format, caltime, time_format) {
228         
229         var format = format || "MDY/";
230         var time_format = time_format || "HMS:";
231         
232         var cdparts = caldate.split(format.charAt(3));
233         var fparts = format.split("");
234         var date = new Date();
235         
236         $.each(cdparts, function(i,v){
237             v = Number(v);
238             if (fparts[i] == 'M') {
239                 date.setMonth(v-1);
240             }
241             if (fparts[i] == 'D') {
242                 date.setDate(v);
243             }
244             if (fparts[i] == 'Y') {
245                 date.setFullYear(v);
246             }
247         });
248         
249         if (caltime)
250         {
251             var time_separator = time_format.charAt(time_format.length - 1);
252             var tfparts = time_format.split("");
253             var ctparts = caltime.split(time_separator);
255             $.each(ctparts, function(i,v){
256                 v = Number(v);
257                 if (tfparts[i] == 'H') {
258                     date.setHours(v);
259                 }
260                 if (tfparts[i] == 'M') {
261                     date.setMinutes(v);
262                 }
263                 if (tfparts[i] == 'S') {
264                     date.setSeconds(v);
265                 }
266             });
267         }
268         else
269         {
270             date.setHours(0);
271             date.setMinutes(0);
272             date.setSeconds(0);
273         }
274                 
275         return $.ajatus.formatter.date.js_to_iso8601(date);
276     };
277     $.ajatus.formatter.date.iso8601_to_caldate = function(iso_date, format) {
278         var format = format || "MDY/";
279         
280         var date = $.ajatus.formatter.date.iso8601_to_js(iso_date);
281         var date_str = '';
282         
283         var day = date.getDate();
284         var month = date.getMonth();
285         var year = date.getFullYear();
286         month++;
287         
288                 for (var i = 0; i < 3; i++) {
289                         date_str += format.charAt(3) +
290                         (format.charAt(i) == 'D' ? $.ajatus.formatter.date.fix_length(day) :
291                         (format.charAt(i) == 'M' ? $.ajatus.formatter.date.fix_length(month) :
292                         (format.charAt(i) == 'Y' ? year : '?')));
293                 }
294                 date_str = date_str.substring(format.charAt(3) ? 1 : 0);
295                 
296                 return date_str;
297     };
298     $.ajatus.formatter.date.iso8601_to_caltime = function(iso_date, format) {
299         var format = format || "HMS:";
300         
301         var date = $.ajatus.formatter.date.iso8601_to_js(iso_date);
302         var time_str = '';
303         
304         var idparts = {
305             H: $.ajatus.formatter.date.fix_length(date.getHours()),
306             M: $.ajatus.formatter.date.fix_length(date.getMinutes()),
307             S: $.ajatus.formatter.date.fix_length(date.getSeconds())
308         };
309                 var separator = format.charAt(format.length - 1);
310         var fparts = format.split("");
311         var utt1_parts = user_test_time1.split(utt1_seprt);
313         $.each(utt1_parts, function(i,v){
314         });
315         
316         $.each(fparts, function(i,k){
317             time_str += fparts[k] + separator;
318         });
319         time_str = time_str.substring(1);
320                 
321                 return time_str;
322     };
323     
324     $.ajatus.tags = {
325         cache: [],
326         active: ''
327     };
328     $.extend($.ajatus.tags, {
329         init: function() {
330             $.ajatus.events.lock_pool.increase();
331             $.ajatus.tags.load();
332             $.ajatus.events.lock_pool.decrease();
333             $.ajatus.tags.update_app_tag_list();
334         },
335         load: function() {
336             var jqcouch = $.jqcouch.doc;
337             jqcouch.on_success = function(data, caller)
338             {
339                 if (data.total_rows <= 0) {
340                     return false;
341                 }
343                 $.each(data.rows, function(i,n){
344                     $.ajatus.tags.cache.push(n.id);
345                 });
346             };
348             jqcouch.get_all($.ajatus.preferences.client.tags_database);
349         },
350         update_cache: function() {
351             $.ajatus.tags.update_app_tag_list();
352             if ($.ajatus.tags.active != '') {
353                 $.ajatus.tags.set_active($.ajatus.tags.active);
354             }
355         },
356         set_active: function(tag) {
357             var select = $('#application-tags select');
358             $('option', select).each(function(i,o){
359                 if (o.value == tag) {
360                     o.selected = 'selected';
361                 }
362             });
363             $.ajatus.tags.active = tag;
364         },
365         update_app_tag_list: function() {
366             var select = $('#application-tags select');
367             select.html('');
368             $.each($.ajatus.tags.cache, function(i){
369                 var opt = $('<option>'+this+'</option>').attr({
370                     value: this
371                 });
372                 opt.appendTo(select);
373             });
374             var def = $('<option />').attr({
375                 value: '',
376                 selected: 'selected'
377             }).html($.ajatus.i10n.get('Global Tag') + '&nbsp;');
378             def.prependTo(select);
379             select.bind('change', function(e){
380                 $.ajatus.tags.set_active(e.currentTarget.value);
381             });
382         },
383         search: function(query, max_res) {
384             // console.log("Search tags with: "+query);
385             var results = [];
386             
387             if (typeof max_res != 'number') {
388                 max_res = 20;
389             }
390             
391             query = $.ajatus.tags._prepare_query(query);
392             
393             var jqcv = $.jqcouch.view;
394             jqcv.on_success = function(data, caller) {
395                 if (data.total_rows == 0) {
396                     return [];
397                 }
398                 
399                 $.each(data.rows, function(i,n){
400                     var doc = new $.ajatus.document(n);
401                     results.push(doc);
402                 });
403             };
404             
405             var rel_view = 'if (doc.value.title.val.match(/\\\\b'+query+'(.*?)\\\\b/) ';
406             rel_view += '&& doc.value.metadata.archived.val == "" && doc.value.metadata.deleted.val != 1){';
407             rel_view += 'map( doc._id, doc.value );}';
408             jqcv.temp(
409                 $.ajatus.preferences.client.tags_database, {
410                     count: max_res
411                 },
412                 "$.ajatus.views.generate('"+rel_view+"')"
413             );
414             
415             // console.log('results: ');
416             // console.log(results);
417             
418             return results;                        
419         },
420         search_cache: function(query) {
421             // console.log("Search tags cache with: "+query);
422             var results = [];
423             query = $.ajatus.tags._prepare_query(query);
424             var re = new RegExp("\\b"+query+"(.*?)\\b");
425             
426             $.each($.ajatus.tags.cache, function(i, tag){
427                 if (tag.toString().match(re)) {
428                     results.push(tag);
429                 }
430             });
432             // console.log('results: ');
433             // console.log(results);
434             
435             return results;
436         },
437         _prepare_query: function(query) {
438             query = query.replace(/[\(|\)|\.|\?|\;|\/]/, '');
439             query = query.replace('\\', '');
440             query = query.replace('*', '(.*?)');
441             
442             return query;
443         },
444         get: function(tag, rev) {
445             var result = false;
446             
447             var jqcouch = $.jqcouch.doc;
448             jqcouch.on_success = function(data, caller) {
449                 var doc = new $.ajatus.document(data);
450                 result = doc;
451             };
453             var args = {};
454             if (typeof rev != 'undefined') {
455                 args['_rev'] = rev;
456             }
458             jqcouch.get($.ajatus.preferences.client.tags_database + '/' + tag, args);
459             
460             return result;
461         },
462         exists: function(tag) {
463             var found = $.inArray(tag, $.ajatus.tags.cache);
464             if (found != -1) {
465                 return true;
466             }
467             return false;
468         },
469         create: function(name, jqc) {
470             
471             if ($.ajatus.tags.exists(name)) {
472                 return false;
473             }
474             
475             if (typeof jqc == 'undefined') {
476                 var jqc = $.jqcouch.doc;
477             }
478             
479             var tag = {
480                 _id: name,
481                 value: {
482                     _type: 'tag',
483                     title: {
484                         val: name,
485                         widget: {
486                             name: 'text',
487                             config: {}
488                         }
489                     }
490                 }
491             };
492             tag = new $.ajatus.document(tag);
493             
494             var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
495             var new_metadata = {
496                 created: now,
497                 creator: $.ajatus.preferences.local.user.name,
498                 revised: now,
499                 revisor: $.ajatus.preferences.local.user.name
500             };
501             tag = $.ajatus.document.modify_metadata(tag, new_metadata);
502             jqc.save($.ajatus.preferences.client.tags_database, tag);
503             
504             return true;
505         },
506         remove: function(tag, jqc) {
507             if (typeof jqc == 'undefined') {
508                 var jqc = $.jqcouch.doc;
509                 jqc.on_success = function(data, caller) {
510                     var msg = $.ajatus.elements.messages.create(
511                         $.ajatus.i10n.get('Object deleted'),
512                         $.ajatus.i10n.get('Tag %s removed from Ajatus.', [tag])
513                     );
514                 };
515             }
517             jqc.del($.ajatus.preferences.client.tags_database + '/' + tag);
518         },
519         related: function(tags, skip_docs) {
520             var related = [];
521             var jqcv = $.jqcouch.view;
522             if (typeof skip_docs != 'object') {
523                 var skip_docs = [];
524             }
525             jqcv.on_success = function(data, caller) {
526                 if (data.total_rows == 0) {
527                     return;
528                 }
529                 
530                 $.each(data.rows, function(i,n){
531                     if ($.ajatus.utils.array.has_match(tags, n.value.tags.val)) {
532                         if (skip_docs.length > 0) {
533                             if ($.inArray(n.id, skip_docs) == -1) {
534                                 var doc = new $.ajatus.document(n);
535                                 related.push(doc);
536                             }
537                         } else {
538                             var doc = new $.ajatus.document(n);
539                             related.push(doc);
540                         }
541                     }
542                 });
543             };
544             
545             var rel_view = 'if (typeof(doc.value.tags) != "undefined" && doc.value.tags.val.length > 0 ';
546             rel_view += '&& doc.value.metadata.archived.val == "" && doc.value.metadata.deleted.val != 1){';
547             rel_view += 'map( doc.value._type, {"_id": doc._id, "_rev": doc._rev, "_type": doc.value._type,';
548             rel_view += '"title": doc.value.title,';
549             
550             $.each($.ajatus.preferences.client.content_types, function(key,type){
551                 if (type['title_item']) {
552                     $.each(type['title_item'], function(i,part){
553                         if (type.schema[part]) {
554                             rel_view += '"'+part+'": doc.value.'+part+',';
555                         }
556                     });
557                 }
558             });
560             rel_view += '"tags": doc.value.tags })}';
561             
562             jqcv.temp(
563                 $.ajatus.preferences.client.content_database, {},
564                 "$.ajatus.views.generate('"+rel_view+"')"
565             );
566             
567             return related;
568         }
569     });
570     
571     $.ajatus.tabs = {};
572     $.ajatus.tabs.set_active_by_hash = function(hash) {
573         // console.log('set_active_by_hash: '+hash);
574         $.ajatus.views.on_change(hash);
575         
576         var views_tab_holder = $('#tabs-views ul');
577         var app_tab_holder = $('#tabs-application ul');
578         
579         var selected_tab = jQuery('li a[@href$="' + hash + '"]', views_tab_holder).parent();
580         if (selected_tab[0] != undefined) {
581             // console.log('views selected_tab:');
582             // console.log(selected_tab);
583             jQuery('li', views_tab_holder).removeClass('tabs-selected').blur();
584             jQuery('li', app_tab_holder).removeClass('tabs-selected').blur();
585             selected_tab.addClass('tabs-selected').focus();
586         } else {
587             selected_tab = jQuery('li a[@href$="' + hash + '"]', app_tab_holder).parent();
588             // console.log('app selected_tab:');
589             // console.log(selected_tab);
590             if (selected_tab[0] != undefined) {
591                 jQuery('li', views_tab_holder).removeClass('tabs-selected').blur();
592                 jQuery('li', app_tab_holder).removeClass('tabs-selected').blur();
593                 selected_tab.addClass('tabs-selected').focus();
594             } else {
595                 jQuery('li', views_tab_holder).removeClass('tabs-selected').blur();
596                 jQuery('li', app_tab_holder).removeClass('tabs-selected').blur();                
597             }            
598         }
599     };
600     $.ajatus.tabs.on_click = function(e) {
601         var trgt = target(e);
602         jQuery("li", parent(e)).removeClass("tabs-selected").index(trgt);
603         jQuery(trgt).addClass("tabs-selected");
604         
605         var new_hash = jQuery('a', trgt)[0].hash;
606         location.hash = new_hash;
607         $.ajatus.history.update(new_hash);
608         $.ajatus.views.on_change(new_hash);
609         
610         function parent(event) {
611                 var element = event.target;
612                 if (element)
613                 {
614                     if (element.tagName == "UL")
615                     {
616                         return element;
617                     }
619                         while(element.tagName != "UL")
620                         {
621                                 element = element.parentNode;
622                         }
623                 }
624                 return element;
625         };
627         function target(event) {
628                 var element = event.target;
629                 if (element)
630                 {
631                     if (element.tagName == "UL")
632                     {
633                         element = jQuery(element).find('li').eq(0);
634                         return element;
635                     }
637                         while(element.tagName != "LI")
638                         {
639                                 element = element.parentNode;
640                         }
641                 }
642                 return element;
643         };
644     };
646     $.jqcouch.on_error = function(request,caller) {
647         $.ajatus.ajax_error(request, caller);
648     };
649     $.jqcouch.on_success = function(data,caller) {
650         $.ajatus.ajax_success(data, caller);
651     };
652         
653         $.ajatus.security_pass = function() {
654             try {
655             netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead UniversalBrowserWrite UniversalFileRead");
656         } catch (e) {
657             alert("Permission UniversalBrowserRead denied. with error "+e);
658         }
659         };
660         
661         $.ajatus.init = function(element, options) {
662             //$.ajatus.security_pass();
663             
664             var application_element = $(element);
665             $.ajatus.application_element = application_element;
666             $.ajatus.application_content_area = $('#middle #content', $.ajatus.application_element);
667             $.ajatus.application_dynamic_elements = $('#dynamic-elements', $.ajatus.application_element);
668         
669         $.ajatus.preferences.client.server_url = window.location.protocol + '//' + document.hostname + (window.location.port != '' ? ':'+window.location.port : '') + '/';
670         
671             $.ajatus.preferences.client = $.extend({}, $.ajatus.preferences.client_defaults, options);
672             $.jqcouch.server_url = $.ajatus.preferences.client.server_url;          
673             
674             var a_db_suffix = $.ajatus.preferences.client.application_database_prefix != '' ? '_db' : 'db';
675             $.ajatus.preferences.client.application_database = 'ajatus_' + $.ajatus.preferences.client.application_database_prefix + a_db_suffix;
676             $.ajatus.preferences.client.content_database = $.ajatus.preferences.client.application_database + '_content';
677             $.ajatus.preferences.client.tags_database = $.ajatus.preferences.client.application_database + '_tags';
678                     
679         $.ajaxSetup({
680             type: "GET",
681             url: $.ajatus.preferences.client.server_url,
682             global: false,
683             cache: false,
684             dataType: "json"
685         });
686         
687         $('#top #new-item-button', application_element).bind('click', function(e){
688             $.ajatus.views.system.create.render($.ajatus.active_type);
689         });
690         
691         $.ajatus.installer.is_installed();        
692         if ($.ajatus.installer.installed == false) {
693             var status = $.ajatus.installer.install();
694             $.ajatus.debug("Installer finished with status: "+status);            
695         } else {
696             $.ajatus.start();
697         }            
698         // else
699         // {
700         //     $.ajatus.installer.uninstall();
701         // }
702     };
703     
704     $.ajatus.start = function() {        
705             $.ajatus.events.lock_pool.increase();
706             $.ajatus.locker = new $.ajatus.events.lock({
707                 watch: {
708                     validate: function(){return $.ajatus.events.lock_pool.count == 0;},
709                     interval: 200,
710                 safety_runs: 0
711                 },
712                 on_release: function(){
713                     $.ajatus.application_element.addClass('ajatus_initialized');
715                 // var trs = $.ajatus.i10n.get('Test %s', ['one']);
716                 // console.log("$.ajatus.i10n.get('Test %s', ['one']): "+trs);
717                 // var pts = $.ajatus.i10n.get('%d comment', [2], 'comment');
718                 // console.log("$.ajatus.i10n.get('%d comment', [2], 'comment'): "+pts);
719                 // var pts = $.ajatus.i10n.get('%d comment in %d doc', [1, 3]);
720                 // console.log("$.ajatus.i10n.get('%d comment in %d doc', [1, 3]): "+pts);
721                 // var pts = $.ajatus.i10n.get('%d comment in %d doc', [2, 1]);
722                 // console.log("$.ajatus.i10n.get('%d comment in %d doc', [2, 1]): "+pts);
723                                                     
724                     var show_frontpage = true;
725                 if (   $.ajatus.history
726                     && $.ajatus.history.enabled)
727                 {
728                      show_frontpage = !$.ajatus.history.check();
729                 }
730                 
731                 if (show_frontpage) {
732                     $.ajatus.views.system.frontpage.render();                    
733                 }
734                 }
735             });
736             
737         var preference_loader = new $.ajatus.preferences.loader;
738         preference_loader.load();
740         if ($.ajatus.preferences.client.language == null) {
741             $.ajatus.preferences.client.language = $.ajatus.preferences.local.localization.language;
742         }
743         $.ajatus.i10n.init($.ajatus.preferences.client.language);
745         $('#middle', $.ajatus.application_element).css({
746             'min-height': $.ajatus.preferences.local.layout.content_height
747         });
748             
749             $('#header .app_version', $.ajatus.application_element).html($.ajatus.version.join('.'));
750             $('#header .tagline', $.ajatus.application_element).html($.ajatus.i10n.get('Distributed CRM'));
752         $.ajatus.extensions.init({
753             on_ready: function(){                
754                 $.ajatus.tags.init();
755                 $.ajatus.widgets.init();
756                 $.ajatus.views.init();
757                 
758                 $.ajatus.active_type = $.ajatus.preferences.client.content_types['note'];
760                 // Release the first lock
761                 $.ajatus.events.lock_pool.decrease();
762             }
763         });
764         
765         $.ajatus.elements.messages.set_holder();
766         
767         window.onbeforeunload = function() {
768             if ($.ajatus.events.named_lock_pool.count('unsaved') > 0) {
769                 return "Reason: You have unsaved changes.";                
770             }
771         }
772     }
773     
774     $.ajatus.ajax_error = function(request, caller) {
775         $.ajatus.debug("Ajax error request.status: "+request.status);
776         if (typeof caller != 'undefined') {
777             $.ajatus.debug("Caller method: "+caller.method);
778             $.ajatus.debug("Caller action:");
779             $.ajatus.debug(caller.action);
780             if (caller.args != undefined) {
781                 $.ajatus.debug("Caller args:");
782                 $.ajatus.debug(caller.args);
783             }
784         }
785         
786         if (request.responseText != '') {
787             var response = eval("(" + request.responseText + ")");
788             $.ajatus.debug('response.error.reason: '+response.error.reason);            
789         }
790     };
791     $.ajatus.ajax_success = function(data, caller) {
792         $.ajatus.debug("Ajax success");
793         if (typeof caller != 'undefined')
794         {
795             $.ajatus.debug("Caller method: "+caller.method);
796             $.ajatus.debug("Caller action: "+caller.action);
797             if (typeof caller.args != 'undefined') {
798                 $.ajatus.debug("Caller args: "+caller.args);
799             }
800         }
801         $.ajatus.debug("data: "+data);
802         
803         return false;
804     };
805     
806     $.ajatus.debug = function(msg, title, type) {
807         if ($.ajatus.preferences.client.debug == true)
808         {
809             console.log(msg);
810         }
811     };
812         
813     $.fn.initialize_ajatus = function(options) {
814                 if (!$(this).is('.ajatus_initialized')) {
815                     return new $.ajatus.init(this, options);
816             }
817         };
818         
819 })(jQuery);
821 function initialize_ajatus() {
822     jQuery('#application').initialize_ajatus({
823         debug: true,
824         //language: 'fi_FI',
825         custom_views: [
826             'test'
827         ],
828         application_url: '/_utils/ajatus/', // '/_utils/ajatus_dev/'
829         application_database_prefix: '' // 'dev'
830     });
833 jQuery(document).ready(function() {
834     try{
835         initialize_ajatus();        
836     } catch(e) {
837         alert("could not initialize ajatus! Reason: "+e);
838     }