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

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

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