/* 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() {
// returns Transform from current dlArea and picsize
var picsize = getElementSize("pic");
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 = getParameter("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(tagid) {
// returns a Size with the best image size for the given tagid
var inset = 0;
var ws = getWinSize();
var es = getElementSize(tagid);
if (es) {
ws.width = ws.width - es.x - inset;
ws.height = ws.height - es.y - inset;
}
return ws;
}
/* **********************************************
* digilib specific routines
* ******************************************** */
function init() {
if (document.layers) {
alert("Sorry Netscape4 is not supported!");
return false;
}
// give a name to the window containing digilib - this way one can test if there is already a
// digilib-window open and replace the contents of it (ex. digicat)
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();
//registerKeyDown(parseKeypress);
renderMarks();
focus();
return null;
}
function display(detail) {
// redisplay the page
var queryString = getAllParameters(detail);
location.href = location.protocol + "//" + location.host + location.pathname + "?" + queryString;
}
/* **********************************************
* interactive digilib functions
* ******************************************** */
function ref(select) {
// open a dialog with a reference to the current digilib set
var hyperlinkRef = baseUrl + "?" + getAllParameters(9);
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;
var picelem = getElement("pic");
// make shure the image is loaded so we know its size
if (picelem && picelem.complete == false) {
setTimeout("placeMarks()", 100);
} else {
var picsize = getElementSize("pic");
dlTrafo = parseTrafo();
for (var i = 0; i < 8; 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("dot"+i, mpos);
showElement("dot"+i, true);
}
} else {
// hide the other marks
showElement("dot"+i, false);
}
}
}
}
function mark() {
// 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("scaler", markEvent);
var p = dlTrafo.invtransform(evtPosition(evt));
addMark(p);
placeMarks();
}
// starting event capture
registerMouseDown("scaler", markEvent);
}
function unmark() {
// remove the last mark
deleteMark();
placeMarks();
}
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
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();
display(3);
}
// starting event capture
registerMouseDown("scaler", zoomPointEvent);
}
function zoomArea() {
var click = 1;
var pt1, pt2;
var eck1pos, eck2pos, eck3pos, eck4pos;
window.focus();
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("scaler", 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("scaler", zoomMove);
unregisterMouseMove("eck4", zoomMove);
unregisterMouseDown("scaler", 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();
display(3);
}
}
}
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("scaler", zoomClick);
registerMouseDown("eck4", zoomClick);
}
function moveTo() {
if ( (dlArea.width == 1.0) && (dlArea.height == 1.0) ) {
alert("This function is only available when zoomed in!");
return;
}
function moveToEvent(event) {
// move to handler
var pt = 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);
// stopping event capture
unregisterMouseDown("scaler", moveToEvent);
// set parameters
setParameter("wx", cropFloat(newarea.x));
setParameter("wy", cropFloat(newarea.y));
setParameter("ww", cropFloat(newarea.width));
setParameter("wh", cropFloat(newarea.height));
display(3);
}
// starting event capture
registerMouseDown("scaler", moveToEvent);
}
function parseKeypress(evt) {
// capturing keypresses for next and previous page
if ( document.all ) {
if ( event.keyCode == 110 ) {
page('+1');
}
if ( event.keyCode == 98 ) {
page('-1');
}
document.cancelBubble = true;
} else {
if ( evt.charCode == 110 ) {
page('+1');
} else if ( evt.charCode == 98 ) {
page('-1');
} else if ( evt.which == 110 ) {
page('+1');
} else if ( evt.which == 98 ) {
// does not work currentlyfor Opera, because it catches the 'b'-key on it's own
// have to change the key or find another way - luginbuehl
page('-1');
}
}
}
/* **********************************************
* digilib parameter-only functions
* ******************************************** */
function setSize(factor) {
// change the size of the image
setParameter("ws", cropFloat(factor));
display(3);
}
function setQuality(qual) {
// set the image quality
for (var i = 0; i < 3; i++) {
removeFlag("q"+i);
if (i == qual) {
addFlag("q"+i);
}
}
setParameter("mo", getAllFlags());
display(3);
}
function mirror(dir) {
// mirror the image horizontally or vertically
if (dir == "h") {
toggleFlag("hmir");
} else {
toggleFlag("vmir");
}
setParameter("mo", getAllFlags());
display(3);
}
function page(page, details) {
if ( details == null ) {
details = 1;
}
if ( page.indexOf('-') == 0 ) {
if ( dlParams.pn.value > 1 ) {
page = Math.max(parseInt(dlParams.pn.value) - parseInt(page.slice(1)), 1);
dlParams.pn.value = page;
display(details);
} else {
alert("You are already on the first page!");
}
} else if ( page.indexOf('+') == 0 ) {
page = parseInt(dlParams.pn.value) + parseInt(page.slice(1));
dlParams.pn.value = page;
display(details);
} else if ( page == parseInt(page) ) {
dlParams.pn.value = parseInt(page);
display(details);
}
}
function zoomFullpage() {
// zooms out to show the whole image
setParameter("wx", 0.0);
setParameter("wy", 0.0);
setParameter("ww", 1.0);
setParameter("wh", 1.0);
parseArea();
display(3);
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>