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 || {};
18 $.ajatus.preferences = {
23 $.ajatus.preferences.local = {};
24 $.ajatus.preferences.local_defaults = {
27 email: 'root@ajatus.info'
35 theme_name: 'default',
54 $.ajatus.preferences.client = {};
55 $.ajatus.preferences.client_defaults = {
59 theme_url: 'themes/default/',
60 theme_icons_url: 'themes/default/images/icons/',
61 application_url: '/_utils/ajatus/',
62 application_database_identifier: '',
69 'note', 'contact', 'event', 'expense', 'hour_report'
80 developer_tools: false// ,
82 // expire: (24 * 60 * 60) // 24hrs in seconds
86 $.ajatus.preferences.loader = function() {
89 var on_success = function(data) {
92 $.ajatus.events.lock_pool.decrease();
93 $.ajatus.preferences.revision = data._rev;
95 $.ajatus.preferences.local = data.value;
96 $.each($.ajatus.preferences.local_defaults, function(i,n){
97 if (typeof $.ajatus.preferences.local[i] == 'undefined') {
98 $.ajatus.preferences.modified = true;
99 $.ajatus.preferences.local[i] = n;
101 if (typeof n == 'object') {
102 $.each(n, function(xi,xn){
103 if (typeof $.ajatus.preferences.local[i][xi] == 'undefined') {
104 $.ajatus.preferences.modified = true;
105 $.ajatus.preferences.local[i][xi] = xn;
114 this.dc = $.jqCouch.connection('doc', on_success);
116 $.extend($.ajatus.preferences.loader.prototype, {
118 $.ajatus.events.lock_pool.increase();
119 var data = this.dc.get($.ajatus.preferences.client.application_database + '/preferences');
122 $.ajatus.events.lock_pool.decrease();
123 $.ajatus.ajax_error(data.request);
128 $.ajatus.preferences.view = {
129 title: 'Preferences',
130 icon: 'preferences.png',
133 'user', 'localization', 'layout', 'replication', 'backups', 'expansions', 'auto_save'
137 on_click: function(e)
139 $.ajatus.tabs.on_click(e);
140 $.ajatus.preferences.view.render();
145 $.ajatus.application_content_area.html('');
146 $.ajatus.layout.body.set_class('preferences');
147 $.ajatus.views.on_change("#view.preferences");
149 $.ajatus.toolbar.show();
151 var form = $('<form name="preferences" id="preferences_form"/>');
152 form.appendTo($.ajatus.application_content_area);
156 _rev: $.ajatus.preferences.revision
158 var hidden_fields = function() {
160 'input', { type: 'hidden', id: 'preferences_id', name: '_id', value: this._id }, '',
161 'input', { type: 'hidden', id: 'preferences_revision', name: '_rev', value: this._rev }, ''
164 $(form).tplAppend(hidden_data, hidden_fields);
166 var form_actions = $('<div class="form_actions"><input type="submit" name="save" value="' + $.ajatus.i10n.get('Save') + '" /><input type="submit" name="cancel" value="' + $.ajatus.i10n.get('Cancel') + '" /></div>');
168 var sections_holder = $('<div id="preference_sections" />');
169 sections_holder.appendTo(form);
171 $.each($.ajatus.preferences.view.sections, function(i,s){
172 var section_holder = $('<div class="section" id="section_' + s + '" />');
173 section_holder.appendTo(sections_holder);
175 var form_items = $.ajatus.preferences.view.generate_section_form(s);
178 var normalized_title = s.toString().replace('_', ' ');
179 var title = $('<h3 />').html($.ajatus.i10n.get(normalized_title));
180 title.appendTo(section_holder);
182 form_items.appendTo(section_holder);
186 form_actions.appendTo(form);
188 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Save'), 'save.png', function(){
189 $('#preferences_form input[@type=submit][name*=save]').trigger("click", []);
191 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Cancel'), 'cancel.png', function(){
192 $('#preferences_form input[@type=submit][name*=cancel]').trigger("click", []);
195 $.ajatus.forms.register.custom(form, '$.ajatus.preferences.view.process_form');
198 process_form: function(form_data, form) {
199 // $.ajatus.debug('Process preferences');
200 // console.log(form_data);
207 var form_values = {};
210 $.each(form_data, function(i,row){
211 if (row.name.toString().match(/__(.*?)/)) {
214 if ( row.name == '_id'
215 && ( row.value != undefined
218 doc['_id'] = String(row.value);
219 form_id = doc['_id'];
221 else if( row.name == '_rev'
222 && ( typeof row.value != "undefined"
225 doc['_rev'] = String(row.value);
227 if (row.name != 'submit') {
228 if (row.name == '_type') {
230 else if ( row.name.substr(0,6) != "widget"
231 && row.name.substr(0,8) != "metadata")
235 var prev_val = false;
237 var name_parts_count = 0;
238 if (row.name.toString().match(/;/g)) {
239 name_parts = row.name.toString().split(";");
240 name_parts_count = name_parts.length;
243 $.each(form_data, function(x,r){
244 if (r.name == 'widget['+row.name+':name]') {
245 widget['name'] = r.value;
246 } else if (r.name == 'widget['+row.name+':config]') {
247 widget['config'] = $.ajatus.converter.parseJSON(r.value);
248 } else if (r.name == 'widget['+row.name+':prev_val]') {
249 prev_val = $.ajatus.converter.parseJSON(r.value);
253 var wdgt = new $.ajatus.widget(widget['name'], widget['config']);
254 item['val'] = wdgt.value_on_save(row.value, prev_val);
255 item['widget'] = widget;
257 if (name_parts_count > 0) {
259 for (var i=0; i < name_parts_count; i++) {
260 var arr_keys = false;
263 if (name_parts[i].match(/\[/g)) {
264 var arr_keys = name_parts[i].split('[');
266 name_parts[i] = name_parts[i].replace(/\[/g, '"][');
267 var key = '["'+name_parts[i];
269 var key = "['"+name_parts[i]+"']";
272 if (prevs.length > 0) {
273 $.each(prevs, function(pi, pk){
274 key_prefix = "['" + pk + "']" + key_prefix;
276 key = key_prefix + key;
280 var tmp_key = key_prefix + "['" + arr_keys[0] + "']";
281 if (typeof eval("form_values"+tmp_key) == 'undefined') {
282 eval("form_values"+tmp_key+"=[];");
286 var multiple = false;
287 if (typeof eval("form_values"+key) == 'undefined') {
288 if (key_prefix != '') {
289 eval("form_values"+key+"=new Array();");
291 eval("form_values"+key+"={};");
297 prevs.push(name_parts[i]);
298 if (i == name_parts_count-1) {
299 if (typeof item['val'] == 'undefined') {
303 if (typeof item == 'object') {
304 // eval("form_values"+key+".push('"+item.toSource()+"');");
305 if (item.widget.name == 'boolean') {
306 eval("form_values"+key+"="+item.val+";");
308 eval("form_values"+key+".push('"+item.val+"');");
311 eval("form_values"+key+".push('"+item+"');");
314 if (typeof item == 'object') {
315 eval("form_values"+key+"='"+item.val+"';");
317 eval("form_values"+key+"='"+item.val+"';");
323 form_values[row.name] = item;
326 else if (row.name.substr(0,8) == "metadata")
328 if (! form_values['metadata']) {
329 form_values['metadata'] = {};
332 var re = /\bmetadata\[([a-z]+)\b/;
333 var results = re.exec(row.name);
334 var key = results[1];
336 form_values['metadata'][key] = {
343 doc['value'] = form_values;
345 doc = new $.ajatus.document(doc);
347 $.ajatus.preferences.view.save(doc.value);
350 save: function(preferences) {
353 var on_success = function(data) {
355 $.ajatus.preferences.revision = data.rev;
356 $.ajatus.events.named_lock_pool.decrease('unsaved');
357 window.location.reload();
362 prefs_doc = new $.ajatus.document({
364 _rev: $.ajatus.preferences.revision,
367 prefs_doc.value._type = 'preferences';
370 revised: $.ajatus.formatter.date.js_to_iso8601(new Date()),
371 revisor: $.ajatus.preferences.local.user.email
373 prefs_doc = $.ajatus.document.modify_metadata(prefs_doc, new_metadata);
376 metadata: prefs_doc.value.metadata
378 $.each($.ajatus.preferences.local_defaults, function(k,data){
379 if (typeof prefs[k] == 'undefined') {
383 if (typeof data == 'object') {
384 $.each(data, function(sk, sdata){
385 if (typeof prefs_doc.value[k] == 'undefined') {
386 prefs[k][sk] = sdata;
388 if (typeof prefs_doc.value[k][sk] == 'undefined') {
389 prefs[k][sk] = sdata;
391 if (typeof prefs_doc.value[k][sk]['val'] == 'undefined') {
392 prefs[k][sk] = prefs_doc.value[k][sk];
394 prefs[k][sk] = prefs_doc.value[k][sk].val;
400 if (typeof prefs_doc.value[k] == 'undefined') {
403 if (typeof prefs_doc.value[k]['val'] == 'undefined') {
404 prefs[k] = prefs_doc.value[k];
406 prefs[k] = prefs_doc.value[k].val;
412 prefs_doc.value = prefs;
414 $.jqCouch.connection('doc', on_success).save($.ajatus.preferences.client.application_database, prefs_doc);
419 generate_section_form: function(section) {
420 if (typeof $.ajatus.preferences.local[section] == 'undefined') {
425 var section_data = $.ajatus.preferences.local[section];
427 function auto_gen(section, data) {
428 var rows = $('<ul/>');
430 $.each(data, function(i,s){
431 // console.log("i: "+i+" s: ");
433 var s_type = typeof(s);
434 // console.log('type: '+s_type);
436 var normalized_name = i.toString().replace('_', ' ');
440 wdgt = $.ajatus.widget('boolean');
443 wdgt = $.ajatus.widget('integer');
447 wdgt = $.ajatus.widget('text');
451 'li', { id: '_setting_'+section+'_'+i, className: 'row' }, [
452 'label', { id: '_setting_'+section+'_'+i+'_label' }, $.ajatus.i10n.get(normalized_name),
453 'div', { id: '_setting_'+section+'_'+i+'_widget', className: wdgt.name }, wdgt.get_edit_tpl(section+';'+i, {val: s}),
454 'br', { className: 'clear_fix' }, ''
457 wdgt.init($('#_setting_'+i+'_widget',rows), true);
460 $('li:first', rows).addClass('first');
461 $('li:last', rows).addClass('last');
466 function gen_localization(data) {
467 var rows = $('<ul/>');
468 var langs = $.ajatus.i10n.get_available_langs();
471 $.each(langs, function(i,l) {
475 wdgt = $.ajatus.widget('selection', {
479 'li', { id: '_setting_localization_language', className: 'row' }, [
480 'label', { id: '_setting_localization_language_label' }, $.ajatus.i10n.get('Language'),
481 'div', { id: '_setting_localization_language_widget', className: wdgt.name }, wdgt.get_edit_tpl('localization;language', {val: data.language}),
482 'br', { className: 'clear_fix' }, ''
485 wdgt.init($('#_setting_localization_language_widget',rows), true);
490 function gen_layout(data) {
491 var rows = $('<ul/>');
492 var themes = $.ajatus.preferences.client.themes.available;
495 $.each(themes, function(i,l) {
496 theme_opts[i] = $.ajatus.i10n.get(l);
499 wdgt = $.ajatus.widget('selection', {
503 'li', { id: '_setting_layout_theme_name', className: 'row' }, [
504 'label', { id: '_setting_layout_theme_name_label' }, $.ajatus.i10n.get('Theme'),
505 'div', { id: '_setting_layout_theme_name_widget', className: wdgt.name }, wdgt.get_edit_tpl('layout;theme_name', {val: data.theme_name}),
506 'br', { className: 'clear_fix' }, ''
509 wdgt.init($('#_setting_layout_theme_name_widget', rows), true);
514 function gen_autosave(data) {
515 var rows = $('<ul/>');
516 var section = 'auto_save';
518 $.each(data, function(i,s){
519 // console.log("i: "+i+" s: ");
521 var s_type = typeof(s);
522 // console.log('type: '+s_type);
524 var normalized_name = i.toString().replace('_', ' ');
528 wdgt = $.ajatus.widget('boolean');
531 wdgt = $.ajatus.widget('integer',{
536 wdgt = $.ajatus.widget('text');
540 'li', { id: '_setting_'+section+'_'+i, className: 'row' }, [
541 'label', { id: '_setting_'+section+'_'+i+'_label' }, $.ajatus.i10n.get(normalized_name),
542 'div', { id: '_setting_'+section+'_'+i+'_widget', className: wdgt.name }, wdgt.get_edit_tpl(section+';'+i, {val: s}),
543 'br', { className: 'clear_fix' }, ''
546 wdgt.init($('#_setting_'+i+'_widget',rows), true);
549 $('li:first', rows).addClass('first');
550 $('li:last', rows).addClass('last');
555 // Example how to handle arrays with checkboxes
556 // function gen_types(data) {
557 // var rows = $('<ul />');
559 // $.each($.ajatus.types.available, function(key,type){
560 // // console.log("key: "+key);
561 // // console.log(type);
563 // var selected = false;
564 // $.each(data.active, function(i,t){
570 // var widget = new $.ajatus.widget('boolean', {
574 // rows.createAppend(
575 // 'li', { id: '_setting_types_active_'+key, className: 'row' }, [
576 // 'label', { id: '_setting_types_active_'+key+'_label' }, $.ajatus.i10n.get(type.title),
577 // 'div', { id: '_setting_types_active_'+key+'_widget', className: widget.name }, widget.get_edit_tpl('types;active', {val: (selected ? key : '')}), //["'+key+'"]
578 // 'br', { className: 'clear_fix' }, ''
581 // widget.init($('#_setting_types_active_'+key+'_widget',rows), true);
589 items = gen_localization(section_data);
592 items = gen_layout(section_data);
595 items = gen_autosave(section_data);
602 items = auto_gen(section, section_data);