added overflow scroll an fixed height to the related objects table
[ajatus.git] / js / ajatus.widgets.js
blob16558c8074bfd2c81758d70125e9a6fe7bdd4c7c
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                 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, name)
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             if (typeof data['widget'] != 'undefined') {
230                 val = data.widget.config[k];
231             }
232             var field = $('<input type="hidden" />').attr({
233                 name: 'config;'+k,
234                 value: $.ajatus.converter.toJSON(val)
235             });
236             field.appendTo(saved_settings);
237         });
238         
239         var actions = $('<div class="actions" />');
240         var pref_btn = $('<div class="widget_settings_btn"><img src="' + $.ajatus.preferences.client.theme_icons_url + 'preferences.png" alt="' + $.ajatus.i10n.get('Settings') + '" /></div>');            
241         pref_btn.appendTo(actions);
242         pref_btn.bind('click', function(){
243             var prev_vals = {};
244             var saved_inputs = $('input', saved_settings);
245             if (saved_inputs.length > 0) {
246                 $.each(saved_inputs, function(i,n){
247                     var key = n.name.split(";")[1];
248                     prev_vals[key] = $.ajatus.converter.parseJSON(n.value);
249                 });
250             }
251             $.ajatus.document.additionals.config(widget, prev_vals);
252         });
253         
254         actions.appendTo(holder);
255         
256         var field_names = {
257             'name': {
258                 title: $.ajatus.i10n.get('name'),
259                 type: 'string',
260                 value: name || '',
261                 read_only: typeof name == 'undefined' ? false : true,
262                 required: true
263             },
264             'label': {
265                 title: $.ajatus.i10n.get('label'),
266                 type: 'string',
267                 value: typeof data.label != 'undefined' ? data.label : '',
268                 required: true
269             },
270             'def_val': {
271                 title: $.ajatus.i10n.get('default value'),
272                 type: 'string',
273                 value: typeof data.def_val != 'undefined' ? data.def_val : ''
274             },
275             'required': {
276                 title: $.ajatus.i10n.get('required'),
277                 type: 'boolean',
278                 value: typeof data.required != 'undefined' ? data.required : false
279             }
280         };
281         
282         var fields = $('<ul class="fields_holder" />');
283         
284         $.each(field_names, function(fn,fd){
285             var wdgt = null;
286             switch (fd.type) {
287                 case 'boolean':
288                     wdgt = $.ajatus.widget('boolean');
289                 break;
290                 case 'integer':
291                     wdgt = $.ajatus.widget('integer');
292                 break;
293                 case 'string':
294                 default:
295                     wdgt = $.ajatus.widget('text');
296             };
297             
298                 if (   typeof fd.required != 'undefined'
299                     && fd.required)
300                 {
301                     wdgt.required = true;
302                 }
303             
304             var def_val = '';
305             if (   typeof fd.value != 'undefined'
306                 && fd.value != '')
307             {
308                 def_val = fd.value;
309             }
310             
311             var wdgt_tpl = wdgt.get_create_tpl(fn, def_val);
312             
313                 if ( typeof fd['read_only'] != 'undefined'
314                     && fd.read_only == true)
315                 {
316                     wdgt_tpl = $.ajatus.widgets.to_readonly(fd.type, fn, def_val, wdgt);
317                 }
318             
319             fields.createAppend(
320                 'li', { id: '_field_'+fn, className: 'row' }, [
321                     'label', { id: '_field_'+fn+'_label' }, fd.title + (wdgt.required ? ' *' : ''),
322                     'div', { id: '_field_'+fn+'_widget', className: wdgt.name }, wdgt_tpl,
323                     'br', { className: 'clear_fix' }, ''
324                 ]
325             );            
326             wdgt.init($('#_field_'+fn+'_widget',fields), true);
327         });
328         
329         fields.appendTo(holder);
330         
331         return holder;
332     }
333     
334     $.ajatus.widgets.generate_default_settings = function(widget, data)
335     {
336         var holder = $('<div class="widget_settings" />');
337         
338         var ext_sett = {};
339         if (typeof(data) == 'object') {
340             ext_sett = data;
341         }
342         
343         var settings = $.ajatus.widgets.generate_settings_form(widget.settings, ext_sett);
344         
345         settings.appendTo(holder);
346         
347         return holder;
348     }
349     
350 })(jQuery);