1 | var LinkParser, |
---|
2 | __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, |
---|
3 | __hasProp = Object.prototype.hasOwnProperty, |
---|
4 | __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }; |
---|
5 | |
---|
6 | Annotator.Viewer = (function(_super) { |
---|
7 | |
---|
8 | __extends(Viewer, _super); |
---|
9 | |
---|
10 | Viewer.prototype.events = { |
---|
11 | ".annotator-edit click": "onEditClick", |
---|
12 | ".annotator-delete click": "onDeleteClick" |
---|
13 | }; |
---|
14 | |
---|
15 | Viewer.prototype.classes = { |
---|
16 | hide: 'annotator-hide', |
---|
17 | showControls: 'annotator-visible' |
---|
18 | }; |
---|
19 | |
---|
20 | Viewer.prototype.html = { |
---|
21 | element: "<div class=\"annotator-outer annotator-viewer\">\n <ul class=\"annotator-widget annotator-listing\"></ul>\n</div>", |
---|
22 | item: "<li class=\"annotator-annotation annotator-item\">\n <span class=\"annotator-controls\">\n <a href=\"#\" title=\"View as webpage\" class=\"annotator-link\">View as webpage</a>\n <button title=\"Edit\" class=\"annotator-edit\">Edit</button>\n <button title=\"Delete\" class=\"annotator-delete\">Delete</button>\n </span>\n</li>" |
---|
23 | }; |
---|
24 | |
---|
25 | Viewer.prototype.options = { |
---|
26 | readOnly: false |
---|
27 | }; |
---|
28 | |
---|
29 | function Viewer(options) { |
---|
30 | this.onDeleteClick = __bind(this.onDeleteClick, this); |
---|
31 | this.onEditClick = __bind(this.onEditClick, this); |
---|
32 | this.load = __bind(this.load, this); |
---|
33 | this.hide = __bind(this.hide, this); |
---|
34 | this.show = __bind(this.show, this); Viewer.__super__.constructor.call(this, $(this.html.element)[0], options); |
---|
35 | this.item = $(this.html.item)[0]; |
---|
36 | this.fields = []; |
---|
37 | this.annotations = []; |
---|
38 | } |
---|
39 | |
---|
40 | Viewer.prototype.show = function(event) { |
---|
41 | var controls, |
---|
42 | _this = this; |
---|
43 | util.preventEventDefault(event); |
---|
44 | controls = this.element.find('.annotator-controls').addClass(this.classes.showControls); |
---|
45 | setTimeout((function() { |
---|
46 | return controls.removeClass(_this.classes.showControls); |
---|
47 | }), 500); |
---|
48 | this.element.removeClass(this.classes.hide); |
---|
49 | return this.checkOrientation().publish('show'); |
---|
50 | }; |
---|
51 | |
---|
52 | Viewer.prototype.isShown = function() { |
---|
53 | return !this.element.hasClass(this.classes.hide); |
---|
54 | }; |
---|
55 | |
---|
56 | Viewer.prototype.hide = function(event) { |
---|
57 | util.preventEventDefault(event); |
---|
58 | this.element.addClass(this.classes.hide); |
---|
59 | return this.publish('hide'); |
---|
60 | }; |
---|
61 | |
---|
62 | Viewer.prototype.load = function(annotations) { |
---|
63 | var annotation, controller, controls, del, edit, element, field, item, link, links, list, _i, _j, _len, _len2, _ref, _ref2; |
---|
64 | this.annotations = annotations || []; |
---|
65 | list = this.element.find('ul:first').empty(); |
---|
66 | _ref = this.annotations; |
---|
67 | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
---|
68 | annotation = _ref[_i]; |
---|
69 | item = $(this.item).clone().appendTo(list).data('annotation', annotation); |
---|
70 | controls = item.find('.annotator-controls'); |
---|
71 | link = controls.find('.annotator-link'); |
---|
72 | edit = controls.find('.annotator-edit'); |
---|
73 | del = controls.find('.annotator-delete'); |
---|
74 | links = new LinkParser(annotation.links || []).get('alternate', { |
---|
75 | 'type': 'text/html' |
---|
76 | }); |
---|
77 | if (links.length === 0 || !(links[0].href != null)) { |
---|
78 | link.remove(); |
---|
79 | } else { |
---|
80 | link.attr('href', links[0].href); |
---|
81 | } |
---|
82 | if (this.options.readOnly) { |
---|
83 | edit.remove(); |
---|
84 | del.remove(); |
---|
85 | } else { |
---|
86 | controller = { |
---|
87 | showEdit: function() { |
---|
88 | return edit.removeAttr('disabled'); |
---|
89 | }, |
---|
90 | hideEdit: function() { |
---|
91 | return edit.attr('disabled', 'disabled'); |
---|
92 | }, |
---|
93 | showDelete: function() { |
---|
94 | return del.removeAttr('disabled'); |
---|
95 | }, |
---|
96 | hideDelete: function() { |
---|
97 | return del.attr('disabled', 'disabled'); |
---|
98 | } |
---|
99 | }; |
---|
100 | } |
---|
101 | _ref2 = this.fields; |
---|
102 | for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) { |
---|
103 | field = _ref2[_j]; |
---|
104 | element = $(field.element).clone().appendTo(item)[0]; |
---|
105 | field.load(element, annotation, controller); |
---|
106 | } |
---|
107 | } |
---|
108 | this.publish('load', [this.annotations]); |
---|
109 | return this.show(); |
---|
110 | }; |
---|
111 | |
---|
112 | Viewer.prototype.addField = function(options) { |
---|
113 | var field; |
---|
114 | field = $.extend({ |
---|
115 | load: function() {} |
---|
116 | }, options); |
---|
117 | field.element = $('<div />')[0]; |
---|
118 | this.fields.push(field); |
---|
119 | field.element; |
---|
120 | return this; |
---|
121 | }; |
---|
122 | |
---|
123 | Viewer.prototype.onEditClick = function(event) { |
---|
124 | return this.onButtonClick(event, 'edit'); |
---|
125 | }; |
---|
126 | |
---|
127 | Viewer.prototype.onDeleteClick = function(event) { |
---|
128 | return this.onButtonClick(event, 'delete'); |
---|
129 | }; |
---|
130 | |
---|
131 | Viewer.prototype.onButtonClick = function(event, type) { |
---|
132 | var item; |
---|
133 | item = $(event.target).parents('.annotator-annotation'); |
---|
134 | return this.publish(type, [item.data('annotation')]); |
---|
135 | }; |
---|
136 | |
---|
137 | return Viewer; |
---|
138 | |
---|
139 | })(Annotator.Widget); |
---|
140 | |
---|
141 | LinkParser = (function() { |
---|
142 | |
---|
143 | function LinkParser(data) { |
---|
144 | this.data = data; |
---|
145 | } |
---|
146 | |
---|
147 | LinkParser.prototype.get = function(rel, cond) { |
---|
148 | var d, k, keys, match, v, _i, _len, _ref, _results; |
---|
149 | if (cond == null) cond = {}; |
---|
150 | cond = $.extend({}, cond, { |
---|
151 | rel: rel |
---|
152 | }); |
---|
153 | keys = (function() { |
---|
154 | var _results; |
---|
155 | _results = []; |
---|
156 | for (k in cond) { |
---|
157 | if (!__hasProp.call(cond, k)) continue; |
---|
158 | v = cond[k]; |
---|
159 | _results.push(k); |
---|
160 | } |
---|
161 | return _results; |
---|
162 | })(); |
---|
163 | _ref = this.data; |
---|
164 | _results = []; |
---|
165 | for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
---|
166 | d = _ref[_i]; |
---|
167 | match = keys.reduce((function(m, k) { |
---|
168 | return m && (d[k] === cond[k]); |
---|
169 | }), true); |
---|
170 | if (match) { |
---|
171 | _results.push(d); |
---|
172 | } else { |
---|
173 | continue; |
---|
174 | } |
---|
175 | } |
---|
176 | return _results; |
---|
177 | }; |
---|
178 | |
---|
179 | return LinkParser; |
---|
180 | |
---|
181 | })(); |
---|