| // =================================================================== |
| // Author: Matt Kruse <matt@mattkruse.com> |
| // WWW: http://www.mattkruse.com/ |
| // |
| // NOTICE: You may use this code for any purpose, commercial or |
| // private, without any further permission from the author. You may |
| // remove this notice from your final code if you wish, however it is |
| // appreciated by the author if at least my web site address is kept. |
| // |
| // You may *NOT* re-distribute this code in any way except through its |
| // use. That means, you can include it in your product, or your web |
| // site, or any other form where the code is actually being used. You |
| // may not put the plain javascript up on your site for download or |
| // include it in your javascript libraries for download. |
| // If you wish to share this code with others, please just point them |
| // to the URL instead. |
| // Please DO NOT link directly to my .js files from your site. Copy |
| // the files to your server and use them there. Thank you. |
| // =================================================================== |
| |
| /* |
| AnchorPosition.js |
| Author: Matt Kruse |
| Last modified: 10/11/02 |
| |
| DESCRIPTION: These functions find the position of an <A> tag in a document, |
| so other elements can be positioned relative to it. |
| |
| COMPATIBILITY: Netscape 4.x,6.x,Mozilla, IE 5.x,6.x on Windows. Some small |
| positioning errors - usually with Window positioning - occur on the |
| Macintosh platform. |
| |
| FUNCTIONS: |
| getAnchorPosition(anchorname) |
| Returns an Object() having .x and .y properties of the pixel coordinates |
| of the upper-left corner of the anchor. Position is relative to the PAGE. |
| |
| getAnchorWindowPosition(anchorname) |
| Returns an Object() having .x and .y properties of the pixel coordinates |
| of the upper-left corner of the anchor, relative to the WHOLE SCREEN. |
| |
| NOTES: |
| |
| 1) For popping up separate browser windows, use getAnchorWindowPosition. |
| Otherwise, use getAnchorPosition |
| |
| 2) Your anchor tag MUST contain both NAME and ID attributes which are the |
| same. For example: |
| <A NAME="test" ID="test"> </A> |
| |
| 3) There must be at least a space between <A> </A> for IE5.5 to see the |
| anchor tag correctly. Do not do <A></A> with no space. |
| */ |
| |
| // getAnchorPosition(anchorname) |
| // This function returns an object having .x and .y properties which are the coordinates |
| // of the named anchor, relative to the page. |
| function getAnchorPosition(anchorname) { |
| // This function will return an Object with x and y properties |
| var useWindow=false; |
| var coordinates=new Object(); |
| var x=0,y=0; |
| // Browser capability sniffing |
| var use_gebi=false, use_css=false, use_layers=false; |
| if (document.getElementById) { use_gebi=true; } |
| else if (document.all) { use_css=true; } |
| else if (document.layers) { use_layers=true; } |
| // Logic to find position |
| if (use_gebi && document.all) { |
| x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]); |
| y=AnchorPosition_getPageOffsetTop(document.all[anchorname]); |
| } |
| else if (use_gebi) { |
| var o=document.getElementById(anchorname); |
| x=AnchorPosition_getPageOffsetLeft(o); |
| y=AnchorPosition_getPageOffsetTop(o); |
| } |
| else if (use_css) { |
| x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]); |
| y=AnchorPosition_getPageOffsetTop(document.all[anchorname]); |
| } |
| else if (use_layers) { |
| var found=0; |
| for (var i=0; i<document.anchors.length; i++) { |
| if (document.anchors[i].name==anchorname) { found=1; break; } |
| } |
| if (found==0) { |
| coordinates.x=0; coordinates.y=0; return coordinates; |
| } |
| x=document.anchors[i].x; |
| y=document.anchors[i].y; |
| } |
| else { |
| coordinates.x=0; coordinates.y=0; return coordinates; |
| } |
| coordinates.x=x; |
| coordinates.y=y; |
| return coordinates; |
| } |
| |
| // getAnchorWindowPosition(anchorname) |
| // This function returns an object having .x and .y properties which are the coordinates |
| // of the named anchor, relative to the window |
| function getAnchorWindowPosition(anchorname) { |
| var coordinates=getAnchorPosition(anchorname); |
| var x=0; |
| var y=0; |
| if (document.getElementById) { |
| if (isNaN(window.screenX)) { |
| x=coordinates.x-document.body.scrollLeft+window.screenLeft; |
| y=coordinates.y-document.body.scrollTop+window.screenTop; |
| } |
| else { |
| x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset; |
| y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset; |
| } |
| } |
| else if (document.all) { |
| x=coordinates.x-document.body.scrollLeft+window.screenLeft; |
| y=coordinates.y-document.body.scrollTop+window.screenTop; |
| } |
| else if (document.layers) { |
| x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset; |
| y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset; |
| } |
| coordinates.x=x; |
| coordinates.y=y; |
| return coordinates; |
| } |
| |
| // Functions for IE to get position of an object |
| function AnchorPosition_getPageOffsetLeft (el) { |
| var ol=el.offsetLeft; |
| while ((el=el.offsetParent) != null) { ol += el.offsetLeft; } |
| return ol; |
| } |
| function AnchorPosition_getWindowOffsetLeft (el) { |
| return AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft; |
| } |
| function AnchorPosition_getPageOffsetTop (el) { |
| var ot=el.offsetTop; |
| while((el=el.offsetParent) != null) { ot += el.offsetTop; } |
| return ot; |
| } |
| function AnchorPosition_getWindowOffsetTop (el) { |
| return AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop; |
| } |