//Common JS functions
//Cross-browser functions from DHTML Utopia: Modern Web Design Using JavaScript & DOM, Sitepoint

//cross-browser event listeners - arguments are: element to attach, type of event, function, useCapture (always false)
//By Scott Andrew
function addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent) {
		var r=elm.attachEvent('on' + evType, fn);
		return r;
	} else {
		elm['on' + evType]=fn;
	}
}

//cross-browser event listener removal
function removeEvent(elm, evType, fn, useCapture) {
	if (elm.removeEventListener) {
		elm.removeEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.detachEvent) {
		var r=elm.detachEvent('on' + evType, fn);
		return r;
	} else {
		elm['on' + evType]=null;
	}
}

//cross-browser function for finding element that triggered an event
function findTarget(e) {
	var el;
	if (window.event && window.event.srcElement) {
		el=window.event.srcElement;
	}
	if (e && e.target) {
		el=e.target;
	}
	if (!el) return null;
	
	if (el.nodeType==3) {   //check for text node type - for Safari
		el=el.parentNode;
	}
	
	return el;
}

//cross-browser function for stopping propogation of an event
function stopBubble(e) {
	if (window.event && window.event.cancelBubble) {
		window.event.cancelBubble=true;
	}
	if (e && e.stopPropagation) {
		e.stopPropagation();
	}
}

//cross-browser for function for stopping an event's default action
function stopDefault(e) {
	if (window.event && window.event.returnValue) {
		window.event.returnValue=false;
	}
	if (e && e.preventDefault) {
		e.preventDefault();
	}
}

//This function to be used with element.onclick=stopDefaultSafari
function stopDefaultSafari() {
	return false;
}

//check the class of element el for match with class name cl
function checkClass(el, cl) {
	var class_regex=new RegExp('\\b' + cl + '\\b');
	return class_regex.test(el.className);
}