Added prev_val and required support to tag widget
[ajatus.git] / js / ajatus.widgets.js
blob33c9c4d4a26ce1e7564486d3af21badd36d5f78b
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         } else {
90             try_count += 1;
91             if (try_count < 2) {
92                 setTimeout("$.ajatus.widgets.widget_loaded('"+wdgt+"', "+try_count+");", 200);
93             }
94         }
95         
96         $.ajatus.events.lock_pool.decrease();
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                 return;
130             }
131             
132             var widget_url = $.ajatus.preferences.client.application_url + 'js/widgets/'+cw+'.js';
133             
134             $.ajatus.events.lock_pool.increase();
135             
136             $.ajatus.utils.load_script(widget_url, "$.ajatus.widgets.widget_loaded", [cw]);
137         });
138         
139         // console.log("Loaded widgets:");
140         // console.log($.ajatus.widgets.loaded_widgets);
142         if ($.ajatus.preferences.client.custom_widgets.length > 0)
143         {
144             $.each($.ajatus.preferences.client.custom_widgets, function(i,cw){
145                 if (cw == '') {
146                     return;
147                 }
148                 
149                 var widget_url = $.ajatus.preferences.client.application_url + 'js/widgets/custom/'+cw+'.js';
150             
151                 $.ajatus.events.lock_pool.increase();
152                 
153                 $.ajatus.utils.load_script(widget_url, "$.ajatus.widgets.custom_widget_loaded", [cw]);
154             });
155         }
156     }
157     
158     $.ajatus.widgets.to_readonly = function(view_type, name, default_value, widget) {
159         var tpl = false;
160         
161         if (typeof widget['get_readonly_tpl'] == 'function') {
162             tpl = widget.get_readonly_tpl(view_type, name, default_value);
163         } else {
164             tpl = [
165                 'input', { type: 'hidden', name: 'widget['+name+':name]', value: widget.name }, '',
166                 'input', { type: 'hidden', name: 'widget['+name+':config]', value: $.ajatus.converter.toJSON(widget.settings) }, '',
167                 'input', { type: 'hidden', name: 'widget['+name+':prev_val]', value: $.ajatus.converter.toJSON(default_value) }, '',
168                 'input', { type: 'hidden', name: name, value: default_value }, '',
169                 'span', { className: 'value_prefix' }, $.ajatus.i10n.get(widget.settings.value_prefix),
170                 'span', { name: name }, default_value.toString(),
171                 'span', { className: 'value_suffix' }, $.ajatus.i10n.get(widget.settings.value_suffix)
172             ];
173         }
174         
175         return tpl;
176     }
177     
178     $.ajatus.widgets.generate_settings_form = function(wdgt_sett, curr_sett)
179     {
180         var settings = $.extend({}, wdgt_sett, curr_sett);
181         var holder = $('<div class="settings_holder"/>');
182         var rows = $('<ul/>');
183                 
184         $.each(settings, function(i,s){
185             // console.log("i: "+i+" s: ");
186             // console.log(s);
187             var s_type = typeof(s);
188             // console.log('type: '+s_type);
189             var wdgt = null;
190             var normalized_name = i.toString().replace('_', ' ');
192             switch(s_type) {
193                 case 'boolean':
194                     wdgt = $.ajatus.widget('boolean');
195                 break;
196                 case 'number':
197                     wdgt = $.ajatus.widget('integer');
198                 break;
199                 case 'string':
200                 default:
201                     wdgt = $.ajatus.widget('text');
202             };
203             
204             rows.createAppend(
205                 'li', { id: '_setting_'+i, className: 'row' }, [
206                     'label', { id: '_setting_'+i+'_label' }, $.ajatus.i10n.get(normalized_name),
207                     'div', { id: '_setting_'+i+'_widget', className: wdgt.name }, wdgt.get_create_tpl(i, s),
208                     'br', { className: 'clear_fix' }, ''
209                 ]
210             );            
211             wdgt.init($('#_setting_'+i+'_widget',rows), true);
212         });
213         rows.appendTo(holder);
215         $('li:first', rows).addClass('first');
216         $('li:last', rows).addClass('last');
217         
218         return holder;
219     }
220     
221     $.ajatus.widgets.generate_default_details = function(widget, data)
222     {
223         var holder = $('<div class="widget_details" />');
224         
225         var saved_settings = $('<div class="saved_settings" />');
226         saved_settings.appendTo(holder);
228         $.each(widget.settings, function(k,val){
229             var field = $('<input type="hidden" />').attr({
230                 name: 'config;'+k,
231                 value: $.ajatus.converter.toJSON(val)
232             });
233             field.appendTo(saved_settings);
234         });
235         
236         var actions = $('<div class="actions" />');
237         var pref_btn = $('<div class="widget_settings_btn"><img src="' + $.ajatus.preferences.client.theme_icons_url + 'preferences.png" alt="' + $.ajatus.i10n.get('Settings') + '" /></div>');            
238         pref_btn.appendTo(actions);
239         pref_btn.bind('click', function(){
240             var prev_vals = {};
241             var saved_inputs = $('input', saved_settings);
242             if (saved_inputs.length > 0) {
243                 $.each(saved_inputs, function(i,n){
244                     var key = n.name.split(";")[1];
245                     prev_vals[key] = $.ajatus.converter.parseJSON(n.value);
246                 });
247             }
248             $.ajatus.document.additionals.config(widget, prev_vals);
249         });
250         
251         actions.appendTo(holder);
252         
253         var field_names = {
254             'name': {
255                 title: $.ajatus.i10n.get('name'),
256                 type: 'string'
257             },
258             'label': {
259                 title: $.ajatus.i10n.get('label'),
260                 type: 'string'
261             },
262             'def_val': {
263                 title: $.ajatus.i10n.get('default value'),
264                 type: 'string'
265             },
266             'required': {
267                 title: $.ajatus.i10n.get('required'),
268                 type: 'boolean'
269             }
270         };
271         
272         var fields = $('<ul class="fields_holder" />');
273         
274         $.each(field_names, function(fn,fd){
275             var wdgt = null;
276             switch (fd.type) {
277                 case 'boolean':
278                     wdgt = $.ajatus.widget('boolean');
279                 break;
280                 case 'integer':
281                     wdgt = $.ajatus.widget('integer');
282                 break;
283                 case 'string':
284                 default:
285                     wdgt = $.ajatus.widget('text');
286             };
287             
288             var def_val = {
289                 val: ''
290             };
291             if (   typeof data.val != 'undefined'
292                 && data.val != '')
293             {
294                 def_val.val = data.val;
295             }
296             
297             fields.createAppend(
298                 'li', { id: '_field_'+fn, className: 'row' }, [
299                     'label', { id: '_field_'+fn+'_label' }, fd.title,
300                     'div', { id: '_field_'+fn+'_widget', className: wdgt.name }, wdgt.get_create_tpl(fn, ''),
301                     'br', { className: 'clear_fix' }, ''
302                 ]
303             );            
304             wdgt.init($('#_field_'+fn+'_widget',fields), true);
305         });
306         
307         fields.appendTo(holder);
308         
309         return holder;
310     }
311     
312     $.ajatus.widgets.generate_default_settings = function(widget, data)
313     {
314         var holder = $('<div class="widget_settings" />');
315         
316         var ext_sett = {};
317         if (typeof(data) == 'object') {
318             ext_sett = data;
319         }
320         
321         var settings = $.ajatus.widgets.generate_settings_form(widget.settings, ext_sett);
322         
323         settings.appendTo(holder);
324         
325         return holder;
326     }
327     
328 })(jQuery);