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

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