// Logger

$Log = function( o ) {
	if ( console ) {
		console.log( o );
	}
}

// Delegate

var $Delegate = {

	create : function() {
		var arr = [];
		for ( var i = 0; i < arguments.length; i++ ) {
			arr.push( arguments[ i ] );
		}
		var obj = arr.shift();
		var func = arr.shift();
		var args = arr;
		var f = function(){
			var target = arguments.callee.target;
			var func = arguments.callee.func;
			var args = arguments.callee.args;
			if (args) {
				return func.apply( target, args );
			} else {
				return func.apply( target, arguments );
			}
		};
		f.target = obj;
		f.func = func;
		f.args = args;
		return f;
	}

}

// Core UIComponent

$UIComponentManager = {

	registry: {},
	
	append: function( id, klass ) {
		this.registry[ id ] = klass;
	},
	
	resolve: function( id ) {
		return this.registry[ id ];
	},
	
	remove: function( id ) {
		this.registry[ id ] = null;
		delete this.registry[ id ];
	}
	
}

var $UIComponent = $.klass({

	initialize: function() {
		$UIComponentManager.append( this.id(), this );
		this.build();
		this.__forwarder = {};
	},
	
	id: function() {
		return this.element.attr( 'id' );
	},
	
	owner: function() {
		return $( this.ownerString() );
	},
	
	ownerString: function() {
		return '#' + this.id();
	},
	
	addEvent: function( type, fun ) {
		this.__forwarder[ type ] = fun;
	},
	
	hasEvent: function( type ) {
		return this.__forwarder[ type ] != null;
	},
	
	triggerEvent: function() {
		var arr = [];
		for ( var i = 0; i < arguments.length; i++ ) {
			arr.push( arguments[ i ] );
		}
		var type = arr.shift();
		if ( this.__forwarder[ type ] ) {
			return this.__forwarder[ type ].apply( this, arr );
		}	
	},
	
	build: function() {
		$Log( this.ownerString() + ' > .build() not implemented' );
	}
	
});

jQuery.fn.extend( {

	component: function() {
		return $UIComponentManager.resolve( this.attr( 'id' ) );
	}
	
});
