/**
 * @fileoverview
 * AJAX Marshaller core code. Based on jQuery Ajax library.
 *
 */


/**
 *	Gets the name of a function by it signature.
 */
Function.prototype.getName = function() {
	var definition = this.toString().split("\n")[0];
	var exp = /^function ([^\s(]+).+/;
	if (exp.test(definition)) {
		var name = definition.split("\n")[0].replace(exp, "$1") || "anonymous";
		name = name.replace(/([a-z0-9_]*)\r+/,"$1");
        return name;
	}
	return "anonymous";
}


//TODO: Complete this documentation.
/**
 * Invokes a function in server side using an AJAX call.
 * 
 * Since AJAX works asynchronously, the response could be processed in two different ways:
 * 
 * <ul>
 * <li>	In case of success, a function with this signature will be called:
 * 
 * 
 * 
 */
Function.prototype.invoke = function(connector) {
	// Marshall function arguments
	func = this.toString();
	a = func.indexOf("function");
	b = func.indexOf('\(');
	c = func.indexOf('\)');
	var name = this.getName().toString();
	params = func.substr(b + 1, c - b - 1);
	params = params.split(',');
	var data = new Object();

	for (i = 0; i < this.arguments.length; i++) {
		data[params[i]] = this.arguments[i];
	}

	var url = connector + "AjaxConnector.php?" + name;
	var success = (eval("typeof " + name + "OK") != 'function') ? defaultAjaxSuccess : eval (name + "OK");
	var error = (eval("typeof " + name + "Error") != 'function') ? defaultAjaxError : eval (name + "Error");

	// Actually call the ajax framework to perform the operation on server side.
	var xhr = $.ajax( {
				data :data,
				url :url,
				type :"post",
				dataType :"json",
				timeout :40000,
				error :error,
				success :success
			});
}


/**
 * 
 */
function defaultAjaxSuccess(json) {
	//console.log(json);
}

/**
 * 
 */
function defaultAjaxError(xhr, desc, exceptionobj) {
	//console.log("Error %o %o", desc, exceptionobj);
}

