/*
	Events
	-----

Library that provied a set of methods for convenient event handling that work in all major browsers.

Written by:
 Mikhail Diatchenko
 Nov 2007
 
Methods:
	cancelBubble(element, eventName) //eventName: e.g. "mousedown", "click", "keyup", etc. - no "on" prefix
	attachEvent(element, eventName, callback)
	removeEvent(element, eventName, callback)

Examples:
	Events.attachEvent(document.body, "click" function(e) { alert("Event fired!"); });

Compatibility:
 The functionality has been tested with the following browsers:
	IE 6 (WinXP)
	Firefox 2.0.0.9 (WinXP)
*/

//this is required to callback functions. read http://www.snook.ca/archives/javascript/javascript_pass/ for more info.
if ( ! Function.prototype.bind ) {
    Function.prototype.bind = function( object ) {
        var __method = this;
        return function() {
            __method.apply( object, arguments );
        };
    };
}

var Events = {
	cancelBubble: function(element, evt) {
		if (!element)
	        return;
		if(window.addEventListener){ // Mozilla, Netscape, Firefox
			element.addEventListener(evt, function(e) { e.cancelBubble = true }, false);
		} else if(window.attachEvent) { // IE
			element.attachEvent('on'+evt, function() { event.cancelBubble = true });
		}
	},

	attachEvent: function(element, evt, callback) {
	    if (!element)
	        return;
		if(window.addEventListener){ // Mozilla, Netscape, Firefox
			element.addEventListener(evt, function(e) { callback(e); }, false);
		} else if(window.attachEvent) { // IE
			element.attachEvent('on'+evt, function() { callback(event); });
		}
	},

	removeEvent: function(element, evt, callback) {   
	    if (!element)
	        return;
		if(window.removeEventListener){ // Mozilla, Netscape, Firefox
			element.removeEventListener(evt, function(e) { callback(e); }, false);
		} else if(window.detachEvent) { // IE
			element.detachEvent('on'+evt, function() { callback(event); });
		}
	},
	
	bindEventHandler: function(handler, object) {   
        var __method = handler;
        return function() {
            __method.apply( object, arguments );
        };
	} //havn't tested yet
}
