
function openEventView(eventId, eventName) {
    openViewWindow("eventView/index.php?nav=eventView&EventID=" + eventId, "EventView");
}

function openViewWindow(url, nameWindow, showLocation) {
  if (arguments.length < 2) {
     nameWindow = "";
  }

  var newWin = window.open(url, nameWindow, 'scrollbars=yes,menubar=yes,personalbar=yes,toolbar=yes,resizable=yes')
  newWin.focus();
}


function openDepWindow(url) {
//opens a dependent window with specified url
//JW 07/24/2001

  window.open(url, 'depWindow', 'dependent=yes,menubar=no,personalbar=no,resizable=yes,toolbar=no,scrollbars=yes').focus();
}

function showGuidelines(url)  {
  var newWin = window.open(url, "guide", "scrollbars=yes,menubar=yes,personalbar=yes,toolbar=yes,resizable=yes,location=no");

  newWin.focus();
}



function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v3.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}


function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}

function getRadioValue(radioGroup) {
  for (var i = 0; i < radioGroup.length; i++) {
    if (radioGroup[i].checked) return radioGroup[i].value;
  }

  return '';
}

function checkAll(key, val) {
  var elements = document.getElementsByName(key);

  for (i = 0; i < elements.length; i++) {
    elements[i].checked = val;
    triggerRowSelector(elements[i]);
  }
}

function isChecked(key) {
  var elements = document.getElementsByName(key);

  for (i = 0; i < elements.length; i++) {
    if (elements[i].checked) return true;
  }

  return false;
}

function switchEditMode(newMode) {
  document.location.href += "&editMode=" + newMode;
}

/* If element is an object, returns it; else, finds it by ID; else, null. */
function findElement(element) {
   if (!document.getElementById) return null;

   // Auto-detect object or objectId
   if ((typeof element) == 'object') return element;
   return document.getElementById(element);
}

/**
 * Determines whether or not element contains className in its css class.
 *
 * @param element string, html id; or can be DOM element reference
 * @param className
 *
 * @return true, className found in element's CSS class; false if
 *     not; null, if error
 */
function containsClass(element, className) {
   var target = findElement(element);

   // Give up if nothing found
   if(target == null) return false;

   return hasClass(target, className);
}

/**
 * Change the CSS class name of an element from fromClass to toClass
 * @param element html id, if string; or can be element reference
 */
function changeClass(element, fromClass, toClass) {
   var target = findElement(element);

   if(target == null)  return false;

   //  word boundary or a punctuation set
   var bound = "(\\b|[:_-])";
   var regexp = new RegExp(bound + fromClass + bound);

   target.className = target.className.replace(regexp, toClass);
}

function removeClass(element, rClass) {
   var target = findElement(element);

   if(target == null) return false;

   //  word boundary or a punctuation set
   var bound = "(\\b|[:_-])";
   var regexp = new RegExp(bound + rClass + bound);

   target.className = target.className.replace(regexp, '');
}

/**
 * Element has one of their classes in className switched from classA
 * to classB (if classname contained classA), or classB to classA if
 * className contained classB
 *
 * @param element html id, if string; or can be element reference.
 *
 * @returns the old className; the value replaced
 */
function toggleClass(element, classA, classB) {
   var targetElement;

   if (!document.getElementById) {
       return false;
   }

   if ((typeof element) == 'object') {
       targetElement = element;
   }
   else {
       targetElement = document.getElementById(element);
   }

   if (targetElement == null) {
       return false;
   }

   //  word boundary or a punctuation set
   var bound = "(\\b|[:_-])";
   var regexp = new RegExp(bound + classA + bound);

   var returnValue;

   // classname has classA in it; so switch it with B
   if (targetElement.className.match(regexp) != null) {
       changeClass(targetElement, classA, classB);

       returnValue = classA;
   }
   // otherwise, switch instance of classB with classA
   else {
       changeClass(targetElement, classB, classA);
       returnValue = classB;
   }

   return returnValue;
}

/**
 * Returns all children of type TAG and class CLS
 */
function classedChildren(parent, tag, cls) {
	var elts = parent.getElementsByTagName(tag);
	var retval = new Array();
	
	for (var i = 0; i < elts.length; i++)
	if (hasClass(elts[i], cls))
		retval.push(elts[i]);
	return retval;
}

/**
 * Attaches an onload event listener properly.
 */
function addOnload(callback) {
 	if (document.addEventListener)
		document.addEventListener('DOMContentLoaded',
	 	                          callback,
	 	                          false);
	if (document.attachEvent) {
		if (document.readyState == 'complete') {
			callback();
		} else {
			var testCallback = function() {
				if (document.readyState == 'complete')
					callback();
			};
 			document.attachEvent('onreadystatechange',
 					     testCallback);
 		}
 	}
}

/**
 * Attaches any other kind of event.
 * When calling, leave out the 'on' portion of the event name
 * 	('onload' => 'load').
 */
function addElementEvent(elt, event, callback, useCapture) {
	if (useCapture == true) var newCB = function(ev) {
		if (ev.stopPropagation) ev.stopPropagation();
		if (ev.preventDefault) ev.preventDefault();
		callback();
	}; else var newCB = callback;
	if (elt.addEventListener)
		elt.addEventListener(event, newCB, true);
	if (elt.attachEvent)
		elt.attachEvent('on' + event, callback);
}

function inArray(haystack, needle) {
	for (var i = 0; i < haystack.length; i++)
		if (haystack[i] == needle) return true;
	return false;
}

/* Looks for a TR containing elt. If one exists, checks if it has a
 * rowSelector and triggers it. All this because onchange actions don't
 * necessarily get fired when we manually change a box. */
function triggerRowSelector(elt) {
	var row = findAncestor(elt, 'tr');
	if (!row) return;
	var toggler = classedChildren(row, 'input', 'rowSelector');
	if (toggler.length != 1) return;
	if (toggler[0].onchange) toggler[0].onchange();
}

/*
 * Searches the tree for a node that's an ancestor of child, of type nodeName.
 * Returns false if it can't find it.
 */
function findAncestor(child, nodeName) {
	nodeName = nodeName.toUpperCase();
	do {
		child = child.parentNode;
	} while (child.parentNode && child.nodeName != nodeName);
	return (child.nodeName == nodeName ? child : false);
}

/* Does element elt include class among its CSS classes? */
function hasClass(elt, clName) {
	var classes = elt.className.split(' ');
	if (classes.length == 0) return false;
	return (inArray(classes, clName));
}

/* Returns all elements <tag class="class"> in the descendents of parent.
 * (This isn't just the children; it's all descendents. */
function classedChildren(parent, tag, clName) {
	var elts = parent.getElementsByTagName(tag);
	var result = new Array();
	for (var i = 0; i < elts.length; i++)
		if (hasClass(elts[i], clName)) result.push(elts[i]);
	return result;
}