function(obj, name, callback) {
		var type, undef;
		
		name = name.toLowerCase();
		
		if (obj[uid] && eventhash[obj[uid]] && eventhash[obj[uid]][name]) {
			type = eventhash[obj[uid]][name];
		} else {
			return;
		}
			
		for (var i = type.length - 1; i >= 0; i--) {
			// undefined or not, key should match
			if (type[i].orig === callback || type[i].key === callback) {
				if (obj.removeEventListener) {
					obj.removeEventListener(name, type[i].func, false);
				} else if (obj.detachEvent) {
					obj.detachEvent('on'+name, type[i].func);
				}
				
				type[i].orig = null;
				type[i].func = null;
				type.splice(i, 1);
				
				// If callback was passed we are done here, otherwise proceed
				if (callback !== undef) {
					break;
				}
			}
		}
		
		// If event array got empty, remove it
		if (!type.length) {
			delete eventhash[obj[uid]][name];
		}
		
		// If mOxie registry has become empty, remove it
		if (Basic.isEmptyObj(eventhash[obj[uid]])) {
			delete eventhash[obj[uid]];
			
			// IE doesn't let you remove DOM object property with - delete
			try {
				delete obj[uid];
			} catch(e) {
				obj[uid] = undef;
			}
		}
	}
function(obj, name, callback) {
		var type, undef;
		
		name = name.toLowerCase();
		
		if (obj[uid] && eventhash[obj[uid]] && eventhash[obj[uid]][name]) {
			type = eventhash[obj[uid]][name];
		} else {
			return;
		}
			
		for (var i = type.length - 1; i >= 0; i--) {
			
			if (type[i].orig === callback || type[i].key === callback) {
				if (obj.removeEventListener) {
					obj.removeEventListener(name, type[i].func, false);
				} else if (obj.detachEvent) {
					obj.detachEvent('on'+name, type[i].func);
				}
				
				type[i].orig = null;
				type[i].func = null;
				type.splice(i, 1);
				
				
				if (callback !== undef) {
					break;
				}
			}
		}
		
		
		if (!type.length) {
			delete eventhash[obj[uid]][name];
		}
		
		
		if (Basic.isEmptyObj(eventhash[obj[uid]])) {
			delete eventhash[obj[uid]];
			
			
			try {
				delete obj[uid];
			} catch(e) {
				obj[uid] = undef;
			}
		}
	}
function ( obj , name , callback ) { var type , undef ; name = name . toLowerCase ( ) ; if ( obj [ uid ] && eventhash [ obj [ uid ] ] && eventhash [ obj [ uid ] ] [ name ] ) { type = eventhash [ obj [ uid ] ] [ name ] ; } else { return ; } for ( var i = type . length - 1 ; i >= 0 ; i -- ) { // undefined or not, key should match if ( type [ i ] . orig === callback || type [ i ] . key === callback ) { if ( obj . removeEventListener ) { obj . removeEventListener ( name , type [ i ] . func , false ) ; } else if ( obj . detachEvent ) { obj . detachEvent ( 'on' + name , type [ i ] . func ) ; } type [ i ] . orig = null ; type [ i ] . func = null ; type . splice ( i , 1 ) ; // If callback was passed we are done here, otherwise proceed if ( callback !== undef ) { break ; } } } // If event array got empty, remove it if ( ! type . length ) { delete eventhash [ obj [ uid ] ] [ name ] ; } // If mOxie registry has become empty, remove it if ( Basic . isEmptyObj ( eventhash [ obj [ uid ] ] ) ) { delete eventhash [ obj [ uid ] ] ; // IE doesn't let you remove DOM object property with - delete try { delete obj [ uid ] ; } catch ( e ) { obj [ uid ] = undef ; } } }
Remove event handler from the specified object. If third argument (callback)
is not specified remove all events with the specified name.

@method removeEvent
@static
@param {Object} obj DOM element to remove event listener(s) from.
@param {String} name Name of event listener to remove.
@param {Function|String} [callback] might be a callback or unique key to match.
Remove event handler from the specified object . If third argument ( callback ) is not specified remove all events with the specified name .