function AddEvent(obj, evType, fn)
{
	$(obj).bind(evType, fn);
}
function GetAncestorElement(elem, ancestorNodeName)
{
    var returnValue;
    var workingElem = elem;
    while (workingElem.nodeName.toLowerCase() != 'body' && workingElem.nodeName.toLowerCase() != ancestorNodeName.toLowerCase())
    {
        workingElem = workingElem.parentNode;
    }
    if (workingElem.nodeName.toLowerCase() == 'body' || workingElem === elem)
    {
        returnValue == null;
    }
    else
    {
        returnValue = workingElem;
    }
    return returnValue;
}
function deepNodeRecursion(master, classCheck, arrayDestination)
{
  var nodeList = master.childNodes;
  for (var i = nodeList.length - 1; i >= 0; i--)
  {
    if (nodeList[i].nodeType == 1)
    {
      var thisElementNode = nodeList[i];
      if(ContainsClass(thisElementNode, classCheck))
	    {
	      arrayDestination[arrayDestination.length] = thisElementNode;
	    }
      var childOfMaster = nodeList[i];
      deepNodeRecursion(childOfMaster, classCheck, arrayDestination);
    }
  }
  return arrayDestination;
}
function GetCaller(e)
{
	var caller = null;
	if (e && e.target)
	{
		caller = e.target;
	}
	else if (window.event && window.event.eventSrc)
	{
		caller = window.event.eventSrc;
	}
	return caller;
}
function ContainsClass(elem, classInQuestion)
{
	var returnValue = false;
	var $el = $(elem);
	var classes = classInQuestion.split('|');
	for (var i = 0; i < classes.length; i++)
	{
		if ($el.hasClass(classes[i]))
		{
			returnValue = true;
			break;
		}
	}
    return returnValue;
}
function AddClass(elem, classToAdd)
{
	$(elem).addClass(classToAdd);
}
function RemoveClass(elem, classToRemove)
{
	$(elem).removeClass(classToRemove.replace(/\|/g,' '));
}
function ToggleClass(elem, classOne, classTwo)
{
	var el = $(elem);
	if (el.hasClass(classOne))
	{
		el.removeClass(classOne);
		el.addClass(classTwo);
	}
	else if (el.hasClass(classTwo))
	{
		el.removeClass(classTwo);
		el.addClass(classOne);
	}
	else
	{
		el.addClass(classOne);
	}
}
function GetCSSValue(elem, desiredProperty)
{
	var retrievedValue = '';
	if (elem.currentStyle) //IE
	{
		var pt = /-([^-]+)/g;
		var reformattedProperty = desiredProperty.replace(pt, function(txt){return txt.charAt(1).toUpperCase() + txt.substr(2).toLowerCase();});
		retrievedValue = elem.currentStyle[reformattedProperty];
	}
	else
	{
		retrievedValue = document.defaultView.getComputedStyle(elem, '').getPropertyValue(desiredProperty);
	}
	return retrievedValue;
}

// Store cookie values in a dictionary for easy access
var CookieDirectory = new Object();
// the isDirty property will trigger a re-population of the CookieDirectory
CookieDirectory.isDirty = true;

// Read the cookie value by passing in the key
function GetCookie(key)
{
	if (CookieDirectory && CookieDirectory.isDirty)
	{
		populateCookieDirectory();
	}
	var cookieValue = CookieDirectory[key];
	if (typeof cookieValue == 'undefined') cookieValue = null;
	return cookieValue;
}
function SetCookie(key, val, expireDate, path, domain, secure)
{
    var returnValue = false;
    if (key && val)
    {
        var cookieString = key + '=' + val;
        if (expireDate) cookieString += ';expires=' + expireDate;
        if (path) cookieString += ';path=' + path;
        if (domain) cookieString += ';domain=' + domain;
        if (secure) cookieString += ';secure';
        document.cookie = cookieString;
        returnValue = true;
        
        if (CookieDirectory)
        {
					CookieDirectory.isDirty = true;
        }
    }
    return returnValue;
}
// Populate or refresh the CookieDirectory
function populateCookieDirectory()
{
	var returnValue = false;
	if (typeof CookieDirectory != undefined)
	{
		CookieDirectory = new Object();
		var allCookies = document.cookie.split(';');
		var i, thisCookie;
		for (i = 0; thisCookie = allCookies[i]; i++)
		{
			var keyVal = thisCookie.split('=');
			var newKey = keyVal[0].replace(/(^ +)|( +$)/, '');
			if (!CookieDirectory[newKey])
			{
				//alert(keyVal[0] + ' = ' + keyVal[1]);
				CookieDirectory[newKey] = keyVal[1];
			}
		}
		CookieDirectory.isDirty = false;
		returnValue = true;
	}
	return returnValue;
}

// Querystring variable function
var _qs;
function GetQueryString(key)
{
	if (!_qs) parseQuerystring();
	if (key)
	{
		return _qs[key];
	}
	else
	{
		return _qs;
	}
}
function parseQuerystring()
{
	_qs = new Object();
	if (location.search && location.search.length > 1)
	{
		var srch = location.search.substring(1).split('&');
		for (var i = 0; i < srch.length; i++)
		{
			var pr = srch[i].split('=');
			if (pr.length >= 2 && pr[0].length > 0)
			{
				_qs[pr[0]] = pr[1];
			}
		}
	}
}

//Variable Checking and Setting Functions
function IsVariableSet(varName)
{
	return (typeof window[varName] != 'undefined');
}
function SetVariable(varName, defaultVal, inheritedVarName)
{
	if (!inheritedVarName) inheritedVarName = varName;
	window[varName] = IsVariableSet(inheritedVarName) ? window[inheritedVarName] : defaultVal;
	return;
}
