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();
44 $.ajatus.tags.used_contexts = [];
45 $.ajatus.tags.cache = [];
47 var legacy_tags_db = $.ajatus.preferences.client.application_database + '_tags';
48 if ($.jqCouch.connection('db').exists(legacy_tags_db)) {
49 $.ajatus.events.lock_pool.increase();
51 var on_success = function(data) {
52 if (data.total_rows == 0) {
56 $.each(data.rows, function(i,doc){
57 var doc = new $.ajatus.document(doc);
58 if (! $.ajatus.tags.exists(doc.value.title.val, doc.value.title.widget.config.context, doc.value.title.widget.config.value)) {
59 $.jqCouch.connection('doc').save($.ajatus.preferences.client.content_database, doc);
64 var list_map = function(doc) {
65 if ( doc.value.metadata.archived.val != false
66 && doc.value.metadata.deleted.val != false)
71 $.jqCouch.connection('view', on_success).temp(legacy_tags_db, list_map);
73 $.jqCouch.connection('db').del(legacy_tags_db);
74 $.ajatus.events.lock_pool.decrease();
77 var on_success = function(data) {
78 if (data.total_rows <= 0) {
82 $.each(data.rows, function(i,n){
83 if ( typeof(n.value.title.widget.config['context']) != 'undefined'
84 && n.value.title.widget.config['context'] != '')
86 var found = $.inArray(n.value.title.widget.config['context'], $.ajatus.tags.used_contexts);
88 $.ajatus.tags.used_contexts.push(n.value.title.widget.config['context']);
91 $.ajatus.tags.cache.push(n);
97 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, function(doc){
98 if ( doc.value._type == 'tag'
99 && doc.value.metadata.archived.val == false
100 && doc.value.metadata.deleted.val == false)
102 map(doc._id, doc.value);
106 refresh_cache: function() {
107 $.ajatus.tags.load();
108 $.ajatus.tags.update_cache();
110 update_cache: function() {
111 $.ajatus.tags.update_app_tag_list();
112 if ($.ajatus.tags.active != '') {
113 $.ajatus.tags.set_active($.ajatus.tags.active);
116 set_active: function(id) {
117 var select = $('#application-tags select');
118 $('option', select).each(function(i,o){
120 o.selected = 'selected';
125 $.ajatus.tags.active = '';
129 var tag = $.ajatus.tags.get(id);
131 $.ajatus.tags.active = tag;
134 update_app_tag_list: function() {
135 var select = $('#application-tags select');
139 var def_opt_grp = $('<optgroup label="' + $.ajatus.i10n.get('No context') + '" />');
140 def_opt_grp.appendTo(select);
142 $.each($.ajatus.tags.used_contexts, function(i){
143 var opt_grp = $('<optgroup label="' + this + '" />');
144 opt_grp.prependTo(select);
145 opt_groups[this] = opt_grp;
148 $.each($.ajatus.tags.cache, function(i){
149 var opt = $('<option>'+this.value.title.val+'</option>').attr({
153 if ( typeof(this.value.title.widget.config['context']) != 'undefined'
154 && this.value.title.widget.config['context'] != '')
156 var context = this.value.title.widget.config.context;
157 opt.appendTo(opt_groups[context]);
159 opt.appendTo(def_opt_grp);
163 var def = $('<option />').attr({
166 }).html($.ajatus.i10n.get('Global Tag') + ' ');
167 def.prependTo(select);
168 select.bind('change', function(e){
169 $.ajatus.tags.set_active(e.currentTarget.value);
172 search: function(query, context, max_res) {
173 // console.log("Search tags with: "+query);
176 var context_key = false;
178 if (typeof max_res != 'number') {
182 query = $.ajatus.tags._prepare_query(query);
184 var on_success = function(data) {
185 if (data.total_rows == 0) {
189 $.each(data.rows, function(i,n){
190 var doc = new $.ajatus.document(n);
197 var rel_view = 'if (doc.value._type == "tag" ';
198 rel_view += '&& doc.value.title.val.match(/\\\\b'+query+'(.*?)\\\\b/) ';
199 if ( typeof context != 'undefined'
202 rel_view += '&& typeof(doc.value.title.widget.config["context"]) != "undefined" ';
203 rel_view += '&& doc.value.title.widget.config.context == "+context+" ';
205 rel_view += '&& doc.value.metadata.archived.val == "" && doc.value.metadata.deleted.val != 1){';
206 rel_view += 'map( doc._id, doc.value );}';
208 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database,
209 "$.ajatus.views.generate('"+rel_view+"')", {
216 search_cache: function(query, context, max_res) {
217 // console.log("Search tags cache with: "+query);
219 if (typeof max_res != 'number') {
224 query = $.ajatus.tags._prepare_query(query);
225 var re = new RegExp("\\b"+query+"(.*?)\\b");
227 $.each($.ajatus.tags.cache, function(i, tag){
228 if (results.length > max_res) {
232 if (tag.value.title.val.toString().match(re)) {
233 if ( typeof context != 'undefined'
236 if ( typeof(tag.value.title.widget.config['context']) != 'undefined'
237 && tag.value.title.widget.config['context'] == context)
249 _prepare_query: function(query) {
250 query = query.replace(/[\(|\)|\.|\?|\;|\/]/, '');
251 query = query.replace('\\', '');
252 query = query.replace('*', '(.*?)');
256 get: function(tag, rev, skip_cache, callback) {
258 if (typeof skip_cache == 'undefined') {
259 var skip_cache = false;
262 if ( typeof rev == 'undefined'
265 $.each($.ajatus.tags.cache, function(i,t){
276 var on_success = function(data) {
277 var doc = new $.ajatus.document(data);
280 if (typeof callback == 'function') {
281 var fn = eval('('+callback+')');
282 fn.apply(fn, [result]);
289 if (typeof rev != 'undefined') {
293 $.jqCouch.connection('doc', on_success).get($.ajatus.preferences.client.content_database + '/' + tag, args);
297 exists: function(tag, context, value) {
301 $.each($.ajatus.tags.cache, function(i,t){
302 if (t.value.title.val == tag) {
305 if ( typeof context != 'undefined'
308 if (t.value.title.widget.config.context == context) {
315 if ( typeof value != 'undefined'
318 if (t.value.title.widget.config.value == value) {
329 create: function(name, data, dc) {
330 if (typeof data == 'undefined') {
337 if (typeof data == 'string') {
345 var color = data.color;
346 var context = data.context;
347 var value = data.value;
349 if ($.ajatus.tags.exists(name, context, value)) {
353 if (typeof dc == 'undefined') {
354 var on_success = function(data) {
356 var msg = $.ajatus.elements.messages.create(
357 $.ajatus.i10n.get('New tag created'),
358 $.ajatus.i10n.get("Created new tag '%s'", [data.value.title.val])
361 $.ajatus.debug("saved tag: "+data.id);
363 var tag = $.ajatus.tags.get(data.id, data.rev, true);
364 $.ajatus.tags.cache.push(tag);
370 var dc = $.jqCouch.connection('doc', on_success);
371 $.ajatus.views.on_change_actions.add('$.ajatus.tags.update_cache();');
382 color: (color || '8596b6'),
383 context: (context || ''),
390 tag = new $.ajatus.document(tag);
392 var now = $.ajatus.formatter.date.js_to_iso8601(new Date());
395 creator: $.ajatus.preferences.local.user.email,
397 revisor: $.ajatus.preferences.local.user.email
399 tag = $.ajatus.document.modify_metadata(tag, new_metadata);
400 dc.save($.ajatus.preferences.client.content_database, tag);
404 remove: function(tag, dc) {
405 if (typeof dc == 'undefined') {
406 var on_success = function(data) {
407 var msg = $.ajatus.elements.messages.create(
408 $.ajatus.i10n.get('Object deleted'),
409 $.ajatus.i10n.get('Tag %s removed from Ajatus.', [tag.value.title.val])
412 var dc = $.jqCouch.connection('doc', on_success);
415 dc.del($.ajatus.preferences.client.content_database + '/' + tag.id);
417 related: function(tags, skip_docs) {
420 if (typeof skip_docs != 'object') {
424 var on_success = function(data) {
425 if (data.total_rows == 0) {
429 $.each(data.rows, function(i,n){
430 if ($.ajatus.utils.array.has_match(tags, n.value.tags.val)) {
431 if (skip_docs.length > 0) {
432 if ($.inArray(n.id, skip_docs) == -1) {
433 var doc = new $.ajatus.document(n);
437 var doc = new $.ajatus.document(n);
446 var rel_view = 'if (typeof(doc.value.tags) != "undefined" && doc.value.tags.val.length > 0 ';
447 rel_view += '&& doc.value.metadata.archived.val == "" && doc.value.metadata.deleted.val != 1){';
448 rel_view += 'map( doc.value._type, {"_id": doc._id, "_rev": doc._rev, "_type": doc.value._type,';
449 rel_view += '"title": doc.value.title,';
451 $.each($.ajatus.preferences.client.content_types, function(key,type){
452 if (type['title_item']) {
453 $.each(type['title_item'], function(i,part){
454 if (type.schema[part]) {
455 rel_view += '"'+part+'": doc.value.'+part+',';
461 rel_view += '"tags": doc.value.tags })}';
463 $.jqCouch.connection('view', on_success).temp($.ajatus.preferences.client.content_database, "$.ajatus.views.generate('"+rel_view+"')");