nmbug.js: Stub out a dialog for editing tags
[nmhive.git] / nmbug.js
1 var nmbug_server = 'http://localhost:5000';
2
3 nmbug = {
4         show: function (message_id) {
5                 this._get_tags(message_id, this._edit_tags.bind(this));
6         },
7         _get_tags: function (message_id, callback) {
8                 var url = [
9                         nmbug_server,
10                         'mid',
11                         encodeURIComponent(message_id),
12                         ].join('/');
13                 console.log('nmbug: get tags from ' + url);
14                 var request = new XMLHttpRequest();
15                 request.onload = function () {
16                         if (this.status == 200) {
17                                 var tags = JSON.parse(this.response);
18                                 console.log('nmbug: got tags', tags);
19                                 callback(message_id, tags);
20                         } else {
21                                 throw 'Error fetching ' + url + ' (status ' + this.status + ')';
22                         }
23                 };
24                 request.open('get', url, true);
25                 request.send();
26         },
27         _edit_tags: function (message_id, tags) {
28                 var dialog = document.createElement('dialog');
29
30                 var content = document.createElement('p');
31                 content.innerHTML = 'Edit tags for ' + message_id;
32                 dialog.appendChild(content);
33
34                 var ul = document.createElement('ul');
35                 dialog.appendChild(ul);
36                 for (var i = 0; i < tags.length; i++) {
37                         var li = document.createElement('li');
38                         li.innerHTML = tags[i];
39                         ul.appendChild(li);
40                 }
41                 var close = document.createElement('button');
42                 close.innerHTML = 'Close';
43                 close.onclick = function () {
44                         dialog.close();
45                 };
46                 dialog.appendChild(close);
47
48                 document.body.appendChild(dialog);
49
50                 dialog.show();
51         },
52 };
53
54 var _gmane_handler = {
55         regexp: /gmane[.]org/,
56         handle: function (callback) {
57                 var article = this._get_article();
58                 this._get_message_id(article, callback);
59         },
60         _article_from_url: function (url) {
61                 var regexp = new RegExp('http://article.gmane.org/([^/]+)/([0-9]+)');
62                 var match = regexp.exec(url);
63                 console.log('nmbug: get article from ' + url, match);
64                 if (match) {
65                         return {'group': match[1], 'id': parseInt(match[2])};
66                 }
67         },
68         _get_article: function () {
69                 var article = this._article_from_url(document.URL);
70                 var i = 0;
71                 for (var i = 0; !article && i < window.frames.length; i++) {
72                         article = this._article_from_url(window.frames[i].document.URL);
73                 }
74                 if (!article) {
75                         throw "Cannot extract an article from Gmane's " + document.URL;
76                 }
77                 return article;
78         },
79         _get_message_id: function (article, callback) {
80                 var url = [
81                         nmbug_server,
82                         'gmane',
83                         article.group,
84                         article.id,
85                 ].join('/');
86                 console.log('nmbug: get Message-ID from ' + url);
87                 var request = new XMLHttpRequest();
88                 request.onload = function () {
89                         var message_id = this.responseText;
90                         callback(message_id);
91                 };
92                 request.open('get', url, true);
93                 request.send();
94         },
95 };
96
97 var handlers = [
98         _gmane_handler,
99 ];
100
101 function _check_handler(handler) {
102         var match = handler.regexp.test(document.URL);
103         console.log('nmbug: testing', handler, match);
104         if (match) {
105                 console.log('nmbug: matched', handler);
106                 handler.handle(nmbug.show.bind(nmbug));
107         }
108         return match;  /* break after the first match */
109 }
110
111 function run() {
112         var matched = handlers.some(_check_handler);
113         if (!matched) {
114                 throw 'No handler for ' + document.URL;
115         }
116 }