//\/////
//\  overLIB Follow Scroll Plugin
//\  This file requires overLIB 4.00 or later.
//\
//\  overLIB 4.05 - You may not remove or change this notice.
//\  Copyright Erik Bosrup 1998-2004. All rights reserved.
//\  Contributors are listed on the homepage.
//\  See http://www.bosrup.com/web/overlib/ for details.
//   $Revision: 1.1 $                      $Date: 2004/09/15 05:00:18 $
//\/////


////////
// PRE-INIT
// Ignore these lines, configuration is below.
////////
if (typeof olInfo == 'undefined' || olInfo.simpleversion < 400) alert('overLIB 4.00 or later is required for the Follow Scroll Plugin.');
registerCommands('followscroll,followscrollrefresh');


////////
// DEFAULT CONFIGURATION
// You don't have to change anything here if you don't want to. All of this can be
// changed on your html page or through an overLIB call.
////////
// Default value for scroll is not to scroll (0)
if (typeof ol_followscroll=='undefined') var ol_followscroll=0;
if (typeof ol_followscrollrefresh=='undefined') var ol_followscrollrefresh=100;

////////
// END OF CONFIGURATION
// Don't change anything below this line, all configuration is above.
////////







////////
// INIT
////////
// Runtime variables init. Don't change for config!
var o3_followscroll=0;
var o3_followscrollrefresh=100;


////////
// PLUGIN FUNCTIONS
////////
function setScrollVariables() {
	o3_followscroll=ol_followscroll;
	o3_followscrollrefresh=ol_followscrollrefresh;
}

// Parses Shadow and Scroll commands
function parseScrollExtras(pf,i,ar) {
	var k=i,v;
	if (k < ar.length) {
		if (ar[k]==FOLLOWSCROLL) { eval(pf +'followscroll=('+pf+'followscroll==0) ? 1 : 0'); return k; }
		if (ar[k]==FOLLOWSCROLLREFRESH) { eval(pf+'followscrollrefresh='+ar[++k]); return k; }
	}
	return -1;
}



// Function to support scroll feature (overloads default)
function scroll_placeLayer() {
	var placeX, placeY, widthFix = 0;
	var hasAnchor=(typeof o3_anchor != 'undefined' && o3_anchor);
	
	// HORIZONTAL PLACEMENT
	if (eval('o3_frame.'+docRoot) && eval("typeof o3_frame."+docRoot+".clientWidth=='number'") && eval('o3_frame.'+docRoot+'.clientWidth')) {
		iwidth = eval('o3_frame.'+docRoot+'.clientWidth');
	} else if (typeof(o3_frame.innerWidth) == 'number') {
		widthFix = Math.ceil(1.2*(o3_frame.outerWidth - o3_frame.innerWidth));
		iwidth = o3_frame.innerWidth;
	}

	if (hasAnchor) {
		placeX = rmrkPosition[0];
		placeY = rmrkPosition[1];
	} else {	
		// Horizontal scroll offset
		winoffset=(olIe4) ? eval('o3_frame.'+docRoot+'.scrollLeft') : o3_frame.pageXOffset;
		var parsedWidth = parseInt(o3_width);
	
		if (o3_fixx > -1 || o3_relx != null) {
			// Fixed position
			placeX=(o3_relx != null ? ( o3_relx < 0 ? winoffset +o3_relx+ iwidth - parsedWidth - widthFix : winoffset+o3_relx) : o3_fixx);
		} else {  
			// If HAUTO, decide what to use.
			if (o3_hauto == 1) {
				if ((o3_x - winoffset) > (iwidth / 2)) {
					o3_hpos = LEFT;
				} else {
					o3_hpos = RIGHT;
				}
			}  		
	
			// From mouse
			if (o3_hpos == CENTER) { // Center
				placeX = o3_x+o3_offsetx-(parsedWidth/2);
	
				if (placeX < winoffset) placeX = winoffset;
			}
	
			if (o3_hpos == RIGHT) { // Right
				placeX = o3_x+o3_offsetx;
	
				if ((placeX+parsedWidth) > (winoffset+iwidth - widthFix)) {
					placeX = iwidth+winoffset - parsedWidth - widthFix;
					if (placeX < 0) placeX = 0;
				}
			}
			if (o3_hpos == LEFT) { // Left
				placeX = o3_x-o3_offsetx-parsedWidth;
				if (placeX < winoffset) placeX = winoffset;
			}  	
	
			// Snapping!
			if (o3_snapx > 1) {
				var snapping = placeX % o3_snapx;
	
				if (o3_hpos == LEFT) {
					placeX = placeX - (o3_snapx+snapping);
				} else {
					// CENTER and RIGHT
					placeX = placeX+(o3_snapx - snapping);
				}
	
				if (placeX < winoffset) placeX = winoffset;
			}
		}	
	
		// VERTICAL PLACEMENT
		if (eval('o3_frame.'+docRoot) && eval("typeof o3_frame."+docRoot+".clientHeight=='number'") && eval('o3_frame.'+docRoot+'.clientHeight')) {
			iheight = eval('o3_frame.'+docRoot+'.clientHeight');
		} else if (typeof(o3_frame.innerHeight)=='number') {
			iheight = o3_frame.innerHeight;
		}
	
		// Vertical scroll offset
		scrolloffset=(olIe4) ? eval('o3_frame.'+docRoot+'.scrollTop') : o3_frame.pageYOffset;
		var parsedHeight=(o3_aboveheight ? parseInt(o3_aboveheight) : (olNs4 ? over.clip.height : over.offsetHeight));
	
		if (o3_fixy > -1 || o3_rely != null) {
			// Fixed position
			placeY=(o3_rely != null ? (o3_rely < 0 ? scrolloffset+o3_rely+iheight - parsedHeight : scrolloffset+o3_rely) : o3_fixy);
		} else {
			// If VAUTO, decide what to use.
			if (o3_vauto == 1) {  
				if ((o3_y - scrolloffset) > (iheight/2)) {
					o3_vpos = ABOVE;
				} else {
					o3_vpos = BELOW;
				}
			}
	
			// From mouse
			if (o3_vpos == ABOVE) {
				if (o3_aboveheight == 0) o3_aboveheight = parsedHeight; 
	
				placeY = o3_y - (o3_aboveheight+o3_offsety);
				if (placeY < scrolloffset) placeY = scrolloffset;
			} else {
				// BELOW
				placeY = o3_y+o3_offsety;
			} 
	
			// Snapping!
			if (o3_snapy > 1) {
				var snapping = placeY % o3_snapy;  			
	
				if (o3_aboveheight > 0 && o3_vpos == ABOVE) {
					placeY = placeY - (o3_snapy+snapping);
				} else {
					placeY = placeY+(o3_snapy - snapping);
				} 			
	
				if (placeY < scrolloffset) placeY = scrolloffset;
			}
		}
	}

	// Actually move the object.
	repositionTo(over,placeX,placeY);
	
	if (o3_followscroll && o3_sticky && (o3_relx || o3_rely) && (typeof o3_draggable == 'undefined' || !o3_draggable)) {
		if (typeof over.scroller=='undefined' || over.scroller.canScroll) over.scroller = new Scroller(placeX-winoffset,placeY-scrolloffset,o3_followscrollrefresh);
	}
}



///////
// SUPPORT ROUTINES FOR SCROLL FEATURE
///////

// Scroller constructor
function Scroller(X,Y,refresh) {
	this.canScroll=0;
	this.refresh=refresh;
	this.x=X;
	this.y=Y;
	this.timer=setTimeout("repositionOver()",this.refresh);
}

// Removes the timer to stop replacing the layer.
function cancelScroll() {
	if (!o3_followscroll || typeof over.scroller == 'undefined') return;
	over.scroller.canScroll = 1;
	
	if (over.scroller.timer) {
		clearTimeout(over.scroller.timer);
		over.scroller.timer=null;
	}
}

// Find out how much we've scrolled.
	function getPageScrollY() {
	if (o3_frame.pageYOffset) return o3_frame.pageYOffset;
	if (eval(docRoot)) return eval('o3_frame.' + docRoot + '.scrollTop');
	return -1;
}
function getPageScrollX() {
	if (o3_frame.pageXOffset) return o3_frame.pageXOffset;
	if (eval(docRoot)) return eval('o3_frame.'+docRoot+'.scrollLeft');
	return -1;
}

// Find out where our layer is
function getLayerTop(layer) {
	if (layer.pageY) return layer.pageY;
	if (layer.style.top) return parseInt(layer.style.top);
	return -1;
}
function getLayerLeft(layer) {
	if (layer.pageX) return layer.pageX;
	if (layer.style.left) return parseInt(layer.style.left);
	return -1;
}

// Repositions the layer if needed
function repositionOver() {
	var X, Y, pgLeft, pgTop;
	pgTop = getPageScrollY();
	pgLeft = getPageScrollX();
	X = getLayerLeft(over)-pgLeft;
	Y = getLayerTop(over)-pgTop;
	
	if (X != over.scroller.x || Y != over.scroller.y) repositionTo(over, pgLeft+over.scroller.x, pgTop+over.scroller.y);
	over.scroller.timer = setTimeout("repositionOver()", over.scroller.refresh);
}

////////
// PLUGIN REGISTRATIONS
////////
registerRunTimeFunction(setScrollVariables);
registerCmdLineFunction(parseScrollExtras);
registerHook("hideObject",cancelScroll,FAFTER);
registerHook("placeLayer",scroll_placeLayer,FREPLACE);
//end