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

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.7     ! casties    20:   Robert Casties, 8.11.2005
1.1       casties    21: 
1.2       casties    22:   ! Requires baselib.js !
1.1       casties    23: 
                     24: */
                     25: 
1.5       casties    26: 
                     27: function identify() {
1.6       casties    28:         // used for identifying a digilib instance
                     29:         // Relato uses that function - lugi
                     30:         return "Digilib 0.6";
1.5       casties    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) {
1.6       casties    81:         // old format with ";"
                     82:         ma = mk.split(";");
1.1       casties    83:     } else {
1.6       casties    84:         ma = mk.split(",");
1.1       casties    85:     }
                     86:     for (var i = 0; i < ma.length ; i++) {
1.6       casties    87:         var pos = ma[i].split("/");
                     88:         if (pos.length > 1) {
                     89:             marks.push(new Position(pos[0], pos[1]));
                     90:         }
1.1       casties    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++) {
1.6       casties    99:         marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
1.1       casties   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]) {
1.6       casties   133:         delete dlFlags[mode];
1.1       casties   134:     }
                    135:     setParameter("mo", getAllFlags());
                    136:     return true;
                    137: }
                    138: 
                    139: function toggleFlag(mode) {
                    140:     // change a mode flag
                    141:     if (dlFlags[mode]) {
1.6       casties   142:         delete dlFlags[mode];
1.1       casties   143:     } else {
1.6       casties   144:         dlFlags[mode] = mode;
1.1       casties   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) {
1.6       casties   154:         if ((f != "")&&(dlFlags[f] != null)) {
                    155:             fa.push(f);
                    156:         }
1.1       casties   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++) {
1.6       casties   166:         var f = fa[i];
                    167:         if (f != "") {
                    168:             flags[f] = f;
                    169:         }
1.1       casties   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)) {
1.6       casties   178:         inset = 25;
1.1       casties   179:     }
                    180:     var ws = getWinSize();
                    181:     var es = getElementPosition(elem);
                    182:     if (es) {
1.6       casties   183:         ws.width = ws.width - es.x - inset;
                    184:         ws.height = ws.height - es.y - inset;
1.1       casties   185:     }
                    186:     return ws;
                    187: }
                    188: 
1.7     ! casties   189: function setDLParam(e, s, relative) {
1.6       casties   190:    // sets parameter based on HTML event
                    191:    var nam;
                    192:     var val;
                    193:     if (s.type && (s.type == "select-one")) {
                    194:         nam = s.name;
                    195:         val = s.options[s.selectedIndex].value;
                    196:     } else if (s.name && s.value) {
                    197:         nam = s.name;
                    198:         val = s.value;
                    199:     }
                    200:     if (nam && val) {
1.7     ! casties   201:         setParameter(nam, val, relative);
1.6       casties   202:         display();
                    203:     } else {
1.7     ! casties   204:         alert("ERROR: unable to process event!");
1.6       casties   205:     }
                    206:     return true;
                    207: }
                    208: 
1.1       casties   209: 
                    210: /* **********************************************
                    211:  *     digilib specific routines
                    212:  * ******************************************** */
                    213: 
                    214: 
                    215: function dl_param_init() {
                    216:     // parameter initialisation before onload
1.5       casties   217:     if (!baseScriptVersion) {
1.6       casties   218:         base_init();
1.5       casties   219:     }
1.7     ! casties   220:     dlScriptVersion = "1.2b";
1.5       casties   221:     dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
                    222:     dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
                    223:     dlTrafo = new Transform();
                    224:     dlMarks = new Array();
                    225:     dlFlags = new Object();
                    226:     elemScaler = null;
                    227:     picElem = null;
                    228:     ZOOMFACTOR = Math.sqrt(2);
1.1       casties   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: }
                    237: 
                    238: 
                    239: function dl_init() {
                    240:     // initalisation on load
1.5       casties   241:     if (!dlScriptVersion) {
1.6       casties   242:         dl_param_init();
1.5       casties   243:     }
1.1       casties   244:     elemScaler = getElement("scaler", true);
                    245:     picElem = getElement("pic", true);
                    246:     if (picElem == null && elemScaler) {
1.6       casties   247:         // in N4 pic is in the scaler layer
                    248:         picElem = elemScaler.document.images[0];
1.1       casties   249:     }
                    250:     if ((!elemScaler)||(!picElem)) {
1.6       casties   251:         alert("Sorry, digilib doesn't work here!");
                    252:         return false;
1.1       casties   253:     }
                    254:     // give a name to the window containing digilib
                    255:     if (defined(dlTarget)&&(dlTarget)) {
1.6       casties   256:         window.name = dlTarget;
1.1       casties   257:     } else {
1.6       casties   258:         window.name = "digilib";
1.1       casties   259:     }
                    260:     // put the query parameters (sans "?") in the parameters array
                    261:     parseParameters(location.search.slice(1));
                    262:     // treat special parameters
                    263:     dlMarks = parseMarks();
                    264:     dlArea = parseArea();
                    265:     dlFlags = parseFlags();
                    266:     // wait for image to load and display marks
                    267:     renderMarks();
                    268:     // done
                    269:     focus();
                    270:     return;
                    271: }
                    272: 
                    273: 
                    274: function display(detail) {
                    275:     // redisplay the page
                    276:     if (! detail) {
1.7     ! casties   277:         detail = 255;
1.1       casties   278:     }
                    279:     var queryString = getAllParameters(detail);
                    280:     location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
                    281: }
                    282: 
                    283: 
                    284: /* **********************************************
                    285:  *     interactive digilib functions
                    286:  * ******************************************** */
                    287: 
                    288: 
                    289: function renderMarks() {
                    290:     // put the visible marks on the image
                    291:     var mark_count = dlMarks.length;
                    292:     // make shure the image is loaded so we know its size
                    293:     if (defined(picElem.complete) && picElem.complete == false && ! browserType.isN4 ) {
1.6       casties   294:         setTimeout("renderMarks()", 100);
1.1       casties   295:     } else {
1.6       casties   296:         dlTrafo = parseTrafo(picElem);
                    297:         for (var i = 0; i < 8; i++) {
                    298:             var me = getElement("dot"+i);
                    299:             if (i < mark_count) {
                    300:                 if (dlArea.containsPosition(dlMarks[i])) {
                    301:                     var mpos = dlTrafo.transform(dlMarks[i]);
                    302:                     // suboptimal to place -5 pixels and not half size of mark-image
                    303:                     mpos.x = mpos.x -5;
                    304:                     mpos.y = mpos.y -5;
                    305:                     moveElement(me, mpos);
                    306:                     showElement(me, true);
                    307:                 }
                    308:             } else {
                    309:                 // hide the other marks
                    310:                 showElement(me, false);
                    311:             }
                    312:         }
1.1       casties   313:     }
                    314: }
                    315: 
                    316: 
                    317: function setMark(reload) {
                    318:     // add a mark where clicked
                    319:     if ( dlMarks.length > 7 ) {
1.6       casties   320:         alert("Only 8 marks are possible at the moment!");
                    321:         return;
1.1       casties   322:     }
1.2       casties   323:     window.focus();
1.1       casties   324: 
                    325:     function markEvent(evt) {
1.6       casties   326:         // event handler adding a new mark
                    327:         unregisterEvent("mousedown", elemScaler, markEvent);
                    328:         var p = dlTrafo.invtransform(evtPosition(evt));
                    329:         addMark(p);
                    330:         if (defined(reload)&&(!reload)) {
                    331:             // don't redisplay
                    332:             renderMarks();
                    333:             return;
                    334:         }
                    335:         display();
1.1       casties   336:     }
                    337: 
                    338:     // starting event capture
1.2       casties   339:     registerEvent("mousedown", elemScaler, markEvent);
1.1       casties   340: }
                    341: 
                    342: 
                    343: function removeMark(reload) {
                    344:     // remove the last mark
                    345:     deleteMark();
                    346:     if (defined(reload)&&(!reload)) {
1.6       casties   347:         // don't redisplay
                    348:         renderMarks();
                    349:         return;
1.1       casties   350:     }
                    351:     display();
                    352: }
                    353: 
                    354: 
                    355: function zoomArea() {
                    356:     var click = 1;
                    357:     var pt1, pt2;
                    358:     var eck1pos, eck2pos, eck3pos, eck4pos;
                    359:     window.focus();
                    360:     var eck1 = getElement("eck1");
                    361:     var eck2 = getElement("eck2");
                    362:     var eck3 = getElement("eck3");
                    363:     var eck4 = getElement("eck4");
                    364: 
                    365:     function zoomClick(evt) {
1.6       casties   366:         // mouse click handler
                    367:         if (click == 1) {
                    368:             // first click -- start moving
                    369:             click = 2;
                    370:             pt1 = evtPosition(evt);
                    371:             pt2 = pt1;
                    372:             eck1pos = pt1;
                    373:             eck2pos = new Position(pt1.x - 12, pt1.y);
                    374:             eck3pos = new Position(pt1.x, pt1.y - 12);
                    375:             eck4pos = new Position(pt1.y - 12, pt1.y - 12);
                    376:             moveElement(eck1, eck1pos);
                    377:             moveElement(eck2, eck2pos);
                    378:             moveElement(eck3, eck3pos);
                    379:             moveElement(eck4, eck4pos);
                    380:             showElement(eck1, true);
                    381:             showElement(eck2, true);
                    382:             showElement(eck3, true);
                    383:             showElement(eck4, true);
                    384:             // show moving
                    385:             registerEvent("mousemove", elemScaler, zoomMove);
                    386:             registerEvent("mousemove", eck4, zoomMove);
                    387:             // enable drag-to-zoom
                    388:             registerEvent("mouseup", elemScaler, zoomClick);
                    389:             registerEvent("mouseup", eck4, zoomClick);
                    390:         } else {
                    391:             // second click -- end moving
                    392:             pt2 = evtPosition(evt);
                    393:             showElement(eck1, false);
                    394:             showElement(eck2, false);
                    395:             showElement(eck3, false);
                    396:             showElement(eck4, false);
                    397:             unregisterEvent("mousemove", elemScaler, zoomMove);
                    398:             unregisterEvent("mousemove", eck4, zoomMove);
                    399:             unregisterEvent("mousedown", elemScaler, zoomClick);
                    400:             unregisterEvent("mousedown", eck4, zoomClick);
                    401:             var p1 = dlTrafo.invtransform(pt1);
                    402:             var p2 = dlTrafo.invtransform(pt2);
                    403:             var ww = p2.x-p1.x;
                    404:             var wh = p2.y-p1.y;
                    405:             if ((ww > 0)&&(wh > 0)) {
                    406:                 setParameter("wx", cropFloat(p1.x));
                    407:                 setParameter("wy", cropFloat(p1.y));
                    408:                 setParameter("ww", cropFloat(ww));
                    409:                 setParameter("wh", cropFloat(wh));
                    410:                 parseArea();
                    411:                 // zoomed is always fit
                    412:                 setParameter("ws", 1);
                    413:                 display();
                    414:             }
                    415:         }
1.1       casties   416:     }
                    417: 
                    418:     function zoomMove(evt) {
1.6       casties   419:         // mouse move handler
                    420:         pt2 = evtPosition(evt);
                    421:         // restrict marks to move right and down
                    422:         eck1pos = pt1;
                    423:         eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y);
                    424:         eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12);
                    425:         eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12);
                    426:         moveElement(eck1, eck1pos);
                    427:         moveElement(eck2, eck2pos);
                    428:         moveElement(eck3, eck3pos);
                    429:         moveElement(eck4, eck4pos);
1.1       casties   430:     }
                    431: 
                    432:     // starting event capture
1.2       casties   433:     registerEvent("mousedown", elemScaler, zoomClick);
                    434:     registerEvent("mousedown", eck4, zoomClick);
1.1       casties   435: }
                    436: 
                    437: function zoomBy(factor) {
                    438:     // zooms by the given factor
                    439:     var newarea = dlArea.copy();
                    440:     newarea.width /= factor;
                    441:     newarea.height /= factor;
                    442:     newarea.x -= 0.5 * (newarea.width - dlArea.width);
                    443:     newarea.y -= 0.5 * (newarea.height - dlArea.height);
                    444:     newarea = dlMaxArea.fit(newarea);
                    445:     setParamFromArea(newarea);
                    446:     display();
                    447: }
                    448: 
                    449: 
                    450: function zoomFullpage() {
                    451:     // zooms out to show the whole image
                    452:     setParameter("wx", 0.0);
                    453:     setParameter("wy", 0.0);
                    454:     setParameter("ww", 1.0);
                    455:     setParameter("wh", 1.0);
                    456:     display();
                    457: }
                    458: 
                    459: 
                    460: function moveCenter() {
                    461:     // move visible area so that it's centered around the clicked point
                    462:     if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
1.7     ! casties   463:         // nothing to do
1.6       casties   464:         return;
1.1       casties   465:     }
                    466:     window.focus();
                    467: 
                    468:     function moveCenterEvent(evt) {
1.6       casties   469:         // move to handler
                    470:         unregisterEvent("mousedown", elemScaler, moveCenterEvent);
                    471:         var pt = dlTrafo.invtransform(evtPosition(evt));
                    472:         var newarea = new Rectangle(pt.x-0.5*dlArea.width, pt.y-0.5*dlArea.height, dlArea.width, dlArea.height);
                    473:         newarea = dlMaxArea.fit(newarea);
                    474:         // set parameters
                    475:         setParamFromArea(newarea);
                    476:         parseArea();
                    477:         display();
1.1       casties   478:     }
                    479: 
                    480:     // starting event capture
1.2       casties   481:     registerEvent("mousedown", elemScaler, moveCenterEvent);
1.1       casties   482: }
                    483: 
1.5       casties   484: function moveBy(movx, movy) {
1.6       casties   485:     // move visible area by movx and movy (in units of ww, wh)
1.5       casties   486:     if ((dlArea.width == 1.0)&&(dlArea.height == 1.0)) {
1.6       casties   487:         // nothing to do
                    488:         return;
1.5       casties   489:     }
                    490:     var newarea = dlArea.copy();
                    491:     newarea.x += parseFloat(movx)*dlArea.width;
                    492:     newarea.y += parseFloat(movy)*dlArea.height;
                    493:     newarea = dlMaxArea.fit(newarea);
                    494:     // set parameters
                    495:     setParamFromArea(newarea);
                    496:     parseArea();
                    497:     display();
                    498: }
                    499: 
1.1       casties   500: function getRef() {
                    501:     // returns a reference to the current digilib set
                    502:     if (! baseUrl) {
1.6       casties   503:         var baseUrl = location.protocol + "//" + location.host + location.pathname;
1.1       casties   504:     }
                    505:     var hyperlinkRef = baseUrl;
1.7     ! casties   506:     var par = getAllParameters(7+16); // all without ddpi, pt
1.1       casties   507:     if (par.length > 0) {
1.6       casties   508:         hyperlinkRef += "?" + par;
1.1       casties   509:     }
                    510:     return hyperlinkRef;
                    511: }
1.3       casties   512: 
                    513: function getRefWin(type, msg) {
                    514:     // shows an alert with a reference to the current digilib set
                    515:     if (! msg) {
1.6       casties   516:         msg = "Link for HTML documents";
1.4       casties   517:     }
1.3       casties   518:     prompt(msg, getRef());
1.5       casties   519: }
1.6       casties   520: 
                    521: function getQuality() {
                    522:    // returns the current q setting
                    523:     for (var i = 0; i < 3; i++) {
                    524:         if (hasFlag("q"+i)) {
                    525:            return i;
                    526:         }
                    527:     }
                    528:     return 1
                    529: }
                    530: 
                    531: function setQuality(qual) {
                    532:     // set the image quality
                    533:     for (var i = 0; i < 3; i++) {
                    534:         removeFlag("q"+i);
                    535:         if (i == qual) {
                    536:             addFlag("q"+i);
                    537:         }
                    538:     }
                    539:     setParameter("mo", getAllFlags());
                    540:     display();
                    541: }    
                    542: 
                    543: function setQualityWin(msg) {
                    544:    // dialog for setting quality
                    545:    if (! msg) {
                    546:        msg = "Quality (0..2)";
                    547:    }
                    548:    var q = getQuality();
                    549:    var newq = window.prompt(msg, q);
                    550:    if (newq) {
                    551:        setQuality(newq);
                    552:    }
                    553: }
                    554: 
                    555: function mirror(dir) {
                    556:     // mirror the image horizontally or vertically
                    557:     if (dir == "h") {
                    558:         toggleFlag("hmir");
                    559:     } else {
                    560:         toggleFlag("vmir");
                    561:     }
                    562:     setParameter("mo", getAllFlags());
                    563:     display();
                    564: }
                    565: 
1.7     ! casties   566: function gotoPage(gopage, keep) {
        !           567:    // goto given page nr (+/-: relative)
        !           568:    var oldpn = parseInt(getParameter("pn"));
        !           569:    setParameter("pn", gopage, true);
1.6       casties   570:    var pn = parseInt(getParameter("pn"));
                    571:    if (pn < 1) {
1.7     ! casties   572:        alert("No such page! (Page number too low)");
        !           573:        setParameter("pn", oldpn);
        !           574:        return;
        !           575:    }
        !           576:    if (hasParameter("pt")) {
        !           577:        pt = parseInt(getParameter("pt"))
        !           578:        if (pn > pt) {
        !           579:            alert("No such page! (Page number too high)");
        !           580:            setParameter("pn", oldpn);
        !           581:            return;
        !           582:        }
        !           583:    }
        !           584:    if (keep) {
        !           585:        display(15+32); // all, no mark
        !           586:    } else {    
        !           587:        display(3+32); // fn, pn, ws, mo + pt
1.6       casties   588:    }
                    589: }
                    590: 
                    591: function gotoPageWin() {
                    592:    // dialog to ask for new page nr
1.7     ! casties   593:    var pn = getParameter("pn");
1.6       casties   594:    var gopage = window.prompt("Go to page", pn);
                    595:    if (gopage) {
                    596:        gotoPage(gopage);
                    597:    }
                    598: }
                    599: 
1.7     ! casties   600: function setParamWin(param, text, relative) {
1.6       casties   601:    // dialog to ask for new parameter value
                    602:    var val = getParameter(param);
                    603:    var newval = window.prompt(text, val);
                    604:    if (newval) {
1.7     ! casties   605:        setParameter(param, newval, relative);
1.6       casties   606:        display();
                    607:    }
                    608: }
                    609: 
                    610: function showOptions(show) {
                    611:    // show or hide option div
                    612:    var elem = getElement("dloptions");
                    613:    showElement(elem, show);
                    614: }

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