function EventLib()
{
}

EventLib.AddEvent = function (elm, evType, fn)
{
	if (elm.addEventListener)
	{
	  elm.addEventListener(evType, fn, false);
	  return true;
	} else if (elm.attachEvent) {
	  var r = elm.attachEvent('on' + evType, fn);
	  return r;
	} else {
	  elm['on' + evType] = fn;
	}
}

EventLib.AddEventById = function(id, evType, fn)
{
	var elem = document.getElementById(id);
	
	if (elem != undefined) {
		EventLib.AddEvent(elem, evType, fn);
	}
}

EventLib.AddEventsById = function(id, eventsDefinition)
{
	var elem = document.getElementById(id);
	
	if (elem != undefined) {
		for (var eventName in eventsDefinition)        
		{
			EventLib.AddEvent(elem, eventName, eventsDefinition[eventName]);
		}
	}
}

/* This can be called without tagName like: EventLib.AddEventByClassName(className,,evType, fn)
   All tags will then be selected... or use '*': EventLib.AddEventByClassName(className, '*',evType, fn)
 */
EventLib.AddEventByClassName = function(className, tagName, evType, fn)
{
	var elems = document.getElementsByClassName(className, tagName);

	for (var i = 0; i < elems.length; i++) {
		EventLib.AddEvent(elems[i], evType, fn);
	}
}


EventLib.AddEventsByClassName = function(className, tagName, eventsDefinition)
{
	var elems = document.getElementsByClassName(className, tagName);

	for (var i = 0; i < elems.length; i++) {
		for (var eventName in eventsDefinition)        
		{
			EventLib.AddEvent(elems[i], eventName, eventsDefinition[eventName]);
		}
	}
}

EventLib.AddEventOnLoad = function(fn)
{
	EventLib.AddEvent(window, 'load', fn);
}

EventLib.GetEventObject = function(e)
{
	if(e == undefined)
	{
		if (window.event != undefined) {
			return window.event;
		}
		else {
			return undefined;
		}
	}
		
	return e;
}

EventLib.GetEventElement = function (e)
{
	e = EventLib.GetEventObject(e);
	if (e != undefined)
	{
		return (e.target || e.srcElement);
	}
	else
	{
		return undefined;
	}
}

EventLib.StopEvent = function (e)
{
	e.returnValue = false;
	
	if (e.preventDefault != undefined)
	{
		e.preventDefault();
	}
}



EventLib.CreateMethodReference = function(object, methodName) {
  return function() {
	object[methodName].apply(object,arguments);
	}
};

/*
document.getElementsByClassName = function(cl) {
	var retnode = [];
	var myclass = new RegExp('\\b'+cl+'\\b');
	var elem = this.getElementsByTagName('*');
	for (var i = 0; i < elem.length; i++) {
	var classes = elem[i].className;
	if (myclass.test(classes)) retnode.push(elem[i]);
	}
	return retnode;
}; */


document.getElementsByClassName = function (className, tagName)
{
	if (tagName == undefined) {
		tagName = '*';
	}

	var elemsByTag = document.getElementsByTagName(tagName);    
	var elemsByClass = [];
	var classRegexp = new RegExp('\\b' + className + '\\b');

	for (var i = 0; i < elemsByTag.length; i++) {
		var elemClassName = elemsByTag[i].className;
		if (classRegexp.test(elemClassName)) {
			elemsByClass.push(elemsByTag[i]);
		}
	}
	
	return elemsByClass;
}


function Actions()
{
}

Actions.Hyperlink_OpenNewWin = function(e)
{
	var e = EventLib.GetEventObject(e);
	var elem = EventLib.GetEventElement(e);

	if (e != undefined && elem != undefined)
	{
		var tagName = elem.tagName.toLowerCase();

		if (tagName != 'a' && tagName != 'area' && elem.parentNode != undefined)
		{
			elem = elem.parentNode;
			tagName = elem.tagName.toLowerCase();
		}

		if (elem.href != undefined && elem.href.length > 0)
		{
			window.open(elem.href, "popupWindow");
			EventLib.StopEvent(e);
		}
	}
}

Actions.Hyperlink_StartAVScanner = function(e)
{
	var e = EventLib.GetEventObject(e);
	var elem = EventLib.GetEventElement(e);

	if (elem.tagName.toLowerCase() != 'a' && elem.parentNode != undefined)
	{
		elem = elem.parentNode;
	}

	if (elem.tagName.toLowerCase() == 'a' && e != undefined && elem.href != undefined && elem.href.length > 0)
	{
		window.open(elem.href, "popupWindow", "location=0,toolbar=0,status=0,menubar=0,scrollbars=0,directories=0,resizable=0,dialog=1,minimizable=0,width=600,height=500,top=100,left=100");
		EventLib.StopEvent(e);
	}
}

Actions.ShowPrintDialog = function(e)
{
	var e = EventLib.GetEventObject(e);
	
	if (e != undefined && window.print != undefined)
	{
		window.print();
	}    
}

Actions.SetCursorOnEvent = function(e, style)
{
	var elem = EventLib.GetEventElement(e); 
	
	if (elem != undefined && elem.style.cursor != undefined)
		elem.style.cursor = style;
}

Actions.CursorPointer = function(e)
{
	Actions.SetCursorOnEvent(e, 'pointer');
}

Actions.CursorDefault = function(e)
{
	Actions.SetCursorOnEvent(e, 'default');
}

Actions.ElemHighlight = function(e)
{
	var elem = EventLib.GetEventElement(e); 
	if (elem != undefined) elem.className+=" sffocus";
}

Actions.ElemUnhighlight = function(e)
{
	var elem = EventLib.GetEventElement(e); 
	if (elem != undefined) {
		elem.className = elem.className.replace(new RegExp("[\s]{0,1}sffocus\\b"), "");
	}
}


function NumbersOnly(e)
{
	var e = EventLib.GetEventObject(e);
	var charCode = undefined;

	if (e != undefined) {    
		charCode = (e.which) ? e.which : e.keyCode ? e.keyCode : undefined;
		if (charCode != undefined && charCode > 37 && (charCode < 48 || charCode > 57))
		{
			EventLib.StopEvent(e);
		}
	}
}


Actions.GoToChildHyperLinkHref = function(e)
{
	var elem = EventLib.GetEventElement(e); 

	if (elem != undefined) {
		var classRegexp = new RegExp('\\b' + 'jsElementLink' + '\\b');

		while (elem != undefined && !classRegexp.test(elem.className)) {
			elem = elem.parentNode;
		}
		
		if (elem != undefined ) {
			for (var i = elem.childNodes.length - 1; i > -1; i--) {
				var child = elem.childNodes[i];
				if (child.tagName != undefined && child.tagName.toLowerCase() == 'a') {
					window.location.href = child.href;
					return;
				}
			}
		}
	}
}

Actions.Hyperlink_SiteCatalystDownloadTracking = function(e)
{
	var e = EventLib.GetEventObject(e);
	var elem = EventLib.GetEventElement(e);

	if (e != undefined && elem != undefined)
	{
		var tagName = elem.tagName.toLowerCase();

		if (tagName != 'a' && tagName != 'area' && elem.parentNode != undefined)
		{
			elem = elem.parentNode;
			tagName = elem.tagName.toLowerCase();
		}

		if (elem.href != undefined && elem.href.length > 0)
		{
			if (typeof(s_account) != "undefined")
			{
				var s = s_gi(s_account);
				s.linkTrackVars = 'eVar7,events,prop8,prop7';
				s.linkTrackEvents = 'event4';
				s.events = 'event4';
				s.eVar7 = elem.href.substring(elem.href.lastIndexOf('/') + 1);
				s.prop7 = s.eVar7;
				s.prop8 = s.pageName;
				s.tl(elem,'d',s.eVar7);
			}
			EventLib.StopEvent(e);
		}
	}
}


EventAssigner = function()
{
}

EventAssigner.PrintWindow = function(tag)
{
	EventLib.AddEventOnLoad(function () {
		EventLib.AddEventsByClassName('jsPrintWindow', tag, { 
			'click'     : Actions.ShowPrintDialog,
			'mouseover' : Actions.CursorPointer,
			'mouseout'  : Actions.CursorDefault
			}
		)
		}
	);
}


EventAssigner.Hyperlink_OpenNewWin = function()
{
	EventLib.AddEventOnLoad(function () {
		EventLib.AddEventByClassName('jsClick_OpenNewWin', 'a', 'click', Actions.Hyperlink_OpenNewWin);
		EventLib.AddEventByClassName('jsClick_OpenNewWin', 'area', 'click', Actions.Hyperlink_OpenNewWin);
	});
}

EventAssigner.Hyperlink_SiteCatalystDownloadTracking = function()
{
	EventLib.AddEventOnLoad(function () {
		EventLib.AddEventByClassName('jsClick_SiteCatalystDownloadTracking', 'a', 'click', Actions.Hyperlink_SiteCatalystDownloadTracking);
	});
}


EventAssigner.ElementLink = function(tag)
{
	EventLib.AddEventOnLoad(function () {
		EventLib.AddEventsByClassName('jsElementLink', tag, { 
			'click'     : Actions.GoToChildHyperLinkHref
			}
		)
	});
}


// Auto assign event hyperlink in all pages
EventAssigner.Hyperlink_OpenNewWin();
//EventAssigner.Hyperlink_SiteCatalystDownloadTracking();
EventAssigner.ElementLink('div');