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 || {};
19 * Holds all tag methods
20 * @accessor {String} cache Holds all cached tag names
21 * @accessor {String} active Currently active tag name
29 $.extend($.ajatus.tags, {
32 * Initializes the tags
33 * @see ajatus.core.init
34 * @see ajatus.tags.load
35 * @see ajatus.tags.update_app_tag_list
38 $.ajatus.events.lock_pool.increase();
40 $.ajatus.events.lock_pool.decrease();
41 $.ajatus.tags.update_app_tag_list();
42 $.ajatus.tags.get_active();
45 $.ajatus.tags.used_contexts = [];
46 $.ajatus.tags.cache = [];
48 var legacy_tags_db = $.ajatus.preferences.client.application_database + '_tags';
49 if ($.jqCouch.connection('db').exists(legacy_tags_db)) {
50 $.ajatus.events.lock_pool.increase();
52 var on_success = function(data) {
53 if (data.total_rows == 0) {
57 $.each(data.rows, function(i,doc){
58 var doc = new $.ajatus.document(doc);
59 if (! $.ajatus.tags.exists(doc.value.title.val, doc.value.title.widget.config.context, doc.value.title.widget.config.value)) {
64 val: doc.value.title.val,
68 color: (doc.value.title.widget.config.color || '8596b6'),
69 context: (doc.value.title.widget.config.context || ''),
70 value: (doc.value.title.widget.config.value || '')
76 tag.value.metadata = doc.value.metadata;
77 $.jqCouch.connection('doc').post($.ajatus.preferences.client.content_database, tag);
82 var list_map = function(doc) {
83 if ( doc.value.metadata.archived.val != false
84 && doc.value.metadata.deleted.val != false)
89 $.jqCouch.connection('view', on_success).temp(legacy_tags_db, list_map);
91 $.jqCouch.connection('db').del(legacy_tags_db);
92 $.ajatus.events.lock_pool.decrease();
95 var on_success = function(data) {
96 if (data.total_rows <= 0) {
100 $.each(data.rows, function(i,n){
101 if ( typeof(n.value.title.widget.config['context']) != 'undefined'
102 && n.value.title.widget.config['context'] != '')
104 var found = $.inArray(n.value.title.widget.config['context'], $.ajatus.tags.used_contexts);
106 $.ajatus.tags.used_contexts.push(n.value.title.widget.config['context']);
109 $.ajatus.tags.cache.push(n);
115 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, function(doc){
116 if ( doc.value._type == 'tag'
117 && doc.value.metadata.archived.val == false
118 && doc.value.metadata.deleted.val == false)
120 map(doc._id, doc.value);
124 refresh_cache: function() {
125 $.ajatus.tags.load();
126 $.ajatus.tags.update_cache();
128 update_cache: function() {
129 $.ajatus.tags.update_app_tag_list();
130 if ($.ajatus.tags.active != '') {
131 $.ajatus.tags.set_active($.ajatus.tags.active);
134 set_active: function(active) {
136 if (typeof active == 'object') {
137 id = active.id || active._id;
139 $.cookie("ajatus.tags.active", active);
140 window.location.reload();
141 // $.ajatus.tags.get_active();
143 get_active: function() {
144 var id = $.cookie("ajatus.tags.active");
146 if ( typeof id == 'undefined'
153 var select = $('#application-tags select');
154 $('option', select).each(function(i,o){
156 o.selected = 'selected';
161 $.ajatus.tags.active = '';
165 var tag = $.ajatus.tags.get(id);
167 $.ajatus.tags.active = tag;
168 $.ajatus.events.signals.trigger('active_tag_changed', $.ajatus.tags.active);
171 update_app_tag_list: function() {
172 var select = $('#application-tags select');
176 var def_opt_grp = $('<optgroup label="' + $.ajatus.i10n.get('No context') + '" />');
177 def_opt_grp.appendTo(select);
179 $.each($.ajatus.tags.used_contexts, function(i){
180 var opt_grp = $('<optgroup label="' + this + '" />');
181 opt_grp.prependTo(select);
182 opt_groups[this] = opt_grp;
185 $.each($.ajatus.tags.cache, function(i){
186 var title = this.value.title.val;
187 if ( typeof this.value.title.widget.config.value != 'undefined'
188 && this.value.title.widget.config.value != '')
190 title += " = " + this.value.title.widget.config.value;
192 var opt = $('<option>'+title+'</option>').attr({
196 if ( typeof(this.value.title.widget.config['context']) != 'undefined'
197 && this.value.title.widget.config['context'] != '')
199 var context = this.value.title.widget.config.context;
200 opt.appendTo(opt_groups[context]);
202 opt.appendTo(def_opt_grp);
206 var def = $('<option />').attr({
209 }).html($.ajatus.i10n.get('Global Tag') + ' ');
210 def.prependTo(select);
212 select.bind('change', function(e){
213 $.ajatus.tags.set_active(e.currentTarget.value);
216 search: function(query, context, max_res) {
217 // console.log("Search tags with: "+query);
220 var context_key = false;
222 if (typeof max_res != 'number') {
226 query = $.ajatus.tags._prepare_query(query);
228 var on_success = function(data) {
229 if (data.total_rows == 0) {
233 $.each(data.rows, function(i,n){
234 var doc = new $.ajatus.document(n);
241 var rel_view = 'if (doc.value._type == "tag" ';
242 rel_view += '&& doc.value.title.val.match(/\\\\b'+query+'(.*?)\\\\b/i) ';
243 if ( typeof context != 'undefined'
246 rel_view += '&& typeof(doc.value.title.widget.config["context"]) != "undefined" ';
247 rel_view += '&& doc.value.title.widget.config.context == "+context+" ';
249 rel_view += '&& doc.value.metadata.archived.val == false && doc.value.metadata.deleted.val == false){';
250 rel_view += 'map( doc._id, doc.value );}';
252 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database,
253 "$.ajatus.views.generate('"+rel_view+"')", {
260 search_cache: function(query, context, max_res) {
261 // console.log("Search tags cache with: "+query);
263 if (typeof max_res != 'number') {
268 query = $.ajatus.tags._prepare_query(query);
269 var re = new RegExp(query+"(.*?)", "gi");
271 $.each($.ajatus.tags.cache, function(i, tag){
272 if (results.length > max_res) {
276 if (tag.value.title.val.toString().match(re)) {
277 if ( typeof context != 'undefined'
280 if ( typeof(tag.value.title.widget.config['context']) != 'undefined'
281 && tag.value.title.widget.config['context'] == context)
293 _prepare_query: function(query) {
294 query = query.replace(/[\(|\)|\.|\?|\;|\/]/, '');
295 query = query.replace('\\', '');
296 query = query.replace('*', '(.*?)');
300 get: function(tag, rev, skip_cache, callback) {
302 if (typeof skip_cache == 'undefined') {
303 var skip_cache = false;
306 if ( typeof rev == 'undefined'
309 $.each($.ajatus.tags.cache, function(i,t){
316 if (typeof callback == 'function') {
317 var fn = eval('('+callback+')');
318 fn.apply(fn, [result]);
325 var on_success = function(data) {
326 var doc = new $.ajatus.document(data);
330 if (typeof callback == 'function') {
331 var fn = eval('('+callback+')');
332 fn.apply(fn, [result]);
339 if (typeof rev != 'undefined') {
343 $.jqCouch.connection('doc', on_success).get($.ajatus.preferences.client.content_database + '/' + tag, args);
347 exists: function(tag, context, value) {
351 var match_tag_id = $.ajatus.utils.md5.encode(context + ':' + tag + '=' + value);
353 $.each($.ajatus.tags.cache, function(i,t){
354 if (t.id == match_tag_id) {
358 if (t.value.title.val == tag) {
361 if ( typeof context != 'undefined'
364 if (t.value.title.widget.config.context == context) {
371 if ( typeof value != 'undefined'
374 if (t.value.title.widget.config.value == value) {
386 create: function(name, data, dc) {
387 if (typeof data == 'undefined') {
394 if (typeof data == 'string') {
402 var color = data.color;
403 var context = data.context;
404 var value = data.value;
406 if ($.ajatus.tags.exists(name, context, value)) {
410 if (typeof dc == 'undefined') {
411 var on_success = function(data) {
413 var msg = $.ajatus.elements.messages.create(
414 $.ajatus.i10n.get('New tag created'),
415 $.ajatus.i10n.get("Created new tag '%s'", [data.value.title.val])
418 $.ajatus.debug("saved tag: "+data.id);
420 var tag = $.ajatus.tags.get(data.id, data.rev, true);
421 $.ajatus.tags.cache.push(tag);
427 var dc = $.jqCouch.connection('doc', on_success);
428 $.ajatus.views.on_change_actions.add('$.ajatus.tags.update_cache();');
431 var tag_id = $.ajatus.tags.calculate_hash(name, context, value);
442 color: (color || '8596b6'),
443 context: (context || ''),
450 tag = new $.ajatus.document(tag);
452 var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
455 creator: $.ajatus.preferences.local.user.email,
457 revisor: $.ajatus.preferences.local.user.email
459 tag = $.ajatus.document.modify_metadata(tag, new_metadata);
460 dc.save($.ajatus.preferences.client.content_database, tag);
464 remove: function(tag, dc) {
465 if (typeof dc == 'undefined') {
466 var on_success = function(data) {
467 var msg = $.ajatus.elements.messages.create(
468 $.ajatus.i10n.get('Object deleted'),
469 $.ajatus.i10n.get('Tag %s removed from Ajatus.', [tag.value.title.val])
472 var dc = $.jqCouch.connection('doc', on_success);
475 dc.del($.ajatus.preferences.client.content_database + '/' + tag.id);
477 related: function(tags, skip_docs) {
480 if (typeof skip_docs != 'object') {
484 if (tags.length == 0) {
488 var on_success = function(data) {
489 if (data.total_rows == 0) {
493 $.each(data.rows, function(i,row){
494 related.push(new $.ajatus.document(row));
500 var rel_view = 'if (typeof(doc.value.tags) != "undefined" && doc.value.tags.val.length > 0 ';
501 rel_view += '&& doc.value.metadata.archived.val == false && doc.value.metadata.deleted.val == false){';
503 if (skip_docs.length > 0) {
505 for (var i=0; i<skip_docs.length; i++) {
506 rel_view += 'doc._id != "'+skip_docs[i]+'" ';
507 if (i < skip_docs.length-1) {
514 rel_view += 'var hm = false;';
515 rel_view += 'for (var i=0;i<doc.value.tags.val.length;i++){';
517 for (var i=0; i<tags.length; i++) {
518 rel_view += 'doc.value.tags.val[i] == "'+tags[i]+'" ';
519 if (i < tags.length-1) {
524 rel_view += 'hm = true;}';
527 rel_view += 'if (hm) {';
529 rel_view += 'map( doc.value._type, {"_id": doc._id, "_rev": doc._rev, "_type": doc.value._type,';
530 rel_view += '"title": doc.value.title,';
532 $.each($.ajatus.preferences.client.content_types, function(key,type){
533 if (type['title_item']) {
534 $.each(type['title_item'], function(i,part){
535 if (type.schema[part]) {
536 rel_view += '"'+part+'": doc.value.'+part+',';
542 rel_view += '"tags": doc.value.tags });';
546 if (skip_docs.length > 0) {
552 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, "$.ajatus.views.generate('"+rel_view+"')");
556 render_title: function(tag) {
559 if (typeof tag.value == 'undefined') {
563 if ( typeof(tag.value.title.widget.config['context']) != 'undefined'
564 && tag.value.title.widget.config['context'] != '')
566 tag_title += tag.value.title.widget.config.context + ':';
569 tag_title += tag.value.title.val;
571 if ( typeof(tag.value.title.widget.config['value']) != 'undefined'
572 && tag.value.title.widget.config['value'] != '')
574 tag_title += '=' + tag.value.title.widget.config.value;
579 calculate_hash: function() { // tag / title, context, value
582 if (arguments.length == 1) {
583 var tag = arguments[0];
584 hash = $.ajatus.utils.md5.encode(tag.value.title.widget.config.context + ':' + tag.value.title.val + '=' + tag.value.title.widget.config.value);
586 var title = arguments[0];
589 if (arguments.length > 1) {
590 context = arguments[1];
592 if (arguments.length > 2) {
593 value = arguments[2];
596 hash = $.ajatus.utils.md5.encode(context + ':' + title + '=' + value);
601 validate_title: function(title) {
602 var context_key = '';
605 if ( !title.match(/:/)
606 && !title.match(/\=/))
611 if (title.match(/:/)) {
612 var tag_parts = title.split(':');
613 context_key = tag_parts[0];
614 title = tag_parts[1];
617 if (title.match(/\=/)) {
618 var tag_parts = title.split('=');
619 value = tag_parts[1];
620 title = tag_parts[0];
625 context: context_key,
633 $.ajatus.tags.merger = function(dubs, dubs_with, tags) {
634 this.merge_list = {};
635 this.merge_count = 0;
636 this.button_generated = false;
637 this.button_visible = false;
638 this.button_holder = null;
643 this.dub_tags_with = {};
645 this.init(dubs, dubs_with, tags);
647 $.extend($.ajatus.tags.merger.prototype, {
648 init: function(dubs, dubs_with, tags) {
649 this.all_tags = tags;
650 this.dub_tags = dubs;
651 this.dub_tags_with = dubs_with;
654 $.each(this.dub_tags, function(i,dub){
655 var row = $('#object_'+dub._id+'_duplicate');
656 row.bind('click', function(){
657 _self.toggle_selection($(this), dub._id, dub.value.real_hash.val);
661 add_to_list: function(real_hash, with_tag, source_tag, row) {
662 // console.log("add_to_list source_tag: "+source_tag+" with_tag: "+with_tag+" real_hash: "+real_hash);
664 // if (source_tag == with_tag) {
665 // this.remove_from_list(real_hash, with_tag, source_tag);
669 if (typeof this.dub_rows[with_tag] == 'undefined') {
670 this.dub_rows[with_tag] = row;
673 if (typeof this.merge_list[real_hash] == 'undefined') {
674 this.merge_list[real_hash] = [with_tag];
675 this.merge_count += 1;
677 this.merge_list[real_hash].push(with_tag);
680 this.merge_count += 1;
682 // console.log(this.merge_list);
687 remove_from_list: function(real_hash, with_tag, source_tag) {
688 // console.log("remove_from_list source_tag: "+source_tag+" with_tag: "+with_tag+" real_hash: "+real_hash);
690 this.merge_list[real_hash] = $.grep(this.merge_list[real_hash], function(n,i){
692 _self.merge_count -= 1;
698 if (this.merge_list[real_hash].length == 0) {
700 for (var hash in this.merge_list) {
701 if (hash != real_hash) {
702 tmp_list[hash] = this.merge_list[hash];
705 this.merge_list = tmp_list;
706 _self.merge_count -= 1;
709 // console.log(this.merge_list);
711 if (this.merge_count <= 0) {
715 merge_selections: function() {
718 var dialog = this._gen_dialog(this.merge_count);
721 var status_holder = $('.status_holder', dialog);
724 var row_failed = '<span class="status_failed">' + $.ajatus.i10n.get('failed').toUpperCase() + '</span><br />';
725 var row_ok = '<span class="status_ok">' + $.ajatus.i10n.get('ok').toUpperCase() + '</span><br />';
727 $.each(this.merge_list, function(hash, dubs){
729 var tag = _self.all_tags[hash];
730 var tag_title = '"' + $.ajatus.tags.render_title(tag) + '"';
732 row = $.ajatus.i10n.get('Merging tag %s', [tag_title]) + '... ';
733 status_holder.append(row);
736 if (_self._execute_merge(tag, dubs)) {
739 status_holder.append(row);
741 _self.toggle_selection(_self.dub_rows[dubs[0]], dubs[0], hash);
744 $('#submit_ok', dialog).show();
746 this._destroy_button();
749 toggle_selection: function(row, dub_id, real_hash) {
750 // console.log("toggle_selection dub_id: "+dub_id+" real_hash: "+real_hash);
752 // console.log("this.dub_tags_with["+real_hash+"]: "+this.dub_tags_with[real_hash].length);
753 // console.log(this.dub_tags_with[real_hash]);
755 if (row.hasClass('duplicate_row_autoselected')) {
759 var bg_color = "#73d216";
760 var fg_color = "#000";
762 var ohdrow = $('#object_'+real_hash);
764 row.toggleClass('duplicate_row_indicator');
765 if (row.hasClass('duplicate_row_indicator')) {
766 this.add_to_list(real_hash, dub_id, dub_id, row);
768 "backgroundColor": bg_color,
773 "backgroundColor": bg_color,
777 this.remove_from_list(real_hash, dub_id, dub_id);
779 "backgroundColor": "",
784 "backgroundColor": "",
789 var odrow = $('#object_'+dub_id).toggleClass('duplicate_row_indicator');
790 if (odrow.hasClass('duplicate_row_indicator')) {
792 "backgroundColor": bg_color,
797 "backgroundColor": "",
802 var dub_with_ids = this.dub_tags_with[real_hash];
804 for (var i=0; i<dub_with_ids.length; i++) {
805 if (dub_with_ids[i] == dub_id) {
808 var drow = $('#object_'+dub_with_ids[i]).toggleClass('duplicate_row_indicator');
809 if (drow.hasClass('duplicate_row_indicator')) {
811 "backgroundColor": bg_color,
816 "backgroundColor": "",
820 var drow2 = $('#object_'+dub_with_ids[i]+'_duplicate').toggleClass('duplicate_row_indicator').addClass('duplicate_row_autoselected');
821 if (drow2.hasClass('duplicate_row_indicator')) {
822 this.add_to_list(real_hash, dub_with_ids[i], dub_id, drow2);
824 "backgroundColor": bg_color,
828 this.remove_from_list(real_hash, dub_with_ids[i], dub_id);
829 drow2.removeClass('duplicate_row_autoselected');
831 "backgroundColor": "",
838 _gen_button: function() {
839 if (this.button_generated) {
845 this.button_holder = $('<div class="tag_merger_button_holder" />').hide();
846 var button = $('<div class="tag_merger_button" />').html($.ajatus.i10n.get('Merge selected!'));
848 button.bind('click', function(e){
849 _self.merge_selections();
852 button.appendTo(this.button_holder);
854 $.ajatus.application_dynamic_elements.append(this.button_holder);
856 this.button_generated = true;
858 _destroy_button: function() {
859 if (! this.button_generated) {
863 this.button_holder.remove();
864 this.button_generated = false;
865 this.button_visible = false;
867 _show_button: function() {
868 this.button_visible = true;
869 this.button_holder.show();
871 _hide_button: function() {
872 this.button_visible = false;
873 this.button_holder.hide();
876 _gen_dialog: function(total_merge_count) {
878 var dialog = new $.ajatus.elements.dialog($.ajatus.i10n.get('Merging %d tag', [total_merge_count]), '', {
884 var cholder = dialog.get_content_holder();
886 var status_holder = $('<div class="status_holder" />');
887 status_holder.appendTo(cholder);
889 var done_btn = $('<input type="submit" id="submit_ok" name="ok" value="' + $.ajatus.i10n.get('ok').toUpperCase() + '" />').hide();
891 done_btn.appendTo(cholder);
893 $('#submit_ok', cholder).bind('click', function(e){
901 _hide_rows_for: function(id) {
902 if (typeof this.dub_rows[id] != 'undefined') {
903 var row = this.dub_rows[id];
907 $('#object_'+id).hide();
908 $('#object_'+id+'_duplicate').hide();
911 _execute_merge: function(source_tag, targets) {
915 var on_success = function(data) {
918 $.each(data.rows, function(i,n){
922 items[n.key[0]].push(n);
929 for (var i=0; i<targets.length; i++) {
930 items[targets[i]] = [];
931 $.jqCouch.connection('view', on_success).get($.ajatus.preferences.client.content_database, 'tag/list_with_docs', {
932 startkey: [targets[i], 0],
933 endkey: [targets[i], 1]
937 var on_save_success = null;
939 $.each(items, function(hash, objs){
940 on_save_success = function(data) {
941 _self._hide_rows_for(hash);
946 if (objs.length > 0) {
947 for (var i=0; i<objs.length; i++) {
948 var doc = new $.ajatus.document($.jqCouch.connection('doc').get($.ajatus.preferences.client.content_database + '/' + objs[i].id));
950 doc.value.tags.val = $.grep(doc.value.tags.val, function(t,x){
956 doc.value.tags.val.push(source_tag._id);
958 doc = $.ajatus.document.modify_metadata(doc, {
959 revised: $.ajatus.formatter.date.js_to_iso8601(new Date()),
960 revisor: $.ajatus.preferences.local.user.email
963 $.jqCouch.connection('doc', on_save_success).save($.ajatus.preferences.client.content_database, doc);
966 _self._hide_rows_for(hash);
969 $.ajatus.document.actions.execute('delete', {
978 $.ajatus.tags.fixer = function(btags, bhashes, tags, settings) {
980 this.broken_tags = [];
981 this.broken_hashes = {};
983 this.settings = $.extend({
985 refresh_on_finish: false
986 }, (settings || {}));
988 this.init(btags, bhashes, tags);
990 $.extend($.ajatus.tags.fixer.prototype, {
991 init: function(btags, bhashes, tags) {
992 this.all_tags = tags;
993 this.broken_tags = btags;
994 this.broken_hashes = bhashes;
996 if (this.settings.show_toolbar) {
998 $.ajatus.toolbar.add_item($.ajatus.i10n.get('Fix all broken tags'), 'repair.png', function(){
1003 validate: function(curr_hash, data) {
1004 var hash = $.ajatus.tags.calculate_hash(data.title, data.context, data.value);
1005 if (curr_hash == hash) {
1011 fix_single: function(tag) {
1012 var is_valid = this.validate(tag._id, {
1013 title: tag.value.title.val,
1014 context: tag.value.title.widget.config.context,
1015 value: tag.value.title.widget.config.value
1022 var data = this._prepare_tag_data(tag.value.title);
1023 var hash = $.ajatus.tags.calculate_hash(data.title.val, data.title.widget.config.context, data.title.widget.config.value);
1025 var real_tag = this._create_real_tag(hash, data);
1027 var items = this._fetch_orig_items(tag._id);
1028 this._update_items(items, tag._id, hash);
1030 $.ajatus.document.actions.execute('delete_final', {
1036 fix_all: function() {
1038 $.each(this.broken_hashes, function(hash,ids){
1039 if (ids.length > 1) {
1040 var data = _self._prepare_tag_data(_self.broken_tags[ids[0]].value.title);
1041 var real_tag = _self._create_real_tag(hash, data);
1043 for (var i=0; i<ids.length; i++) {
1044 var items = _self._fetch_orig_items(ids[i]);
1045 _self._update_items(items, ids[i], hash);
1047 $.ajatus.document.actions.execute('delete', {
1053 var data = _self._prepare_tag_data(_self.broken_tags[ids[0]].value.title);
1054 var real_tag = _self._create_real_tag(hash, data);
1055 var items = _self._fetch_orig_items(ids[0]);
1056 _self._update_items(items, ids[0], hash);
1058 $.ajatus.document.actions.execute('delete', {
1064 window.location.reload();
1066 _update_items: function(items, old_hash, new_hash) {
1067 if (items.length > 0) {
1068 for (var i=0; i<items.length; i++) {
1069 var doc = new $.ajatus.document($.jqCouch.connection('doc').get($.ajatus.preferences.client.content_database + '/' + items[i].id));
1071 doc.value.tags.val = $.grep(doc.value.tags.val, function(t,x){
1072 if (t == old_hash) {
1077 doc.value.tags.val.push(new_hash);
1079 doc = $.ajatus.document.modify_metadata(doc, {
1080 revised: $.ajatus.formatter.date.js_to_iso8601(new Date()),
1081 revisor: $.ajatus.preferences.local.user.email
1084 $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
1088 _fetch_orig_items: function(id) {
1090 var on_success = function(data) {
1093 $.each(data.rows, function(i,n){
1094 if (n.key[1] == 1) {
1102 $.jqCouch.connection('view', on_success).get($.ajatus.preferences.client.content_database, 'tag/list_with_docs', {
1109 _prepare_tag_data: function(title_value) {
1111 var title_data = $.ajatus.tags.validate_title(title_value.val);
1112 if (typeof title_data == 'object') {
1113 title_value.val = title_data.title;
1114 title_value.widget.config.context = title_data.context;
1115 title_value.widget.config.value = title_data.value;
1124 _create_real_tag: function(hash, data) {
1129 doc = new $.ajatus.document(doc);
1130 var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
1131 var new_metadata = {
1133 revisor: $.ajatus.preferences.local.user.email,
1135 creator: $.ajatus.preferences.local.user.email
1137 doc = $.ajatus.document.modify_metadata(doc, new_metadata);
1139 $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
1140 doc = new $.ajatus.document(doc);