////////////////////////////////////////////////////////////////////////////////
// written by Dean Edwards, 2005
// with input from Tino Zijdel - crisp@xs4all.nl
// http://dean.edwards.name/weblog/2005/10/add-event/
function addEvent(element, type, handler) {
	if (element.addEventListener)
		element.addEventListener(type, handler, false);
	else {
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		if (!element.events) element.events = {};
		var handlers = element.events[type];
		if (!handlers) {
			handlers = element.events[type] = {};
			if (element['on' + type]) handlers[0] = element['on' + type];
			element['on' + type] = handleEvent;
		}
	
		handlers[handler.$$guid] = handler;
	}
}
addEvent.guid = 1;

function removeEvent(element, type, handler) {
	if (element.removeEventListener)
		element.removeEventListener(type, handler, false);
	else if (element.events && element.events[type] && handler.$$guid)
		delete element.events[type][handler.$$guid];
}

function handleEvent(event) {
	event = event || fixEvent(window.event);
	var returnValue = true;
	var handlers = this.events[event.type];

	for (var i in handlers) {
		if (!Object.prototype[i]) {
			this.$$handler = handlers[i];
			if (this.$$handler(event) === false) returnValue = false;
		}
	}

	if (this.$$handler) this.$$handler = null;

	return returnValue;
}

function fixEvent(event) {
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
}

fixEvent.preventDefault = function() { this.returnValue = false; }
fixEvent.stopPropagation = function() { this.cancelBubble = true; }

//// This little snippet fixes the problem that the onload attribute on the body-element will overwrite
//// previous attached events on the window object for the onload event
//if (!window.addEventListener) {
//	document.onreadystatechange = function() {
//		if (window.onload && window.onload != handleEvent) {
//			addEvent(window, 'load', window.onload);
//			window.onload = handleEvent;
//		}
//	}
//}

//------------------------------------------------------------------

var mouseX = 0;
var mouseY = 0;

function trackMouse(e) {  
  if(!e) { e = window.event || window.Event };
  if(!e) {return;}
      
  if (typeof(e.pageX) == 'number') {
    mouseX = e.pageX;
    mouseY = e.pageY;
  } else if (typeof(e.clientX) == 'number') {
    mouseX  = e.clientX;
    mouseY  = e.clientY;
    if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
      mouseX += document.body.scrollLeft;
      mouseY += document.body.scrollTop;
    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
      mouseX += document.documentElement.scrollLeft;
      mouseY += document.documentElement.scrollTop;
    }
  }
}
  
addEvent(document,'mousemove',trackMouse);

/*
if(typeof HTMLDocument != "undefined" && !HTMLDocument.prototype.activeElement) {
  HTMLDocument.prototype.activeElement = function() {    
    var elements = document.getElementsByTagName('*');
    for(i = 0; i<elements.length;i++) {
      if(elements[i].hasFocus()) {             
        return elements[i];
        break;
      }     
    }    
  }
}
*/

// insertAdjacentHTML(), insertAdjacentText() and insertAdjacentElement()
// for Netscape 6/Mozilla by Thor Larholm me@jscript.dk
if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement) {

  HTMLElement.prototype.__defineGetter__("insertAdjacentElement", function(where,parsedNode) {
    
    switch (where.toString().toLowerCase()) {
      case 'beforebegin':
        this.parentNode.insertBefore(parsedNode,this)
        break;
      case 'afterbegin':
        this.insertBefore(parsedNode,this.firstChild);
        break;
      case 'beforeend':
        this.appendChild(parsedNode);
        break;
      case 'afterend':
        if (this.nextSibling)
          this.parentNode.insertBefore(parsedNode,this.nextSibling);
        else 
          this.parentNode.appendChild(parsedNode);          
        break;
    }
  });

  HTMLElement.prototype.__defineGetter__("insertAdjacentHTML",function(where,htmlStr) {
    var r = this.ownerDocument.createRange();
    r.setStartBefore(this);

    var parsedHTML = r.createContextualFragment(htmlStr);
    this.insertAdjacentElement(where,parsedHTML)
  });

  HTMLElement.prototype.__defineGetter__("insertAdjacentText",function(where,txtStr) {
    var parsedText = document.createTextNode(txtStr)
    this.insertAdjacentElement(where,parsedText)
  });
}

/*
if(typeof HTMLDocument != "undefined" && !HTMLDocument.prototype.activeElement) {
  HTMLDocument.prototype.__defineGetter__("activeElement", function() {    
    var elements = document.getElementsByTagName('*');    
    for(i = 0; i<elements.length;i++) {
      if(elements[i].hasFocus()) {             
        return elements[i];
        break;
      }     
    }    
  });
}
*/
function listen(type, el, func) { addEvent(el, type, func); }

	
	function GetRelativePosition(objSourceElement) {
		var arrOffsets = {x: 0, y: 0};
    var oParent = objSourceElement.offsetParent;
    
		while ((objSourceElement != null) && (objSourceElement != oParent)) {	
			arrOffsets.x += objSourceElement.offsetLeft;
			arrOffsets.y += objSourceElement.offsetTop;
			objSourceElement = objSourceElement.offsetParent;
		}

		return arrOffsets;
	}
	
	function SetLocation(objTargetWindow, strURL) {
		objTargetWindow.location.href = strURL;
	}

	function GetElementPosition(objElement) {
		var arrCoordinates = {x: 0, y: 0};
    var oParent = objElement.offsetParent;
    
		while ((objElement) && (objElement != oParent)) {
			arrCoordinates.x += objElement.offsetLeft;
			arrCoordinates.y += objElement.offsetTop;
			objElement = objElement.offsetParent;
		}

		return arrCoordinates;
	}

	function GetElementRelativePosition(objSourceElement, objTargetElement) {
		var arrCoordinates = {x: 0, y: 0};

		while (objSourceElement) {
			if (objSourceElement != objTargetElement) {
				arrCoordinates.x += objSourceElement.offsetLeft;
				arrCoordinates.y += objSourceElement.offsetTop;
			} 
			objSourceElement = objSourceElement.offsetParent;
		}
		
		return arrCoordinates;
	}

	function GetElementParentTag(objElement, strTagName) {
		var objParentTag = objElement;
		
		while (objParentTag) {
			if (objParentTag.tagName == strTagName.toUpperCase()) {
				return objParentTag;
			}
			objParentTag = objParentTag.parentNode;
		}
		return null;
	}
	
	function GetMousePosition(intOffsetX, intOffsetY) {
		var arrCoordinates = {x: 0, y: 0};
	  arrCoordinates.x = mouseX;
	  arrCoordinates.y = mouseY;
		return arrCoordinates;	 
	}
	
	function ToggleClass(obj, strClass) {
		if (obj != null) {
			obj.className = strClass;
		}
	}

	function ToggleTreeBranch(strImageID, strObjectID) {
		var objImageControl = document.getElementById(strImageID);
		var objControl = document.getElementById(strObjectID);
		  
		if (objControl != null) {
			if (objControl.style.display == "none") {
				objControl.style.display = "";
				objImageControl.src =  "../Images/treeview_minus.gif";
			} else {
				objControl.style.display = "none";
				objImageControl.src = "../Images/treeview_plus.gif";
			}
		}
	}

	
	function HighlightRow(objRow, strBGColour) {
		if (objRow != null) {
			for (var i = 0; i < objRow.cells.length; i++) {
				objRow.cells[i].style.backgroundColor = strBGColour;
			}
		}
	}
	
	function CentreElement(element)
	{
		var clientWidth = document.body.clientWidth;
		var clientHeight = document.body.clientHeight;

		var newTop = (clientHeight - parseInt(element.style.height)) / 2;
		var newLeft = (clientWidth - parseInt(element.style.width)) / 2;

		if (newTop < 0) {
			newTop = 1;
		}

		if (newLeft < 0) {
			newLeft = 1;
		}

		element.style.top = newTop;
		element.style.left = newLeft;
		element.style.position = "absolute";
	}
	
	//moved from FrameFix.js
  function GetWindow(params) {
    var page = null;
    
    if (params != null) {
      for (idx = 0; idx < params.length; idx++) {
        if(page == null)
          page = document.getElementById(params[idx]);
        else
          page = page.document.getElementById(params[idx]);
        page = (page.contentWindow || page.contentDocument);
      }
    }
    
    return page;
  }