4 * Ajatus - Distributed CRM
5 * @requires jQuery v1.2.1
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
16 $.ajatus = $.ajatus || {};
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 = {};
28 normal: function(form) {
29 $.ajatus.events.named_lock_pool.increase('unsaved');
30 $.ajatus.forms.clear_data();
31 $.ajatus.forms.active = form;
34 jqform.bind('submit',function(e){
38 $('input[@type=submit][name*=save]', jqform).bind('click', function(){
39 var status = $.ajatus.forms.process.normal(jqform.formToArray(false));
41 $.ajatus.forms.active = false;
45 $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
46 $.ajatus.history.navigate(-1);
48 $.ajatus.forms.active = false;
52 ajax: function(form, callback) {
53 if (typeof callback == 'undefined') {
54 $.ajatus.forms.register.normal(form);
57 $.ajatus.events.named_lock_pool.increase('unsaved');
58 $.ajatus.forms.clear_data();
59 $.ajatus.forms.active = form;
62 jqform.bind('submit',function(e){
66 $('input[@type=submit][name*=save]', jqform).bind('click', function(){
67 $.ajatus.forms.process.ajax(jqform.formToArray(false), callback);
69 $.ajatus.forms.active = false;
72 $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
73 $.ajatus.history.navigate(-1);
75 $.ajatus.forms.active = false;
79 custom: function(form, save_func) {
80 if (typeof save_func == 'undefined') {
83 $.ajatus.events.named_lock_pool.increase('unsaved');
84 $.ajatus.forms.clear_data();
85 $.ajatus.forms.active = form;
88 jqform.bind('submit',function(e){
92 $('input[@type=submit][name*=save]', jqform).bind('click', function(){
94 if (typeof save_func == 'string') {
97 fn.apply(fn, [jqform.formToArray(false), form]);
99 $.ajatus.forms.active = false;
102 $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
103 $.ajatus.history.navigate(-1);
105 $.ajatus.forms.active = false;
115 common: function(form_data) {
116 $.ajatus.forms.process.has_errors = false;
117 $.ajatus.forms.process.error_fields = {};
124 var form_values = {};
126 var doc_type = 'note';
127 var additionals = false;
129 var parted_names_done = [];
131 var prev_values_count = 0;
132 var changed_values_count = 0;
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(/__(.*?)/)) {
139 if ( row.name == '_id'
140 && ( typeof row.value != 'undefined'
143 doc['_id'] = String(row.value);
144 form_id = doc['_id'];
146 else if( row.name == '_rev'
147 && ( typeof row.value != 'undefined'
150 doc['_rev'] = String(row.value);
152 else if( row.name == '_additionals'
153 && ( typeof row.value != 'undefined'
156 //additionals = $.ajatus.converter.parseJSON(row.value);
158 if (row.name != 'submit') {
159 if (row.name == '_type') {
160 doc_type = row.value;
161 form_values[row.name] = row.value;
163 else if ( row.name.substr(0,6) != "widget"
164 && row.name.substr(0,8) != "metadata")
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;
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;
180 if ($.inArray(name_parts[0], parted_names_done) != -1) {
184 row_key = name_parts[0];
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]') {
196 prev_val = $.ajatus.converter.parseJSON(r.value);
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);
211 if ( additional_updated
214 prev_values_count += 1;
215 changed_values_count += 1;
218 var wdgt = new $.ajatus.widget(widget['name'], widget['config']);
220 if (typeof widget['required'] != 'undefined') {
221 wdgt.required = widget['required'];
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;
232 if (name_parts_count > 0) {
235 $.each(form_data, function(x,r){
237 if (r.name.toString().match(/\|/g)) {
238 // console.log(r.name+" matches with |");
239 np = r.name.toString().split("|");
241 if (np[0] == name_parts[0]) {
242 if (typeof row_val[np[1]] == 'undefined') {
243 row_val[np[1]] = r.value;
249 parted_names_done.push(name_parts[0]);
251 item['val'] = wdgt.value_on_save(row_val, prev_val, true);
253 item['val'] = wdgt.value_on_save(row.value, prev_val, false);
256 if (typeof prev_val != 'undefined') {
257 if (wdgt.has_data_changed(item['val'], prev_val)) {
258 changed_values_count += 1;
262 item['widget'] = widget;
265 item['additional'] = true;
266 if (additionals == false) {
269 additionals[row_key] = additional;
272 form_values[row_key] = item;
274 else if (row.name.substr(0,8) == "metadata")
276 if (typeof form_values['metadata'] == 'undefined') {
277 form_values['metadata'] = {};
280 var re = /\bmetadata\[([a-z]+)\b/;
281 var results = re.exec(row.name);
282 var key = results[1];
284 form_values['metadata'][key] = {
293 form_values['_additionals'] = additionals;
296 doc['value'] = form_values;
298 doc = new $.ajatus.document(doc);
300 var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
304 revisor: $.ajatus.preferences.local.user.email
306 if ( typeof doc._id == 'undefined'
309 new_metadata['created'] = now;
310 new_metadata['creator'] = $.ajatus.preferences.local.user.email;
313 $.ajatus.forms.process.doc = $.ajatus.document.modify_metadata(doc, new_metadata);
315 if ( prev_values_count > 0
316 && changed_values_count == 0)
318 $.ajatus.forms.process.has_errors = true;
319 $.ajatus.forms.process.error_fields['form'] = {
320 msg: $.ajatus.i10n.get('Nothing to update')
324 return $.ajatus.forms.process.doc;
326 normal: function(form_data) {
327 $.ajatus.events.named_lock_pool.decrease('unsaved');
329 var doc = $.ajatus.forms.process.common(form_data);
331 if ($.ajatus.forms.process.has_errors) {
332 if ( typeof doc._id == 'undefined'
335 $.ajatus.views.system.create.render(doc.value._type, doc);
337 $.ajatus.views.system.edit.render(doc.value._type, doc, true);
342 $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
343 doc = new $.ajatus.document(doc);
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])
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);
362 $.ajatus.events.named_lock_pool.decrease('unsaved');
364 if (typeof callback == 'function') {
365 callback.apply(callback, [doc]);