version 1.1, 2004/05/05 12:29:08
|
version 1.2, 2004/06/02 17:32:54
|
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 3.5.2004 |
Authors: ROC 27.05.2004 |
first version by Christian Luginbuehl, 01.05.2003 |
first version by Christian Luginbuehl, 01.05.2003 |
Changed for digiLib in Zope by DW 24.03.2004 |
Changed for digiLib in Zope by DW 24.03.2004 |
*/ |
*/ |
|
|
|
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"); |
|
} |
|
|
|
// auxiliary function to crop senseless precision |
|
function cropFloat(x) { |
|
return parseInt(10000*x)/10000; |
|
} |
|
|
|
// browser sniffer |
|
var browserType = Object(); |
|
browserType.doDHTML = false; |
|
browserType.versIE = 0; |
|
|
|
if ((! document.cssonly && document.layers) || document.all || document.getElementById) { |
|
var vers = navigator.appVersion.split('MSIE '); |
|
vers = vers[vers.length - 1]; |
|
browserType.versIE = getInt(vers); |
|
browserType.isMac = navigator.platform.indexOf('Mac') >= 0; |
|
browserType.isWin = navigator.platform.indexOf('Win') >= 0; |
|
browserType.isIEWin = browserType.versIE > 0 && browserType.isWin; |
|
if (navigator.appVersion.indexOf('MSIE') < 0 || ! browserType.isMac || browserType.versIE >= 5) { |
|
browserType.doDHTML = true; |
|
browserType.isOpera = navigator.userAgent.indexOf(' Opera ') >= 0; |
|
browserType.isKonq = navigator.userAgent.indexOf(' Konqueror') >= 0; |
|
} |
|
} |
|
//alert("browser: dhtml="+browserType.doDHTML+" ie="+browserType.versIE+" mac="+browserType.isMac); |
|
|
// fixes for javascript < 1.2 |
// fixes for javascript < 1.2 |
if (! Array.prototype.push) { |
if (! Array.prototype.push) { |
Array.prototype.push = function(val) { |
Array.prototype.push = function(val) { |
Line 32 if (! Array.prototype.push) {
|
Line 70 if (! Array.prototype.push) {
|
} |
} |
} |
} |
|
|
// auxiliary function to crop senseless precision |
|
function cropFloat(x) { |
|
return parseInt(10000*x)/10000; |
|
} |
|
|
|
|
|
/* ********************************************** |
/* ********************************************** |
* geometry classes |
* geometry classes |
Line 74 Rectangle.prototype.copy = function() {
|
Line 107 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); |
} |
} |
|
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) { |
Rectangle.prototype.containsPosition = function(pos) { |
// returns if the given Position lies in this Rectangle |
// 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)); |
return ((pos.x >= this.x)&&(pos.y >= this.y)&&(pos.x <= this.x+this.width)&&(pos.y <= this.y+this.width)); |
Line 141 Transform.prototype.concat = function(tr
|
Line 186 Transform.prototype.concat = function(tr
|
} |
} |
return this; |
return this; |
} |
} |
Transform.prototype.transform = function(pos) { |
Transform.prototype.transform = function(rect) { |
// returns transformed Position pos with this Transform applied |
// returns transformed Rectangle or Position with this Transform applied |
var x = this.m00 * pos.x + this.m01 * pos.y + this.m02; |
var x = this.m00 * rect.x + this.m01 * rect.y + this.m02; |
var y = this.m10 * pos.x + this.m11 * pos.y + this.m12; |
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); |
return new Position(x, y); |
} |
} |
Transform.prototype.invtransform = function(pos) { |
Transform.prototype.invtransform = function(pos) { |
Line 192 var dlParams = new Object();
|
Line 242 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 (dlParams[name]) { |
if (defined(dlParams[name])) { |
alert("Fatal: An object with name '" + name + "' already exists - cannot recreate!"); |
alert("Fatal: An object with name '" + name + "' already exists - cannot recreate!"); |
return false; |
return false; |
} else { |
} else { |
Line 207 function newParameter(name, defaultValue
|
Line 257 function newParameter(name, defaultValue
|
|
|
function getParameter(name) { |
function getParameter(name) { |
// returns the named parameter value or its default value |
// returns the named parameter value or its default value |
if (dlParams[name]) { |
if (defined(dlParams[name])) { |
if (dlParams[name].hasValue) { |
if (dlParams[name].hasValue) { |
return dlParams[name].value; |
return dlParams[name].value; |
} else { |
} else { |
return dlParams[name].defaultValue; |
return dlParams[name].defaultValue; |
} |
} |
} else { |
} else { |
return undefined; |
return null; |
} |
} |
} |
} |
|
|
function setParameter(name, value) { |
function setParameter(name, value) { |
// sets parameter value |
// sets parameter value |
if (dlParams[name]) { |
if (defined(dlParams[name])) { |
dlParams[name].value = value; |
dlParams[name].value = value; |
dlParams[name].hasValue = true; |
dlParams[name].hasValue = true; |
return true; |
return true; |
Line 258 function parseParameters(query) {
|
Line 308 function parseParameters(query) {
|
* HTML/DOM routines |
* HTML/DOM routines |
* ******************************************** */ |
* ******************************************** */ |
|
|
function getElement(tagid) { |
function getElement(tagid, quiet) { |
// returns the element object with the id tagid |
// returns the element object with the id tagid |
|
var e; |
if (document.getElementById) { |
if (document.getElementById) { |
return document.getElementById(tagid); |
e = document.getElementById(tagid); |
} else if (document.all) { |
} else if (document.all) { |
alert("document.all!"); |
alert("document.all!"); |
return document.all[tagid]; |
e = document.all[tagid]; |
|
} else if (document.layers) { |
|
e = document.layers[tagid]; |
|
//alert("e: "+e+" layers? "+tagid); |
|
} |
|
if (e) { |
|
return e; |
} else { |
} else { |
var s = ""; |
if (! quiet) { |
for (var e in document.layers) { |
alert("unable to find element: "+tagid); |
s += "'" + e + "', "; |
|
} |
} |
alert("no document.all! "+tagid+" = "+s); |
return null; |
return document[tagid]; |
|
} |
} |
} |
} |
|
|
function getElementSize(tagid) { |
function getElementPosition(elem) { |
// returns a Rectangle with the size and position of the named element |
// returns a Position with the position of the element |
var x = 0; |
var x = 0; |
var y = 0; |
var y = 0; |
var width = 0; |
if (defined(elem.offsetLeft)) { |
var height = 0; |
|
var elem = getElement(tagid); |
|
if (elem.left) { |
|
alert("elem.left!"); |
|
x = elem.left; |
|
y = elem.top; |
|
width = elem.width; |
|
height = elem.height; |
|
} else { |
|
if (elem.clientLeft) { |
|
// spass mit IE |
|
x = elem.clientLeft; |
|
y = elem.clientTop; |
|
} else { |
|
var e = elem; |
var e = elem; |
while (e) { |
while (e) { |
|
if (defined(e.clientLeft)) { |
|
// special for IE |
|
if (browserType.isMac) { |
|
if (e.offsetParent.tagName == "BODY") { |
|
// IE for Mac extraspecial |
|
x += e.clientLeft; |
|
y += e.clientTop; |
|
break; |
|
} |
|
} else { |
|
if ((e.tagName != "TABLE") && (e.tagName != "BODY")) { |
|
x += e.clientLeft; |
|
y += e.clientTop; |
|
} |
|
} |
|
} |
x += e.offsetLeft; |
x += e.offsetLeft; |
y += e.offsetTop; |
y += e.offsetTop; |
e = e.offsetParent; |
e = e.offsetParent; |
} |
} |
|
} else if (defined(elem.x)) { |
|
x = elem.x; |
|
y = elem.y; |
|
} else if (document.layers) { |
|
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; |
width = elem.offsetWidth; |
height = elem.offsetHeight; |
height = elem.offsetHeight; |
|
} else if (document.layers) { |
|
width = elem.clip.width; |
|
height = elem.clip.height; |
|
} else { |
|
alert("unable to get size of "+elem+" (id:"+elem.id+")"); |
} |
} |
return new Rectangle(x, y, width, height); |
return new Size(getInt(width), getInt(height)); |
} |
} |
|
|
function moveElement(tagid, pos) { |
function getElementRect(elem) { |
// moves the named element to the indicated position |
// returns a Rectangle with the size and position of the element |
var elem = getElement(tagid); |
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 |
|
//alert("move: "+elem+" "+rect); |
if (elem.style) { |
if (elem.style) { |
elem.style.left = pos.x + "px"; |
if (defined(rect.x)) { |
elem.style.top = pos.y + "px"; |
elem.style.left = Math.round(rect.x) + "px"; |
|
elem.style.top = Math.round(rect.y) + "px"; |
|
//alert(elem.id+"move: "+rect.x+", "+rect.y+" = "+elem.style.left+", "+elem.style.top); |
|
} |
|
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 { |
} else { |
alert("moveelement: no style property!"); |
alert("moveelement: no style nor layer property!"); |
elem.left = pos.x; |
return false; |
elem.top = pos.y; |
|
} |
} |
return true; |
return true; |
} |
} |
|
|
function showElement(tagid, show) { |
function showElement(elem, show) { |
// shows or hides the named element |
// shows or hides the element |
var elem = getElement(tagid); |
|
if (elem.style) { |
if (elem.style) { |
if (show) { |
if (show) { |
elem.style.visibility = "visible"; |
elem.style.visibility = "visible"; |
Line 340 function evtPosition(evt) {
|
Line 441 function evtPosition(evt) {
|
// returns the on-screen Position of the Event |
// returns the on-screen Position of the Event |
var x; |
var x; |
var y; |
var y; |
if (document.all) { |
evt = (evt) ? evt : window.event; |
x = parseInt(document.body.scrollLeft+event.clientX); |
if (!evt) { |
y = parseInt(document.body.scrollLeft+event.clientY); |
alert("no event found! "+evt); |
} else { |
return; |
|
} |
|
if (defined(evt.pageX)) { |
x = parseInt(evt.pageX); |
x = parseInt(evt.pageX); |
y = parseInt(evt.pageY); |
y = parseInt(evt.pageY); |
|
} else if (defined(evt.clientX)) { |
|
x = parseInt(document.body.scrollLeft+evt.clientX); |
|
y = parseInt(document.body.scrollLeft+evt.clientY); |
|
} else { |
|
alert("evtPosition: don't know how to deal with "+evt); |
} |
} |
return new Position(x, y); |
return new Position(x, y); |
} |
} |
|
|
function registerMouseDown(tagid, handler) { |
function registerMouseDown(elem, handler) { |
// register a mouse down event handler on the indicated element |
// register a mouse down event handler on the indicated element |
if ( document.all ) { |
if (elem.addEventListener) { |
document.all[tagid].onmousedown = handler; |
elem.addEventListener("mousedown", handler, false); |
} else if (document.getElementById) { |
|
document.getElementById(tagid).addEventListener("mousedown", handler, true); |
|
} else { |
} else { |
document[tagid].captureEvents(Event.MOUSEDOWN); |
elem.onmousedown = handler; |
document[tagid].onmousedown = handler; |
|
} |
} |
return true; |
return true; |
} |
} |
|
|
function unregisterMouseDown(tagid, handler) { |
function unregisterMouseDown(elem, handler) { |
// unregister the mouse down event handler |
// unregister the mouse down event handler |
if ( document.all ) { |
if (elem.removeEventListener) { |
document.all[tagid].onmousedown = null; |
elem.removeEventListener("mousedown", handler, false); |
} else if (document.getElementById) { |
|
document.getElementById(tagid).removeEventListener("mousedown", handler, true); |
|
} else { |
} else { |
document[tagid].releaseEvents(Event.MOUSEDOWN); |
elem.onmousedown = null; |
} |
} |
return true; |
return true; |
} |
} |
|
|
function registerMouseMove(tagid, handler) { |
function registerMouseMove(elem, handler) { |
// register a mouse move event handler on the indicated element |
// register a mouse move event handler on the indicated element |
if ( document.all ) { |
if (elem.addEventListener) { |
document.all[tagid].onmousemove = handler; |
elem.addEventListener("mousemove", handler, false); |
} else if (document.getElementById) { |
|
document.getElementById(tagid).addEventListener("mousemove", handler, true); |
|
} else { |
} else { |
document[tagid].captureEvents(Event.MOUSEMOVE); |
elem.onmousemove = handler; |
document[tagid].onmousemove = handler; |
|
} |
} |
return true; |
return true; |
} |
} |
|
|
function unregisterMouseMove(tagid, handler) { |
function unregisterMouseMove(elem, handler) { |
// unregister the mouse move event handler |
// unregister the mouse move event handler |
if ( document.all ) { |
if (elem.removeEventListener) { |
document.all[tagid].onmousemove = null; |
elem.removeEventListener("mousemove", handler, false); |
} else if (document.getElementById) { |
|
document.getElementById(tagid).removeEventListener("mousemove", handler, true); |
|
} else { |
} else { |
document[tagid].releaseEvents(Event.MOUSEMOVE); |
elem.onmousemove = null; |
} |
} |
return true; |
return true; |
} |
} |
|
|
function registerKeyDown(handler) { |
function registerKeyDown(handler) { |
// register a key down handler |
// register a key down handler |
if ( document.all ) { |
if ( document.addEventListener ) { |
this.document.onkeypress = handler |
this.document.addEventListener('keypress', handler, false); |
} else if ( typeof(document.addEventListener) == "function" ) { |
|
this.document.addEventListener('keypress', handler, true); |
|
} else { |
} else { |
window.captureEvents(Event.KEYDOWN); |
this.document.onkeypress = handler |
window.onkeydown = handler; |
|
} |
} |
return true; |
return true; |
} |
} |
Line 416 function registerKeyDown(handler) {
|
Line 511 function registerKeyDown(handler) {
|
function getWinSize() { |
function getWinSize() { |
// returns a Size with the current window size (from www.quirksmode.org) |
// returns a Size with the current window size (from www.quirksmode.org) |
var wsize = new Size(100, 100); |
var wsize = new Size(100, 100); |
if (self.innerHeight) { |
if (defined(self.innerHeight)) { |
// all except Explorer |
// all except Explorer |
wsize.width = self.innerWidth; |
wsize.width = self.innerWidth; |
wsize.height = self.innerHeight; |
wsize.height = self.innerHeight; |