Annotation of zogiLib/js/dllib.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 20.7.2004
! 18: first version by Christian Luginbuehl, 01.05.2003
! 19: Changed for digiLib in Zope by DW 24.03.2004
! 20:
! 21: Requires baselib.js !
! 22:
! 23: */
! 24:
! 25: var dlScriptVersion = "1.0b1";
! 26:
! 27: /*
! 28: * more parameter handling
! 29: */
! 30:
! 31: var dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
! 32: var dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
! 33:
! 34: function parseArea() {
! 35: // returns area Rectangle from current parameters
! 36: return new Rectangle(getParameter("wx"), getParameter("wy"), getParameter("ww"), getParameter("wh"));
! 37: }
! 38:
! 39: function setParamFromArea(rect) {
! 40: // sets digilib wx etc. from rect
! 41: setParameter("wx", cropFloat(rect.x));
! 42: setParameter("wy", cropFloat(rect.y));
! 43: setParameter("ww", cropFloat(rect.width));
! 44: setParameter("wh", cropFloat(rect.height));
! 45: return true;
! 46: }
! 47:
! 48: var dlTrafo = new Transform();
! 49:
! 50: function parseTrafo(elem) {
! 51: // returns Transform from current dlArea and picsize
! 52: var picsize = getElementRect(elem);
! 53: var trafo = new Transform();
! 54: // subtract area offset and size
! 55: trafo.concat(getTranslation(new Position(-dlArea.x, -dlArea.y)));
! 56: trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height)));
! 57: // scale to screen size
! 58: trafo.concat(getScale(picsize));
! 59: trafo.concat(getTranslation(picsize));
! 60: // rotate
! 61: //trafo.concat(getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height)));
! 62: // mirror
! 63: //if (hasFlag("hmir")) {
! 64: //trafo.m00 = - trafo.m00;
! 65: //}
! 66: //if (hasFlag("vmir")) {
! 67: //trafo.m11 = - trafo.m11;
! 68: //}
! 69: return trafo;
! 70: }
! 71:
! 72:
! 73: var dlMarks = new Array();
! 74:
! 75: function parseMarks() {
! 76: // returns marks array from current parameters
! 77: var marks = new Array();
! 78: var ma;
! 79: var mk = getParameter("mk");
! 80: if (mk.indexOf(";") >= 0) {
! 81: // old format with ";"
! 82: ma = mk.split(";");
! 83: } else {
! 84: ma = mk.split(",");
! 85: }
! 86: for (var i = 0; i < ma.length ; i++) {
! 87: var pos = ma[i].split("/");
! 88: if (pos.length > 1) {
! 89: marks.push(new Position(pos[0], pos[1]));
! 90: }
! 91: }
! 92: return marks;
! 93: }
! 94:
! 95: function getAllMarks() {
! 96: // returns a string with all marks in query format
! 97: var marks = new Array();
! 98: for (var i = 0; i < dlMarks.length; i++) {
! 99: marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
! 100: }
! 101: return marks.join(",");
! 102: }
! 103:
! 104: function addMark(pos) {
! 105: // add a mark
! 106: dlMarks.push(pos);
! 107: setParameter("mk", getAllMarks());
! 108: return true;
! 109: }
! 110:
! 111: function deleteMark() {
! 112: // delete the last mark
! 113: dlMarks.pop();
! 114: setParameter("mk", getAllMarks());
! 115: return true;
! 116: }
! 117:
! 118: var dlFlags = new Object();
! 119:
! 120: function hasFlag(mode) {
! 121: // returns if mode flag is set
! 122: return (dlFlags[mode]);
! 123: }
! 124:
! 125: function addFlag(mode) {
! 126: // add a mode flag
! 127: dlFlags[mode] = mode;
! 128: setParameter("mo", getAllFlags());
! 129: return true;
! 130: }
! 131:
! 132: function removeFlag(mode) {
! 133: // remove a mode flag
! 134: if (dlFlags[mode]) {
! 135: delete dlFlags[mode];
! 136: }
! 137: setParameter("mo", getAllFlags());
! 138: return true;
! 139: }
! 140:
! 141: function toggleFlag(mode) {
! 142: // change a mode flag
! 143: if (dlFlags[mode]) {
! 144: delete dlFlags[mode];
! 145: } else {
! 146: dlFlags[mode] = mode;
! 147: }
! 148: setParameter("mo", getAllFlags());
! 149: return true;
! 150: }
! 151:
! 152: function getAllFlags() {
! 153: // returns a string with all flags in query format
! 154: var fa = new Array();
! 155: for (var f in dlFlags) {
! 156: if ((f != "")&&(dlFlags[f] != null)) {
! 157: fa.push(f);
! 158: }
! 159: }
! 160: return fa.join(",");
! 161: }
! 162:
! 163: function parseFlags() {
! 164: // sets dlFlags from the current parameters
! 165: var flags = new Object();
! 166: var fa = getParameter("mo").split(",");
! 167: for (var i = 0; i < fa.length ; i++) {
! 168: var f = fa[i];
! 169: if (f != "") {
! 170: flags[f] = f;
! 171: }
! 172: }
! 173: return flags;
! 174: }
! 175:
! 176:
! 177: function bestPicSize(elem, inset) {
! 178: // returns a Size with the best image size for the given element
! 179: if (! defined(inset)) {
! 180: inset = 25;
! 181: }
! 182: var ws = getWinSize();
! 183: var es = getElementPosition(elem);
! 184: if (es) {
! 185: ws.width = ws.width - es.x - inset;
! 186: ws.height = ws.height - es.y - inset;
! 187: }
! 188: return ws;
! 189: }
! 190:
! 191:
! 192: /* **********************************************
! 193: * digilib specific routines
! 194: * ******************************************** */
! 195:
! 196: var elemScaler = null;
! 197: var picElem = null;
! 198:
! 199:
! 200: function dl_param_init() {
! 201: // parameter initialisation before onload
! 202:
! 203: // put the query parameters (sans "?") in the parameters array
! 204: parseParameters(location.search.slice(1));
! 205: // treat special parameters
! 206: dlMarks = parseMarks();
! 207: dlArea = parseArea();
! 208: dlFlags = parseFlags();
! 209: }
! 210:
! 211:
! 212: function dl_init() {
! 213: // initalisation on load
! 214: elemScaler = getElement("scaler", true);
! 215: picElem = getElement("pic", true);
! 216: if (picElem == null && elemScaler) {
! 217: // in N4 pic is in the scaler layer
! 218: picElem = elemScaler.document.images[0];
! 219: }
! 220: if ((!elemScaler)||(!picElem)) {
! 221: alert("Sorry, zogilib doesn't work here!");
! 222: return false;
! 223: }
! 224: // give a name to the window containing digilib
! 225: if (defined(dlTarget)&&(dlTarget)) {
! 226: window.name = dlTarget;
! 227: } else {
! 228: window.name = "digilib";
! 229: }
! 230: // put the query parameters (sans "?") in the parameters array
! 231: parseParameters(location.search.slice(1));
! 232: // treat special parameters
! 233: dlMarks = parseMarks();
! 234: dlArea = parseArea();
! 235: dlFlags = parseFlags();
! 236: // wait for image to load and display marks
! 237: renderMarks();
! 238: // done
! 239: focus();
! 240: return;
! 241: }
! 242:
! 243:
! 244: function display(detail) {
! 245: // redisplay the page
! 246: if (! detail) {
! 247: detail = 9;
! 248: }
! 249: var queryString = getAllParameters(detail);
! 250: location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
! 251: }
! 252:
! 253:
! 254: /* **********************************************
! 255: * interactive digilib functions
! 256: * ******************************************** */
! 257:
! 258:
! 259: function renderMarks() {
! 260: // put the visible marks on the image
! 261: var mark_count = dlMarks.length;
! 262: // make shure the image is loaded so we know its size
! 263: if (defined(picElem.complete) && picElem.complete == false && ! browserType.isN4 ) {
! 264: setTimeout("renderMarks()", 100);
! 265: } else {
! 266: dlTrafo = parseTrafo(picElem);
! 267: for (var i = 0; i < 8; i++) {
! 268: var me = getElement("dot"+i);
! 269: if (i < mark_count) {
! 270: if (dlArea.containsPosition(dlMarks[i])) {
! 271: var mpos = dlTrafo.transform(dlMarks[i]);
! 272: // suboptimal to place -5 pixels and not half size of mark-image
! 273: mpos.x = mpos.x -5;
! 274: mpos.y = mpos.y -5;
! 275: moveElement(me, mpos);
! 276: showElement(me, true);
! 277: }
! 278: } else {
! 279: // hide the other marks
! 280: showElement(me, false);
! 281: }
! 282: }
! 283: }
! 284: }
! 285:
! 286:
! 287: function setMark(reload) {
! 288: // add a mark where clicked
! 289: if ( dlMarks.length > 7 ) {
! 290: alert("Only 8 marks are possible at the moment!");
! 291: return;
! 292: }
! 293:
! 294: function markEvent(evt) {
! 295: // event handler adding a new mark
! 296: unregisterMouseDown(elemScaler, markEvent);
! 297: var p = dlTrafo.invtransform(evtPosition(evt));
! 298: addMark(p);
! 299: if (defined(reload)&&(!reload)) {
! 300: // don't redisplay
! 301: renderMarks();
! 302: return;
! 303: }
! 304: display();
! 305: }
! 306:
! 307: // starting event capture
! 308: registerMouseDown(elemScaler, markEvent);
! 309: }
! 310:
! 311:
! 312: function removeMark(reload) {
! 313: // remove the last mark
! 314: deleteMark();
! 315: if (defined(reload)&&(!reload)) {
! 316: // don't redisplay
! 317: renderMarks();
! 318: return;
! 319: }
! 320: display();
! 321: }
! 322:
! 323:
! 324: function zoomArea() {
! 325: var click = 1;
! 326: var pt1, pt2;
! 327: var eck1pos, eck2pos, eck3pos, eck4pos;
! 328: window.focus();
! 329: var eck1 = getElement("eck1");
! 330: var eck2 = getElement("eck2");
! 331: var eck3 = getElement("eck3");
! 332: var eck4 = getElement("eck4");
! 333:
! 334: function zoomClick(evt) {
! 335: // mouse click handler
! 336: if (click == 1) {
! 337: // first click -- start moving
! 338: click = 2;
! 339: pt1 = evtPosition(evt);
! 340: pt2 = pt1;
! 341: eck1pos = pt1;
! 342: eck2pos = new Position(pt1.x - 12, pt1.y);
! 343: eck3pos = new Position(pt1.x, pt1.y - 12);
! 344: eck4pos = new Position(pt1.y - 12, pt1.y - 12);
! 345: moveElement(eck1, eck1pos);
! 346: moveElement(eck2, eck2pos);
! 347: moveElement(eck3, eck3pos);
! 348: moveElement(eck4, eck4pos);
! 349: showElement(eck1, true);
! 350: showElement(eck2, true);
! 351: showElement(eck3, true);
! 352: showElement(eck4, true);
! 353: registerMouseMove(elemScaler, zoomMove);
! 354: registerMouseMove(eck4, zoomMove);
! 355: } else {
! 356: // second click -- end moving
! 357: pt2 = evtPosition(evt);
! 358: showElement(eck1, false);
! 359: showElement(eck2, false);
! 360: showElement(eck3, false);
! 361: showElement(eck4, false);
! 362: unregisterMouseMove(elemScaler, zoomMove);
! 363: unregisterMouseMove(eck4, zoomMove);
! 364: unregisterMouseDown(elemScaler, zoomClick);
! 365: unregisterMouseDown(eck4, zoomClick);
! 366: var p1 = dlTrafo.invtransform(pt1);
! 367: var p2 = dlTrafo.invtransform(pt2);
! 368: var ww = p2.x-p1.x;
! 369: var wh = p2.y-p1.y;
! 370: if ((ww > 0)&&(wh > 0)) {
! 371: setParameter("wx", cropFloat(p1.x));
! 372: setParameter("wy", cropFloat(p1.y));
! 373: setParameter("ww", cropFloat(ww));
! 374: setParameter("wh", cropFloat(wh));
! 375: parseArea();
! 376: // zoomed is always fit
! 377: setParameter("ws", 1);
! 378: display();
! 379: }
! 380: }
! 381: }
! 382:
! 383: function zoomMove(evt) {
! 384: // mouse move handler
! 385: pt2 = evtPosition(evt);
! 386: // restrict marks to move right and down
! 387: eck1pos = pt1;
! 388: eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y);
! 389: eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12);
! 390: eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12);
! 391: moveElement(eck1, eck1pos);
! 392: moveElement(eck2, eck2pos);
! 393: moveElement(eck3, eck3pos);
! 394: moveElement(eck4, eck4pos);
! 395: }
! 396:
! 397: // starting event capture
! 398: registerMouseDown(elemScaler, zoomClick);
! 399: registerMouseDown(eck4, zoomClick);
! 400: }
! 401:
! 402: var ZOOMFACTOR = Math.sqrt(2);
! 403:
! 404: function zoomBy(factor) {
! 405: // zooms by the given factor
! 406: var newarea = dlArea.copy();
! 407: newarea.width /= factor;
! 408: newarea.height /= factor;
! 409: newarea.x -= 0.5 * (newarea.width - dlArea.width);
! 410: newarea.y -= 0.5 * (newarea.height - dlArea.height);
! 411: newarea = dlMaxArea.fit(newarea);
! 412: setParamFromArea(newarea);
! 413: display();
! 414: }
! 415:
! 416:
! 417: function zoomFullpage() {
! 418: // zooms out to show the whole image
! 419: setParameter("wx", 0.0);
! 420: setParameter("wy", 0.0);
! 421: setParameter("ww", 1.0);
! 422: setParameter("wh", 1.0);
! 423: display();
! 424: }
! 425:
! 426:
! 427: function moveCenter() {
! 428: // move visible area so that it's centered around the clicked point
! 429: if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
! 430: // noting to do
! 431: return;
! 432: }
! 433: window.focus();
! 434:
! 435: function moveCenterEvent(evt) {
! 436: // move to handler
! 437: unregisterMouseDown(elemScaler, moveCenterEvent);
! 438: var pt = dlTrafo.invtransform(evtPosition(evt));
! 439: var newarea = new Rectangle(pt.x-0.5*dlArea.width, pt.y-0.5*dlArea.height, dlArea.width, dlArea.height);
! 440: newarea = dlMaxArea.fit(newarea);
! 441: // set parameters
! 442: setParamFromArea(newarea);
! 443: parseArea();
! 444: display();
! 445: }
! 446:
! 447: // starting event capture
! 448: registerMouseDown(elemScaler, moveCenterEvent);
! 449: }
! 450:
! 451:
! 452:
! 453: function getRef() {
! 454: // returns a reference to the current digilib set
! 455: if (! baseUrl) {
! 456: var baseUrl = location.protocol + "//" + location.host + location.pathname;
! 457: }
! 458: var hyperlinkRef = baseUrl;
! 459: var par = getAllParameters(9);
! 460: if (par.length > 0) {
! 461: hyperlinkRef += "?" + par;
! 462: }
! 463: return hyperlinkRef;
! 464: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>