Added license header
[ajatus.git] / js / ajatus.widgets.js
blobf042cf0edd972ae31a4b04557731f8e38f22960a
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     $.ajatus.widgets = $.ajatus.widgets || {};
18         
19     $.ajatus.widgets.core = {
20         available: [
21             'text',
22             'wiki',
23             'tags',
24             'date',
25             'boolean',
26             'integer',
27             'tag',
28             'selection'
29         ]
30     };
31     $.ajatus.widgets.loaded_widgets = [];
32             
33     $.ajatus.widget = function(widget, config)
34     {
35         if (typeof($.ajatus.widgets[widget]) == 'undefined') {
36             $.ajatus.debug("widget '"+widget+"' not installed! Using text widget");
37             wdgt = $.ajatus.utils.object.clone($.ajatus.widgets.text);
38         } else {
39             wdgt = $.ajatus.utils.object.clone($.ajatus.widgets[widget]);
40         }
41         
42         if (typeof wdgt == 'undefined') {
43             throw("FATAL: Couldn't init widget "+widget);
44         }
45         
46         if (typeof config != 'undefined') {
47             wdgt.set_config(config);            
48         }
49         
50         if (typeof wdgt['required'] == 'undefined') {
51             wdgt.required = false;
52         }
53         if (typeof wdgt['validate'] == 'undefined') {
54             wdgt.validate = function(name, value) {
55                 if (   wdgt.required === true
56                     && value == '')
57                 {
58                     return {
59                         msg: $.ajatus.i10n.get("Field %s is required", [name])
60                     };
61                 }
63                 return true;
64             };
65         }
66         
67         if (typeof wdgt['has_data_changed'] == 'undefined') {
68             wdgt.has_data_changed = function(value, prev_value) {
69                 if ($.ajatus.utils.md5.encode(value) != $.ajatus.utils.md5.encode(prev_value)) {
70                     return true;
71                 }
72                 return false;
73             }
74         }
75         
76         return wdgt;
77     };
78     
79     $.ajatus.widgets.widget_loaded = function(wdgt, try_count) {
80         if (typeof try_count == 'undefined') {
81             var try_count = 0;
82         }
83         
84         $.ajatus.widgets[wdgt] = $.ajatus.widgets.core[wdgt];
85         
86         if (typeof $.ajatus.widgets[wdgt] != 'undefined') {
87             $.ajatus.widgets[wdgt].loaded();
88             $.ajatus.widgets.loaded_widgets.push(wdgt);
89             
90              $.ajatus.events.lock_pool.decrease();
91         } else {
92             try_count += 1;
93             if (try_count < 2) {
94                 setTimeout("$.ajatus.widgets.widget_loaded('"+wdgt+"', "+try_count+");", 200);
95             }
96         }
97     }
98     
99     $.ajatus.widgets.custom_widget_loaded = function(wdgt, try_count) {
100         if (typeof try_count == 'undefined') {
101             var try_count = 0;
102         }
103         
104         $.ajatus.widgets[wdgt] = $.ajatus.widgets.custom[wdgt];
105         
106         if (typeof $.ajatus.widgets[wdgt] != 'undefined') {
107             $.ajatus.widgets[wdgt].loaded();
108             $.ajatus.widgets.loaded_widgets.push(wdgt);            
109         } else {
110             try_count += 1;
111             if (try_count < 2) {
112                 setTimeout("$.ajatus.widgets.widget_loaded('"+wdgt+"', "+try_count+");", 200);
113             }
114         }
115         
116         $.ajatus.events.lock_pool.decrease();
117     }
118     
119     $.ajatus.widgets.init = function()
120     {
121         $.ajatus.widgets.loaded_widgets = new Array();
122         
123         if ($.browser.safari) {
124             $.ajatus.widgets.core.available = $.ajatus.widgets.core.available.reverse();
125         }
126         
127         $.each($.ajatus.widgets.core.available, function(i,cw){
128             if (   cw == ''
129                 || typeof $.ajatus.widgets[cw] != 'undefined')
130             {
131                 return;
132             }
133             
134             var widget_url = $.ajatus.preferences.client.application_url + 'js/widgets/'+cw+'.js';
135             
136             $.ajatus.events.lock_pool.increase();
137             
138             $.ajatus.utils.load_script(widget_url, "$.ajatus.widgets.widget_loaded", [cw]);
139         });
140         
141         // console.log("Loaded widgets:");
142         // console.log($.ajatus.widgets.loaded_widgets);
144         if ($.ajatus.preferences.client.custom_widgets.length > 0)
145         {
146             $.each($.ajatus.preferences.client.custom_widgets, function(i,cw){
147                 if (   cw == ''
148                     || typeof $.ajatus.widgets[cw] != 'undefined')
149                 {
150                     return;
151                 }
152                 
153                 var widget_url = $.ajatus.preferences.client.application_url + 'js/widgets/custom/'+cw+'.js';
154             
155                 $.ajatus.events.lock_pool.increase();
156                 
157                 $.ajatus.utils.load_script(widget_url, "$.ajatus.widgets.custom_widget_loaded", [cw]);
158             });
159         }
160     }
161     
162     $.ajatus.widgets.to_readonly = function(view_type, name, default_value, widget) {
163         var tpl = false;
164         
165         if (typeof widget['get_readonly_tpl'] == 'function') {
166             tpl = widget.get_readonly_tpl(view_type, name, default_value);
167         } else {
168             tpl = [
169                 'input', { type: 'hidden', name: 'widget['+name+':name]', value: widget.name }, '',
170                 'input', { type: 'hidden', name: 'widget['+name+':config]', value: $.ajatus.converter.toJSON(widget.settings) }, '',
171                 'input', { type: 'hidden', name: 'widget['+name+':prev_val]', value: $.ajatus.converter.toJSON(default_value) }, '',
172                 'input', { type: 'hidden', name: name, value: default_value }, '',
173                 'span', { className: 'value_prefix' }, $.ajatus.i10n.get(widget.settings.value_prefix),
174                 'span', { name: name }, default_value.toString(),
175                 'span', { className: 'value_suffix' }, $.ajatus.i10n.get(widget.settings.value_suffix)
176             ];
177         }
178         
179         return tpl;
180     }
181     
182     $.ajatus.widgets.generate_settings_form = function(wdgt_sett, curr_sett)
183     {
184         var settings = $.extend({}, wdgt_sett, curr_sett);
185         var holder = $('<div class="settings_holder"/>');
186         var rows = $('<ul/>');
187                 
188         $.each(settings, function(i,s){
189             // console.log("i: "+i+" s: ");
190             // console.log(s);
191             var s_type = typeof(s);
192             // console.log('type: '+s_type);
193             var wdgt = null;
194             var normalized_name = i.toString().replace('_', ' ');
196             switch(s_type) {
197                 case 'boolean':
198                     wdgt = $.ajatus.widget('boolean');
199                 break;
200                 case 'number':
201                     wdgt = $.ajatus.widget('integer');
202                 break;
203                 case 'string':
204                 default:
205                     wdgt = $.ajatus.widget('text');
206             };
207             
208             rows.createAppend(
209                 'li', { id: '_setting_'+i, className: 'row' }, [
210                     'label', { id: '_setting_'+i+'_label' }, $.ajatus.i10n.get(normalized_name),
211                     'div', { id: '_setting_'+i+'_widget', className: wdgt.name }, wdgt.get_create_tpl(i, s),
212                     'br', { className: 'clear_fix' }, ''
213                 ]
214             );            
215             wdgt.init($('#_setting_'+i+'_widget',rows), true);
216         });
217         rows.appendTo(holder);
219         $('li:first', rows).addClass('first');
220         $('li:last', rows).addClass('last');
221         
222         return holder;
223     }
224     
225     $.ajatus.widgets.generate_default_details = function(widget, data, name)
226     {        
227         var holder = $('<div class="widget_details" />');
228         
229         var saved_settings = $('<div class="saved_settings" />');
230         saved_settings.appendTo(holder);
232         $.each(widget.settings, function(k,val){
233             if (typeof data['widget'] != 'undefined') {
234                 val = data.widget.config[k];
235             }
236             var field = $('<input type="hidden" />').attr({
237                 name: 'config;'+k,
238                 value: $.ajatus.converter.toJSON(val)
239             });
240             field.appendTo(saved_settings);
241         });
242         
243         var actions = $('<div class="actions" />');
244         var pref_btn = $('<div class="widget_settings_btn"><img src="' + $.ajatus.preferences.client.theme_icons_url + 'preferences.png" alt="' + $.ajatus.i10n.get('Settings') + '" /></div>');            
245         pref_btn.appendTo(actions);
246         pref_btn.bind('click', function(){
247             var prev_vals = {};
248             var saved_inputs = $('input', saved_settings);
249             if (saved_inputs.length > 0) {
250                 $.each(saved_inputs, function(i,n){
251                     var key = n.name.split(";")[1];
252                     prev_vals[key] = $.ajatus.converter.parseJSON(n.value);
253                 });
254             }
255             $.ajatus.document.additionals.config(widget, prev_vals);
256         });
257         
258         actions.appendTo(holder);
259         
260         var field_names = {
261             'name': {
262                 title: $.ajatus.i10n.get('name'),
263                 type: 'string',
264                 value: name || '',
265                 read_only: typeof name == 'undefined' ? false : true,
266                 required: true
267             },
268             'label': {
269                 title: $.ajatus.i10n.get('label'),
270                 type: 'string',
271                 value: typeof data.label != 'undefined' ? data.label : '',
272                 required: true
273             },
274             'def_val': {
275                 title: $.ajatus.i10n.get('default value'),
276                 type: 'string',
277                 value: typeof data.def_val != 'undefined' ? data.def_val : ''
278             },
279             'required': {
280                 title: $.ajatus.i10n.get('required'),
281                 type: 'boolean',
282                 value: typeof data.required != 'undefined' ? data.required : false
283             }
284         };
285         
286         var fields = $('<ul class="fields_holder" />');
287         
288         $.each(field_names, function(fn,fd){
289             var wdgt = null;
290             switch (fd.type) {
291                 case 'boolean':
292                     wdgt = $.ajatus.widget('boolean');
293                 break;
294                 case 'integer':
295                     wdgt = $.ajatus.widget('integer');
296                 break;
297                 case 'string':
298                 default:
299                     wdgt = $.ajatus.widget('text');
300             };
301             
302                 if (   typeof fd.required != 'undefined'
303                     && fd.required)
304                 {
305                     wdgt.required = true;
306                 }
307             
308             var def_val = '';
309             if (   typeof fd.value != 'undefined'
310                 && fd.value != '')
311             {
312                 def_val = fd.value;
313             }
314             
315             var wdgt_tpl = wdgt.get_create_tpl(fn, def_val);
316             
317                 if ( typeof fd['read_only'] != 'undefined'
318                     && fd.read_only == true)
319                 {
320                     wdgt_tpl = $.ajatus.widgets.to_readonly(fd.type, fn, def_val, wdgt);
321                 }
322             
323             fields.createAppend(
324                 'li', { id: '_field_'+fn, className: 'row' }, [
325                     'label', { id: '_field_'+fn+'_label' }, fd.title + (wdgt.required ? ' *' : ''),
326                     'div', { id: '_field_'+fn+'_widget', className: wdgt.name }, wdgt_tpl,
327                     'br', { className: 'clear_fix' }, ''
328                 ]
329             );            
330             wdgt.init($('#_field_'+fn+'_widget',fields), true);
331         });
332         
333         fields.appendTo(holder);
334         
335         return holder;
336     }
337     
338     $.ajatus.widgets.generate_default_settings = function(widget, data)
339     {
340         var holder = $('<div class="widget_settings" />');
341         
342         var ext_sett = {};
343         if (typeof(data) == 'object') {
344             ext_sett = data;
345         }
346         
347         var settings = $.ajatus.widgets.generate_settings_form(widget.settings, ext_sett);
348         
349         settings.appendTo(holder);
350         
351         return holder;
352     }
353     
354 })(jQuery);