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


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





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


	}



