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 || {};
17 $.ajatus.widgets = $.ajatus.widgets || {};
18 $.ajatus.widgets.core = typeof($.ajatus.widgets.core) == 'undefined' ? {} : $.ajatus.widgets.core;
20 $.ajatus.widgets.core.tags = {
28 _force_data_change: false,
29 _missed_tag_arr: null,
31 get_create_tpl: function(name, default_value) {
32 if (this.assign_tags == null) {
33 this.assign_tags = [];
37 if (typeof default_value == 'object') {
38 $.each(default_value, function(i,dv){
39 if (typeof dv.id != 'undefined') {
40 var tag = $.ajatus.tags.get(dv.id);
42 this.assign_tags[idx] = tag;
48 if (typeof $.ajatus.tags.active == 'object') {
49 this.assign_tags[idx] = $.ajatus.tags.active;
53 'input', { type: 'hidden', name: 'widget['+name+':name]', value: this.name }, '',
54 'input', { type: 'hidden', name: 'widget['+name+':config]', value: $.ajatus.converter.toJSON(this.settings) }, '',
55 'input', { type: 'hidden', name: 'widget['+name+':required]', value: this.required }, '',
56 'input', { type: 'text', name: name, value: '' }, ''
59 get_edit_tpl: function(name, data) {
60 data.val = this.value_on_edit(data.val);
62 'input', { type: 'hidden', name: 'widget['+name+':name]', value: this.name }, '',
63 'input', { type: 'hidden', name: 'widget['+name+':config]', value: $.ajatus.converter.toJSON(this.settings) }, '',
64 'input', { type: 'hidden', name: 'widget['+name+':required]', value: this.required }, '',
65 'input', { type: 'hidden', name: 'widget['+name+':prev_val]', value: $.ajatus.converter.toJSON(data.val) }, '',
66 'input', { type: 'text', name: name, value: '' }, ''
69 get_view_tpl: function(name, data) {
70 data.val = this.value_on_view(data.val);
73 'div', { className: data._id+'_element_'+name+'_value' }, [
74 'ul', { className: 'tag_list' }, data.val,
75 'br', { className: 'clear_fix' }, ''
79 set_config: function(config) {
80 this.settings = $.extend(this.settings, config);
82 validate: function(name, value) {
87 this._missed_tag_arr = this._update_system_tags([tag_data], []);
89 this._force_data_change = true;
94 value_on_save: function(value, prev_val) {
98 var id_inputs = $(':input[name*=__tags_widget_selections]');
100 $.each(id_inputs, function(i,n){
101 tag_arr.push($.ajatus.converter.parseJSON(n.value))
104 if ( typeof prev_val == 'undefined'
110 $.each(tag_arr, function(i,t){
111 if (typeof t.id != 'undefined') {
116 tag_arr = $.grep(tag_arr, function(n,i){
117 return n != '' && (typeof n.id == 'undefined' || n.id == '');
120 var saved_tag_ids = this._update_system_tags(tag_arr, prev_val);
122 $.each(saved_tag_ids, function(i,t){
126 if (this._missed_tag_arr != null) {
127 $.each(this._missed_tag_arr, function(i,t){
134 has_data_changed: function(value, prev_objects) {
135 if (this._force_data_change) {
140 $.each(prev_objects, function(i, n){
141 prev_value.push(n.id);
144 var data_changed = false;
146 if ( value.length == 0
147 && prev_value.length == 0)
154 if ( value.length > 0
155 && prev_value.length == 0)
159 if ( prev_value.length > 0
160 && value.length == 0)
165 $.each(value, function(i,n){
166 var match_key = $.inArray(n, prev_value);
167 if (match_key == -1) {
176 $.each(prev_value, function(i,n){
177 var match_key = $.inArray(n, value);
178 if (match_key == -1) {
185 value_on_edit: function(value) {
187 if (self.assign_tags == null) {
188 self.assign_tags = [];
190 $.each(value, function(i,t){
191 self.assign_tags[self.assign_tags.length || i] = $.ajatus.tags.get(t);
194 return self.assign_tags;
196 value_on_view: function(value, type) {
197 if (typeof type == 'undefined') {
201 var has_missing = false;
206 if (value.length > 0) {
207 $.each(value, function(i,v){
208 var tag = $.ajatus.tags.get(v);
213 var tag_title = $.ajatus.tags.render_title(tag);
215 if (type == 'plain') {
216 tags_str += tag_title + _self.settings.separator;
218 var tpl = _self.style_tag_on_view(tag_title, tag.value.title.widget.config.color, type);
219 $.each(tpl, function(tidx, tp){
229 $.ajatus.elements.messages.create($.ajatus.i10n.get('Missing tags'), $.ajatus.i10n.get('Object has missing tags'));
232 if (type == 'plain') {
238 style_tag_on_view: function(title, color, type) {
239 if ( typeof color == 'undefined'
242 var color = $.ajatus.widgets.core.tag.settings.color;
245 if (type == 'list') {
247 'span', { className: 'tag' }, title + ' '
252 'li', { className: 'tag', style: 'background-color: #'+color+';' }, title
256 $.ajatus.events.lock_pool.increase();
258 $.ajatus.layout.styles.load($.ajatus.preferences.client.theme_url + 'css/widgets/tags.css');
259 $.ajatus.layout.styles.load($.ajatus.preferences.client.theme_url + 'css/widgets/includes/tags.css');
261 var tags_url = $.ajatus.preferences.client.application_url + 'js/widgets/includes/tags.js';
262 $.ajatus.utils.load_script(tags_url, "$.ajatus.events.lock_pool.decrease", []);
264 init: function(holder, form_mode) {
266 this.init_form_mode(holder);
268 this.init_view_mode(holder);
271 init_form_mode: function(holder) {
272 var element = $('input[@type=text]', holder);
274 if (this.assign_tags == null) {
275 this.assign_tags = [];
279 element.tags(this.settings.widget);
281 $.each(this.assign_tags, function(i,tag) {
282 if (typeof tag == "object") {
283 element.tags_add_item(tag, true);
285 tag = $.ajatus.tags.get(tag);
287 element.tags_add_item(tag, true);
293 init_view_mode: function(holder) {
295 _update_system_tags: function(new_tags, prev_tags) {
300 || new_tags.length <= 0)
305 var on_success = function(data) {
307 var msg = $.ajatus.elements.messages.create(
308 $.ajatus.i10n.get('New tag created'),
309 $.ajatus.i10n.get("Created new tag '%s'", [data.id])
312 $.ajatus.debug("saved tag: "+data.id);
313 tag_ids.push(data.id);
318 var dc = $.jqCouch.connection('doc', on_success);
320 $.each(new_tags, function(i,d){
322 var title_data = $.ajatus.tags.validate_title(title);
324 var context_key = '';
326 if (typeof title_data == 'object') {
327 title = title_data.title;
328 context_key = title_data.context;
329 value = title_data.value;
333 color: (typeof d.color != 'undefined') ? d.color : '8596b6',
334 context: (typeof d.context != 'undefined') ? d.context : context_key,
335 value: (typeof d.value != 'undefined') ? d.value : value
338 $.ajatus.tags.create(title, data, dc);
341 $.ajatus.views.on_change_actions.add('$.ajatus.tags.refresh_cache();');