/********
* cvhUtils - Useful things for saving time
* (c) 2009 Chris VandenHeuvel (fastballweb.com)
* version 1.5 (2009-02-26)
********/
var cvhUtils = function() {
	var that = {};
  that.returnEvent = function(e) { // return the event, finding it for noncompliant browsers.
    return !e ? window.event : e;
  },
  that.eventTarget = function(e) { // return the target of an event.
    e = that.returnEvent(e);
		var targ = false;
    if (e && e.target) targ = e.target;
    else if (e && e.srcElement) targ = e.srcElement;
    if (targ.nodetype == 3) targ = targ.parentNode;
    return targ;
  },
  that.eventTargetHold = function(e) { // return the target and stop propagation.
    e = that.returnEvent(e);
    if(e.cancelBubble) e.cancelBubble = true;
    if(e.stopPropagation) e.stopPropagation();
    return that.eventTarget(e);
  },
  that.checkMouseMove = function(e, intendedTarget) { // test whether a mouseover/mouseout actually entered/left the intended target element.
    var returnValue = true;
    var e = that.returnEvent(e);
    var targ = that.eventTarget(e);
    // if (targ.nodeName.toLowerCase() != intendedTarget.nodeName.toLowerCase()) { returnValue = false; }
    var relTarg = e.relatedTarget || ((e.type.toLowerCase() == 'mouseover') ? e.fromElement : e.toElement);
    var testTarg = relTarg;
    while (relTarg && relTarg != intendedTarget && relTarg.parentNode) { 
      relTarg = relTarg.parentNode;
    }
    if (relTarg == intendedTarget) { returnValue = false; }
    return returnValue;
  }
  that.formatQueryString = function(query) { // sets ?'s and &'s properly in a url. MFD
    query = query.replace(/\?/g, '&');
    query = query.replace('&', '?');
    return query;
  }
	var metas = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
	var eREPattern = new RegExp('(\\' + metas.join('|\\') + ')', 'g');
	that.escapeRegExp = function(input) { // based on Simon Willison's.
		return input.replace(eREPattern, '\\$1');
	}
	that.classNamePattern = function(className) {
		return new RegExp("(^|\\s)"+that.escapeRegExp(className)+"(\\s|$)", 'g');
	}
	that.getElementsByClassName = function(className, element, tagName) {
		var results = [];
		element = element == null ? document : element;
		tagName = tagName == null ? '*' : tagName;
		var elements = element.getElementsByTagName(tagName);
		for (var i = 0; i < elements.length; i++) {
			if (that.classNamePattern(className).test(elements[i].className)) {
				results.push(elements[i]);
			}
		}
		return results;
	}
	that.addClassName = function(className, element) {
		if (!that.classNamePattern(className).test(element.className)) {
			var divider = element.className.length > 0 ? ' ' : '';
			element.className += divider+className;
		}
	}
	that.removeClassName = function(className, element) {
		element.className = element.className.replace(that.classNamePattern(className), '');
	}
	return that;
}();
