text: define(["./_base/kernel", "./on", "./has", "./dom", "./_base/window"], function(dojo, on, has, dom, win){
  
  	// module:
  	//		dojo/mouse
  
      has.add("dom-quirks", win.doc && win.doc.compatMode == "BackCompat");
  	has.add("events-mouseenter", win.doc && "onmouseenter" in win.doc.createElement("div"));
  	has.add("events-mousewheel", win.doc && 'onmousewheel' in win.doc);
  
  	var mouseButtons;
  	if((has("dom-quirks") && has("ie")) || !has("dom-addeventlistener")){
  		mouseButtons = {
  			LEFT:   1,
  			MIDDLE: 4,
  			RIGHT:  2,
  			// helper functions
  			isButton: function(e, button){ return e.button & button; },
  			isLeft:   function(e){ return e.button & 1; },
  			isMiddle: function(e){ return e.button & 4; },
  			isRight:  function(e){ return e.button & 2; }
  		};
  	}else{
  		mouseButtons = {
  			LEFT:   0,
  			MIDDLE: 1,
  			RIGHT:  2,
  			// helper functions
  			isButton: function(e, button){ return e.button == button; },
  			isLeft:   function(e){ return e.button == 0; },
  			isMiddle: function(e){ return e.button == 1; },
  			isRight:  function(e){ return e.button == 2; }
  		};
  	}
  	dojo.mouseButtons = mouseButtons;
  
  /*=====
  	dojo.mouseButtons = {
  		// LEFT: Number
  		//		Numeric value of the left mouse button for the platform.
  		LEFT:   0,
  		// MIDDLE: Number
  		//		Numeric value of the middle mouse button for the platform.
  		MIDDLE: 1,
  		// RIGHT: Number
  		//		Numeric value of the right mouse button for the platform.
  		RIGHT:  2,
  
  		isButton: function(e, button){
  			// summary:
  			//		Checks an event object for a pressed button
  			// e: Event
  			//		Event object to examine
  			// button: Number
  			//		The button value (example: dojo.mouseButton.LEFT)
  			return e.button == button; // Boolean
  		},
  		isLeft: function(e){
  			// summary:
  			//		Checks an event object for the pressed left button
  			// e: Event
  			//		Event object to examine
  			return e.button == 0; // Boolean
  		},
  		isMiddle: function(e){
  			// summary:
  			//		Checks an event object for the pressed middle button
  			// e: Event
  			//		Event object to examine
  			return e.button == 1; // Boolean
  		},
  		isRight: function(e){
  			// summary:
  			//		Checks an event object for the pressed right button
  			// e: Event
  			//		Event object to examine
  			return e.button == 2; // Boolean
  		}
  	};
  =====*/
  
  	function eventHandler(type, selectHandler){
  		// emulation of mouseenter/leave with mouseover/out using descendant checking
  		var handler = function(node, listener){
  			return on(node, type, function(evt){
  				if(selectHandler){
  					return selectHandler(evt, listener);
  				}
  				if(!dom.isDescendant(evt.relatedTarget, node)){
  					return listener.call(this, evt);
  				}
  			});
  		};
  		handler.bubble = function(select){
  			return eventHandler(type, function(evt, listener){
  				// using a selector, use the select function to determine if the mouse moved inside the selector and was previously outside the selector
  				var target = select(evt.target);
  				var relatedTarget = evt.relatedTarget;
  				if(target && (target != (relatedTarget && relatedTarget.nodeType == 1 && select(relatedTarget)))){
  					return listener.call(target, evt);
  				} 
  			});
  		};
  		return handler;
  	}
  	var wheel;
  	if(has("events-mousewheel")){
  		wheel = 'mousewheel';
  	}else{ //firefox
  		wheel = function(node, listener){
  			return on(node, 'DOMMouseScroll', function(evt){
  				evt.wheelDelta = -evt.detail;
  				listener.call(this, evt);
  			});
  		};
  	}
  	return {
  		// summary:
  		//		This module provide mouse event handling utility functions and exports
  		//		mouseenter and mouseleave event emulation.
  		// example:
  		//		To use these events, you register a mouseenter like this:
  		//		|	define(["dojo/on", "dojo/mouse"], function(on, mouse){
  		//		|		on(targetNode, mouse.enter, function(event){
  		//		|			dojo.addClass(targetNode, "highlighted");
  		//		|		});
  		//		|		on(targetNode, mouse.leave, function(event){
  		//		|			dojo.removeClass(targetNode, "highlighted");
  		//		|		});
  
  		_eventHandler: eventHandler,		// for dojo/touch
  
  		// enter: Synthetic Event
  		//		This is an extension event for the mouseenter that IE provides, emulating the
  		//		behavior on other browsers.
  		enter: eventHandler("mouseover"),
  
  		// leave: Synthetic Event
  		//		This is an extension event for the mouseleave that IE provides, emulating the
  		//		behavior on other browsers.
  		leave: eventHandler("mouseout"),
  
  		// wheel: Normalized Mouse Wheel Event
  		//		This is an extension event for the mousewheel that non-Mozilla browsers provide,
  		//		emulating the behavior on Mozilla based browsers.
  		wheel: wheel,
  
  		isLeft: mouseButtons.isLeft,
  		/*=====
  		isLeft: function(){
  			// summary:
  			//		Test an event object (from a mousedown event) to see if the left button was pressed.
  		},
  		=====*/
  
  		isMiddle: mouseButtons.isMiddle,
  		/*=====
  		 isMiddle: function(){
  			 // summary:
  			 //		Test an event object (from a mousedown event) to see if the middle button was pressed.
  		 },
  		 =====*/
  
  		isRight: mouseButtons.isRight
  		/*=====
  		 , isRight: function(){
  			 // summary:
  			 //		Test an event object (from a mousedown event) to see if the right button was pressed.
  		 }
  		 =====*/
  	};
  });
  