version 1.2, 2004/08/28 20:08:07
|
version 1.13, 2010/06/18 19:45:08
|
Line 1
|
Line 1
|
/* Copyright (C) 2003,2004 WTWG, Uni Bern and others |
/* Copyright (C) 2003,2004 IT-Group MPIWG, WTWG Uni Bern and others |
|
|
This program is free software; you can redistribute it and/or |
This program is free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License |
modify it under the terms of the GNU General Public License |
Line 14 You should have received a copy of the G
|
Line 14 You should have received a copy of the G
|
along with this program; if not, write to the Free Software |
along with this program; if not, write to the Free Software |
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
|
Authors: ROC 03.06.2004 |
Authors: |
first version by Christian Luginbuehl, 01.05.2003 |
Christian Luginbuehl, 01.05.2003 (first version) |
Changed for digiLib in Zope by DW 24.03.2004 |
DW 24.03.2004 (Changed for digiLib in Zope) |
|
Robert Casties, 22.1.2008 |
|
|
*/ |
*/ |
|
|
|
function base_init() { |
|
// init function |
|
baseScriptVersion = "1.2.5"; |
|
dlParams = new Object(); |
|
browserType = getBrowserType(); |
|
} |
|
|
|
|
function getInt(n) { |
function getInt(n) { |
// returns always an integer |
// returns always an integer |
n = parseInt(n); |
var n = parseInt(n); |
if (isNaN(n)) return 0; |
if (isNaN(n)) return 0; |
return n; |
return n; |
} |
} |
Line 31 function defined(x) {
|
Line 41 function defined(x) {
|
return (typeof arguments[0] != "undefined"); |
return (typeof arguments[0] != "undefined"); |
} |
} |
|
|
// auxiliary function to crop senseless precision |
|
function cropFloat(x) { |
function cropFloat(x) { |
|
// auxiliary function to crop senseless precision |
return parseInt(10000*x)/10000; |
return parseInt(10000*x)/10000; |
} |
} |
|
|
|
function getBrowserType() { |
// browser sniffer |
// browser sniffer |
var browserType = Object(); |
var bt = { |
browserType.doDHTML = false; |
doDHTML: false, |
browserType.versIE = 0; |
versIE: 0 |
|
}; |
|
|
if ((! document.cssonly && document.layers) || document.all || document.getElementById) { |
if ((! document.cssonly && document.layers) || document.all || document.getElementById) { |
var vers = navigator.appVersion.split('MSIE '); |
var vers = navigator.appVersion.split('MSIE '); |
vers = vers[vers.length - 1]; |
vers = vers[vers.length - 1]; |
browserType.versIE = getInt(vers); |
bt.versIE = getInt(vers); |
browserType.isIE = navigator.userAgent.indexOf('MSIE') >= 0; |
bt.isIE = navigator.userAgent.indexOf('MSIE') >= 0; |
browserType.isMac = navigator.platform.indexOf('Mac') >= 0; |
bt.isMac = navigator.platform.indexOf('Mac') >= 0; |
browserType.isWin = navigator.platform.indexOf('Win') >= 0; |
bt.isWin = navigator.platform.indexOf('Win') >= 0; |
browserType.isN4 = (navigator.userAgent.indexOf('Mozilla/4.') >= 0) && ! browserType.isIE; |
bt.isN4 = (navigator.userAgent.indexOf('Mozilla/4.') >= 0) && ! bt.isIE; |
browserType.isIEWin = browserType.versIE > 0 && browserType.isWin; |
bt.isIEWin = bt.versIE > 0 && bt.isWin; |
if (navigator.appVersion.indexOf('MSIE') < 0 || ! browserType.isMac || browserType.versIE >= 5) { |
if (navigator.appVersion.indexOf('MSIE') < 0 || ! bt.isMac || bt.versIE >= 5) { |
browserType.doDHTML = true; |
bt.doDHTML = true; |
browserType.isOpera = navigator.userAgent.indexOf(' Opera ') >= 0; |
bt.isOpera = navigator.userAgent.indexOf(' Opera ') >= 0; |
browserType.isKonq = navigator.userAgent.indexOf(' Konqueror') >= 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; |
|
} |
|
} |
} |
|
|
|
|
Line 83 function Size(w, h) {
|
Line 84 function Size(w, h) {
|
this.height = parseFloat(h); |
this.height = parseFloat(h); |
return this; |
return this; |
} |
} |
|
Size.prototype.toString = function() { |
|
return this.width + "x" + this.height; |
|
} |
|
|
|
|
/* |
/* |
* Position class |
* Position class |
Line 92 function Position(x, y) {
|
Line 97 function Position(x, y) {
|
this.y = parseFloat(y); |
this.y = parseFloat(y); |
return this; |
return this; |
} |
} |
|
Position.prototype.toString = function() { |
|
return this.x + "," + this.y; |
|
} |
|
|
/* |
/* |
* Rectangle class |
* Rectangle class |
Line 103 function Rectangle(x, y, w, h) {
|
Line 111 function Rectangle(x, y, w, h) {
|
this.height = parseFloat(h); |
this.height = parseFloat(h); |
return this; |
return this; |
} |
} |
|
Rectangle.prototype.toString = function() { |
|
return this.width+"x"+this.height+"@"+this.x+","+this.y; |
|
} |
Rectangle.prototype.copy = function() { |
Rectangle.prototype.copy = function() { |
// returns a copy of this Rectangle |
// returns a copy of this Rectangle |
return new Rectangle(this.x, this.y, this.width, this.height); |
return new Rectangle(this.x, this.y, this.width, this.height); |
Line 238 function getScale(size) {
|
Line 249 function getScale(size) {
|
* parameter routines |
* parameter routines |
* ******************************************** */ |
* ******************************************** */ |
|
|
var dlParams = new Object(); |
|
|
|
function newParameter(name, defaultValue, detail) { |
function newParameter(name, defaultValue, detail) { |
// create a new parameter with a name and a default value |
// create a new parameter with a name and a default value |
if (defined(dlParams[name])) { |
if (defined(dlParams[name])) { |
Line 268 function getParameter(name) {
|
Line 277 function getParameter(name) {
|
} |
} |
} |
} |
|
|
function setParameter(name, value) { |
function setParameter(name, value, relative) { |
// sets parameter value |
// sets parameter value (relative values with +/- unless literal) |
if (defined(dlParams[name])) { |
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].value = value; |
|
} |
dlParams[name].hasValue = true; |
dlParams[name].hasValue = true; |
return true; |
return true; |
} |
} |
return false; |
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) { |
function getAllParameters(detail) { |
// returns a string of all parameters in query format |
// returns a string of all (set) parameters in query format |
if (! detail) { |
if (! detail) { |
detail = 10; |
detail = 255; |
} |
} |
var params = new Array(); |
var params = new Array(); |
for ( param in dlParams ) { |
for (var p in dlParams) { |
if ((dlParams[param].detail <= detail)&&(dlParams[param].hasValue)) { |
var param = dlParams[p]; |
var val = getParameter(param); |
if (((param.detail & detail) > 0)&&(param.hasValue)) { |
|
var val = param.value; |
if (val != "") { |
if (val != "") { |
params.push(param + "=" + val); |
params.push(p + "=" + val); |
} |
} |
} |
} |
} |
} |
return params.join("&"); |
return params.join("&"); |
} |
} |
|
|
function parseParameters(query) { |
function parseParameters(query,newParamDetail) { |
// gets parameter values from query format string |
// gets parameter values from query format string |
var params = query.split("&"); |
var params = query.split("&"); |
for (var i = 0; i < params.length; i++) { |
for (var i = 0; i < params.length; i++) { |
var keyval = params[i].split("="); |
var keyval = params[i].split("="); |
if (keyval.length == 2) { |
if (keyval.length == 2) { |
|
var ex = setParameter(keyval[0], keyval[1]); |
|
if ((!ex) && newParamDetail) { |
|
// setParameter returned false = parameter doesn't exist -- add it |
|
newParameter(keyval[0], null, newParamDetail); |
setParameter(keyval[0], keyval[1]); |
setParameter(keyval[0], keyval[1]); |
} |
} |
} |
} |
} |
} |
|
} |
|
|
|
|
/* ********************************************** |
/* ********************************************** |
Line 336 function getElementPosition(elem) {
|
Line 370 function getElementPosition(elem) {
|
// returns a Position with the position of the element |
// returns a Position with the position of the element |
var x = 0; |
var x = 0; |
var y = 0; |
var y = 0; |
if (defined(elem.offsetLeft)) { |
if (defined(elem.offsetParent)) { |
|
// use .offsetLeft for most browsers |
var e = elem; |
var e = elem; |
while (e) { |
while (e) { |
if (defined(e.clientLeft)) { |
if (browserType.isIE) { |
// special for IE |
|
if (browserType.isMac) { |
if (browserType.isMac) { |
if (e.offsetParent.tagName == "BODY") { |
|
// IE for Mac extraspecial |
// IE for Mac extraspecial |
|
if (e.offsetParent.tagName == "BODY") { |
x += e.clientLeft; |
x += e.clientLeft; |
y += e.clientTop; |
y += e.clientTop; |
break; |
break; |
} |
} |
} else { |
} else { |
|
// special for IE |
if ((e.tagName != "TABLE") && (e.tagName != "BODY")) { |
if ((e.tagName != "TABLE") && (e.tagName != "BODY")) { |
x += e.clientLeft; |
x += e.clientLeft; |
y += e.clientTop; |
y += e.clientTop; |
Line 360 function getElementPosition(elem) {
|
Line 395 function getElementPosition(elem) {
|
e = e.offsetParent; |
e = e.offsetParent; |
} |
} |
} else if (defined(elem.x)) { |
} else if (defined(elem.x)) { |
|
// use .x for other (which?) |
x = elem.x; |
x = elem.x; |
y = elem.y; |
y = elem.y; |
} else if (defined(elem.pageX)) { |
} else if (defined(elem.pageX)) { |
|
// use pageX for N4 |
x = elem.pageX; |
x = elem.pageX; |
y = elem.pageY; |
y = elem.pageY; |
} else { |
} else { |
Line 397 function getElementRect(elem) {
|
Line 434 function getElementRect(elem) {
|
return new Rectangle(pos.x, pos.y, size.width, size.height); |
return new Rectangle(pos.x, pos.y, size.width, size.height); |
} |
} |
|
|
|
|
|
|
function moveElement(elem, rect) { |
function moveElement(elem, rect) { |
// moves and sizes the element |
// moves and sizes the element |
if (elem.style) { |
if (elem.style) { |
Line 446 function showElement(elem, show) {
|
Line 481 function showElement(elem, show) {
|
return true; |
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) { |
function evtPosition(evt) { |
// returns the on-screen Position of the Event |
// returns the on-screen Position of the Event |
var x; |
var x; |
Line 467 function evtPosition(evt) {
|
Line 513 function evtPosition(evt) {
|
return new Position(x, y); |
return new Position(x, y); |
} |
} |
|
|
function registerMouseDown(elem, handler) { |
function registerEvent(type, elem, handler) { |
// register a mouse down event handler on the indicated element |
// register the given event handler on the indicated element |
if (elem.addEventListener) { |
if (elem.addEventListener) { |
elem.addEventListener("mousedown", handler, false); |
elem.addEventListener(type, handler, false); |
} else { |
} else { |
|
if (type == "mousedown") { |
if (elem.captureEvents) { |
if (elem.captureEvents) { |
elem.captureEvents(Event.MOUSEDOWN); |
elem.captureEvents(Event.MOUSEDOWN); |
} |
} |
elem.onmousedown = handler; |
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; |
return true; |
} |
} |
|
|
function unregisterMouseDown(elem, handler) { |
function unregisterEvent(type, elem, handler) { |
// unregister the mouse down event handler |
// unregister the given event handler from the indicated element |
if (elem.removeEventListener) { |
if (elem.removeEventListener) { |
elem.removeEventListener("mousedown", handler, false); |
elem.removeEventListener(type, handler, false); |
} else { |
} else { |
|
if (type == "mousedown") { |
if (elem.releaseEvents) { |
if (elem.releaseEvents) { |
elem.releaseEvents(Event.MOUSEDOWN); |
elem.releaseEvents(Event.MOUSEDOWN); |
} |
} |
elem.onmousedown = null; |
elem.onmousedown = null; |
|
} else if (type == "mouseup") { |
|
if (elem.releaseEvents) { |
|
elem.releaseEvents(Event.MOUSEUP); |
} |
} |
return true; |
elem.onmouseup = null; |
|
} else if (type == "mousemove") { |
|
if (elem.releaseEvents) { |
|
elem.releaseEvents(Event.MOUSEMOVE); |
} |
} |
|
elem.onmousemove = null; |
function registerMouseMove(elem, handler) { |
} else if (type == "keypress") { |
// register a mouse move event handler on the indicated element |
if (elem.releaseEvents) { |
if (elem.addEventListener) { |
elem.releaseEvents(Event.KEYPRESS); |
elem.addEventListener("mousemove", handler, false); |
} |
|
elem.onkeypress = null; |
} else { |
} else { |
if (elem.captureEvents) { |
alert("unregisterEvent: unknown event type "+type); |
elem.captureEvents(Event.MOUSEMOVE); |
return false; |
} |
} |
elem.onmousemove = handler; |
|
} |
} |
return true; |
return true; |
} |
} |
|
|
function unregisterMouseMove(elem, handler) { |
|
// unregister the mouse move event handler |
// old registerXXYY API for compatibility |
if (elem.removeEventListener) { |
function registerMouseDown(elem, handler) { |
elem.removeEventListener("mousemove", handler, false); |
return registerEvent("mousedown", elem, handler); |
} else { |
|
if (elem.releaseEvents) { |
|
elem.releaseEvents(Event.MOUSEMOVE); |
|
} |
|
elem.onmousemove = null; |
|
} |
} |
return true; |
function unregisterMouseDown(elem, handler) { |
|
return unregisterEvent("mousedown", elem, handler); |
} |
} |
|
function registerMouseMove(elem, handler) { |
function registerKeyDown(handler) { |
return registerEvent("mousemove", elem, handler); |
// register a key down handler |
|
if ( document.addEventListener ) { |
|
this.document.addEventListener('keypress', handler, false); |
|
} else { |
|
if (elem.captureEvents) { |
|
elem.captureEvents(Event.MOUSEDOWN); |
|
} |
} |
this.document.onkeypress = handler |
function unregisterMouseMove(elem, handler) { |
|
return unregisterEvent("mousemove", elem, handler); |
} |
} |
return true; |
function registerKeyDown(handler) { |
|
return registerEvent("keypress", elem, handler); |
} |
} |
|
|
|
|
function getWinSize() { |
function getWinSize() { |
// returns a Size with the current window size (mostly from www.quirksmode.org) |
// returns a Size with the current window size (mostly from www.quirksmode.org) |
var wsize = new Size(100, 100); |
var wsize = new Size(100, 100); |
if (defined(self.innerHeight)) { |
if (!browserType.isIE) { |
// all except Explorer |
// 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.width = self.innerWidth; |
wsize.height = self.innerHeight; |
wsize.height = self.innerHeight; |
|
} |
} else if (document.documentElement && document.documentElement.clientHeight) { |
} else if (document.documentElement && document.documentElement.clientHeight) { |
// Explorer 6 Strict Mode |
// Explorer 6 Strict Mode |
wsize.width = document.documentElement.clientWidth; |
wsize.width = document.documentElement.clientWidth; |