/**
 * @filename ActivityClient.js
 * 
 * @description Wrapper class for making calls to the Activity web service
 * 
 * @author Michael Bina
 * @email michael.bina@garmin.com
 *
 * Copyright(c) 2008, Garmin International
 */

if(Garmin == undefined) var Garmin = {};
if(Garmin.service == undefined) Garmin.service = {};

/**
 *
 */
var ActivityClientConstants = {
	ACTIVITY_SERVICE_JSON_URL: '/proxy/activity-service-1.0/json/',
	ACTIVITY_SERVICE_1_1_JSON_URL: '/proxy/activity-service-1.1/axm/',
	ACTIVITY_SERVICE_POLYLINE_URL: '/proxy/activity-service-1.0/gpolyline/',
	
	// Relative Noun Paths
	ACTIVITY_NOUN_PATH: 'activity/',
	ACTIVITIES_NOUN_PATH: 'activities',
	ACTIVITY_NAME_NOUN_PATH: 'name/',
	ACTIVITY_DESCRIPTION_NOUN_PATH: 'description/',
	ACTIVITY_TYPE_NOUN_PATH: 'type/',
	EVENT_TYPE_NOUN_PATH: 'event_type/',
	ACTIVITY_TIME_ZONE_NOUN_PATH: 'timezone/',
	ACTIVITY_PRIVACY_NOUN_PATH: 'privacy/'
};

/**
 * @class Garmin.services.ActivityClient
 * 
 * @constructor
 * @param {Object} config
 * 
 */
Garmin.service.ActivityClient = Class.create();

Garmin.service.ActivityClient.prototype = Object.extend(new Garmin.service.Client(), {

	initialize: function(config) {
		this.config = config;
	},

	/**
	 * Get an activity
	 * 
	 * @param {String} activityId
	 * @param {Object} callbackFunctions
	 */
	getActivity : function(activityId, callbackFunctions) {
		this.getResource(
			ActivityClientConstants.ACTIVITY_SERVICE_JSON_URL + ActivityClientConstants.ACTIVITY_NOUN_PATH + activityId,
			{},
			callbackFunctions
		);
	},
	
	getActivities : function(callbackFunctions) {
		this.getResource(
				'/proxy/activity-search-service-1.1/json/activities',
				{
					limit: 3
				},
				callbackFunctions
		);
	},
	
	/**
	 * Delete an activity
	 * 
	 * @param {String} activityId
	 * @param {Object} callbackFunctions
	 */
	deleteActivity : function(activityId, callbackFunctions) {
		this.deleteResource(
			ActivityClientConstants.ACTIVITY_SERVICE_JSON_URL + ActivityClientConstants.ACTIVITY_NOUN_PATH + activityId,
			{},
			callbackFunctions
		);
	},
	
	/**
	 * Delete an array of activities
	 * 
	 * @param {Array} activityIds
	 * @param {Object} callbackFunctions
	 */
	deleteActivities : function(activityIds, callbackFunctions) {
		this.deleteResource(
			ActivityClientConstants.ACTIVITY_SERVICE_1_1_JSON_URL + ActivityClientConstants.ACTIVITIES_NOUN_PATH,
			{
				ids: activityIds
			},
			callbackFunctions
		);
	},
	
	/**
	 * Update an activity's activity type
	 * 
	 * @param {String} activityId
	 * @param {String} activityTypeKey
	 * @param {Object} callbackFunctions
	 */
	updateActivityType : function(activityId, activityTypeKey, callbackFunctions) {
		this.postResource(
			ActivityClientConstants.ACTIVITY_SERVICE_JSON_URL + ActivityClientConstants.ACTIVITY_TYPE_NOUN_PATH + activityId,
			{
				value: activityTypeKey
			},
			callbackFunctions
		);
	},
	
	/**
	 * Update an activity's event type
	 * 
	 * @param {String} activityId
	 * @param {String} eventTypeKey
	 * @param {Object} callbackFunctions
	 */
	updateEventType : function(activityId, eventTypeKey, callbackFunctions) {
		this.postResource(
			ActivityClientConstants.ACTIVITY_SERVICE_JSON_URL + ActivityClientConstants.EVENT_TYPE_NOUN_PATH + activityId,
			{
				value: eventTypeKey
			},
			callbackFunctions
		);
	},
	
	/**
	 * Update an activity's name
	 * 
	 * @param {String} activityId
	 * @param {String} activityName
	 * @param {Object} callbackFunctions
	 */
	updateName : function(activityId, activityName, callbackFunctions) {
		this.postResource(
			ActivityClientConstants.ACTIVITY_SERVICE_JSON_URL + ActivityClientConstants.ACTIVITY_NAME_NOUN_PATH + activityId,
			{
				value: activityName
			},
			callbackFunctions
		);
	},
	
	/**
	 * Update an activity's description
	 * 
	 * @param {String} activityId
	 * @param {String} description
	 * @param {Object} callbackFunctions
	 */
	updateDescription : function(activityId, description, callbackFunctions) {
		this.postResource(
			ActivityClientConstants.ACTIVITY_SERVICE_JSON_URL + ActivityClientConstants.ACTIVITY_DESCRIPTION_NOUN_PATH + activityId,
			{
				value: description
			},
			callbackFunctions
		);
	},
	
	/**
	 * Update an activity's time zone
	 * 
	 * @param {String} activityId
	 * @param {String} timeZoneKey
	 * @param {Object} callbackFunctions
	 */
	updateTimeZone : function(activityId, timeZoneKey, callbackFunctions) {
		this.postResource(
			ActivityClientConstants.ACTIVITY_SERVICE_JSON_URL + ActivityClientConstants.ACTIVITY_TIME_ZONE_NOUN_PATH + activityId,
			{
				value: timeZoneKey
			},
			callbackFunctions
		);
	},
	
	/**
	 * Update an activity's privacy
	 * 
	 * @param {String} activityId
	 * @param {String} privacyKey
	 * @param {Object} callbackFunctions
	 */
	updatePrivacy : function(activityId, privacyKey, callbackFunctions) {
		this.postResource(
			ActivityClientConstants.ACTIVITY_SERVICE_JSON_URL + ActivityClientConstants.ACTIVITY_PRIVACY_NOUN_PATH + activityId,
			{
				value: privacyKey
			},
			callbackFunctions
		);
	},
	
	/**
	 * Get polyline for an activity
	 * 
	 * @param {String} activityId
	 * @param {Object} callbackFunctions
	 */
	getPolyline : function(activityId, callbackFunctions) {
		this.getResource(
			ActivityClientConstants.ACTIVITY_SERVICE_POLYLINE_URL + ActivityClientConstants.ACTIVITY_NOUN_PATH + activityId,
			{
				full: true
			},
			callbackFunctions
		);
	}

});