forked from kragen/yamemex
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ymcontent.js
131 lines (108 loc) · 3.72 KB
/
ymcontent.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
var border = '1px solid black';
var borderRadius = '20px 8px';
var iconSize = '32px';
var annotationRecord = null;
// jQuery objects
var ourTextarea = null;
var ourCb = null;
var popup = null;
// This is a kludge to insert our popup into the body as early as
// possible. We don’t actually get notified that the document body
// has been created, as far as I can tell, so we have to poll.
var bodyPoller = setInterval(insertionListener, 50);
function insertionListener() {
if (!document.body) return;
clearInterval(bodyPoller);
popup = $('<div class="yamemex"/>')
.css({ position: 'fixed'
, top: '40px'
, right: '0px'
, backgroundColor: 'white'
, borderTopLeftRadius: borderRadius
, borderBottomLeftRadius: borderRadius
, padding: '3px 3px 6px'
, borderTop: border
, borderLeft: border
, borderBottom: border
, zIndex: 2147483646
, opacity: 0.5
, display: 'none'
})
.append($('<img/>')
.attr('src', chrome.extension.getURL('write.png'))
.css({width: iconSize, height: iconSize, margin: 0})
.click(clickHandler)
)
.hover(function() { popup.animate({opacity: 0.92 }) },
function() { popup.animate({opacity: 0.5}) })
.appendTo(document.body)
;
updateDisplayedness();
}
function clickHandler() {
popup.animate(offscreen(), { duration: 'fast'
, complete: openAnnotationWindow
});
}
chrome.extension.sendRequest( {getAnnotationsFor: location.href}
, function(row) {
annotationRecord = row;
updateDisplayedness();
});
function updateDisplayedness() {
if (annotationRecord && annotationRecord.annotation && popup) {
popup.css({display: ''});
}
}
function offscreen() {
return {right: '-'+popup.width()+'px'};
}
function closeAnnotationWindow() {
popup.animate(offscreen(), {complete: function() {
popup.css({display: 'none'});
}});
}
function openAnnotationWindow() {
ourTextarea = $('<textarea/>')
.val(annotationRecord.annotation || 'Type your annotations here.')
.css({display: 'block'})
.keyup(sendAnnotation)
;
ourCb = $('<input type="checkbox"/>');
// I forget if ‘public’ is a reserved word.
ourCb[0].checked = annotationRecord['public'];
ourCb.change(sendAnnotation);
var closebox = $('<div>X</div>')
.click(closeAnnotationWindow)
.css({float: 'right'})
;
popup
.css({display: ''})
.empty()
.append($('<span/>').append(ourCb).append(' Public'))
.append(closebox)
.append(ourTextarea)
.append(
$('<a>see all annotations</a>')
.attr('href', chrome.extension.getURL('blog.html'))
.attr('target', '_blank')
)
;
popup.css(offscreen());
popup.animate({right: 0});
ourTextarea.focus();
if (!annotationRecord.annotation) ourTextarea[0].select();
}
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
openAnnotationWindow();
});
function sendAnnotation() {
annotationRecord.annotation = ourTextarea.val();
annotationRecord['public'] = ourCb[0].checked ? 1 : 0;
chrome.extension.sendRequest({ updateAnnotationsFor: location.href
// XXX 'annotations' vs. 'annotation'
, annotations: annotationRecord.annotation
, title: document.title
, 'public': annotationRecord['public']
});
}