Annotation of zogiLib/js/dl_lib.js, revision 1.1
1.1 ! casties 1: /* Copyright (C) 2003,2004 WTWG Uni Bern and others
! 2:
! 3: This program is free software; you can redistribute it and/or
! 4: modify it under the terms of the GNU General Public License
! 5: as published by the Free Software Foundation; either version 2
! 6: of the License, or (at your option) any later version.
! 7:
! 8: This program is distributed in the hope that it will be useful,
! 9: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 10: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 11: GNU General Public License for more details.
! 12:
! 13: You should have received a copy of the GNU General Public License
! 14: along with this program; if not, write to the Free Software
! 15: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
! 16:
! 17: Authors: ROC 3.5.2004
! 18: first version by Christian Luginbuehl, 01.05.2003
! 19: Changed for digiLib in Zope by DW 24.03.2004
! 20: */
! 21:
! 22:
! 23: /*
! 24: * parameter handling
! 25: */
! 26:
! 27: var dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
! 28: var dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
! 29:
! 30: function parseArea() {
! 31: // returns area Rectangle from current parameters
! 32: return new Rectangle(getParameter("wx"), getParameter("wy"), getParameter("ww"), getParameter("wh"));
! 33: }
! 34:
! 35: function setParamFromArea(rect) {
! 36: // sets digilib wx etc. from rect
! 37: setParameter("wx", cropFloat(rect.x));
! 38: setParameter("wy", cropFloat(rect.y));
! 39: setParameter("ww", cropFloat(rect.width));
! 40: setParameter("wh", cropFloat(rect.height));
! 41: return true;
! 42: }
! 43:
! 44: var dlTrafo = new Transform();
! 45:
! 46: function parseTrafo() {
! 47: // returns Transform from current dlArea and picsize
! 48: var picsize = getElementSize("pic");
! 49: var trafo = new Transform();
! 50: // subtract area offset and size
! 51: trafo.concat(getTranslation(new Position(-dlArea.x, -dlArea.y)));
! 52: trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height)));
! 53: // scale to screen size
! 54: trafo.concat(getScale(picsize));
! 55: trafo.concat(getTranslation(picsize));
! 56: // rotate
! 57: //trafo.concat(getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height)));
! 58: // mirror
! 59: //if (hasFlag("hmir")) {
! 60: //trafo.m00 = - trafo.m00;
! 61: //}
! 62: //if (hasFlag("vmir")) {
! 63: //trafo.m11 = - trafo.m11;
! 64: //}
! 65: return trafo;
! 66: }
! 67:
! 68:
! 69: var dlMarks = new Array();
! 70:
! 71: function parseMarks() {
! 72: // returns marks array from current parameters
! 73: var marks = new Array();
! 74: var ma = getParameter("mk").split(";");
! 75: for (var i = 0; i < ma.length ; i++) {
! 76: var pos = ma[i].split("/");
! 77: if (pos.length > 1) {
! 78: marks.push(new Position(pos[0], pos[1]));
! 79: }
! 80: }
! 81: return marks;
! 82: }
! 83:
! 84: function getAllMarks() {
! 85: // returns a string with all marks in query format
! 86: var marks = new Array();
! 87: for (var i = 0; i < dlMarks.length; i++) {
! 88: marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
! 89: }
! 90: return marks.join(";");
! 91: }
! 92:
! 93: function addMark(pos) {
! 94: // add a mark
! 95: dlMarks.push(pos);
! 96: setParameter("mk", getAllMarks());
! 97: return true;
! 98: }
! 99:
! 100: function deleteMark() {
! 101: // delete the last mark
! 102: dlMarks.pop();
! 103: setParameter("mk", getAllMarks());
! 104: return true;
! 105: }
! 106:
! 107: var dlFlags = new Object();
! 108:
! 109: function hasFlag(mode) {
! 110: // returns if mode flag is set
! 111: return (dlFlags[mode]);
! 112: }
! 113:
! 114: function addFlag(mode) {
! 115: // add a mode flag
! 116: dlFlags[mode] = mode;
! 117: return true;
! 118: }
! 119:
! 120: function removeFlag(mode) {
! 121: // remove a mode flag
! 122: if (dlFlags[mode]) {
! 123: delete dlFlags[mode];
! 124: }
! 125: return true;
! 126: }
! 127:
! 128: function toggleFlag(mode) {
! 129: // change a mode flag
! 130: if (dlFlags[mode]) {
! 131: delete dlFlags[mode];
! 132: } else {
! 133: dlFlags[mode] = mode;
! 134: }
! 135: return true;
! 136: }
! 137:
! 138: function getAllFlags() {
! 139: // returns a string with all flags in query format
! 140: var fa = new Array();
! 141: for (var f in dlFlags) {
! 142: if ((f != "")&&(dlFlags[f] != null)) {
! 143: fa.push(f);
! 144: }
! 145: }
! 146: return fa.join(",");
! 147: }
! 148:
! 149: function parseFlags() {
! 150: // sets dlFlags from the current parameters
! 151: var flags = new Object();
! 152: var fa = getParameter("mo").split(",");
! 153: for (var i = 0; i < fa.length ; i++) {
! 154: var f = fa[i];
! 155: if (f != "") {
! 156: flags[f] = f;
! 157: }
! 158: }
! 159: return flags;
! 160: }
! 161:
! 162:
! 163: function bestPicSize(tagid) {
! 164: // returns a Size with the best image size for the given tagid
! 165: var inset = 0;
! 166: var ws = getWinSize();
! 167: var es = getElementSize(tagid);
! 168: if (es) {
! 169: ws.width = ws.width - es.x - inset;
! 170: ws.height = ws.height - es.y - inset;
! 171: }
! 172: return ws;
! 173: }
! 174:
! 175:
! 176: /* **********************************************
! 177: * digilib specific routines
! 178: * ******************************************** */
! 179:
! 180: function init() {
! 181: if (document.layers) {
! 182: alert("Sorry Netscape4 is not supported!");
! 183: return false;
! 184: }
! 185: // give a name to the window containing digilib - this way one can test if there is already a
! 186: // digilib-window open and replace the contents of it (ex. digicat)
! 187: top.window.name = "digilib";
! 188: // put the query parameters (sans "&") in the parameters array
! 189: parseParameters(location.search.slice(1));
! 190: // treat special parameters
! 191: dlMarks = parseMarks();
! 192: dlArea = parseArea();
! 193: dlFlags = parseFlags();
! 194:
! 195: //registerKeyDown(parseKeypress);
! 196:
! 197: renderMarks();
! 198:
! 199: focus();
! 200: return null;
! 201: }
! 202:
! 203: function display(detail) {
! 204: // redisplay the page
! 205: var queryString = getAllParameters(detail);
! 206: location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
! 207: }
! 208:
! 209:
! 210: /* **********************************************
! 211: * interactive digilib functions
! 212: * ******************************************** */
! 213:
! 214: function ref(select) {
! 215: // open a dialog with a reference to the current digilib set
! 216: var hyperlinkRef = baseUrl + "?" + getAllParameters(9);
! 217: if ( select == 0 ) {
! 218: prompt("Link for LaTeX-documents", "\\href{" + hyperlinkRef + "}{TEXT}");
! 219: } else if ( select == 1 ) {
! 220: prompt("Link for HTML-documents", hyperlinkRef);
! 221: }
! 222: }
! 223:
! 224: function renderMarks() {
! 225: // put the visible marks on the image
! 226: var mark_count = dlMarks.length;
! 227: var picelem = getElement("pic");
! 228: // make shure the image is loaded so we know its size
! 229: if (picelem && picelem.complete == false) {
! 230: setTimeout("placeMarks()", 100);
! 231: } else {
! 232: var picsize = getElementSize("pic");
! 233: dlTrafo = parseTrafo();
! 234: for (var i = 0; i < 8; i++) {
! 235: if (i < mark_count) {
! 236: if (dlArea.containsPosition(dlMarks[i])) {
! 237: var mpos = dlTrafo.transform(dlMarks[i]);
! 238: // suboptimal to place -5 pixels and not half size of mark-image
! 239: mpos.x = mpos.x -5;
! 240: mpos.y = mpos.y -5;
! 241: moveElement("dot"+i, mpos);
! 242: showElement("dot"+i, true);
! 243: }
! 244: } else {
! 245: // hide the other marks
! 246: showElement("dot"+i, false);
! 247: }
! 248: }
! 249: }
! 250: }
! 251:
! 252: function mark() {
! 253: // add a mark where clicked
! 254: if ( dlMarks.length > 7 ) {
! 255: alert("Only 8 marks are possible at the moment!");
! 256: return;
! 257: }
! 258:
! 259: function markEvent(evt) {
! 260: // event handler adding a new mark
! 261: unregisterMouseDown("scaler", markEvent);
! 262: var p = dlTrafo.invtransform(evtPosition(evt));
! 263: addMark(p);
! 264: placeMarks();
! 265: }
! 266:
! 267: // starting event capture
! 268: registerMouseDown("scaler", markEvent);
! 269: }
! 270:
! 271: function unmark() {
! 272: // remove the last mark
! 273: deleteMark();
! 274: placeMarks();
! 275: }
! 276:
! 277: var ZOOMFACTOR = Math.sqrt(2);
! 278:
! 279: function zoomPoint(inout) {
! 280: // zoom image in or out around the clicked point
! 281: var zoom = ZOOMFACTOR;
! 282: if (inout < 0) {
! 283: zoom = 1/ZOOMFACTOR;
! 284: }
! 285: window.focus();
! 286:
! 287: function zoomPointEvent(evt) {
! 288: // take new center and set zoom parameters
! 289: var p = dlTrafo.invtransform(evtPosition(evt));
! 290: var neww = Math.min(dlArea.width * (1/zoom), 1.0);
! 291: var newh = Math.min(dlArea.height * (1/zoom), 1.0);
! 292: var newx = p.x - 0.5 * neww;
! 293: var newy = p.y - 0.5 * newh;
! 294: var zoomarea = new Rectangle(newx, newy, neww, newh);
! 295: // check bounds
! 296: zoomarea = dlMaxArea.fit(zoomarea);
! 297: // set parameters
! 298: setParamFromArea(zoomarea);
! 299: parseArea();
! 300: display(3);
! 301: }
! 302:
! 303: // starting event capture
! 304: registerMouseDown("scaler", zoomPointEvent);
! 305: }
! 306:
! 307:
! 308: function zoomArea() {
! 309: var click = 1;
! 310: var pt1, pt2;
! 311: var eck1pos, eck2pos, eck3pos, eck4pos;
! 312: window.focus();
! 313:
! 314: function zoomClick(evt) {
! 315: // mouse click handler
! 316: if (click == 1) {
! 317: // first click -- start moving
! 318: click = 2;
! 319: pt1 = evtPosition(evt);
! 320: pt2 = pt1;
! 321: eck1pos = pt1;
! 322: eck2pos = new Position(pt1.x - 12, pt1.y);
! 323: eck3pos = new Position(pt1.x, pt1.y - 12);
! 324: eck4pos = new Position(pt1.y - 12, pt1.y - 12);
! 325: moveElement("eck1", eck1pos);
! 326: moveElement("eck2", eck2pos);
! 327: moveElement("eck3", eck3pos);
! 328: moveElement("eck4", eck4pos);
! 329: showElement("eck1", true);
! 330: showElement("eck2", true);
! 331: showElement("eck3", true);
! 332: showElement("eck4", true);
! 333: registerMouseMove("scaler", zoomMove);
! 334: registerMouseMove("eck4", zoomMove);
! 335: } else {
! 336: // second click -- end moving
! 337: pt2 = evtPosition(evt);
! 338: showElement("eck1", false);
! 339: showElement("eck2", false);
! 340: showElement("eck3", false);
! 341: showElement("eck4", false);
! 342: unregisterMouseMove("scaler", zoomMove);
! 343: unregisterMouseMove("eck4", zoomMove);
! 344: unregisterMouseDown("scaler", zoomClick);
! 345: unregisterMouseDown("eck4", zoomClick);
! 346: var p1 = dlTrafo.invtransform(pt1);
! 347: var p2 = dlTrafo.invtransform(pt2);
! 348: var ww = p2.x-p1.x;
! 349: var wh = p2.y-p1.y;
! 350: if ((ww > 0)&&(wh > 0)) {
! 351: setParameter("wx", cropFloat(p1.x));
! 352: setParameter("wy", cropFloat(p1.y));
! 353: setParameter("ww", cropFloat(ww));
! 354: setParameter("wh", cropFloat(wh));
! 355: parseArea();
! 356: display(3);
! 357: }
! 358: }
! 359: }
! 360:
! 361: function zoomMove(evt) {
! 362: // mouse move handler
! 363: pt2 = evtPosition(evt);
! 364: // restrict marks to move right and down
! 365: eck1pos = pt1;
! 366: eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y);
! 367: eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12);
! 368: eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12);
! 369: moveElement("eck1", eck1pos);
! 370: moveElement("eck2", eck2pos);
! 371: moveElement("eck3", eck3pos);
! 372: moveElement("eck4", eck4pos);
! 373: }
! 374:
! 375: // starting event capture
! 376: registerMouseDown("scaler", zoomClick);
! 377: registerMouseDown("eck4", zoomClick);
! 378: }
! 379:
! 380:
! 381: function moveTo() {
! 382:
! 383: if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
! 384: alert("This function is only available when zoomed in!");
! 385: return;
! 386: }
! 387:
! 388: function moveToEvent(event) {
! 389: // move to handler
! 390: var pt = evtPosition(evt);
! 391: var newarea = new Rectangle(pt.x-0.5*dlArea.width, pt.y-0.5*dlArea.height, dlArea.width, dlArea.height);
! 392: newarea = dlMaxArea.fit(newarea);
! 393: // stopping event capture
! 394: unregisterMouseDown("scaler", moveToEvent);
! 395: // set parameters
! 396: setParameter("wx", cropFloat(newarea.x));
! 397: setParameter("wy", cropFloat(newarea.y));
! 398: setParameter("ww", cropFloat(newarea.width));
! 399: setParameter("wh", cropFloat(newarea.height));
! 400: display(3);
! 401: }
! 402:
! 403: // starting event capture
! 404: registerMouseDown("scaler", moveToEvent);
! 405: }
! 406:
! 407: function parseKeypress(evt) {
! 408: // capturing keypresses for next and previous page
! 409: if ( document.all ) {
! 410: if ( event.keyCode == 110 ) {
! 411: page('+1');
! 412: }
! 413: if ( event.keyCode == 98 ) {
! 414: page('-1');
! 415: }
! 416: document.cancelBubble = true;
! 417: } else {
! 418: if ( evt.charCode == 110 ) {
! 419: page('+1');
! 420: } else if ( evt.charCode == 98 ) {
! 421: page('-1');
! 422: } else if ( evt.which == 110 ) {
! 423: page('+1');
! 424: } else if ( evt.which == 98 ) {
! 425: // does not work currentlyfor Opera, because it catches the 'b'-key on it's own
! 426: // have to change the key or find another way - luginbuehl
! 427: page('-1');
! 428: }
! 429: }
! 430: }
! 431:
! 432:
! 433: /* **********************************************
! 434: * digilib parameter-only functions
! 435: * ******************************************** */
! 436:
! 437: function setSize(factor) {
! 438: // change the size of the image
! 439: setParameter("ws", cropFloat(factor));
! 440: display(3);
! 441: }
! 442:
! 443: function setQuality(qual) {
! 444: // set the image quality
! 445: for (var i = 0; i < 3; i++) {
! 446: removeFlag("q"+i);
! 447: if (i == qual) {
! 448: addFlag("q"+i);
! 449: }
! 450: }
! 451: setParameter("mo", getAllFlags());
! 452: display(3);
! 453: }
! 454:
! 455: function mirror(dir) {
! 456: // mirror the image horizontally or vertically
! 457: if (dir == "h") {
! 458: toggleFlag("hmir");
! 459: } else {
! 460: toggleFlag("vmir");
! 461: }
! 462: setParameter("mo", getAllFlags());
! 463: display(3);
! 464: }
! 465:
! 466: function page(page, details) {
! 467:
! 468: if ( details == null ) {
! 469: details = 1;
! 470: }
! 471:
! 472: if ( page.indexOf('-') == 0 ) {
! 473: if ( dlParams.pn.value > 1 ) {
! 474: page = Math.max(parseInt(dlParams.pn.value) - parseInt(page.slice(1)), 1);
! 475: dlParams.pn.value = page;
! 476: display(details);
! 477: } else {
! 478: alert("You are already on the first page!");
! 479: }
! 480:
! 481: } else if ( page.indexOf('+') == 0 ) {
! 482: page = parseInt(dlParams.pn.value) + parseInt(page.slice(1));
! 483: dlParams.pn.value = page;
! 484: display(details);
! 485: } else if ( page == parseInt(page) ) {
! 486: dlParams.pn.value = parseInt(page);
! 487: display(details);
! 488: }
! 489:
! 490: }
! 491:
! 492: function zoomFullpage() {
! 493: // zooms out to show the whole image
! 494: setParameter("wx", 0.0);
! 495: setParameter("wy", 0.0);
! 496: setParameter("ww", 1.0);
! 497: setParameter("wh", 1.0);
! 498: parseArea();
! 499: display(3);
! 500: }
! 501:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>