--- zogiLib/js/Attic/js_lib.js 2004/05/05 12:29:08 1.1 +++ zogiLib/js/Attic/js_lib.js 2004/06/02 17:32:54 1.2 @@ -14,11 +14,49 @@ You should have received a copy of the G along with this program; if not, write to the Free Software 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 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 if (! Array.prototype.push) { Array.prototype.push = function(val) { @@ -32,11 +70,6 @@ if (! Array.prototype.push) { } } -// auxiliary function to crop senseless precision -function cropFloat(x) { - return parseInt(10000*x)/10000; -} - /* ********************************************** * geometry classes @@ -74,6 +107,18 @@ 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)); @@ -141,10 +186,15 @@ Transform.prototype.concat = function(tr } return this; } -Transform.prototype.transform = function(pos) { - // returns transformed Position pos with this Transform applied - var x = this.m00 * pos.x + this.m01 * pos.y + this.m02; - var y = this.m10 * pos.x + this.m11 * pos.y + this.m12; +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) { @@ -192,7 +242,7 @@ var dlParams = new Object(); function newParameter(name, defaultValue, detail) { // 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!"); return false; } else { @@ -207,20 +257,20 @@ function newParameter(name, defaultValue function getParameter(name) { // returns the named parameter value or its default value - if (dlParams[name]) { + if (defined(dlParams[name])) { if (dlParams[name].hasValue) { return dlParams[name].value; } else { return dlParams[name].defaultValue; } } else { - return undefined; + return null; } } function setParameter(name, value) { // sets parameter value - if (dlParams[name]) { + if (defined(dlParams[name])) { dlParams[name].value = value; dlParams[name].hasValue = true; return true; @@ -258,72 +308,123 @@ function parseParameters(query) { * HTML/DOM routines * ******************************************** */ -function getElement(tagid) { +function getElement(tagid, quiet) { // returns the element object with the id tagid + var e; if (document.getElementById) { - return document.getElementById(tagid); + e = document.getElementById(tagid); } else if (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 { - var s = ""; - for (var e in document.layers) { - s += "'" + e + "', "; + if (! quiet) { + alert("unable to find element: "+tagid); } - alert("no document.all! "+tagid+" = "+s); - return document[tagid]; + return null; } -} +} -function getElementSize(tagid) { - // returns a Rectangle with the size and position of the named element +function getElementPosition(elem) { + // returns a Position with the position of the element var x = 0; var y = 0; - var width = 0; - 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; - while (e) { - x += e.offsetLeft; - y += e.offsetTop; - e = e.offsetParent; + if (defined(elem.offsetLeft)) { + var e = elem; + 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; + y += e.offsetTop; + 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; 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) { - // moves the named element to the indicated position - var elem = getElement(tagid); +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 + //alert("move: "+elem+" "+rect); if (elem.style) { - elem.style.left = pos.x + "px"; - elem.style.top = pos.y + "px"; + if (defined(rect.x)) { + 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 { - alert("moveelement: no style property!"); - elem.left = pos.x; - elem.top = pos.y; + alert("moveelement: no style nor layer property!"); + return false; } return true; } -function showElement(tagid, show) { - // shows or hides the named element - var elem = getElement(tagid); +function showElement(elem, show) { + // shows or hides the element if (elem.style) { if (show) { elem.style.visibility = "visible"; @@ -340,75 +441,69 @@ function evtPosition(evt) { // returns the on-screen Position of the Event var x; var y; - if (document.all) { - x = parseInt(document.body.scrollLeft+event.clientX); - y = parseInt(document.body.scrollLeft+event.clientY); - } else { + 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.scrollLeft+evt.clientY); + } else { + alert("evtPosition: don't know how to deal with "+evt); } return new Position(x, y); } -function registerMouseDown(tagid, handler) { +function registerMouseDown(elem, handler) { // register a mouse down event handler on the indicated element - if ( document.all ) { - document.all[tagid].onmousedown = handler; - } else if (document.getElementById) { - document.getElementById(tagid).addEventListener("mousedown", handler, true); + if (elem.addEventListener) { + elem.addEventListener("mousedown", handler, false); } else { - document[tagid].captureEvents(Event.MOUSEDOWN); - document[tagid].onmousedown = handler; + elem.onmousedown = handler; } return true; } -function unregisterMouseDown(tagid, handler) { +function unregisterMouseDown(elem, handler) { // unregister the mouse down event handler - if ( document.all ) { - document.all[tagid].onmousedown = null; - } else if (document.getElementById) { - document.getElementById(tagid).removeEventListener("mousedown", handler, true); + if (elem.removeEventListener) { + elem.removeEventListener("mousedown", handler, false); } else { - document[tagid].releaseEvents(Event.MOUSEDOWN); + elem.onmousedown = null; } return true; } -function registerMouseMove(tagid, handler) { +function registerMouseMove(elem, handler) { // register a mouse move event handler on the indicated element - if ( document.all ) { - document.all[tagid].onmousemove = handler; - } else if (document.getElementById) { - document.getElementById(tagid).addEventListener("mousemove", handler, true); + if (elem.addEventListener) { + elem.addEventListener("mousemove", handler, false); } else { - document[tagid].captureEvents(Event.MOUSEMOVE); - document[tagid].onmousemove = handler; + elem.onmousemove = handler; } return true; } -function unregisterMouseMove(tagid, handler) { +function unregisterMouseMove(elem, handler) { // unregister the mouse move event handler - if ( document.all ) { - document.all[tagid].onmousemove = null; - } else if (document.getElementById) { - document.getElementById(tagid).removeEventListener("mousemove", handler, true); + if (elem.removeEventListener) { + elem.removeEventListener("mousemove", handler, false); } else { - document[tagid].releaseEvents(Event.MOUSEMOVE); + elem.onmousemove = null; } return true; } function registerKeyDown(handler) { // register a key down handler - if ( document.all ) { - this.document.onkeypress = handler - } else if ( typeof(document.addEventListener) == "function" ) { - this.document.addEventListener('keypress', handler, true); + if ( document.addEventListener ) { + this.document.addEventListener('keypress', handler, false); } else { - window.captureEvents(Event.KEYDOWN); - window.onkeydown = handler; + this.document.onkeypress = handler } return true; } @@ -416,7 +511,7 @@ function registerKeyDown(handler) { function getWinSize() { // returns a Size with the current window size (from www.quirksmode.org) var wsize = new Size(100, 100); - if (self.innerHeight) { + if (defined(self.innerHeight)) { // all except Explorer wsize.width = self.innerWidth; wsize.height = self.innerHeight;