var api = (function($) {

	var config = {
		baseUrl: 'http://tools.cisco.com/reward/api/v1/',
		cookieName: "REWARDSID"
	};
	
	return {
		
		init: function (options) {
			// Set Settings
			$.extend(true, config, options);
		},
		
		createSession : function(sessionToken) {
			var expirationDate = new Date();
			expirationDate.setDate(expirationDate.getDate() + 30);
			var cookieValue = escape(sessionToken) + ((expirationDate==null) ? "" : "; expires=" + expirationDate.toUTCString()) + "; path=/";
			//document.cookie = (config.cookieName + "=" + cookieValue.replace(" ", "+"));
		},
		
		clearSession : function() {
			var date = new Date();
			var expires = "; expires=Thu, 01-Jan-1970 00:00:01 GMT";
			document.cookie = config.cookieName +"="+expires+"; path=/";
		},

		getSession : function() {
			var i, x, y, cookies = document.cookie.split(";");
			for (i = 0; i < cookies.length; i++) {
				x = cookies[i].substr(0, cookies[i].indexOf("="));
				y = cookies[i].substr(cookies[i].indexOf("=") + 1);
				x = x.replace(/^\s+|\s+$/g, "");
				if (x == config.cookieName) {
					return unescape(y);
				}
			}
			return null;
		},
		
		logout : function(model, callback) {
			api.clearSession();
			this.call({ url: 'logout.jsonp', data: model, callback: callback });
		},
		
		authenticate : function(model, callback) {
			this.call({ url: 'authenticate.jsonp', data: model, callback: callback });
		},
		
		register : function(model, callback) {
			this.call({ url: 'register.jsonp', data: model, callback: callback });
		},
		
		connect : function(model, callback) {
			this.call({ url: 'member/connect.jsonp', data: model, callback: callback });
		},
		
		disconnect : function(model, callback) {
			this.call({ url: 'member/disconnect.jsonp', data: model, callback: callback });
		},
		
		getBadge : function(model, callback) {
			this.call({ url: 'badge/get.jsonp', data: model, callback: callback });
		},
		
		getBadgeLevel : function(model, callback) {
			this.call({ url: 'badgelevel/get.jsonp', data: model, cache:true, callback: callback });
		},
		
		getBadges : function(model, callback) {
			this.call({ url: 'badge/list.json', data: model, callback: callback });
		},
		
		getMemberActivities : function(model, callback) {
			this.call({ url: 'member/activities.jsonp', data: model, callback: callback });
		},
		
		getMembersReputation : function(model, callback) {
			this.call({ url: 'member/reputation.jsonp', data: model, callback: callback });
		},
		
		getMemberFollowers : function(model, callback) {
			this.call({ url: 'member/followers.jsonp', data: model, callback: callback });
		},
		
		getMemberFollowing : function(model, callback) {
			this.call({ url: 'member/following.jsonp', data: model, callback: callback });
		},
		
		getMembers: function(model, callback) {
			this.call({ url: 'member/list.jsonp', data: model, callback: callback });
		},
		
		getMember : function(model, callback) {
			this.call({ url: 'member/get.jsonp', data: model, callback: callback });
		},
		
		updateMember : function(model, callback) {
			this.call({ url: 'member/update.jsonp', data: model, callback: callback });
		},
		
		follow : function(model, callback) {
			this.call({ url: 'member/follow.jsonp', data: model, callback: callback });
		},
		
		unfollow : function(model, callback) {
			this.call({ url: 'member/unfollow.jsonp', data: model, callback: callback });
		},
		
		call : function(options) {

			var def = {
				url : '',
				type : "GET",
				dataType : 'jsonp',
				cache: false,
				data : undefined,
				contentType : "application/json",
				callback : function() {},
				errorCallback : function() {}
			};

			$.extend(def, options);

			var sessionToken = api.getSession();
			
			if(sessionToken && sessionToken != "undefined") {
				if(!def.data) {
					def.data = {};
				}
				
				def.data.sessionToken = sessionToken;
			}
			
			var url = config.baseUrl + def.url;

			// Abort Request If Another One Is Made
			if (config.request != null)
				config.request.abort();
			
			config.request = $
					.ajax({
						url : url,
						type : def.type,
						data : { request: $.toJSON(def.data) },
						dataType : def.dataType,
						contentType : def.contentType,
						success : function(data) {

							try {
								var json = data;
								if (typeof data === "String" || typeof data == "string") {
									json = (eval('(' + data + ')'));
								}
								if ('object' === typeof json) {
									def.callback(data);
								} else {
									def.callback(data);
								}
								
							} catch (e) {
								def.callback(data);
							}
						},
						error : function(data) {

							if (config.request.status == 601) {
								// Redirect To Login
							} else {
								api.clearSession();
							}
						}
					});
			

		}	
	};
})(jQuery);

