/**
 * Base Class for Myspace Framework
 * @param controller
 * @return base object
 * @author AJEET SHAKYA
 * @since June 1, 2009
 */
function NET(controller)
{
	var net = {};
	
	/* Attributes */
	
	net.url 					= config.url;
	net.controller 				= controller;
	net.max_attempt				= 5;
	net.attempt					= 0;
	net.params					= null;
	net.loading_message			= config.loadingM;
	
	/* Attributes ends */
	
	/* Function declarations */
	
	net.adjustWindowHeight		= adjustWindowHeight;
	net.checkXml 				= checkXml;
	net.clearMessage 			= clearMessage;
	net.getCaller 				= getCaller;
	net.getErrorMessage 		= getErrorMessage;
	net.getPostData 			= getPostData;
	net.hadError 				= hadError;
	net.hide					= hide;
	net.isSuccess 				= isSuccess;
	net.makeRequest 			= makeRequest;
	net.makeRequestCallback 	= null;
	net.makeRequestHandler 		= makeRequestHandler; 
	net.outputError				= outputError;
	net.outputInfo				= outputInfo;
	net.outputMessage 			= outputMessage;
	net.outputSuccess			= outputSuccess;
	net.refresh					= refresh;
	net.reload					= reload;
	net.request					= request;
	net.show					= show;
	
	/* Function declarations ends */
	
	/* Functions definitions */
	
	function adjustWindowHeight()
	{
		gadgets.window.adjustHeight(config.windowHeight[net.controller]);
	};
	
	function reload()
	{
		net.attempt = 0;
		net.makeRequestCallback = null;
		net.params = null;
		owner.loadOwnerData(escape(owner.thumbnail_url), escape(owner.profile_url));
	};
	
	function checkXml(xml)
	{
		if(!xml)
		{
			if(net.controller == 'owner')
			{
				app.stopLoading();
				$.prompt('Error: Request timed out waiting to connect to the server.', {buttons: {Refresh: true}, callback: net.reload});
			}
			else
				net.outputMessage(config.connectionMessage, 'error');
			net.attempt = 0;
			net.makeRequestCallback = null;
			net.params = null;
			return false;
		}
		if(net.hadError(xml))
		{
			net.outputMessage(net.getErrorMessage(xml), 'error');
			net.attempt = 0;
			net.makeRequestCallback = null;
			net.params = null;
			return false;
		}
		return true;
	};
	
	function clearMessage()
	{
		$('#'+net.controller+'_message').html('');
		$('#'+net.controller+'_message').css('display', 'none');
	};
	
	function getCaller()
	{
		var arg = arguments.callee.caller.arguments;
		var caller = arg.callee.caller.toString().substr(9);
		caller = caller.substr(0, caller.indexOf('('));
		return caller;
	};
	
	function getErrorMessage(xml)
	{
		var errC = $(xml).find('errC').text();
		if(errC=='111')
			return uuescape($(xml).find('errM').text());
		return config.errM[errC];
	};
	
	function getPostData()
	{
		var args = arguments.callee.caller.caller.arguments;
		var post_data = "";
		for(i=0; i<args.length; i++)
		{
			post_data += '"arg'+i+'" : "'+args[i]+'"';
			if(i < (args.length-1))
				post_data +=", ";
		}
		return "{ "+post_data+" }";
	};
	
	function hadError(xml)
	{
		if($(xml).find('errC').text())
			return true;
		return false;
	};
	
	function hide()
	{
		$('#'+net.controller+'_page').hide();
	};
	
	function isSuccess(xml)
	{
		var success = parseInt($(xml).find('errC').text());
		if(success)
			return true;
		return false;
	};
		
	function makeRequest(loading)
	{ 
		if(loading === undefined)
			loading = true;
		if(loading)
			net.outputMessage(net.loading_message, 'm');
		var post_data = {
				args: [escape(net.getPostData())], 
				page: net.controller, 
				func: net.getCaller()
		};
		if(net.makeRequestCallback)
			return;
		callback = net.controller+"."+net.getCaller()+"Callback";
		net.makeRequestCallback = callback;
		var params = {};
		params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
		params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
		params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;
		params[gadgets.io.RequestParameters.POST_DATA] = post_data;
		net.params = params;
		net.request();
	};
	
	function makeRequestHandler(response)
	{ 
		net.clearMessage();
		if(response.errorCode)
		{
			if(net.attempt < net.max_attempt)
			{
				net.request();
				return;
			}
		}
		var xml = response.data;
		if(!net.checkXml(xml))
			return;
		app.refresh(xml);
		var cbk 					= net.makeRequestCallback;
		net.makeRequestCallback 	= null;
		net.params 					= null;
		eval(cbk+"(xml);");
	};
	
	function outputError(msg)
	{
		net.outputMessage(msg, 'e');
	};
	
	function outputInfo(msg)
	{
		net.outputMessage(msg, 'i');
	};
	
	function outputMessage(msg, type)
	{
		var str = "";
		switch(type)
		{
		default:
		case 'SUCCESS':
		case 'success':
		case 's':
		case 'S':
		case 1:
			str = "<div class=\"success\">"+msg+"</div>";
			break;
			
		case 'INFO':
		case 'info':
		case 'i':
		case 'I':
		case 2:
			str = "<div class=\"info\">"+msg+"</div>";
			break;
			
		case 'ERROR':
		case 'error':
		case 'e':
		case 'E':
		case 3:
			str = "<div class=\"error\">"+msg+"</div>";
			break;
			
		case 'WARNING':
		case 'warning':
		case 'w':
		case 'W':
		case 4:
			str = "<div class=\"warning\">"+msg+"</div>";
			break;
			
		case 'MESSAGE':
		case 'message':
		case 'm':
		case 'M':
		case 5:
			str = msg;
			break;
		}
		$('#'+net.controller+'_message').html(str);
		$('#'+net.controller+'_message').show();		
		document.location = "#top";
	};
	
	function outputSuccess(msg)
	{
		net.outputMessage(msg, 's');
	};
	
	function refresh()
	{
		
	};
	
	function request()
	{
		net.attempt++;
		gadgets.io.makeRequest(net.url, net.makeRequestHandler, net.params);
	};
	
	function show()
	{
		$('#'+net.controller+'_page').show();
	};
	
	/* Functions definitions End */
	
	return net;
};