Annotation of zogiLib/js/dllib.js, revision 1.4

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>