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