/********
* cvhUtils - Useful things for saving time
* (c) 2009 Chris VandenHeuvel (fastballweb.com)
* version 1.47 (2009-02-17)
********/
var cvhUtils = {
  returnEvent : function(e) { // return the event, finding it for noncompliant browsers.
    return !e ? window.event : e;
  },
  eventTarget : function(e) { // return the target of an event.
    e = this.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;
  },
  eventTargetHold : function(e) { // return the target and stop propagation.
    e = this.returnEvent(e);
    if(e.cancelBubble) e.cancelBubble = true;
    if(e.stopPropagation) e.stopPropagation();
    return this.eventTarget(e);
  },
  checkMouseMove : function(e, intendedTarget) { // test whether a mouseover/mouseout actually entered/left the intended target element.
    var returnValue = true;
    var e = this.returnEvent(e);
    var targ = this.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;
  },
  formatQueryString : function(query) { // sets ?'s and &'s properly in a url.
    query = query.replace(/\?/g, '&');
    query = query.replace('&', '?');
    return query;
  },
	eREPattern : null,
	escapeRegExp : function(input) { // based on Simon Willison's.
		var metas = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
		this.eREPattern = (this.eREPattern) ? this.eREPattern : new RegExp('(\\' + metas.join('|\\') + ')', 'g');
		return input.replace(this.eREPattern, '\\$1');
	},
	classNamePattern : function(className) {
		return new RegExp("(^|\\s)"+this.escapeRegExp(className)+"(\\s|$)", 'g');
	},
	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 (this.classNamePattern(className).test(elements[i].className)) {
				results.push(elements[i]);
			}
		}
		return results;
	},
	addClassName : function(className, element) {
		if (!this.classNamePattern(className).test(element.className)) {
			var divider = element.className.length > 0 ? ' ' : '';
			element.className += divider+className;
		}
	},
	removeClassName : function(className, element) {
		element.className = element.className.replace(this.classNamePattern(className), '');
	}
}

