// ===================================================================

// 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. Instead,

// please just point to my URL to ensure the most up-to-date versions

// of the files. Thanks.

// ===================================================================

/* 

AnchorPosition.js

Author: Matt Kruse

Last modified: 5/31/01



DESCRIPTION: These functions find the position of an <A> tag in a document,

so other elements can be positioned relative to it.



COMPATABILITY: Works with Netscape 4.x, 6.x, IE 5.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 coordinates = new Object();

	var x=0;

	var y=0;

	// Browser capability sniffing

	var use_gebi = false;

	var use_css = false;

	var 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 = o.offsetLeft;

		y = o.offsetTop;

		}

 	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 + window.screenLeft;

			y = coordinates.y + 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 + window.screenLeft;

		y = coordinates.y + 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) {

	var scrollamount = document.body.scrollLeft;

	return AnchorPosition_getPageOffsetLeft(el)-scrollamount;

	}	

function AnchorPosition_getPageOffsetTop (el) {

	var ot = el.offsetTop;

	while((el = el.offsetParent) != null) { 

		ot += el.offsetTop; 

		}

	return ot;

	}

function AnchorPosition_getWindowOffsetTop (el) {

	var scrollamount = document.body.scrollTop;

	return AnchorPosition_getPageOffsetTop(el)-scrollamount;

	}

