﻿// Wrapper functions to support browsers that do not follow standards.
function addEvent(obj, evType, fn, useCapture)
{
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		alert("Handler could not be attached");
	}
}

function removeEvent(obj, evType, fn, useCapture)
{
	if (obj.removeEventListener){
		obj.removeEventListener(evType, fn, useCapture);
		return true;
	} else if (obj.detachEvent){
		var r = obj.detachEvent("on"+evType, fn);
		return r;
	} else {
		alert("Handler could not be removed");
	}
}

function stopEventPropagation (oEvent)
{
	if (oEvent.stopPropagation)
	{
		oEvent.stopPropagation();
	} else if (typeof (oEvent.cancelBubble) != "undefined")
	{
		oEvent.cancelBubble = true;
	}
}

var DHTMLClickHandlers = new Array();
var AllowClick = true;

function GeneralClickHandler(eventParam)
{
	// Get event object
	var oEvent;
	if (eventParam) {
		oEvent = eventParam;
	} else if (window.event) {
		oEvent = window.event;
	}
	
	// Get Target
	var oTarget;
	if (oEvent.target) {
		oTarget = oEvent.target;
	} else {
		oTarget = oEvent.srcElement;
	}
	
	// Make sure it's a click we get
	if (oEvent.type == 'click')
	{
		if (AllowClick == true)
		{
			// Call the handler
			if (DHTMLClickHandlers[oTarget.id])
				DHTMLClickHandlers[oTarget.id](oEvent);
		}
		else
		{
			stopEventPropagation(oEvent);
		}
	}
}

var DHTMLDragHandlers = new Array();
var CurrentlyDragging = null;

// Keep track of where mouse is
var lastMouseX = 0;
var lastMouseY = 0;
var mouseMoveX = 0;
var mouseMoveY = 0;

function GeneralDragHandler(eventParam)
{
	// Get event object
	var oEvent;
	if (eventParam) {
		oEvent = eventParam;
	} else if (window.event) {
		oEvent = window.event;
	}
	
	// Get Target
	var oTarget;
	if (oEvent.target) {
		oTarget = oEvent.target;
	} else {
		oTarget = oEvent.srcElement;
	}
	
	// Mousedown starts a drag
	if (oEvent.type == 'mousedown' && CurrentlyDragging == null)
	{
		AllowClick = true;
		if (DHTMLDragHandlers[oTarget.id])
		{
			lastMouseX = oEvent.clientX;
			lastMouseY = oEvent.clientY;
		
			// Register mouse handlers
			addEvent (document, "mousemove", GeneralDragHandler, false);
			addEvent (document, "mouseup", GeneralDragHandler, false);
			
			// Remember object beeing dragged
			CurrentlyDragging = oTarget;
		}
	}
	
	// Mousemove calls the registered callback
	if (oEvent.type == 'mousemove' && CurrentlyDragging)
	{
		AllowClick = false;
		
		mouseMoveX = oEvent.clientX-lastMouseX;
		mouseMoveY = oEvent.clientY-lastMouseY;
		lastMouseX = oEvent.clientX;
		lastMouseY = oEvent.clientY;
		
		DHTMLDragHandlers[CurrentlyDragging.id](oEvent, mouseMoveX, mouseMoveY);
	}
	
	// Mouseup ends a drag
	if (oEvent.type == 'mouseup')
	{
		if (CurrentlyDragging)
		{
			// Register mouse handlers
			removeEvent (document, "mousemove", GeneralDragHandler, false);
			removeEvent (document, "mouseup", GeneralDragHandler, false);
			
			// Remember object beeing dragged
			CurrentlyDragging = null;
		}
	}
}

// Calls callBack with parameters when objId is clicked
function DHTMLAddClickHandler(objId, callBack, includeChildren, changePointer)
{
	var obj = document.getElementById(objId);
	if (obj)
	{
		addEvent (obj, 'mousedown', GeneralDragHandler);
		addEvent (obj, 'click', GeneralClickHandler);
		DHTMLClickHandlers[objId] = callBack;
		
		if (includeChildren)
		{
			var children = obj.childNodes;
			for (index = 0; index < children.length; index++)
			{
				if (children[index].id)
				{
					DHTMLAddClickHandler(children[index].id, callBack, false);
				}
			}
		}
		
		// Set cursor to pointer, and make content unselectable
		if (changePointer == true)
			obj.style.cursor = 'pointer';
			
		obj.onselectstart = 'return false;';
		obj.unselectable = 'on';
	}
}

// Calls callBack with parameters when objId is dragged
function DHTMLAddDragHandler(objId, callBack, includeChildren, changePointer)
{
	var obj = document.getElementById(objId);
	if (obj)
	{
		addEvent (obj, 'mousedown', GeneralDragHandler);
		DHTMLDragHandlers[objId] = callBack;
		
		if (includeChildren)
		{
			var children = obj.childNodes;
			for (index = 0; index < children.length; index++)
			{
				if (children[index].id)
				{
					DHTMLAddDragHandler(children[index].id, callBack, false, changePointer);
				}
			}
		}
		
		// Set cursor to pointer, and make content unselectable
		if (changePointer == true)
			obj.style.cursor = 'pointer';
		
		obj.onselectstart = 'return false;';
		obj.unselectable = 'on';
	}
}

var nn6=document.getElementById&&!document.all;

function selectmouse(e) 
{
  var fobj       = nn6 ? e.target : event.srcElement;
  var topelement = nn6 ? "HTML" : "BODY";

  while (fobj.tagName != topelement && !DHTMLDragHandlers[fobj.id])
  {
    fobj = nn6 ? fobj.parentNode : fobj.parentElement;
  }

  if (DHTMLDragHandlers[fobj.id])
  {
    return false;
  }
}

document.onmousedown=selectmouse;
