diff client/digitallibrary/greyskin/dllib.js @ 446:8f8d7c1a12b9

experimental intermediary release - more object-orientation in javascript - more changes afoot - reloading works properly - setting a mark reloads quickly
author robcast
date Mon, 23 Jan 2006 18:29:52 +0100
parents a7bd9e2e1bbe
children c3a36b515a73
line wrap: on
line diff
--- a/client/digitallibrary/greyskin/dllib.js	Mon Jan 16 20:53:44 2006 +0100
+++ b/client/digitallibrary/greyskin/dllib.js	Mon Jan 23 18:29:52 2006 +0100
@@ -24,34 +24,131 @@
 
 */
 digilibVersion = "Digilib NG";
-dllibVersion = "2.031";
-isDigilibInitialized = false;    // gets set to true in dl_param_init
-reloadPage = true; // reload the page when parameters are changed, otherwise update only "src" attribute of scaler img 
+dllibVersion = "2.040";
+
+/****************************************************
+ * digilib specific classes (must be defined first)
+ ****************************************************/
+ 
+/*
+ * Marks class
+ */ 
+function Marks() {
+	return this;
+}
+// Marks inherits from Array
+Marks.prototype = new Array();
+Marks.prototype.parse = function(query) {
+	this.length = 0;
+    if (query.indexOf(";") >= 0) {
+        var pa = query.split(";");    // old format with ";"
+    } else {
+        var pa = query.split(",");    // new format
+    }
+    for (var i = 0; i < pa.length ; i++) {
+        var pos = pa[i].split("/");
+        if (pos.length > 1) this.push(new Position(pos[0], pos[1]));
+    }
+}
+Marks.prototype.getAll = function() {
+    var ma = new Array();
+    for (var i = 0; i < this.length; i++) {
+        ma.push(cropFloat(this[i].x) + "/" + cropFloat(this[i].y));
+   	}
+    return ma.join(",");
+}
+Marks.prototype.addEvent = function(evt) {
+    // add a mark from a screen event
+    var pos = dlTrafo.invtransform(evtPosition(evt));
+    this.push(pos);
+}
 
-// global variables
-dlTrafo = new Transform();
-dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0);
-dlArea = null;
-dlMarks = null;
-dlFlags = null;
+/*
+ * DLParameters -- digilibs own parameter class
+ */
+function DLParameters() {
+	// flags for parameter sets
+	this.PARAM_FILE = 1;
+	this.PARAM_MODE = 2;
+	this.PARAM_DIM = 4;
+	this.PARAM_IMAGE = 8;
+	this.PARAM_DPI = 16;
+	this.PARAM_SIZE = 32;
+	this.PARAM_MARK = 64;
+	this.PARAM_PAGES = 128;
+	this.PARAM_ALL = 255;
+	return this;
+}
+DLParameters.prototype = new Parameters();
+// move the inherited getAll because we need it later
+DLParameters.prototype._getAll = Parameters.prototype.getAll;
+DLParameters.prototype.getAll = function(paDetail, moDetail) {
+	// get Flags and Marks first
+    var mo = dlFlags.getAll(moDetail);
+    this.set("mo", mo);
+    var mk = dlMarks.getAll();
+    this.set("mk", mk);
+    var ret = this._getAll(paDetail);
+	return ret;
+}
+
+/*
+ * DLModes -- digilibs own flags class
+ */
+function DLFlags() {
+	// flags for mode sets
+	this.MODE_QUAL = 1;
+	this.MODE_SIZE = 2;
+	this.MODE_MIR = 4;
+	this.MODE_OTHER = 128;
+	this.MODE_ALL = 255;
+	return this;
+}
+// inherits from Flags
+DLFlags.prototype = new Flags();
+
+/********************************
+ * global variables
+ ********************************/
+ 
+var isDigilibInitialized = false;    // gets set to true in dl_param_init
+
+var dlParams;
+var dlTrafo;
+var dlMaxArea = new Rectangle(0.0, 0.0, 1.0, 1.0); // should be CONST
+var dlArea;
+var dlFlags;
+var dlMarks;
 
 // global elements
-scalerDiv = null;
-scalerImg = null;
+var scalerDiv = null;
+var scalerImg = null;
 
 // default inset (for scalerImg relativ to scalerDiv 
 INSET = 40; // because of scrollbars of main window and scaler [Firefox bug?]
 
-// flags for parameter sets
-PARAM_FILE = 1;
-PARAM_MODE = 2;
-PARAM_DIM = 4;
-PARAM_IMAGE = 8;
-PARAM_DPI = 16;
-PARAM_MARK = 32;
-PARAM_PAGES = 64;
-PARAM_SIZE = 128;
-PARAM_ALL = PARAM_FILE | PARAM_MODE | PARAM_DIM | PARAM_IMAGE | PARAM_DPI | PARAM_MARK | PARAM_PAGES | PARAM_SIZE;
+/* old parameter function compatibility stuff */
+function newParameter(a,b,c) {return dlParams.define(a,b,c)};
+function resetParameter(a) {return dlParams.reset(a)};
+function deleteParameter(a) {return dlParams.remove(a)};
+function getParameter(a) {return dlParams.get(a)};
+function setParameter(a,b,c) {return dlParams.set(a,b,c)};
+function hasParameter(a) {return dlParams.isSet(a)};
+function getAllParameters(a) {return dlParams.getAll(a)};
+getQueryString = getAllParameters;
+function parseParameters(a) {return dlParams.parse(a)};
+function getAllMarks() {return dlMarks.getAll()};
+getMarksQueryString = getAllMarks;
+function addMark(evt) {return dlMarks.addEvent(evt)};
+function deleteMark() {return dlMarks.pop()};
+function deleteAllMarks() {return dlMarks = new Marks()};
+function hasFlag(mode) {return dlFlags.get(mode)};
+function addFlag(mode) {return dlFlags.set(mode)};
+function removeFlag(mode) {return dlFlags.reset(mode)};
+function toggleFlag(mode) {return dlFlags.toggle(mode)};
+function getAllFlags() {return dlFlags.getAll()};
+
+
 
 // mouse drag area that counts as one click 
 MIN_AREA_SIZE = 3 * 3 + 1;
@@ -74,56 +171,80 @@
         // Relato uses that function - lugi
         return digilibVersion;
 }
+
 /*
  * more parameter handling
  */
 
-function initParameters() {
-// file
-    newParameter('fn', '',    PARAM_FILE);
-    newParameter('pn', '1',   PARAM_FILE);
-// mode
-    newParameter('mo', '',    PARAM_MODE);
-// relative dimensions of zoomed image
-    newParameter('wx', '0.0', PARAM_DIM);
-    newParameter('wy', '0.0', PARAM_DIM);
-    newParameter('ww', '1.0', PARAM_DIM);
-    newParameter('wh', '1.0', PARAM_DIM);
-// image manipulation
-    newParameter('brgt', '0.0', PARAM_IMAGE);
-    newParameter('cont', '0.0', PARAM_IMAGE);
-    newParameter('rot',  '0.0', PARAM_IMAGE);
-    newParameter('rgba', '',    PARAM_IMAGE);
-    newParameter('rgbm', '',    PARAM_IMAGE);
-// resolution
-    newParameter('ddpi',  '', PARAM_DPI);
-    newParameter('ddpix', '', PARAM_DPI);
-    newParameter('ddpiy', '', PARAM_DPI);
-// marks
-    newParameter('mk', '', PARAM_MARK);
-// pages total
-    newParameter('pt', '0', PARAM_PAGES);
-// size
-    newParameter('ws', '1.0', PARAM_SIZE);
-}
-
 function parseArea() {
     // returns area Rectangle from current parameters
     return new Rectangle(
-        getParameter("wx"),
-        getParameter("wy"),
-        getParameter("ww"),
-        getParameter("wh"));
-    }
+        dlParams.get("wx"),
+        dlParams.get("wy"),
+        dlParams.get("ww"),
+        dlParams.get("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));
+    dlParams.set("wx", cropFloat(rect.x));
+    dlParams.set("wy", cropFloat(rect.y));
+    dlParams.set("ww", cropFloat(rect.width));
+    dlParams.set("wh", cropFloat(rect.height));
     return true;
+}
+
+function initParameters() {
+    // initialisation before onload
+    if (!baseLibVersion) alert("ERROR: baselib.js not loaded!");
+    if (isDigilibInitialized) return false;    // dl_param_init was already run 
+    dlParams = new DLParameters();
+    dlFlags = new DLFlags();
+    dlMarks = new Marks();
+	/* request parameters */
+	with (dlParams) {
+	// file
+	    define('fn', '',    PARAM_FILE);
+	    define('pn', '1',   PARAM_FILE);
+	// mode
+	    define('mo', '',    PARAM_MODE);
+	// relative dimensions of zoomed image
+	    define('wx', '0.0', PARAM_DIM);
+	    define('wy', '0.0', PARAM_DIM);
+	    define('ww', '1.0', PARAM_DIM);
+	    define('wh', '1.0', PARAM_DIM);
+	// image manipulation
+	    define('brgt', '0.0', PARAM_IMAGE);
+	    define('cont', '0.0', PARAM_IMAGE);
+	    define('rot',  '0.0', PARAM_IMAGE);
+	    define('rgba', '',    PARAM_IMAGE);
+	    define('rgbm', '',    PARAM_IMAGE);
+	// resolution
+	    define('ddpi',  '', PARAM_DPI);
+	    define('ddpix', '', PARAM_DPI);
+	    define('ddpiy', '', PARAM_DPI);
+	// marks
+	    define('mk', '', PARAM_MARK);
+	// pages total
+	    define('pt', '0', PARAM_PAGES);
+	// size
+	    define('ws', '1.0', PARAM_SIZE);
     }
+    /* mode flags */
+    with (dlFlags) {
+	    define('q0', MODE_QUAL);
+	    define('q1', MODE_QUAL);
+	    define('q2', MODE_QUAL);
+	    define('fit',   MODE_SIZE);
+	    define('clip',  MODE_SIZE);
+	    define('osize', MODE_SIZE);
+	    define('vmir', MODE_MIR);
+	    define('hmir', MODE_MIR);
+	}
+    // parse parameters
+    parseAllParameters();
+    isDigilibInitialized = true;
+}
 
 /* **********************************************
  *     parse parameters routines
@@ -140,66 +261,20 @@
     trafo.concat(getScale(picsize));
     trafo.concat(getTranslation(picsize));
     // FIX ME: Robert, kannst Du mal nachsehen, ob das folgende tut, was es soll?
-    // oder gibt es dafür neuen Code?
+    // oder gibt es dafuer neuen Code? -- ROC: Bisher funktioniert es nicht!
     // rotate
-    var rot = getRotation(- getParameter("rot"), new Position(0.5*picsize.width, 0.5*picsize.height));
-    trafo.concat(rot);
+    //var rot = getRotation(- dlParams.get("rot"), new Position(0.5*picsize.width, 0.5*picsize.height));
+    //trafo.concat(rot);
     // mirror
-    if (hasFlag("hmir")) trafo.m00 = - trafo.m00; // ??
-    if (hasFlag("vmir")) trafo.m11 = - trafo.m11; // ??
+    //if (hasFlag("hmir")) trafo.m00 = - trafo.m00; // ??
+    //if (hasFlag("vmir")) trafo.m11 = - trafo.m11; // ??
     return trafo;
 }
 
-function parseMarks() {
-    // returns marks array from current parameters
-    var marks = new Array();
-    var param = getParameter("mk");
-    var pairs = (param.indexOf(";") >= 0)
-        ? param.split(";")    // old format with ";"
-        : param.split(",");    // new format
-    for (var i = 0; i < pairs.length ; i++) {
-        var pos = pairs[i].split("/");
-        if (pos.length > 1) marks.push(new Position(pos[0], pos[1]));
-        }
-    return marks;
-    }
-
 /* **********************************************
  *     marks routines
  * ******************************************** */
 
- 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(",");
-    }
-
-getMarksQueryString = getAllMarks;
-
-function addMark(evt) {
-    // add a mark
-    var pos = dlTrafo.invtransform(evtPosition(evt));
-    dlMarks.push(pos)
-    setParameter("mk", getAllMarks());
-    return true;
-    }
-
-function deleteMark() {
-    // delete the last mark
-    var mark = dlMarks.pop();
-    setParameter("mk", getAllMarks());
-    return true;
-    }
-
-function deleteAllMarks() {
-    // delete all marks and mk parameters
-    dlMarks.length = 0;
-    resetParameter("mk");
-    return true;
-    }
-
 function createMarkDiv(index) {
     var div = document.createElement("div");
     div.className = "mark";
@@ -207,65 +282,9 @@
     div.innerHTML = index + 1;
     document.body.appendChild(div);
     return div;
-    }
-
-/* **********************************************
- *     flag routines
- * ******************************************** */
-
-function hasFlag(mode) {
-    // returns if mode flag is set
-    return (dlFlags[mode]);
-    }
-
-function addFlag(mode) {
-    // add a mode flag
-    dlFlags[mode] = mode;
-    setParameter("mo", getAllFlags());
-    return true;
-    }
-
-function removeFlag(mode) {
-    // remove a mode flag
-    if (dlFlags[mode]) delete dlFlags[mode];
-    setParameter("mo", getAllFlags());
-    return true;
-    }
-
-function toggleFlag(mode) {
-    // change a mode flag
-    if (dlFlags[mode]) {
-        delete dlFlags[mode];
-    } else {
-        dlFlags[mode] = mode;
-    }
-    setParameter("mo", getAllFlags());
-    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) {
@@ -294,7 +313,7 @@
         val = s.value;
     }
     if (nam && val) {
-        setParameter(nam, val, relative);
+        dlParams.set(nam, val, relative);
         display();
     } else {
         alert("ERROR: unable to process event!");
@@ -310,138 +329,106 @@
 
 function parseAllParameters() {
     // put the query parameters (sans "?") in the parameters array
-    parseParameters(location.search.slice(1));
+    dlParams.parse(location.search.slice(1));
     // treat special parameters
-    dlMarks = parseMarks();
+    dlMarks.parse(dlParams.get("mk"));
     dlArea = parseArea();
-    dlFlags = parseFlags();
-    }
+    dlFlags.parse(dlParams.get("mo"));
+}
 
 function dl_param_init() {
-    // initialisation before onload
-    if (!baseLibVersion) alert("ERROR: baselib.js not loaded!");
-    if (isDigilibInitialized) return false;    // dl_param_init was already run 
-    // dlArea = new Rectangle(0.0, 0.0, 1.0, 1.0); // overwritten by parseAllParameters() below
-    // dlMarks = new Array(); // dito
-    // dlFlags = new Object(); // dito
-    // parse parameters
-    parseAllParameters();
-    isDigilibInitialized = true;
     return true;
-    }
+}
 
 function dl_init() {
     // initalisation on load
     if (!isDigilibInitialized) dl_param_init();
-    scalerDiv = getElement("scaler");
-    scalerImg = getElement("pic", true);
-    // in N4 pic is in the scaler layer
-    if (scalerImg == null && scalerDiv) {
-        scalerImg = scalerDiv.document.images[0];
-        }
-    // give a name to the window containing digilib
-    window.name = defined(dlTarget) && dlTarget
-        ? dlTarget
-        : "digilib";
-    // put the query parameters (sans "?") in the parameters array
-        // parseAllParameters(); // has already been called in dl_param_init()
     // wait for image to load and display marks
     renderMarks();
     // done
     focus();
-    }
-    
-initScaler = dl_init;
+}
 
-function loadScalerImage(detail) {
-    var pic = getElement('pic');
-    var scaler = getElement('scaler');
-    var zoomdiv = getElement("zoom");    // test for presence only
-    var overlay = getElement("overlay");    // test for presence only
-    var about = getElement("about");        // test for presence only
-    var bird = getElement("bird");        // test for presence only
-    var picsize = bestPicSize(scaler, 50);
+function setScalerImage(detail) {
+	// set the scaler image source (needs the browser size)
+    if (!scalerDiv) scalerDiv = getElement("scaler");
+    if (!scalerImg) scalerImg = getElement("pic");
+    var picsize = bestPicSize(scalerDiv, 50);
     var src = "../servlet/Scaler?" 
-        + getQueryString()
+        + dlParams.getAll(dlParams.PARAM_ALL & ~(dlParams.PARAM_MARK | dlParams.PARAM_PAGES))
         + "&dw=" + picsize.width
         + "&dh=" + picsize.height;
     // debug(src);
-    pic.src = src;
-    initScaler();    // dl_init braucht die endgültigen Maße des pic Elements
-    }
+    scalerImg.onload = onImgLoad;
+    scalerImg.src = src;
+    //initScaler();    // dl_init braucht die endgueltigen Masze des pic Elements
+}
 
-function display(detail) {
+function display(detail, moDetail) {
     // redisplay the page
-    if (! detail) detail = PARAM_ALL;
-    var queryString = getAllParameters(detail);
-    if (reloadPage) {
-        location.href
-            = location.protocol + "//"
-            + location.host
-            + location.pathname
-            + "?" + queryString;
-    } else {
-        loadScalerImage();
-        }
-    }
+    var queryString = dlParams.getAll(detail, moDetail);
+	location.href
+        = location.protocol + "//"
+    	    + location.host
+    	    + location.pathname
+        + "?" + queryString;
+}
 
 /* **********************************************
  *     interactive digilib functions
  * ******************************************** */
 function renderMarks() {
     // make sure the image is loaded so we know its size
-    if (defined(scalerImg.complete) && !scalerImg.complete && !browserType.isN4 ) {
-        setTimeout("renderMarks()", 100);
-        return;
-            }
-    // put the visible marks on the image
-    dlTrafo = parseTrafo(scalerImg);
+    if (!dlTrafo) {
+    		alert("ERROR: cannot render marks!");
+    		return;
+    	}
     // debugProps(dlArea, "dlArea");
     for (var i = 0; i < dlMarks.length; i++) {
-    var div = getElement("mark" + i) || createMarkDiv(i);
-        var mark = dlMarks[i];
-    // debugProps(mark, "mark");
-    if (dlArea.containsPosition(mark)) {
-        var mpos = dlTrafo.transform(mark); // FIX ME: transform does not change anything 
-        // debugProps(mark, "mpos");
-        // suboptimal to place -5 pixels and not half size of mark-image
-        // better not hide the marked spot (MR)
-        // mpos.x = mpos.x -5;
-        // mpos.y = mpos.y -5;
-        moveElement(div, mpos);
-        showElement(div, true);
-    } else {
-        // hide the other marks
-        showElement(div, false);
-        }
-        }
+    	var div = getElement("mark" + i, true) || createMarkDiv(i);
+    	var mark = dlMarks[i];
+    	// debugProps(mark, "mark");
+    	if (dlArea.containsPosition(mark)) {
+        	var mpos = dlTrafo.transform(mark); 
+        	// debugProps(mark, "mpos");
+	       	// suboptimal to place -5 pixels and not half size of mark-image
+	       	// better not hide the marked spot (MR)
+	       	// mpos.x = mpos.x -5;
+	       	// mpos.y = mpos.y -5;
+	       	moveElement(div, mpos);
+	        showElement(div, true);
+	    } else {
+	        // hide the other marks
+	        showElement(div, false);
+	    }
     }
+}
 
 function setMark(reload) {
 
     function markEvent(evt) {
     // event handler adding a new mark
         unregisterEvent("mousedown", scalerDiv, markEvent);
-        addMark(evt);
+        dlMarks.addEvent(evt);
         if ( defined(reload) && !reload ) {
             // don't redisplay
             renderMarks();
             return;
-            }
+        }
         display();
         return stopEvent(evt);
-        }
+    }
     
     // add a mark where clicked
     window.focus();
     moveCenter(false);
     // start event capturing
     registerEvent("mousedown", scalerDiv, markEvent);
-    }
+}
 
 function removeMark(reload) {
     // remove the last mark
-    deleteMark();
+    dlMarks.pop();
     if (defined(reload)&&(!reload)) {
         // don't redisplay
         renderMarks();
@@ -478,13 +465,14 @@
         registerEvent("mousemove", document, zoomMove);
         registerEvent("mouseup", document, zoomEnd);
         return stopEvent(evt);
-        }
+    }
     
 // mouseup handler: end moving
     function zoomEnd(evt) {
         pt2 = evtPosition(evt);
         // assume a click if the area is too small (up to 3 x 3 pixel)
-        var clickRect = getRect(pt1, pt2);
+        var clickRect = new Rectangle(pt1, pt2);
+        clickRect.normalize();
         if (clickRect.getArea() <= MIN_AREA_SIZE) return stopEvent(evt); 
         // hide zoom div
         showElement(zoomdiv, false);
@@ -492,43 +480,26 @@
         // unregister events
         unregisterEvent("mousemove", document, zoomMove);
         unregisterEvent("mouseup", document, zoomMove);
-        // calc offsets
+        // clip and transform
         clickRect.clipTo(picRect);
-        var area = getRect(
-            // FIX ME: liefert negative x/y Werte, wenn hmir/vmir=1
-            dlTrafo.invtransform(clickRect.getPt1()),
-            dlTrafo.invtransform(clickRect.getPt2())
-            );
-        setParameter("wx", cropFloat(area.x));
-        setParameter("wy", cropFloat(area.y));
-        setParameter("ww", cropFloat(area.width));
-        setParameter("wh", cropFloat(area.height));
-        // parseArea(); // why?
+        var area = dlTrafo.invtransform(clickRect);
+        setParamFromArea(area);
         // zoomed is always fit
-        setParameter("ws", 1);
+        dlParams.set("ws", 1);
         display();
         return stopEvent(evt);
-        }
+    }
     
 // mouse move handler
     function zoomMove(evt) {
         pt2 = evtPosition(evt);
-        var rect = getRect(pt1, pt2);
+        var rect = new Rectangle(pt1, pt2);
+        rect.normalize();
         rect.clipTo(picRect);
         // update zoom div
         moveElement(zoomdiv, rect);
         return stopEvent(evt);
-        }
-    
-// get a rectangle from two points
-    function getRect(p1, p2) {
-        return new Rectangle(
-            Math.min(p1.x, p2.x),
-            Math.min(p1.y, p2.y),
-            Math.abs(p1.x - p2.x),
-            Math.abs(p1.y - p2.y)
-            );
-        }
+    	}
 }
 
 function zoomBy(factor) {
@@ -546,10 +517,10 @@
 
 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);
+    dlParams.set("wx", 0.0);
+    dlParams.set("wy", 0.0);
+    dlParams.set("ww", 1.0);
+    dlParams.set("wh", 1.0);
     display();
 }
 
@@ -622,31 +593,30 @@
         + location.host
         + location.pathname;
     var hyperlinkRef = baseUrl;
-    var params = getAllParameters(PARAM_ALL & ~(PARAM_DPI | PARAM_PAGES)); // all without ddpi, pt
+    var params = dlParams.getAll(dlParams.PARAM_ALL & ~(dlParams.PARAM_DPI | dlParams.PARAM_PAGES)); // all without ddpi, pt
     if (params.length > 0) hyperlinkRef += "?" + params;
     return hyperlinkRef;
-    }
+}
 
 function getRefWin(type, msg) {
     // shows an alert with a reference to the current digilib set
     if (! msg) msg = "URL reference to the current view";
     prompt(msg, getRef());
-    }
+}
 
 function getQuality() {
     // returns the current q setting
     for (var i = 0; i < 3; i++) {
-        if (hasFlag("q"+i)) return i;
-        }
+        if (dlFlags.get("q"+i)) return i;
+    }
     return 1
-    }
+}
 
 function setQuality(qual) {
     // set the image quality
-    for (var i = 0; i < 3; i++) removeFlag("q" + i);
-    if (qual > 2) return alert("Quality number not supported");
-    addFlag("q" + i);
-    setParameter("mo", getAllFlags());
+    for (var i = 0; i < 3; i++) dlFlags.reset("q" + i);
+    if ((qual < 0)||(qual > 2)) return alert("Quality setting not supported");
+    dlFlags.set("q" + qual);
     display();
 }
 
@@ -656,58 +626,56 @@
     var q = getQuality();
     var newq = window.prompt(msg, q);
     if (newq) setQuality(newq);
-    }
+}
 
 function mirror(dir) {
     // mirror the image horizontally or vertically
-    toggleFlag(dir == "h"
-        ? "hmir"
-        : "vmir"
-        );
-    setParameter("mo", getAllFlags());
+    if (dir == "h") {
+    		dlFlags.toggle("hmir");
+    	} else {
+    		dlFlags.toggle("vmir");
+	}
     display();
 }
 
 function gotoPage(gopage, keep) {
     // goto given page nr (+/-: relative)
-    var oldpn = parseInt(getParameter("pn"));
-    setParameter("pn", gopage, true);
-    var pn = parseInt(getParameter("pn"));
+    var oldpn = parseInt(dlParams.get("pn"));
+    dlParams.set("pn", gopage, true);
+    var pn = parseInt(dlParams.get("pn"));
     if (pn < 1) {
         alert("No such page! (Page number too low)");
-        setParameter("pn", oldpn);
+        dlParams.set("pn", oldpn);
         return;
     }
-    if (hasParameter("pt")) {
-        pt = parseInt(getParameter("pt"))
+    if (dlParams.isSet("pt")) {
+        pt = parseInt(dlParams.get("pt"))
         if (pn > pt) {
             alert("No such page! (Page number too high)");
-            setParameter("pn", oldpn);
+            dlParams.set("pn", oldpn);
             return;
         }
     }
     if (keep) {
-        display(PARAM_ALL & ~PARAM_MARK); // all, no mark
+        display(dlParams.PARAM_ALL & ~dlParams.PARAM_MARK); // all, no mark
     } else {
-        display(PARAM_FILE | PARAM_MODE | PARAM_PAGES); // fn, pn, ws, mo + pt
-// FIX ME: currently the mirror status gets propagated to the other pages
-// hmir and vmir should not be mode flags, but boolean params!!! 
+        display(dlParams.PARAM_FILE | dlParams.PARAM_MODE | dlParams.PARAM_PAGES, dlParams.MODE_QUAL | dlParams.MODE_OTHER); // fn, pn, ws, mo + pt
     }
 }
 
 function gotoPageWin() {
     // dialog to ask for new page nr
-    var pn = getParameter("pn");
+    var pn = dlParams.get("pn");
     var gopage = window.prompt("Go to page", pn);
     if (gopage) gotoPage(gopage);
     }
 
 function setParamWin(param, text, relative) {
     // dialog to ask for new parameter value
-    var val = getParameter(param);
+    var val = dlParams.get(param);
     var newval = window.prompt(text, val);
     if (newval) {
-        setParameter(param, newval, relative);
+        dlParams.set(param, newval, relative);
         display();
     }
 }
@@ -745,7 +713,7 @@
 function loadBirdImage() {
     var img = getElement("bird-image");
     var src = "../servlet/Scaler?" 
-        + getQueryString(PARAM_FILE)
+        + dlParams.getAll(dlParams.PARAM_FILE)
         + "&dw=" + BIRD_MAXX 
         + "&dh=" + BIRD_MAXY;
     img.src = src;
@@ -821,10 +789,10 @@
             startPos = birdAreaRect.getCenter();
             birdAreaMove(evt); // set center to click position
             }
-        setParameter("wx", cropFloat((newRect.x - birdImgRect.x) / birdImgRect.width));
-        setParameter("wy", cropFloat((newRect.y - birdImgRect.y) / birdImgRect.height));
+        dlParams.set("wx", cropFloat((newRect.x - birdImgRect.x) / birdImgRect.width));
+        dlParams.set("wy", cropFloat((newRect.y - birdImgRect.y) / birdImgRect.height));
         // zoomed is always fit
-        setParameter("ws", 1);
+        dlParams.set("ws", 1);
         display();
         return stopEvent(evt);
         }
@@ -932,7 +900,7 @@
             alert("Screen has not yet been calibrated - using default value of 72 dpi");
             dpi = 72;
             }
-        setParameter("ddpi", dpi);
+        dlParams.set("ddpi", dpi);
         addFlag("osize");
         display();
         }
@@ -953,15 +921,15 @@
     divSize.width -= INSET; // allow for scrollbars [Firefox bug?]
     var imgSize = getElementSize(scalerImg);
     if (imgSize.width < divSize.width) {
-        setParameter("ws", cropFloat(divSize.width / imgSize.width));
-        display(PARAM_ALL & ~PARAM_DIM); // no zoom
+        dlParams.set("ws", cropFloat(divSize.width / imgSize.width));
+        display(dlParams.PARAM_ALL & ~dlParams.PARAM_DIM); // no zoom
         };
     // TODO: how to calculate correct width if zoom is on? (plus size?)
 
 }
 
 function resize(factor) {
-    setParameter("ws", factor);
+    dlParams.set("ws", factor);
     showSizeMenu(false);
     display();
 }