/*

Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.

For licensing, see LICENSE.html or http://ckeditor.com/license

*/



/**

 * @fileOverview Defines the {@link CKEDITOR.dom.event} class, which

 *		represents the a native DOM event object.

 */



/**

 * Represents a native DOM event object.

 * @constructor

 * @param {Object} domEvent A native DOM event object.

 * @example

 */

CKEDITOR.dom.event = function( domEvent )

{

	/**

	 * The native DOM event object represented by this class instance.

	 * @type Object

	 * @example

	 */

	this.$ = domEvent;

};



CKEDITOR.dom.event.prototype =

{

	/**

	 * Gets the key code associated to the event.

	 * @returns {Number} The key code.

	 * @example

	 * alert( event.getKey() );  "65" is "a" has been pressed

	 */

	getKey : function()

	{

		return this.$.keyCode || this.$.which;

	},



	/**

	 * Gets a number represeting the combination of the keys pressed during the

	 * event. It is the sum with the current key code and the {@link CKEDITOR.CTRL},

	 * {@link CKEDITOR.SHIFT} and {@link CKEDITOR.ALT} constants.

	 * @returns {Number} The number representing the keys combination.

	 * @example

	 * alert( event.getKeystroke() == 65 );                                   // "a" key

	 * alert( event.getKeystroke() == CKEDITOR.CTRL + 65 );                   // CTRL + "a" key

	 * alert( event.getKeystroke() == CKEDITOR.CTRL + CKEDITOR.SHIFT + 65 );  // CTRL + SHIFT + "a" key

	 */

	getKeystroke : function()

	{

		var keystroke = this.getKey();



		if ( this.$.ctrlKey || this.$.metaKey )

			keystroke += CKEDITOR.CTRL;



		if ( this.$.shiftKey )

			keystroke += CKEDITOR.SHIFT;



		if ( this.$.altKey )

			keystroke += CKEDITOR.ALT;



		return keystroke;

	},



	/**

	 * Prevents the original behavior of the event to happen. It can optionally

	 * stop propagating the event in the event chain.

	 * @param {Boolean} [stopPropagation] Stop propagating this event in the

	 *		event chain.

	 * @example

	 * var element = CKEDITOR.document.getById( 'myElement' );

	 * element.on( 'click', function( ev )

	 *     {

	 *         // The DOM event object is passed by the "data" property.

	 *         var domEvent = ev.data;

	 *         // Prevent the click to chave any effect in the element.

	 *         domEvent.preventDefault();

	 *     });

	 */

	preventDefault : function( stopPropagation )

	{

		var $ = this.$;

		if ( $.preventDefault )

			$.preventDefault();

		else

			$.returnValue = false;



		if ( stopPropagation )

			this.stopPropagation();

	},



	stopPropagation : function()

	{

		var $ = this.$;

		if ( $.stopPropagation )

			$.stopPropagation();

		else

			$.cancelBubble = true;

	},



	/**

	 * Returns the DOM node where the event was targeted to.

	 * @returns {CKEDITOR.dom.node} The target DOM node.

	 * @example

	 * var element = CKEDITOR.document.getById( 'myElement' );

	 * element.on( 'click', function( ev )

	 *     {

	 *         // The DOM event object is passed by the "data" property.

	 *         var domEvent = ev.data;

	 *         // Add a CSS class to the event target.

	 *         domEvent.getTarget().addClass( 'clicked' );

	 *     });

	 */



	getTarget : function()

	{

		var rawNode = this.$.target || this.$.srcElement;

		return rawNode ? new CKEDITOR.dom.node( rawNode ) : null;

	}

};



// For the followind constants, we need to go over the Unicode boundaries

// (0x10FFFF) to avoid collision.



/**

 * CTRL key (0x110000).

 * @constant

 * @example

 */

CKEDITOR.CTRL = 0x110000;



/**

 * SHIFT key (0x220000).

 * @constant

 * @example

 */

CKEDITOR.SHIFT = 0x220000;



/**

 * ALT key (0x440000).

 * @constant

 * @example

 */

CKEDITOR.ALT = 0x440000;

