// vim: et:ts=4:sw=4:sts=4:ft=javascript 'use strict'; /*@ Ox.AnnotationPanel AnnotationPanel Object () -> AnnotationPanel Object (options) -> AnnotationPanel Object (options, self) -> AnnotationPanel Object options Options object editable If true, annotations can be added id id items items title title type panel type width self shared private variable @*/ Ox.AnnotationPanel = function(options, self) { self = self || {}; var that = Ox.Element({}, self) .defaults({ editable: false, id: '', items: [], range: 'all', selected: '', sort: 'position', title: '', type: 'text', width: 0 }) .options(options || {}); self.sort = self.options.sort == 'duration' ? [ {key: 'duration', operator: '-'}, {key: 'position', operator: '+'}, {key: 'value', operator: '+'} ] : self.options.sort == 'position' ? [ {key: 'position', operator: '+'}, {key: 'duration', operator: '-'}, {key: 'value', operator: '+'} ] : [ // 'text' {key: 'value', operator: '+'}, {key: 'position', operator: '+'}, {key: 'duration', operator: '-'} ]; that.setElement( Ox.CollapsePanel({ collapsed: false, extras: self.options.editable ? [ Ox.Button({ id: 'add', style: 'symbol', title: 'add', tooltip: 'Add', type: 'image' }).bindEvent({ click: function(data) { that.triggerEvent('add', {value: ''}); } }) ] : [], size: 16, title: self.options.title }) .addClass('OxAnnotationPanel') .bindEvent({ toggle: togglePanel }) ); that.$content = that.$element.$content; if (self.options.type == 'event') { self.$annotations = Ox.Element(); } else if (self.options.type == 'place') { self.$annotations = Ox.Element(); } else if (['string', 'text'].indexOf(self.options.type) > -1) { self.$annotations = Ox.ArrayEditable({ editable: self.options.editable, items: getAnnotations(), sort: self.sort, width: self.options.width, type: self.options.type == 'text' ? 'textarea' : 'input' }) .bindEvent({ add: function(data) { that.triggerEvent('add', { value: data.value || '' }); }, 'delete': function(data) { that.triggerEvent('remove', {id: data.id}); }, edit: function(data) { that.triggerEvent('edit', data); }, select: selectAnnotation, submit: editAnnotation }); } self.$annotations.appendTo(that.$content); /* self.$annotations = Ox.Element() .appendTo(that.$content); self.$annotation = []; self.options.items.forEach(function(item, i) { self.$annotation[i] = Ox.Element() .addClass('OxAnnotation') .html(item.value.replace(/\n/g, '
')) .click(function() { clickAnnotation(i); }) .appendTo(self.$annotations); }); */ function getAnnotations() { return self.options.items.filter(function(item) { return self.options.range == 'all' || ( self.options.range == 'selection' && item['in'] < self.options.out && item.out > self.options['in'] ) || ( self.options.range == 'position' && item['in'] <= self.options.position && item.out > self.options.position ) }); } function selectAnnotation(data) { var item = Ox.getObjectById(self.options.items, data.id); that.triggerEvent('select', Ox.extend({ id: data.id }, item ? { 'in': item['in'], out: item.out, layer: self.options.id } : {})); } function editAnnotation(data) { var item = Ox.getObjectById(self.options.items, data.id); item.value = data.value; that.triggerEvent('submit', item); } function togglePanel() { } self.setOption = function(key, value) { if (key == 'in') { self.options.range == 'selection' && self.$annotations.options({ items: getAnnotations() }); } else if (key == 'out') { self.options.range == 'selection' && self.$annotations.options({ items: getAnnotations() }); } else if (key == 'position') { self.options.range == 'position' && self.$annotations.options({ items: getAnnotations() }); } else if (key == 'range') { self.$annotations.options({ items: getAnnotations() }); } else if (key == 'sort') { self.$annotations.options('sort', value); } }; /*@ addItem addItem @*/ that.addItem = function(item) { var pos = 0; self.options.items.splice(pos, 0, item); self.$annotations.addItem(pos, item); self.$annotations.editItem(pos); }; /*@ deselectItems deselectItems @*/ that.deselectItems = function() { self.$annotations.options('selected', ''); }; /*@ removeItems removeItems @*/ that.removeItem = function(id) { var pos = Ox.getIndexById(self.options.items, id); self.options.items.splice(pos, 1); self.$annotations.removeItems && self.$annotations.removeItems([id]); }; return that; };