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

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

Goto form added in. More careful control of padding of elmements. Post-it mouse events restricted to be on 'thispage'. More careful conversion of CGI params to be numeric in JavaScript, where needed.

  • Property svn:executable set to *
File size: 11.6 KB
Line 
1
2function MusicStand(httpdoc,cgiargc,docoid,thisOID,cgiNumPages,cgiGotoPage,
3 cgiPageWidth,cgiPageHeight,cgiScaleFactor)
4{
5
6 var httpdocument = httpdoc;
7 var collect = cgiargc;
8 var site = gs.xsltParams.site_name;
9
10 var docid = docoid;
11 var _cutpos = docid.indexOf(".");
12 var docRoot = (_cutpos>0) ? docid.substr(0,_cutpos) : docid;
13
14 var assocDir = thisOID;
15
16 var totalPageCount = cgiNumPages;
17 var speedBreak = 500;
18 var pageXDim = cgiPageWidth;
19 var pageYDim = cgiPageHeight;
20 var scaleFactor = cgiScaleFactor;
21
22 var topVal = 0;
23 var rightVal = pageXDim;
24 var bottomVal = 0;
25 var leftVal = 0;
26
27 var pageNum = cgiGotoPage;
28
29 var pageAnimTimer;
30
31 var cgiPrefix;
32 var cgiSuffix;
33
34 var postitBgCol = "rgba(255,200,200,0.7)";
35 var postitSelCol = "rgba(128,0,0,0.7)";
36
37 var username = null;
38
39 imageserverURL = function()
40 {
41 //return gsapi.apiURL("image-server.pl");
42 return "cgi-bin/image-server.pl";
43 }
44
45 this.setStyleColors = function(bg,sel)
46 {
47 postitBgCol = bg;
48 postitSelCol = sel;
49 }
50
51
52 this.setUsername = function(cgiUsername)
53 {
54 username = cgiUsername;
55 }
56
57 this.getUsername = function()
58 {
59 return username;
60 }
61
62 this.getScaleFactor = function()
63 {
64 return scaleFactor;
65 }
66
67 this.getPageNum = function()
68 {
69 return pageNum;
70 }
71
72 this.getDocRoot = function()
73 {
74 return docRoot;
75 }
76
77 this.getDocOID = function()
78 {
79 return docid;
80 }
81
82 this.getSpeedBreak = function()
83 {
84 return speedBreak;
85 }
86
87 this.setSpeedBreak = function(newSpeedBreak)
88 {
89 speedBreak = newSpeedBreak;
90 }
91
92
93 this.setPagePrefix = function(p)
94 {
95 cgiPrefix = p;
96 }
97
98 this.setPageSuffix = function(s)
99 {
100 cgiSuffix = s;
101 }
102
103
104 this.docwritePrevPageNum = function()
105 {
106 document.write(pageNum-1);
107 }
108
109 this.activatePrevPageNum = function()
110 {
111 if (pageNum>1) {
112 displayInline('prevpagespan');
113 }
114 else {
115 displayNone('prevpagespan');
116 }
117 }
118
119
120 this.docwriteOptOfPages = function()
121 {
122 if (totalPageCount>1) {
123 document.write(' of ' + totalPageCount + ' pages');
124 }
125 }
126
127 this.docwriteNextPageNum = function()
128 {
129 document.write(pageNum+1);
130 }
131
132 this.activateNextPageNum = function()
133 {
134 if (pageNum < totalPageCount) {
135 displayInline('nextpagespan');
136 }
137 else {
138 displayNone('nextpagespan');
139 }
140 }
141
142 delayedShowStatus = function(mess)
143 {
144 window.status = mess;
145 }
146
147 this.showStatus = function(mess)
148 {
149 window.status = mess;
150
151 // NS6 series of browsers set URL after doing event
152 // => have a delayed version that sets the status bar
153 setTimeout("delayedShowStatus('"+mess+"')",10);
154
155 return true;
156 }
157
158
159 pageAnimPrivate = function(direction,pagePrefix,pageSuffix)
160 {
161 var imagediv = (direction>0) ? 'nextpagediv' : 'prevpagediv';
162 var imagelayer = document.getElementById(imagediv)
163 var bleedlayer = document.getElementById('animedgebleed')
164
165 var deltaY;
166 var deltaTime;
167
168 if (bottomVal<speedBreak) {
169 deltaY = 2;
170 deltaTime = 10;
171 }
172 else {
173 deltaY = 1;
174 deltaTime = 30;
175 }
176
177 if(bottomVal < pageYDim) {
178 bottomVal += deltaY;
179 imagelayer.style.clip="rect("+topVal+"px "+rightVal+"px "+bottomVal+"px "+leftVal+"px)"
180 bleedlayer.style.clip="rect("+topVal+"px "+rightVal+"px "+(bottomVal+2)+"px "+leftVal+"px)"
181 var callPageAnim = "pageAnimPrivate("+direction+",'"+pagePrefix+"','"+pageSuffix+"')";
182 pageAnimTimer = setTimeout(callPageAnim,deltaTime)
183 }
184 else {
185
186 // finished => update the image that is the current page
187 var thisimg = document.getElementById('thispageimg')
188 var nextimg = document.getElementById('nextpageimg')
189 var previmg = document.getElementById('prevpageimg')
190
191 if (direction>0) {
192 if (pageNum<totalPageCount) {
193 pageNum++;
194 previmg.src = thisimg.src;
195 thisimg.src = nextimg.src;
196
197 resetValues(); // reset clip rectangles
198
199 var nextSrc = httpnextanimPrivate(pagePrefix,pageSuffix,pageNum+1);
200 nextimg.src = nextSrc;
201
202 var nextspan = document.getElementById('nextpagespan');
203
204 // update page numbers displayed for next and prev
205 var nextval = document.getElementById('nextpageval');
206 if (pageNum<totalPageCount) {
207 nextval.innerHTML = (pageNum+1);
208 displayInline('nextpagespan');
209 }
210 else {
211 nextval.innerHTML = "";
212 displayNone('nextpagespan');
213 }
214
215 var prevval = document.getElementById('prevpageval');
216 prevval.innerHTML = (pageNum-1);
217
218 displayInline('prevpagespan');
219 }
220 }
221 else {
222 // previous page
223 if (pageNum>0) {
224 pageNum--;
225 nextimg.src = thisimg.src;
226 thisimg.src = previmg.src;
227
228 resetValues(); // reset clip rectangles
229
230 var prevSrc = httpnextanimPrivate(pagePrefix,pageSuffix,pageNum-1);
231 previmg.src = prevSrc;
232
233 // update page numbers displayed for next and prev
234 var nextval = document.getElementById('nextpageval');
235 nextval.innerHTML = (pageNum+1);
236
237 displayInline('nextpagespan');
238 //var nextspan = document.getElementById('nextpagespan');
239 //nextspan.style.display = "block";
240
241 var prevspan = document.getElementById('prevpagespan');
242
243 var prevval = document.getElementById('prevpageval');
244 if (pageNum>1) {
245 prevval.innerHTML = (pageNum-1);
246 displayInline('prevpagespan');
247 }
248 else {
249 prevval.innerHTML = "";
250 displayNone('prevpagespan');
251 }
252 }
253 }
254
255 // update docid member variable (pageNum reflect new page value)
256 docid = docRoot + "." + pageNum;
257
258/*
259 // remove any existing annotations
260 annotate.clearAnnotations();
261
262 //var annotateCanvasElem = document.getElementById("annotateCanvas");
263 //annotateCanvasElem.style.display = "none";
264
265 // load in new ones for this page
266 annotate.loadAnnotations(docid);
267
268 //annotateCanvasElem.style.display = "block";
269*/
270
271 // update slide position (pageNum already changed)
272
273
274 var username = musicStand.getUsername();
275 var metaval;
276
277 if (username != null) {
278 // try of user specific one, if it exists
279 var metaname = username + "-sliderposTop";
280 metaval = gsapi.getLiveMetadata(docid,metaname);
281 if (metaval == "") {
282 // fallback to looking up non-user specific one
283 metaval = gsapi.getLiveMetadata(docid,"sliderposTop");
284 }
285 }
286 else {
287 //metaval = gsapi.getLiveMetadata(docid,"sliderposTop");
288 metaval = 700; // ******** hack
289 }
290 var sliderposTop = parseInt(metaval);
291
292 updateSlider(sliderposTop);
293
294 }
295 }
296
297 cancelPageAnimPrivate = function() {
298 clearTimeout(pageAnimTimer);
299 resetValues();
300 }
301
302 this.cancelPageAnim = function() {
303 cancelPageAnimPrivate();
304 }
305
306 this.pageAnim = function(direction,pagePrefix,pageSuffix)
307 {
308 pageAnimPrivate(direction,pagePrefix,pageSuffix);
309 }
310
311 httpnextanimPrivate = function(pagePrefix,pageSuffix,nextPageNum)
312 {
313 var imgserver = imageserverURL();
314
315 var screenWidth = screen.width;
316 var screenHeight = screen.height;
317
318 nextPageNum--; // filenames use values one less that pageNum
319
320 var url = imgserver + "?a=fit-screen"
321 url += "&c="+collect;
322 url += "&site="+site;
323 url += "&pageWidth="+pageXDim;
324 url += "&pageHeight="+pageYDim;
325 url += "&assocDir=" + assocDir;
326 url += "&assocFile=" + pagePrefix;
327
328
329 if (totalPageCount>1) {
330 url += "-" + nextPageNum;
331 }
332 url += pageSuffix;
333
334 if (orientation == "landscape") {
335 url += "&orientation=landscape";
336 }
337
338 return url;
339 }
340
341 this.httpnextanim = function(pagePrefix,pageSuffix,nextPageNum)
342 {
343 return httpnextanimPrivate(pagePrefix,pageSuffix,nextPageNum);
344 }
345
346
347 httpprevanimPrivate = function(pagePrefix,pageSuffix,prevPageNum)
348 {
349 var imgserver = imageserverURL();
350
351 var screenWidth = screen.width;
352 var screenHeight = screen.height;
353
354 prevPageNum--; // filenames use values one less that pageNum
355
356 var url = imgserver + "?a=fit-screen"
357 url += "&c="+collect;
358 url += "&site="+site;
359 url += "&pageWidth="+pageXDim;
360 url += "&pageHeight="+pageYDim;
361 url += "&assocDir=" + assocDir;
362 url += "&assocFile=" + pagePrefix;
363
364
365 if (totalPageCount>1) {
366 url += "-" + prevPageNum;
367 }
368 url += pageSuffix;
369
370 if (orientation == "landscape") {
371 url += "&orientation=landscape";
372 }
373
374 return url;
375 }
376
377 this.httpprevanim = function(pagePrefix,pageSuffix,prevPageNum)
378 {
379 return httpprevanimPrivate(pagePrefix,pageSuffix,prevPageNum);
380 }
381
382
383
384 nextPageAnimPrivate = function(pagePrefix,pageSuffix)
385 {
386 // set up next page
387
388 if (pageNum<totalPageCount) {
389 //saveAnnotations();
390 pageAnimPrivate(1,pagePrefix,pageSuffix);
391 }
392 }
393
394 this.nextPageAnim = function(pagePrefix,pageSuffix)
395 {
396 nextPageAnimPrivate(pagePrefix,pageSuffix);
397 }
398
399 prevPageAnimPrivate = function(pagePrefix,pageSuffix)
400 {
401 // set up next page
402
403 if (pageNum>1) {
404 //saveAnnotations();
405 pageAnimPrivate(-1,pagePrefix,pageSuffix);
406 }
407 }
408
409 this.prevPageAnim = function(pagePrefix,pageSuffix)
410 {
411 prevPageAnimPrivate(pagePrefix,pageSuffix);
412 }
413
414 this.nextOrPrevPageEventLRMouse = function(evt,pagePrefix,pageSuffix)
415 {
416 if (!evt) var evt = window.event;
417
418 var rightclick = false;
419 if (evt.which) rightclick = (evt.which == 3);
420 else if (evt.button) rightclick = (evt.button == 2);
421
422 var leftclick = false;
423 if (evt.which) leftclick = (evt.which == 1);
424 else if (evt.button) leftclick = (evt.button == 1);
425
426 if (rightclick) {
427 this.nextPageAnim(pagePrefix,pageSuffix);
428 }
429 else if (leftclick) {
430 this.prevPageAnim(pagePrefix,pageSuffix);
431 }
432
433
434 return false;
435 }
436
437
438 var numClicks = 0;
439 var clicksTimer = null;
440
441 this.nextOrPrevPageEvent = function(evt,pagePrefix,pageSuffix)
442 //this.pageMenu = function(e)
443 {
444 //var pagePrefix = cgiPrefix;
445 //var pageSuffix = cgiSuffix;
446
447 if (clicksTimer!=null) {
448 clearTimeout(clicksTimer);
449 }
450
451 var callPageAction = 'pageAction("'+pagePrefix+'","'+pageSuffix+'")';
452 clicksTimer = setTimeout(callPageAction,1000);
453
454 numClicks = (numClicks % 3) + 1;
455
456 var menu = document.getElementById("pagemenu");
457 menu.style.visibility = "visible";
458
459 for (var i=1; i<=3; i++) {
460 var menuItem = document.getElementById("pagemenu"+i);
461 if (i==numClicks) {
462 menuItem.style.backgroundColor = postitSelCol;
463 }
464 else {
465 menuItem.style.backgroundColor = postitBgCol;
466 }
467 }
468
469 return false;
470 }
471
472 pageAction = function(pagePrefix,pageSuffix)
473 {
474 var menu = document.getElementById("pagemenu");
475 menu.style.visibility = "hidden";
476
477 var keepState = numClicks;
478
479 clicksTimer = null;
480 numClicks = 0;
481
482 if (keepState==1) {
483 cancelPageAnimPrivate();
484 }
485 else if (keepState==2) {
486 nextPageAnimPrivate(pagePrefix,pageSuffix);
487 }
488 else if (keepState==3) {
489 prevPageAnimPrivate(pagePrefix,pageSuffix);
490 }
491
492 }
493
494 this.hidePageMenu = function(elem,event)
495 {
496 elem.style.visibility="hidden";
497 //de.cursor.setCursorAtXY(mouseX,mouseY);
498 }
499
500
501 resetValues = function()
502 {
503 var nextlayer = document.getElementById('nextpagediv')
504 var prevlayer = document.getElementById('prevpagediv')
505 var bleedlayer = document.getElementById('animedgebleed')
506
507 topVal=0;
508 rightVal=pageXDim;
509 bottomVal=0;
510 leftVal=0
511
512 var startingClip = "rect("+topVal+"px "+rightVal+"px "+bottomVal+"px "+leftVal+"px)";
513
514 nextlayer.style.clip=startingClip;
515 prevlayer.style.clip=startingClip;
516 bleedlayer.style.clip=startingClip;
517 }
518}
Note: See TracBrowser for help on using the repository browser.