// =============================================
// Capturing The Mouse Position in IE4-6 & NS4-6
// (C) 2000 www.CodeLifter.com
// Free for all users, but leave in this header

function getMouseXY(e)
{
	if (document.all)
	{
		// grab the x-y pos.s if browser is IE
		x = event.clientX + document.body.scrollLeft
    	y = event.clientY + document.body.scrollTop
  	}
  	else
  	{
  		// grab the x-y pos.s if browser is NS
    	x = e.pageX
    	y = e.pageY
	}

	// catch possible negative values in NS4
	if (x < 0)
		x = 0;
	if (y < 0)
		y = 0;

	return new Array(x, y);
}

function getElementXY(element)
{
	var xy = new Array(0, 0);
	while (element != null)
	{
		xy[0] += element.offsetLeft;
		xy[1] += element.offsetTop;
		
		element = element.offsetParent;
	}

	return xy;
}

function scrollbarMouseUp()
{
	active_scrollbar = -1;
	scrolling_knob = null;
}

function scrollbarMouseDown(e)
{
	if (!e)
		var e = window.event;
		
	target = null;
	if (e.target)
		target = e.target;
	else if (e.srcElement)
		target = e.srcElement;
		
	if (target)
	{
		// Which element is this scrollbar scrolling?
		scrolling_element = null;
		for (i = 0; i < scrollbars.length; ++i)
		{
			if (scrollbars[i].scrollbar_element == target.parentNode)
			{
				active_scrollbar = i;
				scrolling_knob = target;
				
				// Determine the offset of the mouse's y-coordinate from the top of the knob.
				mouse_xy = getMouseXY(e);
				knob_xy = getElementXY(scrolling_knob);
				scrolling_knob_offset = scrollbars[i].vertical ? mouse_xy[1] - knob_xy[1] : mouse_xy[0] - knob_xy[0];
				
				break;
			}
		}
	}
}

function scrollbarMouseMove(e)
{
	if (!e)
		var e = window.event;
		
	if (scrolling_knob && active_scrollbar >= 0)
	{
		vertical = scrollbars[active_scrollbar].vertical;
		
		// How long is the knob?
		knob_size = vertical ? scrolling_knob.clientHeight : scrolling_knob.clientWidth;
		// How long is the track? (-2 for the 1-pixel border at the top and bottom).
		track_size = vertical ? (scrolling_knob.parentNode.clientHeight - 4) : (scrolling_knob.parentNode.clientWidth - 4);
		// The traversable track is the 'empty' bit of the track.
		traversable_track = track_size - knob_size;
		
		// Get the offset of the mouse cursor from the top of the scrollbar's track.
		mouse_xy = getMouseXY(e);
		bar_xy = getElementXY(scrolling_knob.parentNode);
		
		// From that, determine how far down the top of the knob should be.
		knob_pos = (vertical ? mouse_xy[1] - bar_xy[1] : mouse_xy[0] - bar_xy[0]) - scrolling_knob_offset;
		if (knob_pos < 0)
			knob_pos = 0;
		if (knob_pos > traversable_track)
			knob_pos = traversable_track;
			
		// Move the scrollbar.
		knob_pos_style = (1 + knob_pos) + 'px';
		if (vertical)
			scrolling_knob.style.top = knob_pos_style;
		else
			scrolling_knob.style.left = knob_pos_style;
			
		// Now that we've moved the scrollbar, scroll the element's content.
		scrolling_element = scrollbars[active_scrollbar].scrolling_element;
		if (vertical)
			scrolling_element.scrollTop = (knob_pos / traversable_track) * (scrolling_element.scrollHeight - scrolling_element.clientHeight);
		else
			scrolling_element.scrollLeft = (knob_pos / traversable_track) * (scrolling_element.scrollWidth - scrolling_element.clientWidth);
	}
}

// Have the global events been attached? Only attach them if a scrollbar is required on the page.
var scrollbar_events_attached = false;

// All the scrollbars we're managing.
var scrollbars = new Array();

// The scrollbar that it being moved currently.
var active_scrollbar = -1;

// Which element are we current scrolling?
//var scrolling_element = null;
// Which knob are we scrolling currently?
var scrolling_knob = null;
var scrolling_knob_offset = 0;


function attachScrollbar(scroll_container, scroll_element, vertical)
{
	if (scroll_element)
	{
		// Have we made a scrollbar for this element already?
		for (i = 0; i < scrollbars.length; ++i)
		{
			if (scrollbars[i].scrolling_element == scroll_element)
				return;
		}
		
		// How big is the element?
		// Force horizontal width to 651, Safari and Chrome are returning garbage values (too early to be laid out?)
		window_size = vertical ? scroll_element.offsetHeight : /*scroll_element.offsetWidth*/ 651;
		content_size = 0
		if (vertical)
			content_size = scroll_element.scrollHeight;
		else
		{
			// Safari and Chrome don't calculate scrollHeight early enough, so add up the width of
			// all the images instead.
			for (i = 0; i < scroll_element.childNodes.length; ++i)
            {
                if (scroll_element.childNodes[i].firstChild)
                    content_size += scroll_element.childNodes[i].firstChild.clientWidth;
            }
		}
		
		if (content_size < window_size)
			content_size = window_size;
		
		// Create the scrollbar elements.
		scrollbar_element = document.createElement('div');
		scrollbar_element.className = vertical ? 'scrollbar-vertical' : 'scrollbar-horizontal';
		if (vertical)
			scrollbar_element.style.height = (window_size - 31) + 'px';
		
		// Create the top and bottom elements for the scrollbar.
		top_element = document.createElement('div');
		top_element.className = 'scrollbar-top';
		scrollbar_element.appendChild(top_element);
		bottom_element = document.createElement('div');
		bottom_element.className = 'scrollbar-bottom';
		scrollbar_element.appendChild(bottom_element);
		
		knob_element = document.createElement('div');
		knob_element.className = 'knob';
		knob_size = ((window_size / content_size) * 100) + '%';
		if (vertical)
		{
			knob_element.style.height = knob_size;
			//knob_element.style.top = '1px';
		}
		else
		{
			knob_element.style.width = knob_size;
			//knob_element.style.left = '1px';
		}
		
		// Create the top and bottom elements for the scrollbar knob.
		top_element = document.createElement('div');
		top_element.className = 'knob-top';
		knob_element.appendChild(top_element);
		bottom_element = document.createElement('div');
		bottom_element.className = 'knob-bottom';
		knob_element.appendChild(bottom_element);
		
		scrollbar_element.appendChild(knob_element);
		
		// Attach the scrollbar listener to the new scrollbar knob.
		knob_element.onmousedown = scrollbarMouseDown;
		
		// Have we attached our global events yet to the document? If not, do so now.
		if (!scrollbar_events_attached)
		{
			if (document.attachEvent)
			{
				document.attachEvent('onmousemove', scrollbarMouseMove);
				document.attachEvent('onmouseup', scrollbarMouseUp);
			}
			else if (document.addEventListener)
			{
				document.addEventListener('mousemove', scrollbarMouseMove, false);
				document.addEventListener('mouseup', scrollbarMouseUp, false);
			}
			
			scrollbar_events_attached = true;
		}
		
		// Push the scrollbar and the element it is scrolling into our arrays.
		scrollbar = new Object;
		scrollbar.scrolling_element = scroll_element;
		scrollbar.scrollbar_element = scrollbar_element;
		scrollbar.vertical = vertical;
		scrollbars.push(scrollbar);
		
		scroll_container.appendChild(scrollbar_element);
	}
}

function attachVerticalScrollbar(scroll_container, scroll_element)
{
	attachScrollbar(scroll_container, scroll_element, true);
}

function attachHorizontalScrollbar(scroll_container, scroll_element)
{
	attachScrollbar(scroll_container, scroll_element, false);
}

function scrollHorizontalScrollbar(container_id, anchor_id)
{
	scrolling_element = document.getElementById('nav-' + container_id);
	anchor = document.getElementById(anchor_id);
	if (scrolling_element && anchor)
	{	
		// Force horizontal width to 651, Safari and Chrome are returning garbage values (too early to be laid out?)
		//width = scrolling_element.clientWidth;
		width = 651;
		
		anchor_pos = anchor.offsetLeft + anchor.offsetWidth;
		
		if (anchor_pos > width)
			scrolling_element.scrollLeft = anchor_pos - width;
			
		// Now move the scrollbar to reflect the new position. Safari and Chrome don't calculate
		// scrollHeight early enough, so add up the width of all the images instead.
		content_size = 0;
		for (i = 0; i < scrolling_element.childNodes.length; ++i)
        {
            if (scrolling_element.childNodes[i].firstChild)
                content_size += (scrolling_element.childNodes[i].firstChild.clientWidth + 6);
        }
        
        percentage_scrolled = scrolling_element.scrollLeft / (content_size - width);
        if (percentage_scrolled < 0)
        	percentage_scrolled = 0;
        if (percentage_scrolled > 1)
        	percentage_scrolled = 1;
        	
        // Fetch the scrollbar element.
        scrollbar_element = document.getElementById('scrollbar-' + container_id);
        knob_element = scrollbar_element.firstChild.childNodes[2];
        knob_element.style.left = (1 + percentage_scrolled * ((width - 8) - knob_element.clientWidth)) + 'px';
	}
}
