view client/digitallibrary/baselib.js @ 643:c108607e1bc0 jquery

zoomin and -out works now gotopage resets (some) parameters reload takes changed parameters (to put in url) getParamString omits parameters with default values (for shorter urls)
author robcast
date Wed, 19 Jan 2011 20:03:44 +0100
parents d989a93d773b
children
line wrap: on
line source

/* Copyright (C) 2003,2004 IT-Group MPIWG, 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: 
  Christian Luginbuehl, 01.05.2003 (first version)
  DW 24.03.2004 (Changed for digiLib in Zope)
  Robert Casties, 22.1.2008

*/

function base_init() {
    // init function
    baseScriptVersion = "1.2.4";
    dlParams = new Object();
    browserType = getBrowserType();
}


function getInt(n) {
    // returns always an integer
    n = parseInt(n);
    if (isNaN(n)) return 0;
    return n;
}

function defined(x) {
    // returns if x is defined
    return (typeof arguments[0] != "undefined");
}

function cropFloat(x) {
    // auxiliary function to crop senseless precision
    return parseInt(10000*x)/10000;
}

function getBrowserType() {
    // browser sniffer
    var bt = Object();
    bt.doDHTML = false;
    bt.versIE = 0;

    if ((! document.cssonly && document.layers) || document.all || document.getElementById) {
        var vers = navigator.appVersion.split('MSIE ');
        vers = vers[vers.length - 1];
        bt.versIE = getInt(vers);
        bt.isIE = navigator.userAgent.indexOf('MSIE') >= 0;
        bt.isMac = navigator.platform.indexOf('Mac') >= 0;
        bt.isWin = navigator.platform.indexOf('Win') >= 0;
        bt.isN4 = (navigator.userAgent.indexOf('Mozilla/4.') >= 0) && ! bt.isIE;
        bt.isIEWin = bt.versIE > 0 && bt.isWin;
        if (navigator.appVersion.indexOf('MSIE') < 0 || ! bt.isMac || bt.versIE >= 5) {
            bt.doDHTML = true;
            bt.isOpera = navigator.userAgent.indexOf(' Opera ') >= 0;
            bt.isKonq = navigator.userAgent.indexOf(' Konqueror') >= 0;
        }
    }
    return bt;
}

// fixes for javascript < 1.2
if (! Array.prototype.push) {
    Array.prototype.push = function(val) {
        this[this.length] = val;
        return this.length;
    }
    Array.prototype.pop = function() {
        var val = this[this.length-1];
        this.length -= 1;
        return val;
    }
}


/* **********************************************
 *     geometry classes
 * ******************************************** */

/*
 * Size class
 */
function Size(w, h) {
    this.width = parseFloat(w);
    this.height = parseFloat(h);
    return this;
}
Size.prototype.toString = function() {
    return this.width + "x" + this.height;
}


/*
 * Position class
 */
function Position(x, y) {
    this.x = parseFloat(x);
    this.y = parseFloat(y);
    return this;
}
Position.prototype.toString = function() {
    return this.x + "," + this.y;
}

/*
 * Rectangle class
 */
function Rectangle(x, y, w, h) {
    this.x = parseFloat(x);
    this.y = parseFloat(y);
    this.width = parseFloat(w);
    this.height = parseFloat(h);
    return this;
}
Rectangle.prototype.toString = function() {
    return this.width+"x"+this.height+"@"+this.x+","+this.y;
}
Rectangle.prototype.copy = function() {
    // returns a copy of this Rectangle
    return new Rectangle(this.x, this.y, this.width, this.height);
}
Rectangle.prototype.getPosition = function() {
    // returns the position of this Rectangle
    return new Position(this.x, this.y);
}
Rectangle.prototype.getSize = function() {
    // returns the size of this Rectangle
    return new Size(this.width, this.height);
}
Rectangle.prototype.getArea = function() {
    // returns the area of this Rectangle
    return (this.width * this.height);
}
Rectangle.prototype.containsPosition = function(pos) {
    // returns if the given Position lies in this Rectangle
    return ((pos.x >= this.x)&&(pos.y >= this.y)&&(pos.x <= this.x+this.width)&&(pos.y <= this.y+this.width));
}
Rectangle.prototype.intersect = function(rect) {
    // returns the intersection of the given Rectangle and this one
    var sec = rect.copy();
    if (sec.x < this.x) {
        sec.width = sec.width - (this.x - sec.x);
        sec.x = this.x;
    }
    if (sec.y < this.y) {
        sec.height = sec.height - (this.y - sec.y);
        sec.y = this.y;
    }
    if (sec.x + sec.width > this.x + this.width) {
        sec.width = (this.x + this.width) - sec.x;
    }
    if (sec.y + sec.height > this.y + this.height) {
        sec.height = (this.y + this.height) - sec.y;
    }
    return sec;
}
Rectangle.prototype.fit = function(rect) {
    // returns a Rectangle that fits into this one (by moving first)
    var sec = rect.copy();
    sec.x = Math.max(sec.x, this.x);
    sec.x = Math.max(sec.x, this.x);
    if (sec.x + sec.width > this.x + this.width) {
        sec.x = this.x + this.width - sec.width;
    }
    if (sec.y + sec.height > this.y + this.height) {
        sec.y = this.y + this.height - sec.height;
    }
    return sec.intersect(this);
}

/*
 * Transform class
 *
 * defines a class of affine transformations
 */
function Transform() {
    this.m00 = 1.0;
    this.m01 = 0.0;
    this.m02 = 0.0;
    this.m10 = 0.0;
    this.m11 = 1.0;
    this.m12 = 0.0;
    this.m20 = 0.0;
    this.m21 = 0.0;
    this.m22 = 1.0;
    return this;
}
Transform.prototype.concat = function(traf) {
    // add Transform traf to this Transform
    for (var i = 0; i < 3; i++) {
        for (var j = 0; j < 3; j++) {
            var c = 0.0;
            for (var k = 0; k < 3; k++) {
                c += traf["m"+i+k] * this["m"+k+j];
            }
            this["m"+i+j] = c;
        }
    }
    return this;
}
Transform.prototype.transform = function(rect) {
    // returns transformed Rectangle or Position with this Transform applied
    var x = this.m00 * rect.x + this.m01 * rect.y + this.m02;
    var y = this.m10 * rect.x + this.m11 * rect.y + this.m12;
    if (rect.width) {
        var width = this.m00 * rect.width + this.m01 * rect.height;
        var height = this.m10 * rect.width + this.m11 * rect.height;
        return new Rectangle(x, y, width, height);
    }
    return new Position(x, y);
}
Transform.prototype.invtransform = function(pos) {
    // returns transformed Position pos with the inverse of this Transform applied
    var det = this.m00 * this.m11 - this.m01 * this.m10;
    var x = (this.m11 * pos.x - this.m01 * pos.y - this.m11 * this.m02 + this.m01 * this.m12) / det;
    var y = (- this.m10 * pos.x + this.m00 * pos.y + this.m10 * this.m02 - this.m00 * this.m12) / det;
    return new Position(x, y);
}
function getRotation(angle, pos) {
    // returns a Transform that is a rotation by angle degrees around [pos.x, pos.y]
    var traf = new Transform();
    if (angle != 0) {
        var t = 2.0 * Math.PI * parseFloat(angle) / 360.0;
        traf.m00 = Math.cos(t);
        traf.m01 = - Math.sin(t);
        traf.m10 = Math.sin(t);
        traf.m11 = Math.cos(t);
        traf.m02 = pos.x - pos.x * Math.cos(t) + pos.y * Math.sin(t);
        traf.m12 = pos.y - pos.x * Math.sin(t) - pos.y * Math.cos(t);
    }
    return traf;
}
function getTranslation(pos) {
    // returns a Transform that is a translation by [pos.x, pos,y]
    var traf = new Transform();
    traf.m02 = pos.x;
    traf.m12 = pos.y;
    return traf;
}
function getScale(size) {
    // returns a Transform that is a scale by [size.width, size.height]
    var traf = new Transform();
    traf.m00 = size.width;
    traf.m11 = size.height;
    return traf;
}


/* **********************************************
 *     parameter routines
 * ******************************************** */

function newParameter(name, defaultValue, detail) {
    // create a new parameter with a name and a default value
    if (defined(dlParams[name])) {
        alert("Fatal: An object with name '" + name + "' already exists - cannot recreate!");
        return false;
    } else {
        dlParams[name] = new Object();
        dlParams[name].defaultValue = defaultValue;
        dlParams[name].hasValue = false;
        dlParams[name].value = defaultValue;
        dlParams[name].detail = detail;
        return dlParams[name];
    }
}

function getParameter(name) {
    // returns the named parameter value or its default value
    if (defined(dlParams[name])) {
        if (dlParams[name].hasValue) {
            return dlParams[name].value;
        } else {
            return dlParams[name].defaultValue;
        }
    } else {
        return null;
    }
}

function setParameter(name, value, relative) {
    // sets parameter value (relative values with +/- unless literal)
    if (defined(dlParams[name])) {
    	if ((relative)&&(value.slice)) {
	    	var sign = value.slice(0,1);
			if (sign == '+') {
				dlParams[name].value = parseFloat(dlParams[name].value) + parseFloat(value.slice(1));
			} else if (sign == '-') {
				dlParams[name].value = parseFloat(dlParams[name].value) - parseFloat(value.slice(1));
			} else {
	        	dlParams[name].value = value;
	        }
	    } else {
	        dlParams[name].value = value;
	    }
        dlParams[name].hasValue = true;
        return true;
    }
    return false;
}

function hasParameter(name) {
    // returns if the parameter's value has been set
    if (defined(dlParams[name])) {
        return dlParams[name].hasValue;
    }
    return false;
}

function getAllParameters(detail) {
    // returns a string of all parameters in query format
    if (! detail) {
        detail = 255;
    }
    var params = new Array();
    for (param in dlParams) {
        if (((dlParams[param].detail & detail) > 0)&&(dlParams[param].hasValue)) {
            var val = getParameter(param);
            if (val != "") {
                params.push(param + "=" + val);
            }
        }
    }
    return params.join("&");
}

function parseParameters(query) {
    // gets parameter values from query format string
    var params = query.split("&");
    for (var i = 0; i < params.length; i++) {
        var keyval = params[i].split("=");
        if (keyval.length == 2) {
            setParameter(keyval[0], keyval[1]);
        }
    }
}


/* **********************************************
 *     HTML/DOM routines
 * ******************************************** */

function getElement(tagid, quiet) {
    // returns the element object with the id tagid
    var e;
    if (document.getElementById) {
        e = document.getElementById(tagid);
    } else if (document.all) {
        alert("document.all!");
        e = document.all[tagid];
    } else if (document.layers) {
        e = document.layers[tagid];
    } 
    if (e) {
        return e;
    } else {
        if (! quiet) {
            alert("unable to find element: "+tagid);
        }
        return null;
    }
}

function getElementPosition(elem) {
    // returns a Position with the position of the element
    var x = 0;
    var y = 0;
    if (defined(elem.offsetParent)) {
        // use .offsetLeft for most browsers
        var e = elem;
        while (e) {
            if (browserType.isIE) {
                if (browserType.isMac) {
                    // IE for Mac extraspecial
                    if (e.offsetParent.tagName == "BODY") {
                        x += e.clientLeft;
                        y += e.clientTop;
                        break;
                    }
                } else {
                    // special for IE
                    if ((e.tagName != "TABLE") && (e.tagName != "BODY")) {
                        x += e.clientLeft;
                        y += e.clientTop;
                    }
                }
            }
            x += e.offsetLeft;
            y += e.offsetTop;
            e = e.offsetParent;
        }
    } else if (defined(elem.x)) {
        // use .x for other (which?)
        x = elem.x;
        y = elem.y;
    } else if (defined(elem.pageX)) {
        // use pageX for N4
        x = elem.pageX;
        y = elem.pageY;
    } else {
        alert("unable to get position of "+elem+" (id:"+elem.id+")");
    }
    return new Position(getInt(x), getInt(y));
}

function getElementSize(elem) {
    // returns a Rectangle with the size of the element
    var width = 0;
    var height = 0;
    if (defined(elem.offsetWidth)) {
        width = elem.offsetWidth;
        height = elem.offsetHeight;
    } else if (defined(elem.width)) {
        width = elem.width;
        height = elem.height;
    } else if (defined(elem.clip.width)) {
        width = elem.clip.width;
        height = elem.clip.height;
    } else {
        alert("unable to get size of "+elem+" (id:"+elem.id+")");
    }
    return new Size(getInt(width), getInt(height));
}

function getElementRect(elem) {
    // returns a Rectangle with the size and position of the element
    var pos = getElementPosition(elem);
    var size = getElementSize(elem);
    return new Rectangle(pos.x, pos.y, size.width, size.height);
}

function moveElement(elem, rect) {
    // moves and sizes the element
    if (elem.style) {
        if (defined(rect.x)) {
            elem.style.left = Math.round(rect.x) + "px";
            elem.style.top = Math.round(rect.y) + "px";
        }
        if (defined(rect.width)) {
            elem.style.width = Math.round(rect.width) + "px";
            elem.style.height = Math.round(rect.height) + "px";
        }
    } else if (document.layers) {
        if (defined(rect.x)) {
            elem.pageX = getInt(rect.x);
            elem.pageY = getInt(rect.y);
        }
        if (defined(rect.width)) {
            elem.clip.width = getInt(rect.width);
            elem.clip.height = getInt(rect.height);
        }
    } else {
        alert("moveelement: no style nor layer property!");
        return false;
    }
    return true;
}

function showElement(elem, show) {
    // shows or hides the element
    if (elem.style) {
        if (show) {
            elem.style.visibility = "visible";
        } else {
            elem.style.visibility = "hidden";
        }
    } else if (defined(elem.visibility)) {
        if (show) {
            elem.visibility = "show";
        } else {
            elem.visibility = "hide";
        }
    } else {
        alert("showelement: no style nor layer property!");
    }
    return true;
}

function isElementVisible(elem) {
    // returns of the is shown or hidden
    if (elem.style) {
        return (elem.style.visibility == "visible");
    } else if (defined(elem.visibility)) {
        return (elem.visibility == "show");
    } else {
        alert("iselementvisible: no style nor layer property!");
    }
}

function evtPosition(evt) {
    // returns the on-screen Position of the Event 
    var x;
    var y;
    evt = (evt) ? evt : window.event;
    if (!evt) {
        alert("no event found! "+evt);
        return;
    }
    if (defined(evt.pageX)) {
        x = parseInt(evt.pageX);
        y = parseInt(evt.pageY);
    } else if (defined(evt.clientX)) {
        x = parseInt(document.body.scrollLeft+evt.clientX);
        y = parseInt(document.body.scrollTop+evt.clientY);
    } else {
        alert("evtPosition: don't know how to deal with "+evt);
    }
    return new Position(x, y);
}

function registerEvent(type, elem, handler) {
    // register the given event handler on the indicated element
    if (elem.addEventListener) {
        elem.addEventListener(type, handler, false);
    } else {
        if (type == "mousedown") {
            if (elem.captureEvents) {
                elem.captureEvents(Event.MOUSEDOWN);
            }
            elem.onmousedown = handler;
        } else if (type == "mouseup") {
            if (elem.captureEvents) {
                elem.captureEvents(Event.MOUSEUP);
            }
            elem.onmouseup = handler;
        } else if (type == "mousemove") {
            if (elem.captureEvents) {
                elem.captureEvents(Event.MOUSEMOVE);
            }
            elem.onmousemove = handler;
        } else if (type == "keypress") {
            if (elem.captureEvents) {
                elem.captureEvents(Event.KEYPRESS);
            }
            elem.onkeypress = handler;
        } else {
            alert("registerEvent: unknown event type "+type);
            return false;
        }
    }
    return true;
}

function unregisterEvent(type, elem, handler) {
    // unregister the given event handler from the indicated element
    if (elem.removeEventListener) {
        elem.removeEventListener(type, handler, false);
    } else {
        if (type == "mousedown") {
            if (elem.releaseEvents) {
                elem.releaseEvents(Event.MOUSEDOWN);
            }
            elem.onmousedown = null;
        } else if (type == "mouseup") {
            if (elem.releaseEvents) {
                elem.releaseEvents(Event.MOUSEUP);
            }
            elem.onmouseup = null;
        } else if (type == "mousemove") {
            if (elem.releaseEvents) {
                elem.releaseEvents(Event.MOUSEMOVE);
            }
            elem.onmousemove = null;
        } else if (type == "keypress") {
            if (elem.releaseEvents) {
                elem.releaseEvents(Event.KEYPRESS);
            }
            elem.onkeypress = null;
        } else {
            alert("unregisterEvent: unknown event type "+type);
            return false;
        }
    }
    return true;
}


// old registerXXYY API for compatibility
function registerMouseDown(elem, handler) {
    return registerEvent("mousedown", elem, handler);
}
function unregisterMouseDown(elem, handler) {
    return unregisterEvent("mousedown", elem, handler);
}
function registerMouseMove(elem, handler) {
    return registerEvent("mousemove", elem, handler);
}
function unregisterMouseMove(elem, handler) {
    return unregisterEvent("mousemove", elem, handler);
}
function registerKeyDown(handler) {
    return registerEvent("keypress", elem, handler);
}


function getWinSize() {
    // returns a Size with the current window size (mostly from www.quirksmode.org)
    var wsize = new Size(100, 100);
    if (defined(self.innerHeight))  {
        // all except Explorer
        if ((self.innerWidth == 0)||(self.innerHeight == 0)) {
            // Safari 1.2 (and other) bug
            if (parent) {
                wsize.height = parent.innerHeight;
                wsize.width = parent.innerWidth;
            }
        } else {
            wsize.width = self.innerWidth;
            wsize.height = self.innerHeight;
        }
    } else if (document.documentElement && document.documentElement.clientHeight) {
        // Explorer 6 Strict Mode
        wsize.width = document.documentElement.clientWidth;
        wsize.height = document.documentElement.clientHeight;
    } else if (document.body) {
        // other Explorers
        wsize.width = document.body.clientWidth;
        wsize.height = document.body.clientHeight;
    }
    return wsize;
}

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