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