/**
 * @author carrillos
 * @version 1.0, 05/01/2009
 */
if(typeof NICK == "undefined" || !NICK) var NICK = {};

(function() {
	KIDS.namespace("utils", NICK);
	KIDS.namespace("request.messages", NICK);
	KIDS.namespace("request.errors", NICK);
	KIDS.namespace("response.codes", NICK);

	NICK.request.errors.SERVER = "_ERROR_SERVER";
	NICK.request.errors.REQUEST = "_ERROR_REQUEST";
	NICK.request.errors.RESPONSE = "_ERROR_RESPONSE";
	NICK.request.errors.URL = "_ERROR_URL";

	NICK.request.messages.INVALID_RESPONSE = "Invalid reponse";
	NICK.request.messages.INVALID_URL = "Invalid url requested";

	NICK.response.codes.OK = "ok";
	NICK.response.codes.ERROR = "error";

	NICK.request.doRequest = function(options) {
		var defaults = {
			type:"GET",
			url:null,
			data:null,
			dataType:"jsonp",
			onSuccess:null,
			onFail:null
		};

		var settings = $.extend({}, defaults, options);

		var doResponse = function(response) {
			if("jsonp" == settings.dataType) doResponseJson(response);
			else if("json" == settings.dataType) doResponseJson(response);
			else if("xml" == settings.dataType) doResponseXml(response);
			else if("html" == settings.dataType) doResponseHtml(response);
			else KIDS.utils.doLog(">>NICK.request: No response handler for type: "+settings.dataType);
		}

		var doResponseJson = function(response) {
		
			if(response == null) {
				onFail(getError(NICK.request.errors.RESPONSE, NICK.request.messages.INVALID_RESPONSE));
			} else if(response.code == NICK.response.codes.OK) {
				onSuccess(response);
			} else if(response.code == NICK.response.codes.ERROR) {
				onFail(response.errors);
			}else{
				onSuccess(response);
			}
		}

		var doResponseXml = function(response) {
			if(response == null) {
				onFail(getError(NICK.request.errors.RESPONSE, NICK.request.messages.INVALID_RESPONSE));
				return;
			} else if($(response).find('response').attr('status') == NICK.response.codes.OK) {
				onSuccess(response);
			} else if($(response).find('response').attr('status') == NICK.response.codes.ERROR) {
				var errors = {};

				$(response).find('error').each(function() {
					errors[$(this).attr('name')] = $(this).text();
				});

				//onFail($(response).find('errors'));
				onFail(errors);
			}
		}

		var doResponseHtml = function(response) {
			if(response == null) {
				onFail(getError(NICK.request.errors.RESPONSE, NICK.request.messages.INVALID_RESPONSE));
				return;
			} else {
				onSuccess(response);
			}
		}

		var onFail = function(error) {
			var errors = typeof error == 'string' ? { request:error } : error;

			if(settings.onFail) settings.onFail(errors); // Always want to pass errors as an Object
			else KIDS.utils.doLog("doRequest: Failed: "+ error);
		}

		var onSuccess = function(data) {
			if(settings.onSuccess) settings.onSuccess(data);
			else KIDS.utils.doLog("doRequest: OK");
		}

		var doRequestError = function(request, error, exception) {
			onFail(getError(NICK.request.errors.REQUEST, error));
		}

		var getError = function(name, message) {
			var error = new Object();
			error[name] = message;
			return error;
		}

		if(settings.url == null) {
			onFail(getError(NICK.request.errors.URL, NICK.request.messages.INVALID_URL));
			return;
		}

		try { // Catch browser security exceptions.
			$.ajax({
				type:		settings.type,
				url:		settings.url,
				data:		settings.data == null ? {} : settings.data,
				dataType:	settings.dataType,
				success:	doResponse,
				error:		doRequestError
			});
		} catch(error) {
			KIDS.utils.doLog("NickRequest: error: "+error);
			onFail({_ERROR_SERVER:error});
		}
	}

})();
