/*	Site: www.m2m.-net.de / Author: Andreas Sternak / Date: 2001-13-01 (VEERY late at night...) */

var checkZIndex = true;
var dragobject = null;
var ty;		 								// rel change of position (only y needed)
var minY;									// top
var maxY;									// bottom
var factor;								// scroll every "factor" pixels...
var scrollCounter = 0;		// delay counter 

// register event-handlers
document.onmousedown = moveme_onmousedown;
document.onmouseup   = moveme_onmouseup;
document.onmousemove = moveme_onmousemove;

function initDrag(y1,y2)
{																		 
	if (!y1 || !y2) return; 
	minY = y1;
	maxY = y2;
	barH = maxY - minY;	
	scrollH = scrollLayer.scrollHeight;
	//factor = Math.round(barH / ((scrollH+scrollH*0.1) - barH));
	factor = barH / ((scrollH+scrollH*0.1) - barH);
	scrollCounter = 0;										 
}

function moveme_onmousedown() 
{
	el = getReal(window.event.srcElement)
	if (el.className == "dragable" || el.className == "handle") 	// drag only selected layers
	{
		if (el.className == "handle")						// in case it's a handle...
		{				
			tmp = el.getAttribute("handlefor");		// determine which layer it haNdles	
			if (tmp == null) 
			{
				dragobject = null; 
				return;
			}
			else dragobject = eval(tmp);
		}
		else dragobject = el;
		ty = window.event.clientY - getTopPos(dragobject);	// set drag start
		window.event.returnValue = false;
		window.event.cancelBubble = true;
	}
	else dragobject = null;
}

// called when mouse is moved and button is pressed
function moveme_onmousemove() 
{
	if (dragobject) 
	{
		eventPos = window.event.clientY;
		if (eventPos >= minY && eventPos <= maxY)				 // if inside y-bounds of drag-layer...
		{
			lastpos = parseInt(dragobject.style.top);				 
			newpos  =	eventPos - ty; 	 
			if (scrollCounter >= factor && newpos != lastpos)
			{
				if (factor > 1)
				{
					if (lastpos < newpos) scroll_up(0,0); 
					if (lastpos > newpos) scroll_down(0,0);				
				}
				else
				{
					if (lastpos < newpos) scroll_up(Math.round(newpos-lastpos),0); 
					if (lastpos > newpos) scroll_down(Math.round(lastpos-newpos),0);				
				}
				scrollCounter = 0;
			}
			scrollCounter++;
			dragobject.style.top = newpos; 
		}
		else 																				// if outside bounds, reset positions
		{
			if(eventPos <= minY - 10) 
			{	
				scrollResetUp(); dragobject.style.top = minY-10;
			}
			if(eventPos >= maxY + 10) 
			{	
				scrollResetDown(); dragobject.style.top = maxY-10;
			}
		}	
		window.event.returnValue = false;
		window.event.cancelBubble = true;
	}
}

// end dragging
function moveme_onmouseup() 
{
	if (dragobject) 
		dragobject = null;
}

// get the element to drag
function getReal(el) 
{
	temp = el;
	while ((temp != null) && (temp.tagName != "BODY"))
	{
		if ((temp.className == "dragable") || (temp.className == "handle"))
		{
			el = temp; 
			return el;
		}
		temp = temp.parentElement;
	}
	return el;
}

// return relative top pos of element
function getTopPos(el) 
{
	if (el.currentStyle.top == "auto") return 0;
	return parseInt(el.currentStyle.top);
}	