/**
 * @author: Ivan Andonov
 * @email:  ivata[at]design[dot]bg
 * 
 * @require: dbg.ShortcutCall, dbg.Utils
 * @use:     dbg.Debug
 **/

dbg.Delegate = {
	
	/**
	 * @param target  object or null for window
	 * @param method  string or function
	 * @param ...rest arguments that will be passed to the method on every call
	 * 
	 * @return        function
	 * 
	 * @usage:
	 *			var obj = {
	 *				name : 'testObject',
	 *				method : function() {
	 *					alert(this.name+'.method');
	 *					for (var i = 0; i < arguments.length; i++) {
	 *						alert('arg'+i+'='+arguments[i]);
	 *					}
	 *				}
	 *			}
	 *			var _delegate = Delegate.create(obj, 'method', 1, 2);
	 *			// var _delegate = $d(obj, 'method', 1, 2);
	 *			_delegate(3, 4);
	 **/
	create : function(target, method) {
		var t = target;
		var m = method;
		var args = [];
		for (var i = 2; i < arguments.length; i++) args.push(arguments[i]);
		return function() {
			var arr = [].concat(args);
			for (var i = 0; i < arguments.length; i++)  arr.push(arguments[i]);
			try {
				switch (typeof(m)) {
					case "string":
						return ($e(t)[m] || eval(m)).apply($e(t), arr);
					case "function":
						return m.apply($e(t), arr);
					default:
						if (dbg.Debug) {
							$logError('WARNING: Delegate.create unexpected method type: '+typeof(m));
						}
				}
			} catch (error) {
				if (dbg.Debug && dbg.isPageLoaded) {
					$logError('ERROR in '+t+'.'+m+' => '+(error.description || error));
				}
			}
			return null;
		};
	}
	
};

$shortcut(['d', 'delegate'], dbg.Delegate, 'create');