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, {
23 normal: function(form) {
24 $.ajatus.events.named_lock_pool.increase('unsaved');
25 $.ajatus.forms.active = form;
28 jqform.bind('submit',function(e){
32 $('input[@type=submit][name*=save]', jqform).bind('click', function(){
33 var status = $.ajatus.forms.process.normal(jqform.formToArray(false));
35 $.ajatus.forms.active = false;
39 $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
40 $.ajatus.history.navigate(-1);
42 $.ajatus.forms.active = false;
46 ajax: function(form, callback) {
47 if (typeof callback == 'undefined') {
48 $.ajatus.forms.register.normal(form);
51 $.ajatus.events.named_lock_pool.increase('unsaved');
52 $.ajatus.forms.active = form;
55 jqform.bind('submit',function(e){
59 $('input[@type=submit][name*=save]', jqform).bind('click', function(){
60 $.ajatus.forms.process.ajax(jqform.formToArray(false), callback);
62 $.ajatus.forms.active = false;
65 $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
66 $.ajatus.history.navigate(-1);
68 $.ajatus.forms.active = false;
72 custom: function(form, save_func) {
73 if (typeof save_func == 'undefined') {
76 $.ajatus.events.named_lock_pool.increase('unsaved');
77 $.ajatus.forms.active = form;
80 jqform.bind('submit',function(e){
84 $('input[@type=submit][name*=save]', jqform).bind('click', function(){
86 if (typeof save_func == 'string') {
89 fn.apply(fn, [jqform.formToArray(false), form]);
91 $.ajatus.forms.active = false;
94 $('input[@type=submit][name*=cancel]', jqform).bind('click', function(){
95 $.ajatus.history.navigate(-1);
97 $.ajatus.forms.active = false;
107 common: function(form_data) {
108 $.ajatus.forms.process.has_errors = false;
109 $.ajatus.forms.process.error_fields = {};
116 var form_values = {};
118 var doc_type = 'note';
119 var additionals = false;
121 var parted_names_done = [];
123 var prev_values_count = 0;
124 var changed_values_count = 0;
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(/__(.*?)/)) {
131 if ( row.name == '_id'
132 && ( typeof row.value != 'undefined'
135 doc['_id'] = String(row.value);
136 form_id = doc['_id'];
138 else if( row.name == '_rev'
139 && ( typeof row.value != 'undefined'
142 doc['_rev'] = String(row.value);
144 else if( row.name == '_additionals'
145 && ( typeof row.value != 'undefined'
148 additionals = $.ajatus.converter.parseJSON(row.value);
150 if (row.name != 'submit') {
151 if (row.name == '_type') {
152 doc_type = row.value;
153 form_values[row.name] = row.value;
155 else if ( row.name.substr(0,6) != "widget"
156 && row.name.substr(0,8) != "metadata")
160 var prev_val = false;
161 var additional = false;
162 var row_key = row.name;
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;
170 if ($.inArray(name_parts[0], parted_names_done) != -1) {
174 row_key = name_parts[0];
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);
193 var wdgt = new $.ajatus.widget(widget['name'], widget['config']);
195 if (typeof widget['required'] != 'undefined') {
196 wdgt.required = widget['required'];
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;
207 if (name_parts_count > 0) {
210 $.each(form_data, function(x,r){
212 if (r.name.toString().match(/\|/g)) {
213 // console.log(r.name+" matches with |");
214 np = r.name.toString().split("|");
216 if (np[0] == name_parts[0]) {
217 if (typeof row_val[np[1]] == 'undefined') {
218 row_val[np[1]] = r.value;
224 parted_names_done.push(name_parts[0]);
226 item['val'] = wdgt.value_on_save(row_val, prev_val, true);
228 item['val'] = wdgt.value_on_save(row.value, prev_val, false);
232 if (wdgt.has_data_changed(item['val'], prev_val)) {
233 changed_values_count += 1;
237 item['widget'] = widget;
240 item['additional'] = true;
241 if (additionals == false) {
244 additionals[row_key] = additional;
247 form_values[row_key] = item;
249 else if (row.name.substr(0,8) == "metadata")
251 if (typeof form_values['metadata'] == 'undefined') {
252 form_values['metadata'] = {};
255 var re = /\bmetadata\[([a-z]+)\b/;
256 var results = re.exec(row.name);
257 var key = results[1];
259 form_values['metadata'][key] = {
268 form_values['_additionals'] = additionals;
271 doc['value'] = form_values;
273 doc = new $.ajatus.document(doc);
275 var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
279 revisor: $.ajatus.preferences.local.user.email
281 if ( typeof doc._id == 'undefined'
284 new_metadata['created'] = now;
285 new_metadata['creator'] = $.ajatus.preferences.local.user.email;
288 $.ajatus.forms.process.doc = $.ajatus.document.modify_metadata(doc, new_metadata);
290 if ( prev_values_count > 0
291 && changed_values_count == 0)
293 $.ajatus.forms.process.has_errors = true;
296 return $.ajatus.forms.process.doc;
298 normal: function(form_data) {
299 $.ajatus.events.named_lock_pool.decrease('unsaved');
301 var doc = $.ajatus.forms.process.common(form_data);
303 if ($.ajatus.forms.process.has_errors) {
304 if ( typeof doc._id == 'undefined'
307 $.ajatus.views.system.create.render(doc.value._type, doc);
309 $.ajatus.views.system.edit.render(doc.value._type, doc, true);
314 $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
315 doc = new $.ajatus.document(doc);
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])
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);
334 $.ajatus.events.named_lock_pool.decrease('unsaved');
336 if (typeof callback == 'function') {
337 callback.apply(callback, [doc]);