var DRAGGING_OPTIMISATIONS=true;
var BOX_MARGIN=5;

function setupChatboxPositioning()
{
	var chatbox=document.getElementById('chatbox');

	if (!chatbox)
		return;

	makeFixed(chatbox);

	addEvent(chatbox, 'mousedown', function (e) {
		var target=getEventSource(e);
		if (target == chatbox)
			startDragging(chatbox, e);
	}, false);
}

function startDragging(chatbox, e)
{
//	document.documentElement.id='dragging';
	var event=(window.event)?window.event:e;
	chatbox.draghandle=new Object;
	chatbox.draghandle.x=event.clientX-findPosX(chatbox);
	chatbox.draghandle.y=event.clientY-findPosY(chatbox);
	
	prepareForMove();
	
	addEvent(document.documentElement, 'mouseup', stopDragging, false);
	addEvent(document.documentElement, 'mousemove', doDrag, false);

	if (event.preventDefault)
		event.preventDefault();
	else
		window.event.returnValue=false;
}

function prepareForMove()
{
	if (!DRAGGING_OPTIMISATIONS) return;
	var messages=document.getElementById('messages');
	messages.style.overflow='hidden';
}

function restoreAfterMove()
{
	if (!DRAGGING_OPTIMISATIONS) return;
	var messages=document.getElementById('messages');
	messages.style.overflow='auto';
}

function stopDragging(e)
{
//	document.documentElement.id='';
	
	restoreAfterMove();
		
	removeEvent(document.documentElement, 'mouseup', stopDragging, false);
	removeEvent(document.documentElement, 'mousemove', doDrag, false);
}

function doDrag(e)
{
	var event=(window.event)?window.event:e;
	
	var chatbox=messagewindow.getWindowPane();

	var vp=getViewportBounds();
	var left=event.clientX-chatbox.draghandle.x-vp.x;
	var top=event.clientY-chatbox.draghandle.y-vp.y;

	setScreenPosition(left, top);
}

function setScreenPosition(left, top)
{
	var chatbox=messagewindow.getWindowPane();
	var boxdims=chatbox.getDimensions();
	
	if (!left || !top)
	{
		left=BOX_MARGIN;
		top=BOX_MARGIN;
	//	return;	//not tracked down why this happens in IE
	}
	
	var vp=getViewportBounds();
	
	if (left < BOX_MARGIN)
		left=BOX_MARGIN;

	var maxl=vp.w - BOX_MARGIN - boxdims.w;
	if (left > maxl)
		left=maxl;

	if (top < BOX_MARGIN)
		top=BOX_MARGIN;

	var maxt=vp.h - BOX_MARGIN - boxdims.h;
	if (top > maxt)
		top=maxt;
		
	setCookie('bpos', left+','+top);
	chatbox.screenposX=left;
	chatbox.screenposY=top;
	chatbox.style.left=(vp.x+left)+'px';
	chatbox.style.top=(vp.y+top)+'px';
}

function updateBoxPositionForScroll()
{
	if (!messagewindow.isVisible())
		return;
	var chatbox=messagewindow.getWindowPane();
	var vp=getViewportBounds();
	if (!chatbox.lastvp ||
	    vp.x != chatbox.lastvp.x ||
	    vp.y != chatbox.lastvp.y ||
	    vp.w != chatbox.lastvp.w ||
	    vp.h != chatbox.lastvp.h)
	{
		//Viewport has been updated!
		prepareForMove();

		if (chatbox.restoreTimer)
		{
			clearTimeout(chatbox.restoreTimer);
			chatbox.restoreTimer=false;
		}
		chatbox.restoreTimer=setTimeout(restoreAfterMove, 200);

		setScreenPosition(chatbox.screenposX, chatbox.screenposY);
	}

	chatbox.lastvp=vp;
}

//emulate fixed positioning as this seems to work better
function makeFixed(o)
{
	o.style.position='absolute';
	var oldpos=getCookie('bpos');
	if (oldpos)
	{
		var coords=oldpos.split(',');
		var x=parseInt(coords[0]);
		var y=parseInt(coords[1]);
		setScreenPosition(x, y);
	}
	else
		centerWindow(o);

	setInterval(updateBoxPositionForScroll, 30);
}

function centerWindow(w)
{
	var vp=getViewportBounds();
	
	var boxdims=messagewindow.getWindowPane().getDimensions();
	var x=(vp.w-boxdims.w)/2;
	var y=(vp.h-boxdims.h)/2;
	
	setScreenPosition(x, y);
}
