Don't override existing signal listeners
[ajatus.git] / js / ajatus.forms.js
blob70b0f7e5bfc0f8d4f91931db9a464b6b5be2798c
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 || {};
18     $.ajatus.forms = {
19         active: false
20     };
21     $.extend($.ajatus.forms, {
22         clear_data: function() {
23             $.ajatus.forms.active = false;
24             $.ajatus.forms.process.has_errors = false;
25             $.ajatus.forms.process.error_fields = {};
26         },
27         register: {
28             normal: function(form) {
29                 $.ajatus.events.named_lock_pool.increase('unsaved');
30                 $.ajatus.forms.clear_data();
31                 $.ajatus.forms.active = form;
32                 
33                     jqform = $(form);
34                     jqform.bind('submit',function(e){
35                         return false;
36                     });
38                     $('input[@type=submit][name*=save]', jqform).bind('click', function(){                      
39                     var status = $.ajatus.forms.process.normal(jqform.formToArray(false));
40                     
41                     $.ajatus.forms.active = false;
42                     
43                     return false;
44                     });
45                     $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
46                     $.ajatus.history.navigate(-1);
47                         
48                         $.ajatus.forms.active = false;
49                         return false;
50                     });
51             },
52             ajax: function(form, callback) {
53                 if (typeof callback == 'undefined') {
54                     $.ajatus.forms.register.normal(form);
55                     return;
56                 }
57                 $.ajatus.events.named_lock_pool.increase('unsaved');
58                 $.ajatus.forms.clear_data();
59                 $.ajatus.forms.active = form;
60                 
61                     jqform = $(form);
62                     jqform.bind('submit',function(e){
63                         return false;
64                     });
66                     $('input[@type=submit][name*=save]', jqform).bind('click', function(){
67                     $.ajatus.forms.process.ajax(jqform.formToArray(false), callback);
68                     
69                     $.ajatus.forms.active = false;
70                     return false;
71                     });
72                     $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
73                     $.ajatus.history.navigate(-1);
74                         
75                         $.ajatus.forms.active = false;
76                         return false;
77                     });
78             },
79             custom: function(form, save_func) {
80                 if (typeof save_func == 'undefined') {
81                     return;
82                 }                
83                 $.ajatus.events.named_lock_pool.increase('unsaved');
84                 $.ajatus.forms.clear_data();
85                 $.ajatus.forms.active = form;
86                 
87                     jqform = $(form);
88                     jqform.bind('submit',function(e){
89                         return false;
90                     });
92                     $('input[@type=submit][name*=save]', jqform).bind('click', function(){
93                     var fn = save_func;
94                     if (typeof save_func == 'string') {
95                         fn = eval(save_func);
96                     }
97                     fn.apply(fn, [jqform.formToArray(false), form]);
98                     
99                     $.ajatus.forms.active = false;
100                     return false;
101                     });
102                     $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
103                     $.ajatus.history.navigate(-1);
104                         
105                         $.ajatus.forms.active = false;
106                         return false;
107                     });                
108             }
109         },        
110         process: {
111             doc: null,
112             has_errors: false,
113             error_fields: {},
114             
115             common: function(form_data) {
116                 $.ajatus.forms.process.has_errors = false;
117                 $.ajatus.forms.process.error_fields = {};
118                 
119                     var doc = {
120                         _id: '',
121                         _rev: '',
122                         value: {}
123                     };
124                     var form_values = {};
125                     var form_id = '';
126                     var doc_type = 'note';
127                 var additionals = false;
128                 
129                 var parted_names_done = [];
130                 
131                 var prev_values_count = 0;
132                 var changed_values_count = 0;
133                 
134                     $.each(form_data, function(i,row){
135                     // console.log('i: '+i+' row.name: '+row.name+' row.value: '+row.value);
136                     if (row.name.toString().match(/__(.*?)/)) {
137                         return;
138                     }
139                         if (   row.name == '_id'
140                             && (   typeof row.value != 'undefined'
141                                 && row.value != ''))
142                         {
143                             doc['_id'] = String(row.value);
144                             form_id = doc['_id'];
145                         }
146                         else if(   row.name == '_rev'
147                                 && (   typeof row.value != 'undefined'
148                                     && row.value != ''))
149                         {
150                             doc['_rev'] = String(row.value);
151                     }
152                         else if(   row.name == '_additionals'
153                                 && (   typeof row.value != 'undefined'
154                                     && row.value != ''))
155                         {
156                             //additionals = $.ajatus.converter.parseJSON(row.value);
157                         } else {
158                             if (row.name != 'submit') {
159                                 if (row.name == '_type') {
160                                 doc_type = row.value;
161                                 form_values[row.name] = row.value;
162                             }
163                             else if (   row.name.substr(0,6) != "widget"
164                                      && row.name.substr(0,8) != "metadata")
165                             {
166                                 var item = {};
167                                 var widget = {};
168                                 var prev_val = undefined;
169                                 var additional = false;
170                                 var additional_updated = false;
171                                 var field_updated = false;
172                                 var row_key = row.name;
173                                 
174                                 var name_parts = [];
175                                 var name_parts_count = 0;
176                                 if (row_key.toString().match(/\|/g)) {
177                                     name_parts = row_key.toString().split("|");
178                                     name_parts_count = name_parts.length;
179                                     
180                                     if ($.inArray(name_parts[0], parted_names_done) != -1) {
181                                         return;
182                                     }
183                                     
184                                     row_key = name_parts[0];
185                                 }
186                                 
187                                 $.each(form_data, function(x,r){
188                                     if (r.name == 'widget['+row_key+':name]') {
189                                         widget['name'] = r.value;
190                                     } else if (r.name == 'widget['+row_key+':config]') {
191                                             widget['config'] = $.ajatus.converter.parseJSON(r.value);
192                                         } else if (r.name == 'widget['+row_key+':prev_val]') {
193                                             if (r.value == '') {
194                                                 prev_val = r.value;
195                                             } else {
196                                                 prev_val = $.ajatus.converter.parseJSON(r.value);
197                                             }
198                                             prev_values_count += 1;
199                                         } else if (r.name == 'widget['+row_key+':additional]') {
200                                             additional = $.ajatus.converter.parseJSON(r.value);
201                                         } else if (r.name == 'widget['+row_key+':field_updated]') {
202                                         field_updated = $.ajatus.converter.parseJSON(r.value);
203                                     } else if (r.name == 'widget['+row_key+':additional_updated]') {
204                                         additional_updated = $.ajatus.converter.parseJSON(r.value);
205                                         } else if (r.name == 'widget['+row_key+':required]') {
206                                         widget['required'] = $.ajatus.utils.to_boolean(r.value);
207                                     }
208                                         
209                                     });
211                                     if (   additional_updated
212                                         || field_updated)
213                                     {
214                                         prev_values_count += 1;
215                                         changed_values_count += 1;
216                                     }
218                                     var wdgt = new $.ajatus.widget(widget['name'], widget['config']);
220                                 if (typeof widget['required'] != 'undefined') {
221                                         wdgt.required = widget['required'];
222                                 }
223                                     
224                                     if (typeof wdgt.validate == 'function') {
225                                         var status = wdgt.validate(row_key, row.value);
226                                         if (typeof status == 'object') {
227                                             $.ajatus.forms.process.has_errors = true;
228                                             $.ajatus.forms.process.error_fields[row_key] = status;
229                                         }
230                                     }
231                                     
232                                     if (name_parts_count > 0) {
233                                         var row_val = {};
234                                         
235                                         $.each(form_data, function(x,r){
236                                             var np = [];
237                                             if (r.name.toString().match(/\|/g)) {
238                                             // console.log(r.name+" matches with |");
239                                                 np = r.name.toString().split("|");
240                                             // console.log(np);
241                                                 if (np[0] == name_parts[0]) {
242                                                     if (typeof row_val[np[1]] == 'undefined') {
243                                                     row_val[np[1]] = r.value;
244                                                     }
245                                                 }
246                                             }
247                                     });
249                                     parted_names_done.push(name_parts[0]);
250                                     
251                                     item['val'] = wdgt.value_on_save(row_val, prev_val, true);
252                                     } else {
253                                     item['val'] = wdgt.value_on_save(row.value, prev_val, false);
254                                     }
255                                     
256                                     if (typeof prev_val != 'undefined') {
257                                     if (wdgt.has_data_changed(item['val'], prev_val)) {
258                                         changed_values_count += 1;
259                                     }
260                                     }
261                                     
262                                 item['widget'] = widget;
263                                 
264                                 if (additional) {
265                                     item['additional'] = true;
266                                     if (additionals == false) {
267                                         additionals = {};
268                                     }
269                                     additionals[row_key] = additional;
270                                 }
271                                 
272                                 form_values[row_key] = item;
273                             }
274                             else if (row.name.substr(0,8) == "metadata")
275                             {
276                                 if (typeof form_values['metadata'] == 'undefined') {
277                                     form_values['metadata'] = {};
278                                 }
280                                 var re = /\bmetadata\[([a-z]+)\b/;
281                                 var results = re.exec(row.name);
282                                 var key = results[1];
284                                 form_values['metadata'][key] = {
285                                     val: row.value
286                                 };
287                             }
288                             }
289                         }
290                     });
291                     
292                     if (additionals) {
293                         form_values['_additionals'] = additionals;
294                     }
295                     
296                     doc['value'] = form_values;
298                     doc = new $.ajatus.document(doc);
299                 
300                     var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
302                     var new_metadata = {
303                         revised: now,
304                         revisor: $.ajatus.preferences.local.user.email
305                     };
306                     if (   typeof doc._id == 'undefined'
307                         || doc._id == '')
308                     {
309                         new_metadata['created'] = now;
310                         new_metadata['creator'] = $.ajatus.preferences.local.user.email;
311                     }
313                     $.ajatus.forms.process.doc = $.ajatus.document.modify_metadata(doc, new_metadata);
314                     
315                     if (   prev_values_count > 0
316                         && changed_values_count == 0)
317                     {
318                         $.ajatus.forms.process.has_errors = true;
319                         $.ajatus.forms.process.error_fields['form'] = {
320                             msg: $.ajatus.i10n.get('Nothing to update')
321                         };
322                     }
323                     
324                     return $.ajatus.forms.process.doc;
325             },
326             normal: function(form_data) {
327                 $.ajatus.events.named_lock_pool.decrease('unsaved');
328                 
329                 var doc = $.ajatus.forms.process.common(form_data);
330                 
331                 if ($.ajatus.forms.process.has_errors) {
332                     if (   typeof doc._id == 'undefined'
333                         || doc._id == '')
334                     {
335                             $.ajatus.views.system.create.render(doc.value._type, doc);
336                     } else {
337                             $.ajatus.views.system.edit.render(doc.value._type, doc, true);
338                     }
340                     return false;
341                 } else {
342                     $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
343                     doc = new $.ajatus.document(doc);
344                     
345                     $.ajatus.views.system.edit.render(doc._type, doc);
347                     var content_type = $.ajatus.preferences.client.content_types[doc.value._type];
348                     var msg = $.ajatus.elements.messages.create(
349                         $.ajatus.i10n.get('Object saved'),
350                         $.ajatus.i10n.get("%s saved successfully", [content_type.title])
351                     );
353                     return true;
354                 }
355             },
356             ajax: function(form_data, callback) {
357                 var doc = $.ajatus.forms.process.common(form_data);
359                     $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
360                 doc = new $.ajatus.document(doc);
361                 
362                 $.ajatus.events.named_lock_pool.decrease('unsaved');
364                 if (typeof callback == 'function') {
365                     callback.apply(callback, [doc]);
366                 }
367                 
368                     return true;
369             }
370         },
371     });
372     
373 })(jQuery);