penguin/AstroJS

Javascript framework for my blog

botanjs/src/Dandelion/IDOMObject.js

raw ยท 2705 bytes

(function(){
	var ns = __namespace( "Dandelion" );
	/** @type {typeof System.utils.EventKey} */
	var EventKey = __import( "System.utils.EventKey" );

	/** @constructor
	 * @extends Array
	 */
	var EvtsArr = function () { Array.call( this ); };

	/** @param {System.utils.EventKey} e */
	EvtsArr.prototype.indexOf = function( e )
	{
		var l = this.length;
		for( var i = 0; i < l; i ++ )
		{
			/** @type {typeof System.utils.EventKey} */
			var evt = this[i];
			if( evt.type == e.type && evt.handler == e.handler )
			{
				return i;
			}
		}

		return -1;
	};

	__extends( EvtsArr, Array );

	/** @constructor */
	var IDOMObject = function ( obj, sw )
	{
		if ( obj instanceof IDOMObject ) return obj;

		if ( sw )
		{
			this.obj = /** @type {EventTarget} */ (obj);
		}
		else if ( obj )
		{
			return new IDOMObject( obj, true );
		}
		else
		{
			throw new Error( "[Dandelion.IDOMObject] Invalid argument" );
		}
	}

	IDOMObject.prototype.hasListener = function(e)
	{
		if( e instanceof EventKey
			&& this._events
			&& this._events.indexOf(e) != -1
		)
		{
			return this._events[ this._events.indexOf(e) ];
		}
		return null;
	};

	/**
	 * @param {*} event
	 * @param {function(Event): void=} handler
	 */
	IDOMObject.prototype.addEventListener = function (event, handler)
	{
		var e;
		if (typeof event == "string" && handler)
		{
			e = new EventKey(event, handler);
		}
		else if (event instanceof EventKey)
		{
			e = event;
		}
		else
		{
			return false;
		}

		if ( this._events )
		{
			if ( this._events.indexOf( e ) < 0 )
			{
				this._events.push( e );
			}
			else
			{
				return false;
			}
		}
		else
		{
			this._events = new EvtsArr();
			this._events[0] = e;
		}

		if( this.obj.addEventListener )
		{
			this.obj.addEventListener( e.type, e.handler, false );
		}
		// IE
		else if( this.obj.attachEvent )
		{
			this.obj.attachEvent('on' + e.type, e.handler);
		}
		else
		{
			this.obj['on' + e.type] = e.handler;
		}
		return true;
	};

	IDOMObject.prototype.addEventListeners = function(evtKeys)
	{
		if(evtKeys instanceof Array)
		{
			for(var i = 0, l = evtKeys.length; i < l; i ++)
			{
				this.addEventListener(evtKeys[i]);
			}
		}
	};

	IDOMObject.prototype.removeEventListener = function( e, handler )
	{
		if( handler )
		{
			e = new EventKey( e, handler );
		}

		if( this._events )
		{
			delete this._events[ this._events.indexOf(e) ];
		}

		if( this.obj.removeEventListener )
		{
			this.obj.removeEventListener( e.type, e.handler );
		}
		// IE
		else if( this.obj.detachEvent )
		{
			this.obj.detachEvent( 'on' + e.type, e.handler );
		}
		else
		{
			this.obj['on' + e.type] = null;
		}
	};

	ns[ NS_EXPORT ]( EX_CLASS, "IDOMObject", IDOMObject );
})();