|
|
| 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; |