Added phing based release script
[ajatus.git] / js / ajatus.widgets.js
blob1796808d2dcc63cd0c6a27886b480e8e37f3e920
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         return wdgt;
68     };
69     
70     $.ajatus.widgets.widget_loaded = function(wdgt, try_count) {
71         if (typeof try_count == 'undefined') {
72             var try_count = 0;
73         }
74         
75         $.ajatus.widgets[wdgt] = $.ajatus.widgets.core[wdgt];
76         
77         if (typeof $.ajatus.widgets[wdgt] != 'undefined') {
78             $.ajatus.widgets[wdgt].loaded();
79             $.ajatus.widgets.loaded_widgets.push(wdgt);            
80         } else {
81             try_count += 1;
82             if (try_count < 2) {
83                 setTimeout("$.ajatus.widgets.widget_loaded('"+wdgt+"', "+try_count+");", 200);
84             }
85         }
86         
87         $.ajatus.events.lock_pool.decrease();
88     }
89     
90     $.ajatus.widgets.custom_widget_loaded = function(wdgt, try_count) {
91         if (typeof try_count == 'undefined') {
92             var try_count = 0;
93         }
94         
95         $.ajatus.widgets[wdgt] = $.ajatus.widgets.custom[wdgt];
96         
97         if (typeof $.ajatus.widgets[wdgt] != 'undefined') {
98             $.ajatus.widgets[wdgt].loaded();
99             $.ajatus.widgets.loaded_widgets.push(wdgt);            
100         } else {
101             try_count += 1;
102             if (try_count < 2) {
103                 setTimeout("$.ajatus.widgets.widget_loaded('"+wdgt+"', "+try_count+");", 200);
104             }
105         }
106         
107         $.ajatus.events.lock_pool.decrease();
108     }
109     
110     $.ajatus.widgets.init = function()
111     {
112         $.ajatus.widgets.loaded_widgets = new Array();
113         
114         if ($.browser.safari) {
115             $.ajatus.widgets.core.available = $.ajatus.widgets.core.available.reverse();
116         }
117         
118         $.each($.ajatus.widgets.core.available, function(i,cw){
119             if (cw == '') {
120                 return;
121             }
122             
123             var widget_url = $.ajatus.preferences.client.application_url + 'js/widgets/'+cw+'.js';
124             
125             $.ajatus.events.lock_pool.increase();
126             
127             $.ajatus.utils.load_script(widget_url, "$.ajatus.widgets.widget_loaded", [cw]);
128         });
129         
130         // console.log("Loaded widgets:");
131         // console.log($.ajatus.widgets.loaded_widgets);
133         if ($.ajatus.preferences.client.custom_widgets.length > 0)
134         {
135             $.each($.ajatus.preferences.client.custom_widgets, function(i,cw){
136                 if (cw == '') {
137                     return;
138                 }
139                 
140                 var widget_url = $.ajatus.preferences.client.application_url + 'js/widgets/custom/'+cw+'.js';
141             
142                 $.ajatus.events.lock_pool.increase();
143                 
144                 $.ajatus.utils.load_script(widget_url, "$.ajatus.widgets.custom_widget_loaded", [cw]);
145             });
146         }
147     }
148     
149     $.ajatus.widgets.to_readonly = function(view_type, name, default_value, widget) {
150         var tpl = false;
151         
152         if (typeof widget['get_readonly_tpl'] == 'function') {
153             tpl = widget.get_readonly_tpl(view_type, name, default_value);
154         } else {
155             tpl = [
156                 'input', { type: 'hidden', name: 'widget['+name+':name]', value: widget.name }, '',
157                 'input', { type: 'hidden', name: 'widget['+name+':config]', value: $.ajatus.converter.toJSON(widget.settings) }, '',
158                 'input', { type: 'hidden', name: name, value: default_value }, '',
159                 'span', { className: 'value_prefix' }, $.ajatus.i10n.get(widget.settings.value_prefix),
160                 'span', { name: name }, default_value.toString(),
161                 'span', { className: 'value_suffix' }, $.ajatus.i10n.get(widget.settings.value_suffix)
162             ];
163         }
164         
165         return tpl;
166     }
167     
168     $.ajatus.widgets.generate_settings_form = function(wdgt_sett, curr_sett)
169     {
170         var settings = $.extend({}, wdgt_sett, curr_sett);
171         var holder = $('<div class="settings_holder"/>');
172         var rows = $('<ul/>');
173                 
174         $.each(settings, function(i,s){
175             // console.log("i: "+i+" s: ");
176             // console.log(s);
177             var s_type = typeof(s);
178             // console.log('type: '+s_type);
179             var wdgt = null;
180             var normalized_name = i.toString().replace('_', ' ');
182             switch(s_type) {
183                 case 'boolean':
184                     wdgt = $.ajatus.widget('boolean');
185                 break;
186                 case 'number':
187                     wdgt = $.ajatus.widget('integer');
188                 break;
189                 case 'string':
190                 default:
191                     wdgt = $.ajatus.widget('text');
192             };
193             
194             rows.createAppend(
195                 'li', { id: '_setting_'+i, className: 'row' }, [
196                     'label', { id: '_setting_'+i+'_label' }, $.ajatus.i10n.get(normalized_name),
197                     'div', { id: '_setting_'+i+'_widget', className: wdgt.name }, wdgt.get_create_tpl(i, s),
198                     'br', { className: 'clear_fix' }, ''
199                 ]
200             );            
201             wdgt.init($('#_setting_'+i+'_widget',rows), true);
202         });
203         rows.appendTo(holder);
205         $('li:first', rows).addClass('first');
206         $('li:last', rows).addClass('last');
207         
208         return holder;
209     }
210     
211     $.ajatus.widgets.generate_default_details = function(widget, data)
212     {
213         var holder = $('<div class="widget_details" />');
214         
215         var saved_settings = $('<div class="saved_settings" />');
216         saved_settings.appendTo(holder);
218         $.each(widget.settings, function(k,val){
219             var field = $('<input type="hidden" />').attr({
220                 name: 'config;'+k,
221                 value: $.ajatus.converter.toJSON(val)
222             });
223             field.appendTo(saved_settings);
224         });
225         
226         var actions = $('<div class="actions" />');
227         var pref_btn = $('<div class="widget_settings_btn"><img src="' + $.ajatus.preferences.client.theme_icons_url + 'preferences.png" alt="' + $.ajatus.i10n.get('Settings') + '" /></div>');            
228         pref_btn.appendTo(actions);
229         pref_btn.bind('click', function(){
230             var prev_vals = {};
231             var saved_inputs = $('input', saved_settings);
232             if (saved_inputs.length > 0) {
233                 $.each(saved_inputs, function(i,n){
234                     var key = n.name.split(";")[1];
235                     prev_vals[key] = $.ajatus.converter.parseJSON(n.value);
236                 });
237             }
238             $.ajatus.document.additionals.config(widget, prev_vals);
239         });
240         
241         actions.appendTo(holder);
242         
243         var field_names = {
244             'name': {
245                 title: $.ajatus.i10n.get('name'),
246                 type: 'string'
247             },
248             'label': {
249                 title: $.ajatus.i10n.get('label'),
250                 type: 'string'
251             },
252             'def_val': {
253                 title: $.ajatus.i10n.get('default value'),
254                 type: 'string'
255             },
256             'required': {
257                 title: $.ajatus.i10n.get('required'),
258                 type: 'boolean'
259             }
260         };
261         
262         var fields = $('<ul class="fields_holder" />');
263         
264         $.each(field_names, function(fn,fd){
265             var wdgt = null;
266             switch (fd.type) {
267                 case 'boolean':
268                     wdgt = $.ajatus.widget('boolean');
269                 break;
270                 case 'integer':
271                     wdgt = $.ajatus.widget('integer');
272                 break;
273                 case 'string':
274                 default:
275                     wdgt = $.ajatus.widget('text');
276             };
277             
278             var def_val = {
279                 val: ''
280             };
281             if (   typeof data.val != 'undefined'
282                 && data.val != '')
283             {
284                 def_val.val = data.val;
285             }
286             
287             fields.createAppend(
288                 'li', { id: '_field_'+fn, className: 'row' }, [
289                     'label', { id: '_field_'+fn+'_label' }, fd.title,
290                     'div', { id: '_field_'+fn+'_widget', className: wdgt.name }, wdgt.get_create_tpl(fn, ''),
291                     'br', { className: 'clear_fix' }, ''
292                 ]
293             );            
294             wdgt.init($('#_field_'+fn+'_widget',fields), true);
295         });
296         
297         fields.appendTo(holder);
298         
299         return holder;
300     }
301     
302     $.ajatus.widgets.generate_default_settings = function(widget, data)
303     {
304         var holder = $('<div class="widget_settings" />');
305         
306         var ext_sett = {};
307         if (typeof(data) == 'object') {
308             ext_sett = data;
309         }
310         
311         var settings = $.ajatus.widgets.generate_settings_form(widget.settings, ext_sett);
312         
313         settings.appendTo(holder);
314         
315         return holder;
316     }
317     
318 })(jQuery);