File:  [Repository] / zogiLib / js / Attic / dl_lib.js
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Thu Jun 3 18:13:29 2004 UTC (21 years ago) by casties
Branches: MAIN
CVS tags: HEAD
removed alert

/* Copyright (C) 2003,2004 WTWG Uni Bern and others
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
 
Authors: ROC 3.5.2004
  first version by Christian Luginbuehl, 01.05.2003
  Changed for digiLib in Zope by DW 24.03.2004
*/


/*
 * parameter handling
 */

var dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
var dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0);

function parseArea() {
    // returns area Rectangle from current parameters
    return new Rectangle(getParameter("wx"), getParameter("wy"), getParameter("ww"), getParameter("wh"));
}

function setParamFromArea(rect) {
    // sets digilib wx etc. from rect
    setParameter("wx", cropFloat(rect.x));
    setParameter("wy", cropFloat(rect.y));
    setParameter("ww", cropFloat(rect.width));
    setParameter("wh", cropFloat(rect.height));
    return true;
}

var dlTrafo = new Transform();

function parseTrafo(elem) {
    // returns Transform from current dlArea and picsize
    var picsize = getElementRect(elem);
    var trafo = new Transform();
    // subtract area offset and size
    trafo.concat(getTranslation(new Position(-dlArea.x, -dlArea.y)));
    trafo.concat(getScale(new Size(1/dlArea.width, 1/dlArea.height)));
    // scale to screen size
    trafo.concat(getScale(picsize));
    trafo.concat(getTranslation(picsize));
    // rotate
    //trafo.concat(getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height)));
    // mirror
    //if (hasFlag("hmir")) {
    //trafo.m00 = - trafo.m00;
    //}
    //if (hasFlag("vmir")) {
    //trafo.m11 = - trafo.m11;
    //}
    return trafo;
}


var dlMarks = new Array();

function parseMarks() {
    // returns marks array from current parameters
    var marks = new Array();
    var ma;
    var mk = getParameter("mk");
    if (mk.indexOf(";") >= 0) {
	// old format with ";"
	ma = mk.split(";");
    } else {
	ma = mk.split(",");
    }
    for (var i = 0; i < ma.length ; i++) {
	var pos = ma[i].split("/");
	if (pos.length > 1) {
	    marks.push(new Position(pos[0], pos[1]));
	}
    }
    return marks;
}

function getAllMarks() {
    // returns a string with all marks in query format
    var marks = new Array();
    for (var i = 0; i < dlMarks.length; i++) {
	marks.push(cropFloat(dlMarks[i].x) + "/" + cropFloat(dlMarks[i].y));
    }
    return marks.join(",");
}

function addMark(pos) {
    // add a mark
    dlMarks.push(pos);
    setParameter("mk", getAllMarks());
    return true;
}

function deleteMark() {
    // delete the last mark
    dlMarks.pop();
    setParameter("mk", getAllMarks());
    return true;
}

var dlFlags = new Object();

function hasFlag(mode) {
    // returns if mode flag is set
    return (dlFlags[mode]);
}

function addFlag(mode) {
    // add a mode flag
    dlFlags[mode] = mode;
    return true;
}

function removeFlag(mode) {
    // remove a mode flag
    if (dlFlags[mode]) {
	delete dlFlags[mode];
    }
    return true;
}

function toggleFlag(mode) {
    // change a mode flag
    if (dlFlags[mode]) {
	delete dlFlags[mode];
    } else {
	dlFlags[mode] = mode;
    }
    return true;
}

function getAllFlags() {
    // returns a string with all flags in query format
    var fa = new Array();
    for (var f in dlFlags) {
	if ((f != "")&&(dlFlags[f] != null)) {
	    fa.push(f);
	}
    }
    return fa.join(",");
}

function parseFlags() {
    // sets dlFlags from the current parameters
    var flags = new Object();
    var fa = getParameter("mo").split(",");
    for (var i = 0; i < fa.length ; i++) {
	var f = fa[i];
	if (f != "") {
	    flags[f] = f;
	}
    }
    return flags;
}    


function bestPicSize(elem, inset) {
    // returns a Size with the best image size for the given element
    if (! defined(inset)) {
	inset = 25;
    }
    var ws = getWinSize();
    var es = getElementPosition(elem);
    if (es) {
	ws.width = ws.width - es.x - inset;
	ws.height = ws.height - es.y - inset;
    }
    return ws;
}


/* **********************************************
 *     digilib specific routines
 * ******************************************** */

var elemScaler = null;
var picElem = null;

function dl_init() {
    elemScaler = getElement("scaler");
    if (! elemScaler) {
	return false;
    }
    picElem = getElement("pic", true);
    if (picElem == null) {
	// in N4 pic is in the scaler layer
	picElem = elemScaler.document.images[0];
    }
    // give a name to the window containing digilib
    top.window.name = "digilib";
    // put the query parameters (sans "?") in the parameters array
    parseParameters(location.search.slice(1));
    // treat special parameters
    dlMarks = parseMarks();
    dlArea = parseArea();
    dlFlags = parseFlags();
    // wait for image to load and display marks
    renderMarks();
    // done
    focus();
    return;
}

function display(detail) {
    // redisplay the page
    if (! detail) {
	detail = 9;
    }
    var queryString = getAllParameters(detail);
    location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
}

function openWin(url, title, params) {
    // open browser window
    var ow = window.open(url, title, params);
    ow.focus();
}

/* **********************************************
 *     interactive digilib functions
 * ******************************************** */

function getRef(select) {
    // open a dialog with a reference to the current digilib set
    if (! baseUrl) {
	var baseUrl = location.protocol + "//" + location.host + location.pathname;
    }
    var hyperlinkRef = baseUrl;
    var par = getAllParameters(9);
    if (par.length > 0) {
	hyperlinkRef += "?" + par;
    }
    if ( select == 0 ) {
	prompt("Link for LaTeX-documents", "\\href{" + hyperlinkRef + "}{TEXT}");
    } else if ( select == 1 ) {
	prompt("Link for HTML-documents", hyperlinkRef);
    }
}

function renderMarks() {
    // put the visible marks on the image
    var mark_count = dlMarks.length;
    // make shure the image is loaded so we know its size
    if (defined(picElem.complete) && picElem.complete == false && ! browserType.isN4 ) {
	setTimeout("renderMarks()", 100);
    } else {
	dlTrafo = parseTrafo(picElem);
	for (var i = 0; i < 8; i++) {
	    var me = getElement("dot"+i);
	    if (i < mark_count) {
		if (dlArea.containsPosition(dlMarks[i])) {
		    var mpos = dlTrafo.transform(dlMarks[i]);
		    // suboptimal to place -5 pixels and not half size of mark-image
		    mpos.x = mpos.x -5;
		    mpos.y = mpos.y -5;
		    moveElement(me, mpos);
		    showElement(me, true);
		}
	    } else {
		// hide the other marks
		showElement(me, false);
	    }
	}
    }
}

function setMark() {
    // add a mark where clicked
    if ( dlMarks.length > 7 ) {
	alert("Only 8 marks are possible at the moment!");
	return;
    }

    function markEvent(evt) {
	// event handler adding a new mark
	unregisterMouseDown(elemScaler, markEvent);
	var p = dlTrafo.invtransform(evtPosition(evt));
	addMark(p);
	display();
    }

    // starting event capture
    registerMouseDown(elemScaler, markEvent);
}

var ZOOMFACTOR = Math.sqrt(2);

function zoomPoint(inout) {
    // zoom image in or out around the clicked point
    var zoom = ZOOMFACTOR;
    if (inout < 0) {
	zoom = 1/ZOOMFACTOR;
    }
    window.focus();

    function zoomPointEvent(evt) {
	// take new center and set zoom parameters
	unregisterMouseDown(elemScaler, zoomPointEvent);
	var p = dlTrafo.invtransform(evtPosition(evt));
	var neww = Math.min(dlArea.width * (1/zoom), 1.0);
	var newh = Math.min(dlArea.height * (1/zoom), 1.0);
	var newx = p.x - 0.5 * neww;
	var newy = p.y - 0.5 * newh;
	var zoomarea = new Rectangle(newx, newy, neww, newh);
	// check bounds
	zoomarea = dlMaxArea.fit(zoomarea);
	// set parameters
	setParamFromArea(zoomarea);
	parseArea();
	// zoomed is always fit
	setParameter("ws", 1);
	display();
    }

    // starting event capture
    registerMouseDown(elemScaler, zoomPointEvent);
}


function zoomArea() {
    var click = 1;
    var pt1, pt2;
    var eck1pos, eck2pos, eck3pos, eck4pos;
    window.focus();
    var eck1 = getElement("eck1");
    var eck2 = getElement("eck2");
    var eck3 = getElement("eck3");
    var eck4 = getElement("eck4");

    function zoomClick(evt) {
	// mouse click handler
	if (click == 1) {
	    // first click -- start moving
	    click = 2;
	    pt1 = evtPosition(evt);
	    pt2 = pt1;
	    eck1pos = pt1;
	    eck2pos = new Position(pt1.x - 12, pt1.y);
	    eck3pos = new Position(pt1.x, pt1.y - 12);
	    eck4pos = new Position(pt1.y - 12, pt1.y - 12);
	    moveElement(eck1, eck1pos);
	    moveElement(eck2, eck2pos);
	    moveElement(eck3, eck3pos);
	    moveElement(eck4, eck4pos);
	    showElement(eck1, true);
	    showElement(eck2, true);
	    showElement(eck3, true);
	    showElement(eck4, true);
	    registerMouseMove(elemScaler, zoomMove);
	    registerMouseMove(eck4, zoomMove);
	} else {
	    // second click -- end moving
	    pt2 = evtPosition(evt);
	    showElement(eck1, false);
	    showElement(eck2, false);
	    showElement(eck3, false);
	    showElement(eck4, false);
	    unregisterMouseMove(elemScaler, zoomMove);
	    unregisterMouseMove(eck4, zoomMove);
	    unregisterMouseDown(elemScaler, zoomClick);
	    unregisterMouseDown(eck4, zoomClick);
	    var p1 = dlTrafo.invtransform(pt1);
	    var p2 = dlTrafo.invtransform(pt2);
	    var ww = p2.x-p1.x;
	    var wh = p2.y-p1.y;
	    if ((ww > 0)&&(wh > 0)) {
		setParameter("wx", cropFloat(p1.x));
		setParameter("wy", cropFloat(p1.y));
		setParameter("ww", cropFloat(ww));
		setParameter("wh", cropFloat(wh));
		parseArea();
		// zoomed is always fit
		setParameter("ws", 1);
		display();
	    }
	}
    }

    function zoomMove(evt) {
	// mouse move handler
	pt2 = evtPosition(evt);
	// restrict marks to move right and down
	eck1pos = pt1;
	eck2pos = new Position(Math.max(pt1.x, pt2.x)-12, pt1.y);
	eck3pos = new Position(pt1.x, Math.max(pt1.y, pt2.y)-12);
	eck4pos = new Position(Math.max(pt1.x, pt2.x)-12, Math.max(pt1.y, pt2.y)-12);
	moveElement(eck1, eck1pos);
	moveElement(eck2, eck2pos);
	moveElement(eck3, eck3pos);
	moveElement(eck4, eck4pos);
    }

    // starting event capture
    registerMouseDown(elemScaler, zoomClick);
    registerMouseDown(eck4, zoomClick);
}


function moveCenter() {
    // move visible area so that it's centered around the clicked point
    if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
	// noting to do
	return;
    }
    window.focus();

    function moveCenterEvent(evt) {
	// move to handler
	unregisterMouseDown(elemScaler, moveCenterEvent);
	var pt = dlTrafo.invtransform(evtPosition(evt));
	var newarea = new Rectangle(pt.x-0.5*dlArea.width, pt.y-0.5*dlArea.height, dlArea.width, dlArea.height);
	newarea = dlMaxArea.fit(newarea);
	// set parameters
	setParamFromArea(newarea);
	parseArea();
	display();
    }

    // starting event capture
    registerMouseDown(elemScaler, moveCenterEvent);
}


// debuggin'
function showcoordsN4() {
    var s = "";
    for (var l in document.layers) {
	if (l == "length") continue;
	e = document.layers[l];
	if (e) {
	    s += " [" + e.name + "]: pageX:" + e.pageX + " pageY:" + e.pageY + " width:" + e.clip.width + " height:" + e.clip.height + " visibility:" + e.visibility + " zindex:" + e.zIndex + "
\n"; } else { s += " {" + l + "}
\n"; } } return s; }

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