/**
 * This js file contains almost all the api methods.
 * 
 * @author Basit (basit@imegah.com || http://Basit.me)
 */

var	api = {
	apiUrl: '',
	apiKey: null,
	signature: null,
	version: 1.0,
	format: 'json',
	username: profile_username ? profile_username : login_username,
	
	ajax_options: {
		global: true
		// ... more ajax options
		},
		
	AJAX: function(method, url, data, callback)
	{	
		var defaults = {
			type: method,
			dataType: this.format,
			url: this.apiUrl+url+'.'+this.format,
			data: data,
			success: callback ? callback : this.ajax_response	
		}
		
		var settings = jQuery.extend(defaults, this.ajax_options);
		
		jQuery.ajax(settings);
		
		return this;
	},
	
	GET: function(url, data, callback)
	{
		return this.AJAX('GET', url, data, callback);
	},
	
	CREATE: function (url, data, callback)
	{
		return this.AJAX('POST', url, data, callback);
	},
	
	UPDATE: function (url, data, callback)
	{
		return this.AJAX('PUT', url, data, callback);
	},
	
	DELETE: function (url, data, callback)
	{
		return this.AJAX('DELETE', url, data, callback);
	},
	
	/**
	 * for showing successful message on top
	 * @param {Object} response
	 */
	ajax_response: function (response, showSuccessMsg)
	{
		ajax_response(response, showSuccessMsg); // global function, change this if you need to use outside the site
	},
	
	userModify: function (data, callback)
	{
		return this.UPDATE('/', data, callback);
	},
	
	profileModify: function (data, callback)
	{
		return this.UPDATE('/', data, callback);
	},
	
	userDelete: function (callback)
	{
		return this.DELETE('/', {}, callback);
	},
	
	feedCreate: function (data, callback)
	{
		return this.CREATE('/status', data, callback);
	},
	
	feedModify: function (feed_id, data, callback)
	{
		return this.UPDATE('/status/'+feed_id, data, callback)
	},
	
	feedDelete: function (feed_id, callback)
	{
		return this.DELETE('/status/'+feed_id, {username: login_username ? login_username : 'basit'}, callback);
	},

	feedEveryone: function (after, callback)
	{
		return this.GET('/status', {after: after}, callback);
	},
	
	feedSearch: function (search, type, after, callback)
	{
		if (profile_username == 'x')
			var $post = {after: after, username: 'x'}
		else
			var $post = {after: after}
			
		var filter_type = (type != 'undefined' && type) ? type+'/' : '';
		return this.GET('/status/'+filter_type+search+'', $post, callback);
	},
	
	feedUser: function (type, userOnly, after, callback)
	{
		var filter_type = (type != 'undefined' && type) ? type : '';
		var ifeed = (userOnly != 'undefined' && userOnly) ? 'ifeed/' : '';
		return this.GET('/status/'+ifeed+filter_type, {after: after, username: profile_username}, callback);
	},
	
	feedThread: function (thread_id, after, callback)
	{
		return this.GET('/status/thread/'+thread_id, {after: after}, callback);
	},
	
	feedMedia: function (media_id, after, callback)
	{
		return this.GET('/status/media/'+media_id, {after: after}, callback);
	},
	
	feedVote: function (feed_id, user_vote, callback)
	{
		return this.CREATE('/status/'+feed_id, {vote: user_vote, username: login_username ? login_username : 'basit'}, callback)
	},
	
	feedReportSpam: function (feed_id, msg, callback)
	{
		var message = (msg != 'undefined' && msg) ? msg : null;
		return this.UPDATE('/status/'+feed_id, {spam: message, username: login_username ? login_username : 'basit'}, callback)
	},
	
	albumCreate: function (data, callback)
	{
		return this.CREATE('/album/only', data, callback);
	},
	
	albumDelete: function (album_id, callback)
	{
		return this.DELETE('/album/'+album_id+'/only', false, callback);
	},
	
	albumModify: function (album_id, data, callback)
	{
		return this.UPDATE('/album/'+album_id+'/only', data, callback)
	},
	
	albumList: function (album_id, after, callback)
	{
		var sub_album_of = (album_id != 'undefined' && album_id) ? album_id+'/' : '';
		return this.GET('/album/'+sub_album_of+'only', {after: after}, callback);
	},
	
	albumPremissionList: function (album_id, callback)
	{
		var sub_album_of = (album_id != 'undefined' && album_id) ? album_id+'/' : '';
		return this.GET('/album/'+sub_album_of+'permission', false, callback);
	},
	
	albumPermissionGive: function (album_id, data, callback)
	{
		return this.CREATE('/album/'+album_id+'/permission', data, callback);
	},
	
	albumPermissionTake: function (album_id, data, callback)
	{
		return this.DELETE('/album/'+album_id+'/permission', data, callback);
	},

	mediaCreate: function (album_id, data, callback)
	{
		var album_id = (album_id != 'undefined' && album_id) ? album_id : 0;
		return this.CREATE('/album/'+album_id, data, callback);
	},
	
	mediaModify: function (media_id, data, callback)
	{
		return this.UPDATE('/'+media_id, data, callback);
	},
	
	mediaMove: function (album_id, media_id, callback)
	{
		var album_id = (album_id != 'undefined' && album_id) ? album_id : 0;
		
		if (jQuery.isArray(media_id)) // bulk moving
			data = {'media_id[]': media_id};
		else
			data = {media_id: media_id};

		return this.UPDATE('/album/'+album_id, data, callback);
	},
	
	mediaDelete: function (media_id, callback)
	{
		return this.DELETE('/'+media_id, {}, callback);
	},
	
	mediaVote: function (media_id, user_vote, callback)
	{
		return this.CREATE('/vote/'+media_id, {vote: user_vote}, callback);
	},

	mediaUser: function (album_id, after, show, callback)
	{
		var album_id = (album_id != 'undefined' && album_id) ? album_id : 0;
		return this.GET('/album/'+album_id, {after: after, show: show}, callback);
	},
	
	mediaAlbumPrev: function (album_id, media_id, after, show, callback)
	{
		var album_id = (album_id != 'undefined' && album_id) ? album_id : 0;
		return this.GET('/album/'+album_id+'/prev/'+media_id, {show: show, after: after}, callback);
	}, 
	
	mediaAlbumNext: function (album_id, media_id, after, show, callback)
	{
		var album_id = (album_id != 'undefined' && album_id) ? album_id : 0;
		return this.GET('/album/'+album_id+'/next/'+media_id, {show: show, after: after}, callback);
	},
	
	mediaSearch: function (search, media_type, sub_type, after, callback)
	{
		var media_type = (media_type != 'undefined' && media_type) ? media_type+'/' : '';
		var sub_type = (sub_type != 'undefined' && sub_type) ? sub_type+'/' : '';
		return this.GET('/tag/'+media_type+sub_type+search, false, callback);
	},

	mediaCommentList: function (media_id, after, callback)
	{
		return this.GET('/comment/'+media_id, {after: after}, callback);
	},
	
	mediaCommentCreate: function (media_id, reply_to_id, comment_text, callback)
	{
		var reply_to_id = (reply_to_id != 'undefined' && reply_to_id) ? reply_to_id : null;
		return this.CREATE('/comment/'+media_id, {text: comment_text, reply_to: reply_to_id}, callback);
	},
	
	mediaCommentModify: function (media_id, comment_id, comment_text, callback)
	{
		return this.UPDATE('/comment/'+media_id, {text: comment_text, comment_id: comment_id}, callback);
	},
	
	mediaCommentDelete: function (media_id, comment_id, callback)
	{
		return this.DELETE('/comment/'+media_id, {comment_id: comment_id}, callback);
	},

	mediaCommentVote: function (media_id, comment_id, user_vote, callback)
	{
		return this.CREATE('/comment/'+media_id, {comment_id: comment_id, vote: user_vote}, callback)
	},
	
	friends: function (username, after, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		return this.GET('/people/friend', {username: username, after: after}, callback);
	},
	
	friendsMutual: function (username, username_with, after, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		var username_with = (username_with != 'undefined' && username_with) ? '/'+username_with : null;
		return this.GET('/people/mutual'+username_with, {username: username, after: after}, callback);
	},
	
	followers: function (username, after, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		return this.GET('/people/followers', {username: username, after: after}, callback);
	},
	
	following: function (username, after, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		return this.GET('/people/following', {username: username, after: after}, callback);
	},
	
	suggestion: function (username, after, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		return this.GET('/people/suggest', {username: username, after: after}, callback);
	},
	
	startFollowing: function (username, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		return this.CREATE('/people/follow', {username: username}, callback);
	},
	
	stopFollowing: function (username, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		return this.DELETE('/people/follow', {username: username}, callback);
	},
	
	blockFollower: function (username, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		return this.UPDATE('/people/follow', {username: username, block: 'yes'}, callback);
	},
	
	unblockFollower: function (username, callback)
	{
		var username = (username != 'undefined' && username) ? username : this.username;
		return this.UPDATE('/people/follow', {username: username, block: 'no'}, callback);
	}
}