(function($){
	var pnp = this.pnPlugin = function(){
		this.__events__ = [];
		this.__listeners__ = {};
	};
	$.extend( pnp.prototype, {
		__owner__ : null,
		owner : function ()
		{
			//begin set
			if(arguments.length>0){
				this.__owner__ = arguments[0];
				return this;
			}	//end set
			return this.__owner__;	//get
		},
		//数据操作
		__data__ : null,
		data : function ()
		{
			//begin set
			if(arguments.length>0){
				this.__data__ = arguments[0];
				return this;
			}	//end set
			return this.__data__;	//get
		},	//end function
	//事件处理
		__events__ : [],
		isEvent : function(/*string*/ type)
		{
			if( this.__events__.indexOf )
				return ( this.__events__.indexOf(type) > -1 );
			else
			{
				for(var i=0, length=this.__events__.length; i<length; ++i)
				{
					if(type==this.__events__[i])
						return true;
				}
			}
			return false;
		},	//end function 
		registerEvent : function(/*string*/type /*[...]*/)
		{
			for(var i=0, length=arguments.length; i<length; ++i)
			{
				if(!this.isEvent(arguments[i]))
				{
					this.__events__.push(arguments[i]);
				}
			}
		},	//end function
		__listeners__ : {},
		hasListener : function(/*string*/ type, /*function*/ listener)
		{
			if( this.isEvent( type ) && this.__listeners__[type] && typeof(listener)=='function' )
			{
				for ( var i=0, length=this.__listeners__[type].length; i<length; ++i )
			 	{
			 		if(this.__listeners__[type][i]==listener)
			 		{
			 			return i;
			 		}						 		
			 	}
			}
			return -1;
		},	//end function
		addListener : function(/*string*/ type, /*function*/ listener)
		{			
			if( this.isEvent( type ) )
			{
				if(!this.__listeners__[type])
					this.__listeners__[type] = [];
				if( typeof(listener)=='function' )
				{
					this.removeListener(type, listener);
					this.__listeners__[type].push( listener );
				}
			}
			return this;
		},	//end function
		removeListener : function (/*string*/ type, /*function*/ listener) 
		{
			if(  this.isEvent( type ) )
			{
				if( (this.__listeners__[type] instanceof Array) && 
					typeof(listener) == 'function' )
				{
					var i = this.hasListener(type, listener);
//					alert(i);
					if(i > -1)
						this.__listeners__[type].splice(i, 1);
//					alert(this.__listeners__[type].length);
				}
			}
			return this;
		},	//end function
		dispatchEvent : function ( /*string*/ type /* , ...*/ ) 
		{
			if( this.isEvent( type ) &&
				(this.__listeners__[type] instanceof Array) 
			 )
			 {
			 	var parameter = [];
			 	if(arguments.length>1)
			 	{
			 		parameter = parameter.concat.apply(parameter, arguments).slice(1);
			 	}						 	
			 	for ( var i=0, length=this.__listeners__[type].length; i<length; ++i )
			 	{
			 		this.__listeners__[type][i].apply(this, parameter);						 		
			 	}
			 	return ( parameter.length>0 );
			 }
			 return false;
		}	//end function
	});
})(jQuery);
