source: main/trunk/model-sites-dev/mozarts-laptop/collect/digital-music-stand/script/annotate.js@ 30446

Last change on this file since 30446 was 30446, checked in by davidb, 8 years ago

... and the example collection (initial version)

  • Property svn:executable set to *
File size: 8.9 KB
Line 
1
2function Annotate(httpImagesMacro)
3{
4 var httpImages = httpImagesMacro;
5
6 var numAnnotations = 0;
7
8 var username = null;
9
10 this.getNumAnnotations = function()
11 {
12 return numAnnotations;
13 }
14
15 this.setUsername = function(cgiUsername)
16 {
17 username = cgiUsername;
18 }
19
20 this.getUsername = function()
21 {
22 return username;
23 }
24
25 this.createAnnotation = function(xleft,ytop,xwidth,yheight,text)
26 {
27 // start new annotation
28 var newAI = document.createElement("div");
29 newAI.setAttribute("class","annotationNote");
30 if (expeditee) {
31 newAI.setAttribute("onmouseout", "javascript:annotateLoseFocus(this)");
32 }
33
34 //newAI.style.position = "absolute";
35 //newAI.style.visibility = "visible";
36 //newAI.style.zIndex = "2";
37 //newAI.style.background = "rgba(255,200,200,0.7)";
38
39 if (xwidth) {
40 newAI.style.width = xwidth + "px";
41 }
42
43 if (yheight) {
44 newAI.style.height = yheight + "px";
45 }
46 else {
47 newAI.style.height = "auto";
48 }
49
50 //newAI.style.borderStyle = "solid";
51 //newAI.style.borderColor = "black";
52
53 newAI.style.padding = "1px";
54 newAI.style.paddingRight = "6px";
55
56
57 var annotate_x_org = xleft;
58 var annotate_y_org = ytop;
59
60 if (document.all) {
61 newAI.style.pixelLeft = annotate_x_org
62 newAI.style.pixelTop = annotate_y_org;
63 }
64 else if (document.getElementById) {
65 newAI.style.left = annotate_x_org + 'px';
66 newAI.style.top = annotate_y_org + 'px';
67 }
68
69
70 var tableElem = document.createElement("table");
71 var trElem = document.createElement("tr");
72
73 var tdTextElem = document.createElement("td");
74 var tdDecElem = document.createElement("td");
75
76 var editableElem = document.createElement("span");
77 if (expeditee) {
78 editableElem.setAttribute("onmouseover","javascript:annotateGainFocus(this)");
79 editableElem.setAttribute("onmousemove","javascript:annotateGainFocus(this)");
80 }
81 //else {
82 // tableElem.setAttribute("onmousedown","javascript:return false;");
83 // tableElem.setAttribute("onmouseup", "javascript:return false;");
84 // }
85
86 var annotation = (username!=null) ? username+"-annotation" : "annotation";
87
88 editableElem.setAttribute("id","annotateItem" + numAnnotations);
89 editableElem.setAttribute("class","editable-metadata");
90 editableElem.setAttribute("docoid",musicStand.getDocOID());
91 editableElem.setAttribute("metaname",annotation);
92 editableElem.setAttribute("metapos",numAnnotations);
93
94 editableElem.style.position = "relative";
95
96 if (text == "") {
97 text = " "
98 }
99 editableElem.innerHTML = text;
100
101 tdTextElem.setAttribute("onmousedown","javascript:return annotateMouseDown(this,event);");
102 tdTextElem.setAttribute("onmouseup", "javascript:return annotateMouseUp(this,event);");
103
104 var closeElem = document.createElement("div");
105 closeElem.onmouseup=closeAnnotation;
106
107 closeElem.style.position = "absolute";
108 closeElem.style.top = "0px";
109 closeElem.style.right = "0px";
110 closeElem.innerHTML = '<img src="'+httpImages+'/window-close.gif">';
111
112 var resizeElem = document.createElement("div");
113
114 resizeElem.setAttribute("onmousedown","javascript:return startResizeAnnotation(this,event);");
115 resizeElem.setAttribute("onmouseup", "javascript:return stopResizeAnnotation(this,event);");
116
117 resizeElem.style.position = "absolute";
118 resizeElem.style.bottom = "0px";
119 resizeElem.style.right = "0px";
120 resizeElem.innerHTML = '<img src="'+httpImages+'/resizer.gif">';
121
122 tdTextElem.appendChild(editableElem);
123 tdDecElem.appendChild(closeElem);
124 tdDecElem.appendChild(resizeElem);
125 trElem.appendChild(tdTextElem);
126 trElem.appendChild(tdDecElem);
127 tableElem.appendChild(trElem);
128 newAI.appendChild(tableElem);
129
130 numAnnotations++;
131
132 return newAI;
133 }
134
135
136 this.saveAnnotation = function(annotateWrapper,editedElem)
137 {
138 var docoid = editedElem.getAttribute("docoid");
139
140 if (gsdefined(docoid)) {
141 var metaname = editedElem.getAttribute("metaname");
142 var metapos = editedElem.getAttribute("metapos");
143 var metavalue= editedElem.innerHTML;
144
145 var metavalue = metavalue.replace(/&nbsp;/g, " ");
146
147 gsapi.setDocumentMetadata(docoid,metaname,metapos,metavalue);
148 // gsapi.setImportMetadata(docoid,metaname,metapos,metavalue);
149
150 // Store co-ord + width and height
151 var ax_org = parseInt(annotateWrapper.style.left);
152 var ay_org = parseInt(annotateWrapper.style.top);
153 var ax_dim = parseInt(annotateWrapper.style.width);
154 var ay_dim = parseInt(annotateWrapper.style.height);
155
156 var scaleFactor = musicStand.getScaleFactor();
157 ax_org /= scaleFactor;
158 ay_org /= scaleFactor;
159
160 var rectHash = { "left": ax_org, "top": ay_org };
161
162 if (ay_dim) {
163
164 if (!ax_dim) {
165 // switch to width and deliberately leave height
166 // underdefined
167 //ax_dim = parseInt(editedElem.offsetWidth) +4;
168 ax_dim = parseInt(annotateWrapper.offsetWidth)-10;
169 }
170 else {
171 rectHash.height = ay_dim;
172 }
173 }
174
175 if (ax_dim) {
176 rectHash.width = ax_dim;
177 }
178
179 var rectHashStr = JSON.stringify(rectHash);
180
181 //alert("rectHashStr = " + rectHashStr);
182
183 var metaname = (username!=null) ? username+"-rectpos" : "rectpos";
184
185 gsapi.setDocumentMetadata(docoid,metaname,metapos,rectHashStr);
186 // gsapi.setImportMetadata(docoid,metaname,metapos,rectHashStr);
187
188 }
189
190 return true;
191 }
192
193 this.clearAnnotations = function()
194 {
195 var annotateCanvasElem = document.getElementById("annotateCanvas");
196 annotateCanvasElem.innerHTML = null;
197 numAnnotations = 0;
198 }
199
200 this.loadAnnotation = function(docoid,metapos)
201 {
202 var annotationMetaname = "annotation";
203 var rectposMetaname = "rectpos";
204 if (username!=null) {
205 annotationMetaname = username + "-" + annotationMetaname;
206 rectposMetaname = username + "-" + rectposMetaname;
207 }
208
209 var annotateText = gsapi.getDocumentMetadata(docoid,annotationMetaname,metapos);
210 var annotateRect = gsapi.getDocumentMetadata(docoid,rectposMetaname,metapos);
211
212 //alert("annotateRect = " + annotateRect);
213
214 // Non-existent annotation rectangle has somehow got into the database
215 if (annotateRect == "") { return; }
216
217 var annotateHash = JSON.parse(annotateRect);
218
219 var xleft = annotateHash.left;
220 var ytop = annotateHash.top;
221 var xwidth = annotateHash.width;
222 var yheight = annotateHash.height;
223
224 var scaleFactor = musicStand.getScaleFactor();
225 xleft *= scaleFactor;
226 ytop *= scaleFactor;
227
228 var newAI = this.createAnnotation(xleft,ytop,xwidth,yheight,annotateText);
229
230 var annotateCanvasElem = document.getElementById("annotateCanvas");
231 annotateCanvasElem.appendChild(newAI);
232 }
233
234 this.loadAnnotations = function(docoid)
235 {
236 numAnnotations = 0;
237
238 var metaname = (username!=null) ? username+"-numAnnotations" : "numAnnotations";
239
240 var newNumAnnotations = gsapi.getLiveMetadata(docoid,metaname);
241
242 //alert("load: newNumAnnotations = " + newNumAnnotations);
243
244 for (var a=0; a<newNumAnnotations; a++) {
245 this.loadAnnotation(docoid,a);
246 }
247 }
248
249
250 this.removeAnnotation = function(annotateCanvas,removeMetapos)
251 {
252 var annotateDivs = annotateCanvas.childNodes;
253 //var numAnnotations = annotateDivs.length;
254
255 //alert("num annotations = " + numAnnotations + " removeMetapos = " + removeMetapos);
256
257 for (var a=0; a<numAnnotations; a++) {
258 var annotateDiv = annotateDivs[a];
259
260 var editableElems = getElementsByClass("editable-",annotateDiv);
261 var editableElem = editableElems[0];
262
263 var metapos = editableElem.getAttribute("metapos");
264
265 if (metapos>removeMetapos) {
266 editableElem.setAttribute("metapos",metapos-1);
267 }
268 }
269
270 if (annotateCanvas != null) {
271 var removeElem = annotateDivs[removeMetapos];
272 annotateCanvas.removeChild(removeElem);
273 }
274
275
276 var docoid = musicStand.getDocOID();
277
278 var annotationMetaname = "annotation";
279 var rectposMetaname = "rectpos";
280 var numAnnotationsMetaname = "numAnnotations";
281
282 if (username!=null) {
283 annotationMetaname = username + "-" + annotationMetaname;
284 rectposMetaname = username + "-" + rectposMetaname;
285 numAnnotationsMetaname = username + "-" + numAnnotationsMetaname;
286 }
287
288 gsapi.removeDocumentMetadata(docoid,annotationMetaname,removeMetapos);
289 gsapi.removeDocumentMetadata(docoid,rectposMetaname,removeMetapos);
290 numAnnotations--;
291 gsapi.setLiveMetadata(docoid,numAnnotationsMetaname,numAnnotations);
292 }
293}
Note: See TracBrowser for help on using the repository browser.