/***************************************************************************
 *                            dragdrop.1.0.1.js
 *                            -------------------
 *   begin                : December 06, 2005 
 *   copyright            : (C) 2005 BSG Online Games
 *	 author:			  : Bryan Wiebe
 *   email                : freelance@bsgonlinegames.com
 *
 *   version: 1.0.1
 *
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *	 http://www.gnu.org/licenses/gpl.txt
 *
 ***************************************************************************/

/* Directions:
 *  To make an object draggable add the following javascript:
 *    onmousedown="dd_start('object_id');"
 *	The draggable object should be styled: position: absolute;
 *
 * Example:
 *	<html>
 *	<head>
 *		<title>Drag & Drop Demo</title>
 *		<script type="text/javascript" src="dragdrop.1.0.1.js" />
 *	</head>
 *	<body>
 *	 	<div id="container">
 *			<div id="container_header" onmousedown="dd_start('container');">USE ME TO DRAG</div>
 *			I'm draggable! Is draggable even a word?
 *	 	</div>
 *	</body>
 *	</html>
*/

/* Customizable Variables: */ 
var dd_force_onscreen = true;		/* Force the object to stay on the viewable screen */

/* Do not edit the following */
var dd_dragging = null, dd_on = false, dd_y = 0, dd_firstmove = false, dd_offx = 0, dd_offy = 0, dd_holdx = 0, dd_holdy = 0, dd_width = 0, dd_height = 0, dd_screenx, dd_screeny, dd_id = null;

/* Code */
function dd_start(dragged_id, offx, offy) {
	if (offx != null) {
		dd_offx = offx; 
	}
	if (offy != null) {
		dd_offy = offy;
	}
	
	dd_on = true;
	dd_dragging = dragged_id;
	dd_id = document.getElementById(dd_dragging);
	
	dd_firstmove = true;
	
	dd_capture();
	
	return false;
}

function dd_release(e) {
	dd_on = false;
	dd_dragging = null;
	dd_id = null;

	if (document.releaseEvents) {
		document.releaseEvents(Event.MOUSEMOVE);
		document.releaseEvents(Event.MOUSEUP);
	}
	document.onmousemove = null;
	document.onmouseup = null;
}

function dd_capture() {
	if (document.captureEvents) {
		document.captureEvents(Event.MOUSEMOVE);
		document.captureEvents(Event.MOUSEUP);
	}
	document.onmousemove = dd_mousemove;
	document.onmouseup   = dd_release;
}

function dd_mousemove(e) {
	if (dd_on) {
	
		if (!e) {
			e = window.event;
		}
		
		mouse_x = e.clientX;
		mouse_y = e.clientY;
		if( typeof( e.pageX ) == 'number' ) {
			page_x = e.pageX;
			page_y = e.pageY;
		} else {
			page_x = e.clientX + document.body.scrollLeft;
			page_y = e.clientY + document.body.scrollTop;
		}
		
		if (dd_firstmove) {
			dd_firstmove = false;
			
			dd_y = dd_getY(dd_dragging);
			dd_holdy = page_y - dd_y;
			dd_x = dd_getX(dd_dragging);
			dd_holdx = page_x - dd_x;
			
			dd_width = dd_getWidth(dd_dragging);
			dd_height = dd_getHeight(dd_dragging);
			
			if ( typeof (window.innerWidth) == 'number' ) {
				dd_screenx = window.innerWidth;
				dd_screeny = window.innerHeight;
			} else {
				dd_screenx = document.body.offsetWidth;
				dd_screeny = document.body.offsetHeight;
			}
			
			dd_id.style.position = 'absolute';
		}
		
		dd_move();
		
		
		return false;
	}
}

function dd_move() {
	if ((page_y + dd_offy - dd_holdy) + dd_height >= dd_screeny && dd_force_onscreen) {
		dd_id.style.top = (dd_screeny - dd_height) + 'px';
	} else if ((page_y + dd_offy - dd_holdy) <= 0) {
		dd_id.style.top = '0px';
	} else {
		dd_id.style.top = (page_y + dd_offy - dd_holdy) + 'px';
	}
	
	if ((page_x + dd_offx - dd_holdx) + dd_width >= dd_screenx && dd_force_onscreen) {
		dd_id.style.left = (dd_screenx - dd_width) + 'px';
	} else if ((page_x + dd_offx - dd_holdx) <= 0) {
		dd_id.style.left = '0px';
	} else {
		dd_id.style.left = (page_x + dd_offx - dd_holdx) + 'px';
	}
}

function dd_getY(id_name) {
	id = document.getElementById(id_name);
	
	if (id != null && id.offsetParent) {
		ty = 0;
		while (id.offsetParent) {
			ty += id.offsetTop;
			id = id.offsetParent;
		}
		return ty;
	} else if (id.y) {
		return id.y;
	}
}

function dd_getX(id_name) {
	id = document.getElementById(id_name);
	
	if (id != null && id.offsetParent) {
		tx = 0;
		while (id.offsetParent) {
			tx += id.offsetLeft;
			id = id.offsetParent;
		}
		return tx;
	} else if (id.x) {
		return id.x;
	}
}

function dd_getWidth(id_name) {
	return document.getElementById(dd_dragging).offsetWidth;
}

function dd_getHeight(id_name) {
	return document.getElementById(dd_dragging).offsetHeight;
}

/* End Code */