//<!--
//# Written by Russell Moffitt, NOAA
//# Modified Oct 2005
//# License: GPL
//-->

// EVENT MODEL COMPATIBILITY FUNCTIONS - supports W3C DOM and IE models
// Modified from cross-browser.com x lib (Mike Foster).

/* x_event.js
   additional functions can be found in
       x_core.js:	Cross-browser DOM & CSS compatibility functions (REQUIRED!)
       x_dom.js:	DOM traversal and Element searching functions
       x_slide.js:	Animation functions for a smooth sin slide (slow>>fast>>slow)
*/

function xAddEventListener(e,eT,eL,cap) {
	if(!(e=xGetElementById(e))) return;
	eT=eT.toLowerCase();
	var eh='e.on'+eT+'=eL';
	if(e.addEventListener) e.addEventListener(eT,eL,cap);
	else if(e.attachEvent) e.attachEvent('on'+eT,eL);
	else eval(eh);
}

function xRemoveEventListener(e,eT,eL,cap) {
	if(!(e=xGetElementById(e))) return;
	eT=eT.toLowerCase();
	var eh='e.on'+eT+'=null';
	if(e.removeEventListener) e.removeEventListener(eT,eL,cap);
	else if(e.detachEvent) e.detachEvent('on'+eT,eL);
	else eval(eh);
}

function xStopPropagation(evt) {
	if (evt && evt.stopPropagation) evt.stopPropagation();
	else if (window.event) window.event.cancelBubble = true;
}

function xPreventDefault(e) {
	if (e && e.preventDefault) e.preventDefault();
	else if (window.event) window.event.returnValue = false;
}

function xEvent(evt) {  // object prototype
	var e = evt || window.event;
	if (!e) return;
	if (e.type) this.type = e.type;
	if (e.target) {
		this.target = (e.target.nodeType == 3) ? e.target.parentNode : e.target;  // defeat textnode issue in Safari and others
		// currentTarget should always point to element to which the event listener is attached.
		// In W3C DOM event model (Firefox,Safari,etc) target will point to lowest element that triggered event, often a child of currentTarget
		if (e.currentTarget) this.currentTarget = e.currentTarget;
	} else if (e.srcElement) {
		// In IE event model, srcElement points to the element with which the listener was registered, like W3C's currentTarget
		// For this reason, using xEvent.currentTarget is probably more reliable
		this.target = this.currentTarget = e.srcElement;
	}
	if (e.relatedTarget) this.relatedTarget = e.relatedTarget;
	else if (e.type == 'mouseover' && e.fromElement) this.relatedTarget = e.fromElement;
	else if (e.type == 'mouseout') this.relatedTarget = e.toElement;
	if (xDef(e.pageX,e.pageY)) { this.pageX = e.pageX; this.pageY = e.pageY; }
	else if (xDef(e.clientX,e.clientY)) { this.pageX = e.clientX + xScrollLeft(); this.pageY = e.clientY + xScrollTop(); }
	if (xDef(e.offsetX,e.offsetY)) {
		this.offsetX = e.offsetX;
		this.offsetY = e.offsetY;
	}
	else if (xDef(e.layerX,e.layerY)) {
		this.offsetX = e.layerX;
		this.offsetY = e.layerY;
	}
	else {
		this.offsetX = this.pageX - xPageX(this.target);
		this.offsetY = this.pageY - xPageY(this.target);
	}
	if (e.which) { this.which = e.which; }
	else if (e.button) { this.which = e.button; }
	if (e.keyCode) { this.keyCode = e.keyCode; } // for moz/fb, if keyCode==0 use which
	else if (xDef(e.which) && e.type.indexOf('key')!=-1) { this.keyCode = e.which; }
	this.shiftKey = e.shiftKey;
	this.ctrlKey = e.ctrlKey;
	this.altKey = e.altKey;
}