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 = undefined;
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]') {
186 prev_val = $.ajatus.converter.parseJSON(r.value);
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);
197 var wdgt = new $.ajatus.widget(widget['name'], widget['config']);
199 if (typeof widget['required'] != 'undefined') {
200 wdgt.required = widget['required'];
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;
211 if (name_parts_count > 0) {
214 $.each(form_data, function(x,r){
216 if (r.name.toString().match(/\|/g)) {
217 // console.log(r.name+" matches with |");
218 np = r.name.toString().split("|");
220 if (np[0] == name_parts[0]) {
221 if (typeof row_val[np[1]] == 'undefined') {
222 row_val[np[1]] = r.value;
228 parted_names_done.push(name_parts[0]);
230 item['val'] = wdgt.value_on_save(row_val, prev_val, true);
232 item['val'] = wdgt.value_on_save(row.value, prev_val, false);
235 if (typeof prev_val != 'undefined') {
236 if (wdgt.has_data_changed(item['val'], prev_val)) {
237 changed_values_count += 1;
241 item['widget'] = widget;
244 item['additional'] = true;
245 if (additionals == false) {
248 additionals[row_key] = additional;
251 form_values[row_key] = item;
253 else if (row.name.substr(0,8) == "metadata")
255 if (typeof form_values['metadata'] == 'undefined') {
256 form_values['metadata'] = {};
259 var re = /\bmetadata\[([a-z]+)\b/;
260 var results = re.exec(row.name);
261 var key = results[1];
263 form_values['metadata'][key] = {
272 form_values['_additionals'] = additionals;
275 doc['value'] = form_values;
277 doc = new $.ajatus.document(doc);
279 var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
283 revisor: $.ajatus.preferences.local.user.email
285 if ( typeof doc._id == 'undefined'
288 new_metadata['created'] = now;
289 new_metadata['creator'] = $.ajatus.preferences.local.user.email;
292 $.ajatus.forms.process.doc = $.ajatus.document.modify_metadata(doc, new_metadata);
294 if ( prev_values_count > 0
295 && changed_values_count == 0)
297 $.ajatus.forms.process.has_errors = true;
300 return $.ajatus.forms.process.doc;
302 normal: function(form_data) {
303 $.ajatus.events.named_lock_pool.decrease('unsaved');
305 var doc = $.ajatus.forms.process.common(form_data);
307 if ($.ajatus.forms.process.has_errors) {
308 if ( typeof doc._id == 'undefined'
311 $.ajatus.views.system.create.render(doc.value._type, doc);
313 $.ajatus.views.system.edit.render(doc.value._type, doc, true);
318 $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
319 doc = new $.ajatus.document(doc);
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])
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);
338 $.ajatus.events.named_lock_pool.decrease('unsaved');
340 if (typeof callback == 'function') {
341 callback.apply(callback, [doc]);