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

1.1     ! casties     1: /* Copyright (C) 2003,2004 WTWG Uni Bern and others
        !             2:  
        !             3: This program is free software; you can redistribute it and/or
        !             4: modify it under the terms of the GNU General Public License
        !             5: as published by the Free Software Foundation; either version 2
        !             6: of the License, or (at your option) any later version.
        !             7:  
        !             8: This program is distributed in the hope that it will be useful,
        !             9: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            10: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            11: GNU General Public License for more details.
        !            12:  
        !            13: You should have received a copy of the GNU General Public License
        !            14: along with this program; if not, write to the Free Software
        !            15: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
        !            16:  
        !            17: Authors: ROC 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: 
        !            46: function parseTrafo() {
        !            47:     // returns Transform from current dlArea and picsize
        !            48:     var picsize = getElementSize("pic");
        !            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();
        !            74:     var ma = getParameter("mk").split(";");
        !            75:     for (var i = 0; i < ma.length ; i++) {
        !            76:    var pos = ma[i].split("/");
        !            77:    if (pos.length > 1) {
        !            78:        marks.push(new Position(pos[0], pos[1]));
        !            79:    }
        !            80:     }
        !            81:     return marks;
        !            82: }
        !            83: 
        !            84: function getAllMarks() {
        !            85:     // returns a string with all marks in query format
        !            86:     var marks = new Array();
        !            87:     for (var i = 0; i < dlMarks.length; i++) {
        !            88:    marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
        !            89:     }
        !            90:     return marks.join(";");
        !            91: }
        !            92: 
        !            93: function addMark(pos) {
        !            94:     // add a mark
        !            95:     dlMarks.push(pos);
        !            96:     setParameter("mk", getAllMarks());
        !            97:     return true;
        !            98: }
        !            99: 
        !           100: function deleteMark() {
        !           101:     // delete the last mark
        !           102:     dlMarks.pop();
        !           103:     setParameter("mk", getAllMarks());
        !           104:     return true;
        !           105: }
        !           106: 
        !           107: var dlFlags = new Object();
        !           108: 
        !           109: function hasFlag(mode) {
        !           110:     // returns if mode flag is set
        !           111:     return (dlFlags[mode]);
        !           112: }
        !           113: 
        !           114: function addFlag(mode) {
        !           115:     // add a mode flag
        !           116:     dlFlags[mode] = mode;
        !           117:     return true;
        !           118: }
        !           119: 
        !           120: function removeFlag(mode) {
        !           121:     // remove a mode flag
        !           122:     if (dlFlags[mode]) {
        !           123:    delete dlFlags[mode];
        !           124:     }
        !           125:     return true;
        !           126: }
        !           127: 
        !           128: function toggleFlag(mode) {
        !           129:     // change a mode flag
        !           130:     if (dlFlags[mode]) {
        !           131:    delete dlFlags[mode];
        !           132:     } else {
        !           133:    dlFlags[mode] = mode;
        !           134:     }
        !           135:     return true;
        !           136: }
        !           137: 
        !           138: function getAllFlags() {
        !           139:     // returns a string with all flags in query format
        !           140:     var fa = new Array();
        !           141:     for (var f in dlFlags) {
        !           142:    if ((f != "")&&(dlFlags[f] != null)) {
        !           143:        fa.push(f);
        !           144:    }
        !           145:     }
        !           146:     return fa.join(",");
        !           147: }
        !           148: 
        !           149: function parseFlags() {
        !           150:     // sets dlFlags from the current parameters
        !           151:     var flags = new Object();
        !           152:     var fa = getParameter("mo").split(",");
        !           153:     for (var i = 0; i < fa.length ; i++) {
        !           154:    var f = fa[i];
        !           155:    if (f != "") {
        !           156:        flags[f] = f;
        !           157:    }
        !           158:     }
        !           159:     return flags;
        !           160: }    
        !           161: 
        !           162: 
        !           163: function bestPicSize(tagid) {
        !           164:     // returns a Size with the best image size for the given tagid
        !           165:     var inset = 0;
        !           166:     var ws = getWinSize();
        !           167:     var es = getElementSize(tagid);
        !           168:     if (es) {
        !           169:    ws.width = ws.width - es.x - inset;
        !           170:    ws.height = ws.height - es.y - inset;
        !           171:     }
        !           172:     return ws;
        !           173: }
        !           174: 
        !           175: 
        !           176: /* **********************************************
        !           177:  *     digilib specific routines
        !           178:  * ******************************************** */
        !           179: 
        !           180: function init() {
        !           181:     if (document.layers) {
        !           182:    alert("Sorry Netscape4 is not supported!");
        !           183:    return false;
        !           184:     }
        !           185:     // give a name to the window containing digilib - this way one can test if there is already a
        !           186:     // digilib-window open and replace the contents of it (ex. digicat)
        !           187:     top.window.name = "digilib";
        !           188:     // put the query parameters (sans "&") in the parameters array
        !           189:     parseParameters(location.search.slice(1));
        !           190:     // treat special parameters
        !           191:     dlMarks = parseMarks();
        !           192:     dlArea = parseArea();
        !           193:     dlFlags = parseFlags();
        !           194: 
        !           195:     //registerKeyDown(parseKeypress);
        !           196:     
        !           197:     renderMarks();
        !           198: 
        !           199:     focus();
        !           200:     return null;
        !           201: }
        !           202: 
        !           203: function display(detail) {
        !           204:     // redisplay the page
        !           205:     var queryString = getAllParameters(detail);
        !           206:     location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
        !           207: }
        !           208: 
        !           209: 
        !           210: /* **********************************************
        !           211:  *     interactive digilib functions
        !           212:  * ******************************************** */
        !           213: 
        !           214: function ref(select) {
        !           215:     // open a dialog with a reference to the current digilib set
        !           216:     var hyperlinkRef = baseUrl + "?" + getAllParameters(9);
        !           217:     if ( select == 0 ) {
        !           218:    prompt("Link for LaTeX-documents", "\\href{" + hyperlinkRef + "}{TEXT}");
        !           219:     } else if ( select == 1 ) {
        !           220:    prompt("Link for HTML-documents", hyperlinkRef);
        !           221:     }
        !           222: }
        !           223: 
        !           224: function renderMarks() {
        !           225:     // put the visible marks on the image
        !           226:     var mark_count = dlMarks.length;
        !           227:     var picelem = getElement("pic");
        !           228:     // make shure the image is loaded so we know its size
        !           229:     if (picelem && picelem.complete == false) {
        !           230:    setTimeout("placeMarks()", 100);
        !           231:     } else {
        !           232:    var picsize = getElementSize("pic");
        !           233:    dlTrafo = parseTrafo();
        !           234:    for (var i = 0; i < 8; i++) {
        !           235:        if (i < mark_count) {
        !           236:        if (dlArea.containsPosition(dlMarks[i])) {
        !           237:            var mpos = dlTrafo.transform(dlMarks[i]);
        !           238:            // suboptimal to place -5 pixels and not half size of mark-image
        !           239:            mpos.x = mpos.x -5;
        !           240:            mpos.y = mpos.y -5;
        !           241:            moveElement("dot"+i, mpos);
        !           242:            showElement("dot"+i, true);
        !           243:        }
        !           244:        } else {
        !           245:        // hide the other marks
        !           246:        showElement("dot"+i, false);
        !           247:        }
        !           248:    }
        !           249:     }
        !           250: }
        !           251: 
        !           252: function mark() {
        !           253:     // add a mark where clicked
        !           254:     if ( dlMarks.length > 7 ) {
        !           255:    alert("Only 8 marks are possible at the moment!");
        !           256:    return;
        !           257:     }
        !           258: 
        !           259:     function markEvent(evt) {
        !           260:    // event handler adding a new mark 
        !           261:    unregisterMouseDown("scaler", markEvent);
        !           262:    var p = dlTrafo.invtransform(evtPosition(evt));
        !           263:    addMark(p);
        !           264:    placeMarks();
        !           265:     }
        !           266: 
        !           267:     // starting event capture
        !           268:     registerMouseDown("scaler", markEvent);
        !           269: }
        !           270: 
        !           271: function unmark() {
        !           272:     // remove the last mark
        !           273:     deleteMark();
        !           274:     placeMarks();
        !           275: }
        !           276: 
        !           277: var ZOOMFACTOR = Math.sqrt(2);
        !           278: 
        !           279: function zoomPoint(inout) {
        !           280:     // zoom image in or out around the clicked point
        !           281:     var zoom = ZOOMFACTOR;
        !           282:     if (inout < 0) {
        !           283:    zoom = 1/ZOOMFACTOR;
        !           284:     }
        !           285:     window.focus();
        !           286: 
        !           287:     function zoomPointEvent(evt) {
        !           288:    // take new center and set zoom parameters
        !           289:    var p = dlTrafo.invtransform(evtPosition(evt));
        !           290:    var neww = Math.min(dlArea.width * (1/zoom), 1.0);
        !           291:    var newh = Math.min(dlArea.height * (1/zoom), 1.0);
        !           292:    var newx = p.x - 0.5 * neww;
        !           293:    var newy = p.y - 0.5 * newh;
        !           294:    var zoomarea = new Rectangle(newx, newy, neww, newh);
        !           295:    // check bounds
        !           296:    zoomarea = dlMaxArea.fit(zoomarea);
        !           297:    // set parameters
        !           298:    setParamFromArea(zoomarea);
        !           299:    parseArea();
        !           300:    display(3);
        !           301:     }
        !           302: 
        !           303:     // starting event capture
        !           304:     registerMouseDown("scaler", zoomPointEvent);
        !           305: }
        !           306: 
        !           307: 
        !           308: function zoomArea() {
        !           309:     var click = 1;
        !           310:     var pt1, pt2;
        !           311:     var eck1pos, eck2pos, eck3pos, eck4pos;
        !           312:     window.focus();
        !           313: 
        !           314:     function zoomClick(evt) {
        !           315:    // mouse click handler
        !           316:    if (click == 1) {
        !           317:        // first click -- start moving
        !           318:        click = 2;
        !           319:        pt1 = evtPosition(evt);
        !           320:        pt2 = pt1;
        !           321:        eck1pos = pt1;
        !           322:        eck2pos = new Position(pt1.x - 12, pt1.y);
        !           323:        eck3pos = new Position(pt1.x, pt1.y - 12);
        !           324:        eck4pos = new Position(pt1.y - 12, pt1.y - 12);
        !           325:        moveElement("eck1", eck1pos);
        !           326:        moveElement("eck2", eck2pos);
        !           327:        moveElement("eck3", eck3pos);
        !           328:        moveElement("eck4", eck4pos);
        !           329:        showElement("eck1", true);
        !           330:        showElement("eck2", true);
        !           331:        showElement("eck3", true);
        !           332:        showElement("eck4", true);
        !           333:        registerMouseMove("scaler", zoomMove);
        !           334:        registerMouseMove("eck4", zoomMove);
        !           335:    } else {
        !           336:        // second click -- end moving
        !           337:        pt2 = evtPosition(evt);
        !           338:        showElement("eck1", false);
        !           339:        showElement("eck2", false);
        !           340:        showElement("eck3", false);
        !           341:        showElement("eck4", false);
        !           342:        unregisterMouseMove("scaler", zoomMove);
        !           343:        unregisterMouseMove("eck4", zoomMove);
        !           344:        unregisterMouseDown("scaler", zoomClick);
        !           345:        unregisterMouseDown("eck4", zoomClick);
        !           346:        var p1 = dlTrafo.invtransform(pt1);
        !           347:        var p2 = dlTrafo.invtransform(pt2);
        !           348:        var ww = p2.x-p1.x;
        !           349:        var wh = p2.y-p1.y;
        !           350:        if ((ww > 0)&&(wh > 0)) {
        !           351:        setParameter("wx", cropFloat(p1.x));
        !           352:        setParameter("wy", cropFloat(p1.y));
        !           353:        setParameter("ww", cropFloat(ww));
        !           354:        setParameter("wh", cropFloat(wh));
        !           355:        parseArea();
        !           356:        display(3);
        !           357:        }
        !           358:    }
        !           359:     }
        !           360: 
        !           361:     function zoomMove(evt) {
        !           362:    // mouse move handler
        !           363:    pt2 = evtPosition(evt);
        !           364:    // restrict marks to move right and down
        !           365:    eck1pos = pt1;
        !           366:    eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y);
        !           367:    eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12);
        !           368:    eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12);
        !           369:    moveElement("eck1", eck1pos);
        !           370:    moveElement("eck2", eck2pos);
        !           371:    moveElement("eck3", eck3pos);
        !           372:    moveElement("eck4", eck4pos);
        !           373:     }
        !           374: 
        !           375:     // starting event capture
        !           376:     registerMouseDown("scaler", zoomClick);
        !           377:     registerMouseDown("eck4", zoomClick);
        !           378: }
        !           379: 
        !           380: 
        !           381: function moveTo() {
        !           382: 
        !           383:     if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
        !           384:    alert("This function is only available when zoomed in!");
        !           385:    return;
        !           386:     }
        !           387: 
        !           388:     function moveToEvent(event) {
        !           389:    // move to handler
        !           390:    var pt = evtPosition(evt);
        !           391:    var newarea = new Rectangle(pt.x-0.5*dlArea.width, pt.y-0.5*dlArea.height, dlArea.width, dlArea.height);
        !           392:    newarea = dlMaxArea.fit(newarea);
        !           393:    // stopping event capture
        !           394:    unregisterMouseDown("scaler", moveToEvent);
        !           395:    // set parameters
        !           396:    setParameter("wx", cropFloat(newarea.x));
        !           397:    setParameter("wy", cropFloat(newarea.y));
        !           398:    setParameter("ww", cropFloat(newarea.width));
        !           399:    setParameter("wh", cropFloat(newarea.height));
        !           400:    display(3);
        !           401:     }
        !           402: 
        !           403:     // starting event capture
        !           404:     registerMouseDown("scaler", moveToEvent);
        !           405: }
        !           406: 
        !           407: function parseKeypress(evt) {
        !           408:     // capturing keypresses for next and previous page
        !           409:     if ( document.all ) {
        !           410:    if ( event.keyCode == 110 ) {
        !           411:        page('+1');
        !           412:    }
        !           413:    if ( event.keyCode == 98 ) {
        !           414:        page('-1');
        !           415:    }
        !           416:    document.cancelBubble = true;
        !           417:     } else {
        !           418:    if ( evt.charCode == 110 ) {
        !           419:        page('+1');
        !           420:    } else if ( evt.charCode == 98 ) {
        !           421:        page('-1');
        !           422:    } else if ( evt.which == 110 ) {
        !           423:        page('+1');
        !           424:    } else if ( evt.which == 98 ) {
        !           425:        // does not work currentlyfor Opera, because it catches the 'b'-key on it's own
        !           426:        // have to change the key or find another way - luginbuehl
        !           427:        page('-1');
        !           428:    }
        !           429:     }
        !           430: }
        !           431: 
        !           432: 
        !           433: /* **********************************************
        !           434:  *     digilib parameter-only functions
        !           435:  * ******************************************** */
        !           436: 
        !           437: function setSize(factor) {
        !           438:     // change the size of the image
        !           439:     setParameter("ws", cropFloat(factor));
        !           440:     display(3);
        !           441: }
        !           442: 
        !           443: function setQuality(qual) {
        !           444:     // set the image quality
        !           445:     for (var i = 0; i < 3; i++) {
        !           446:    removeFlag("q"+i);
        !           447:    if (i == qual) {
        !           448:        addFlag("q"+i);
        !           449:    }
        !           450:     }
        !           451:     setParameter("mo", getAllFlags());
        !           452:     display(3);
        !           453: }    
        !           454: 
        !           455: function mirror(dir) {
        !           456:     // mirror the image horizontally or vertically
        !           457:     if (dir == "h") {
        !           458:    toggleFlag("hmir");
        !           459:     } else {
        !           460:    toggleFlag("vmir");
        !           461:     }
        !           462:     setParameter("mo", getAllFlags());
        !           463:     display(3);
        !           464: }
        !           465: 
        !           466: function page(page, details) {
        !           467: 
        !           468:   if ( details == null ) {
        !           469:     details = 1;
        !           470:   }
        !           471:   
        !           472:   if ( page.indexOf('-') == 0 ) {
        !           473:     if ( dlParams.pn.value > 1 ) {
        !           474:       page = Math.max(parseInt(dlParams.pn.value) - parseInt(page.slice(1)), 1);
        !           475:       dlParams.pn.value = page;
        !           476:       display(details);
        !           477:     } else {
        !           478:       alert("You are already on the first page!");
        !           479:     }
        !           480: 
        !           481:   } else if ( page.indexOf('+') == 0 ) {
        !           482:     page = parseInt(dlParams.pn.value) + parseInt(page.slice(1));
        !           483:     dlParams.pn.value = page;
        !           484:     display(details);
        !           485:   } else if ( page == parseInt(page) ) {
        !           486:     dlParams.pn.value = parseInt(page);
        !           487:     display(details);
        !           488:   }
        !           489: 
        !           490: }
        !           491: 
        !           492: function zoomFullpage() {
        !           493:     // zooms out to show the whole image
        !           494:     setParameter("wx", 0.0);
        !           495:     setParameter("wy", 0.0);
        !           496:     setParameter("ww", 1.0);
        !           497:     setParameter("wh", 1.0);
        !           498:     parseArea();
        !           499:     display(3);
        !           500: }
        !           501: 

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