/* Thanks to Scott Andrew */
function AddEvent(obj, evType, fn)
{
    if (obj.addEventListener)
    {
        obj.addEventListener(evType, fn, true);
        return true;
    }
    else if (obj.attachEvent)
    {
        var r = obj.attachEvent("on"+evType, fn);
        return r;
    }
    else
    {
	    return false;
    }
}
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;
    if (elem && elem.className)
    {
	    var regExp = new RegExp('(^|\\s)(' + classInQuestion + ')(\\s|$)');
	    var result = elem.className.match(regExp);
	    returnValue = (result != null && result.length > 2);
    }
    else
    {
        returnValue = false;
    }
    return returnValue;
}
function AddClass(elem, classToAdd)
{
	if (!elem.className)
	{
		elem.className = classToAdd;
	}
  else if (!ContainsClass(elem, classToAdd))
  {
      elem.className += ' ' + classToAdd;
  }
}
function RemoveClass(elem, classToRemove)
{
	if (elem.className == classToRemove)
	{
		elem.className = '';  // For IE7
		elem.removeAttribute('class');
	}
	else
	{
		var regExp = new RegExp('(^|\\s+)' + classToRemove + '(\\s+|$)');
		elem.className = elem.className.replace(regExp, ' ');
	}
}
function ToggleClass(elem, classOne, classTwo)
{
	var regExp = new RegExp('(^|\\s)(' + classOne + '|' + classTwo + ')(\\s|$)');
	var result = elem.className.match(regExp);
	if (result && result[2] == classOne)
	{
		elem.className = elem.className.replace(regExp, result[1] + classTwo + result[3]);
	}
	else if (result && result[2] == classTwo)
	{
		elem.className = elem.className.replace(regExp, result[1] + classOne + result[3]);
	} else
	{
		elem.className = elem.className + ' ' + 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();
	}
	return CookieDirectory[key];
}
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;
}

//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;
}