Added safety checks if no args are passed
[ajatus.git] / js / ajatus.forms.js
blob677f58f74e923ad6fc6ee7772ae381f3da594a51
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 = undefined;
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                                             if (r.value == '') {
184                                                 prev_val = r.value;
185                                             } else {
186                                                 prev_val = $.ajatus.converter.parseJSON(r.value);
187                                             }
188                                             prev_values_count += 1;
189                                         } else if (r.name == 'widget['+row_key+':additional]') {
190                                             additional = $.ajatus.converter.parseJSON(r.value);
191                                         } else if (r.name == 'widget['+row_key+':required]') {
192                                         widget['required'] = $.ajatus.utils.to_boolean(r.value);
193                                     }
194                                         
195                                     });
197                                     var wdgt = new $.ajatus.widget(widget['name'], widget['config']);
199                                 if (typeof widget['required'] != 'undefined') {
200                                         wdgt.required = widget['required'];
201                                 }
202                                     
203                                     if (typeof wdgt.validate == 'function') {
204                                         var status = wdgt.validate(row_key, row.value);
205                                         if (typeof status == 'object') {
206                                             $.ajatus.forms.process.has_errors = true;
207                                             $.ajatus.forms.process.error_fields[row_key] = status;
208                                         }
209                                     }
210                                     
211                                     if (name_parts_count > 0) {
212                                         var row_val = {};
213                                         
214                                         $.each(form_data, function(x,r){
215                                             var np = [];
216                                             if (r.name.toString().match(/\|/g)) {
217                                             // console.log(r.name+" matches with |");
218                                                 np = r.name.toString().split("|");
219                                             // console.log(np);
220                                                 if (np[0] == name_parts[0]) {
221                                                     if (typeof row_val[np[1]] == 'undefined') {
222                                                     row_val[np[1]] = r.value;
223                                                     }
224                                                 }
225                                             }
226                                     });
228                                     parted_names_done.push(name_parts[0]);
229                                     
230                                     item['val'] = wdgt.value_on_save(row_val, prev_val, true);
231                                     } else {
232                                     item['val'] = wdgt.value_on_save(row.value, prev_val, false);
233                                     }
234                                     
235                                     if (typeof prev_val != 'undefined') {
236                                     if (wdgt.has_data_changed(item['val'], prev_val)) {
237                                         changed_values_count += 1;
238                                     }
239                                     }
240                                     
241                                 item['widget'] = widget;
242                                 
243                                 if (additional) {
244                                     item['additional'] = true;
245                                     if (additionals == false) {
246                                         additionals = {};
247                                     }
248                                     additionals[row_key] = additional;
249                                 }
250                                 
251                                 form_values[row_key] = item;
252                             }
253                             else if (row.name.substr(0,8) == "metadata")
254                             {
255                                 if (typeof form_values['metadata'] == 'undefined') {
256                                     form_values['metadata'] = {};
257                                 }
259                                 var re = /\bmetadata\[([a-z]+)\b/;
260                                 var results = re.exec(row.name);
261                                 var key = results[1];
263                                 form_values['metadata'][key] = {
264                                     val: row.value
265                                 };
266                             }
267                             }
268                         }
269                     });
270                     
271                     if (additionals) {
272                         form_values['_additionals'] = additionals;
273                     }
274                     
275                     doc['value'] = form_values;
277                     doc = new $.ajatus.document(doc);
278                 
279                     var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
281                     var new_metadata = {
282                         revised: now,
283                         revisor: $.ajatus.preferences.local.user.email
284                     };
285                     if (   typeof doc._id == 'undefined'
286                         || doc._id == '')
287                     {
288                         new_metadata['created'] = now;
289                         new_metadata['creator'] = $.ajatus.preferences.local.user.email;
290                     }
292                     $.ajatus.forms.process.doc = $.ajatus.document.modify_metadata(doc, new_metadata);
293                     
294                     if (   prev_values_count > 0
295                         && changed_values_count == 0)
296                     {
297                         $.ajatus.forms.process.has_errors = true;
298                     }
299                     
300                     return $.ajatus.forms.process.doc;
301             },
302             normal: function(form_data) {
303                 $.ajatus.events.named_lock_pool.decrease('unsaved');
304                 
305                 var doc = $.ajatus.forms.process.common(form_data);
306                 
307                 if ($.ajatus.forms.process.has_errors) {
308                     if (   typeof doc._id == 'undefined'
309                         || doc._id == '')
310                     {
311                             $.ajatus.views.system.create.render(doc.value._type, doc);
312                     } else {
313                             $.ajatus.views.system.edit.render(doc.value._type, doc, true);
314                     }
316                     return false;
317                 } else {
318                     $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
319                     doc = new $.ajatus.document(doc);
320                     
321                     $.ajatus.views.system.edit.render(doc._type, doc);
323                     var content_type = $.ajatus.preferences.client.content_types[doc.value._type];
324                     var msg = $.ajatus.elements.messages.create(
325                         $.ajatus.i10n.get('Object saved'),
326                         $.ajatus.i10n.get("%s saved successfully", [content_type.title])
327                     );
329                     return true;
330                 }
331             },
332             ajax: function(form_data, callback) {
333                 var doc = $.ajatus.forms.process.common(form_data);
335                     $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
336                 doc = new $.ajatus.document(doc);
337                 
338                 $.ajatus.events.named_lock_pool.decrease('unsaved');
340                 if (typeof callback == 'function') {
341                     callback.apply(callback, [doc]);
342                 }
343                 
344                     return true;
345             }
346         },
347     });
348     
349 })(jQuery);