Annotation of zogiLib/js/dl_lib.js, revision 1.9

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: 
1.2       casties    46: function parseTrafo(elem) {
1.1       casties    47:     // returns Transform from current dlArea and picsize
1.2       casties    48:     var picsize = getElementRect(elem);
1.1       casties    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();
1.2       casties    74:     var ma;
                     75:     var mk = getParameter("mk");
                     76:     if (mk.indexOf(";") >= 0) {
                     77:    // old format with ";"
                     78:    ma = mk.split(";");
                     79:     } else {
                     80:    ma = mk.split(",");
                     81:     }
1.1       casties    82:     for (var i = 0; i < ma.length ; i++) {
                     83:    var pos = ma[i].split("/");
                     84:    if (pos.length > 1) {
                     85:        marks.push(new Position(pos[0], pos[1]));
                     86:    }
                     87:     }
                     88:     return marks;
                     89: }
                     90: 
                     91: function getAllMarks() {
                     92:     // returns a string with all marks in query format
                     93:     var marks = new Array();
                     94:     for (var i = 0; i < dlMarks.length; i++) {
                     95:    marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
                     96:     }
1.2       casties    97:     return marks.join(",");
1.1       casties    98: }
                     99: 
                    100: function addMark(pos) {
                    101:     // add a mark
                    102:     dlMarks.push(pos);
                    103:     setParameter("mk", getAllMarks());
                    104:     return true;
                    105: }
                    106: 
                    107: function deleteMark() {
                    108:     // delete the last mark
                    109:     dlMarks.pop();
                    110:     setParameter("mk", getAllMarks());
                    111:     return true;
                    112: }
                    113: 
                    114: var dlFlags = new Object();
                    115: 
                    116: function hasFlag(mode) {
                    117:     // returns if mode flag is set
                    118:     return (dlFlags[mode]);
                    119: }
                    120: 
                    121: function addFlag(mode) {
                    122:     // add a mode flag
                    123:     dlFlags[mode] = mode;
                    124:     return true;
                    125: }
                    126: 
                    127: function removeFlag(mode) {
                    128:     // remove a mode flag
                    129:     if (dlFlags[mode]) {
                    130:    delete dlFlags[mode];
                    131:     }
                    132:     return true;
                    133: }
                    134: 
                    135: function toggleFlag(mode) {
                    136:     // change a mode flag
                    137:     if (dlFlags[mode]) {
                    138:    delete dlFlags[mode];
                    139:     } else {
                    140:    dlFlags[mode] = mode;
                    141:     }
                    142:     return true;
                    143: }
                    144: 
                    145: function getAllFlags() {
                    146:     // returns a string with all flags in query format
                    147:     var fa = new Array();
                    148:     for (var f in dlFlags) {
                    149:    if ((f != "")&&(dlFlags[f] != null)) {
                    150:        fa.push(f);
                    151:    }
                    152:     }
                    153:     return fa.join(",");
                    154: }
                    155: 
                    156: function parseFlags() {
                    157:     // sets dlFlags from the current parameters
                    158:     var flags = new Object();
                    159:     var fa = getParameter("mo").split(",");
                    160:     for (var i = 0; i < fa.length ; i++) {
                    161:    var f = fa[i];
                    162:    if (f != "") {
                    163:        flags[f] = f;
                    164:    }
                    165:     }
                    166:     return flags;
                    167: }    
                    168: 
                    169: 
1.2       casties   170: function bestPicSize(elem, inset) {
                    171:     // returns a Size with the best image size for the given element
                    172:     if (! defined(inset)) {
                    173:    inset = 25;
                    174:     }
1.1       casties   175:     var ws = getWinSize();
1.2       casties   176:     var es = getElementPosition(elem);
1.1       casties   177:     if (es) {
                    178:    ws.width = ws.width - es.x - inset;
                    179:    ws.height = ws.height - es.y - inset;
                    180:     }
                    181:     return ws;
                    182: }
                    183: 
                    184: 
                    185: /* **********************************************
                    186:  *     digilib specific routines
                    187:  * ******************************************** */
                    188: 
1.2       casties   189: var elemScaler = null;
                    190: var picElem = null;
                    191: 
                    192: function dl_init() {
1.7       casties   193:     elemScaler = getElement("scaler", true);
1.2       casties   194:     picElem = getElement("pic", true);
1.7       casties   195:     if (picElem == null && elemScaler) {
1.4       casties   196:    // in N4 pic is in the scaler layer
1.2       casties   197:    picElem = elemScaler.document.images[0];
1.6       casties   198:     }
                    199:     if ((!elemScaler)||(!picElem)) {
                    200:    alert("Sorry, zogilib doesn't work here!");
                    201:    return false;
1.2       casties   202:     }
                    203:     // put the query parameters (sans "?") in the parameters array
1.1       casties   204:     parseParameters(location.search.slice(1));
                    205:     // treat special parameters
                    206:     dlMarks = parseMarks();
                    207:     dlArea = parseArea();
                    208:     dlFlags = parseFlags();
1.2       casties   209:     // wait for image to load and display marks
1.1       casties   210:     renderMarks();
1.2       casties   211:     // done
1.1       casties   212:     focus();
1.4       casties   213:     return;
1.1       casties   214: }
                    215: 
                    216: function display(detail) {
                    217:     // redisplay the page
1.2       casties   218:     if (! detail) {
                    219:    detail = 9;
                    220:     }
1.1       casties   221:     var queryString = getAllParameters(detail);
                    222:     location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
                    223: }
                    224: 
1.2       casties   225: function openWin(url, title, params) {
                    226:     // open browser window
                    227:     var ow = window.open(url, title, params);
                    228:     ow.focus();
                    229: }
1.1       casties   230: 
                    231: /* **********************************************
                    232:  *     interactive digilib functions
                    233:  * ******************************************** */
                    234: 
1.2       casties   235: function getRef(select) {
1.1       casties   236:     // open a dialog with a reference to the current digilib set
1.3       casties   237:     if (! baseUrl) {
                    238:    var baseUrl = location.protocol + "//" + location.host + location.pathname;
                    239:     }
                    240:     var hyperlinkRef = baseUrl;
                    241:     var par = getAllParameters(9);
                    242:     if (par.length > 0) {
                    243:    hyperlinkRef += "?" + par;
                    244:     }
1.1       casties   245:     if ( select == 0 ) {
                    246:    prompt("Link for LaTeX-documents", "\\href{" + hyperlinkRef + "}{TEXT}");
                    247:     } else if ( select == 1 ) {
                    248:    prompt("Link for HTML-documents", hyperlinkRef);
                    249:     }
                    250: }
                    251: 
                    252: function renderMarks() {
                    253:     // put the visible marks on the image
                    254:     var mark_count = dlMarks.length;
                    255:     // make shure the image is loaded so we know its size
1.2       casties   256:     if (defined(picElem.complete) && picElem.complete == false && ! browserType.isN4 ) {
                    257:    setTimeout("renderMarks()", 100);
1.1       casties   258:     } else {
1.2       casties   259:    dlTrafo = parseTrafo(picElem);
1.1       casties   260:    for (var i = 0; i < 8; i++) {
1.2       casties   261:        var me = getElement("dot"+i);
1.1       casties   262:        if (i < mark_count) {
                    263:        if (dlArea.containsPosition(dlMarks[i])) {
                    264:            var mpos = dlTrafo.transform(dlMarks[i]);
                    265:            // suboptimal to place -5 pixels and not half size of mark-image
                    266:            mpos.x = mpos.x -5;
                    267:            mpos.y = mpos.y -5;
1.2       casties   268:            moveElement(me, mpos);
                    269:            showElement(me, true);
1.1       casties   270:        }
                    271:        } else {
                    272:        // hide the other marks
1.2       casties   273:        showElement(me, false);
1.1       casties   274:        }
                    275:    }
                    276:     }
                    277: }
                    278: 
1.2       casties   279: function setMark() {
1.1       casties   280:     // add a mark where clicked
                    281:     if ( dlMarks.length > 7 ) {
                    282:    alert("Only 8 marks are possible at the moment!");
                    283:    return;
                    284:     }
                    285: 
                    286:     function markEvent(evt) {
1.4       casties   287:    // event handler adding a new mark
                    288:    unregisterMouseDown(elemScaler, markEvent);
1.1       casties   289:    var p = dlTrafo.invtransform(evtPosition(evt));
                    290:    addMark(p);
1.2       casties   291:    display();
1.1       casties   292:     }
                    293: 
                    294:     // starting event capture
1.2       casties   295:     registerMouseDown(elemScaler, markEvent);
1.1       casties   296: }
                    297: 
                    298: 
                    299: function zoomArea() {
                    300:     var click = 1;
                    301:     var pt1, pt2;
                    302:     var eck1pos, eck2pos, eck3pos, eck4pos;
                    303:     window.focus();
1.2       casties   304:     var eck1 = getElement("eck1");
                    305:     var eck2 = getElement("eck2");
                    306:     var eck3 = getElement("eck3");
                    307:     var eck4 = getElement("eck4");
1.1       casties   308: 
                    309:     function zoomClick(evt) {
                    310:    // mouse click handler
                    311:    if (click == 1) {
                    312:        // first click -- start moving
                    313:        click = 2;
                    314:        pt1 = evtPosition(evt);
                    315:        pt2 = pt1;
                    316:        eck1pos = pt1;
                    317:        eck2pos = new Position(pt1.x - 12, pt1.y);
                    318:        eck3pos = new Position(pt1.x, pt1.y - 12);
                    319:        eck4pos = new Position(pt1.y - 12, pt1.y - 12);
1.2       casties   320:        moveElement(eck1, eck1pos);
                    321:        moveElement(eck2, eck2pos);
                    322:        moveElement(eck3, eck3pos);
                    323:        moveElement(eck4, eck4pos);
                    324:        showElement(eck1, true);
                    325:        showElement(eck2, true);
                    326:        showElement(eck3, true);
                    327:        showElement(eck4, true);
                    328:        registerMouseMove(elemScaler, zoomMove);
                    329:        registerMouseMove(eck4, zoomMove);
1.1       casties   330:    } else {
                    331:        // second click -- end moving
                    332:        pt2 = evtPosition(evt);
1.2       casties   333:        showElement(eck1, false);
                    334:        showElement(eck2, false);
                    335:        showElement(eck3, false);
                    336:        showElement(eck4, false);
                    337:        unregisterMouseMove(elemScaler, zoomMove);
                    338:        unregisterMouseMove(eck4, zoomMove);
                    339:        unregisterMouseDown(elemScaler, zoomClick);
                    340:        unregisterMouseDown(eck4, zoomClick);
1.9     ! casties   341:        unregisterMouseUp(elemScaler, zoomClick);
        !           342:        unregisterMouseUp(eck4, zoomClick);
1.1       casties   343:        var p1 = dlTrafo.invtransform(pt1);
                    344:        var p2 = dlTrafo.invtransform(pt2);
                    345:        var ww = p2.x-p1.x;
                    346:        var wh = p2.y-p1.y;
                    347:        if ((ww > 0)&&(wh > 0)) {
                    348:        setParameter("wx", cropFloat(p1.x));
                    349:        setParameter("wy", cropFloat(p1.y));
                    350:        setParameter("ww", cropFloat(ww));
                    351:        setParameter("wh", cropFloat(wh));
                    352:        parseArea();
1.2       casties   353:        // zoomed is always fit
                    354:        setParameter("ws", 1);
                    355:        display();
1.1       casties   356:        }
                    357:    }
                    358:     }
                    359: 
                    360:     function zoomMove(evt) {
                    361:    // mouse move handler
                    362:    pt2 = evtPosition(evt);
                    363:    // restrict marks to move right and down
                    364:    eck1pos = pt1;
                    365:    eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y);
                    366:    eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12);
                    367:    eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12);
1.2       casties   368:    moveElement(eck1, eck1pos);
                    369:    moveElement(eck2, eck2pos);
                    370:    moveElement(eck3, eck3pos);
                    371:    moveElement(eck4, eck4pos);
1.1       casties   372:     }
                    373: 
                    374:     // starting event capture
1.2       casties   375:     registerMouseDown(elemScaler, zoomClick);
                    376:     registerMouseDown(eck4, zoomClick);
1.9     ! casties   377:     registerMouseUp(elemScaler, zoomClick);
        !           378:     registerMouseUp(eck4, zoomClick);
1.1       casties   379: }
                    380: 
                    381: 
1.4       casties   382: function moveCenter() {
                    383:     // move visible area so that it's centered around the clicked point
1.1       casties   384:     if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
1.4       casties   385:    // noting to do
1.1       casties   386:    return;
                    387:     }
1.4       casties   388:     window.focus();
1.1       casties   389: 
1.4       casties   390:     function moveCenterEvent(evt) {
1.1       casties   391:    // move to handler
1.4       casties   392:    unregisterMouseDown(elemScaler, moveCenterEvent);
                    393:    var pt = dlTrafo.invtransform(evtPosition(evt));
1.1       casties   394:    var newarea = new Rectangle(pt.x-0.5*dlArea.width, pt.y-0.5*dlArea.height, dlArea.width, dlArea.height);
                    395:    newarea = dlMaxArea.fit(newarea);
                    396:    // set parameters
1.4       casties   397:    setParamFromArea(newarea);
                    398:    parseArea();
1.2       casties   399:    display();
1.1       casties   400:     }
                    401: 
                    402:     // starting event capture
1.4       casties   403:     registerMouseDown(elemScaler, moveCenterEvent);
1.1       casties   404: }
                    405: 
                    406: 
1.2       casties   407: // debuggin'
                    408: function showcoordsN4() {
                    409:     var s = "";
                    410:     for (var l in document.layers) {
                    411:    if (l == "length") continue;
                    412:    e = document.layers[l];
                    413:    if (e) {
                    414:        s += " [" + e.name + "]: pageX:" + e.pageX + " pageY:" + e.pageY + " width:" + e.clip.width + " height:" + e.clip.height + " visibility:" + e.visibility + " zindex:" + e.zIndex + "<br>\n";
                    415:    } else {
                    416:        s += " {" + l + "}<br>\n";
1.1       casties   417:    }
                    418:     }
1.2       casties   419:     return s;
                    420: }

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