function Event(sSelector, sDomEvent, iIndex) {
	this.selector = sSelector;	// selector to fetch the tag(s) for this event
	this.domEvent = sDomEvent;	// simple DOM event of that tag(s)
	this.index = iIndex;

	this.bindings = new Array();
}

Event.cancelBubble = function (ev) {
	if(!ev) {
		event.cancelBubble = true;	// IE
	} else {
		ev.cancelBubble = true;		// Mozilla
	}	// other browsers?
}

Event.bubble = function (ev) {
	if(!ev) {
		event.cancelBubble = false;	// IE
	} else {
		ev.cancelBubble = false;	// Mozilla
	}	// other browsers?
}

p = Event.prototype;

p.bind = function (sId, action) {	// shorthand for .addAction()
	this.bindings.push(new Binding(sId, action));
}

p.unbind = function (sId) {
	var binding = this.bindings.getById(sId);
	this.bindings.remove(binding);
}

p.fire = function (tag, ev) {
	var returnValue = true;

	for(var iBinding = 0; iBinding < this.bindings.length; iBinding++) {
		var binding = this.bindings[iBinding];
//		alert(this.getString());	// debug
		returnValue = returnValue & binding.fire(this, ev, tag);
	}
	
	if(!returnValue)
		Event.cancelBubble(ev);
	
	return returnValue;
}

p.getString = function () {
	var sEvent = this.selector + ':' + this.domEvent;
	
	//sEvent += ' bind' + this.bindings.length;
	/*
	for(var iBinding = 0; iBinding < this.bindings.length; iBinding++) {
		var binding = this.bindings[iBinding];
		sEvent += ' ' + binding.getString();
	}
	*/
	
	return sEvent;
}


addOnload(
	function () {
		var logNoAttach = new CountLog();
		
		for(var iEvent = Events.length - 1; iEvent >= 0; iEvent--) {
			var ntevent = Events[iEvent];
			var iIndex = ntevent.index;

			var tags = document.getBySelector(ntevent.selector);
			
			for(var iTag = tags.length - 1; iTag >= 0; iTag--) {
				var tag = tags[iTag];

				/* Does not override inline events
					Priority:
					1. Inline events (onclick="blah()")
					2. Lower events (events created later in script)
					3. Higher events (events created earlier in script) - because this loop loops backwards
				*/
				if(!eval("tag." + ntevent.domEvent)) {
					eval('tag.' + ntevent.domEvent + ' = function (ev) { return Events[' + iIndex + '].fire(this, ev); }');
				} else {
					logNoAttach.log(tag.tagName + '.' + ntevent.domEvent);
				}
			}
		}
		
//		alert(SelectorToken.log);
//		alert('Not attaching to:' + logNoAttach.getString());
	}
);