/**
 * @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_1_2_AXM_URL: '/proxy/activity-service-1.2/axm/',
	ACTIVITY_SERVICE_POLYLINE_URL: '/proxy/activity-service-1.0/gpolyline/',
	ACTIVITY_SERVICE_GEOCODER_URL: '/proxy/activity-service-1.2/xml/geocoder/',
	ACTIVITY_SERVICE_1_2_JSON_URL: '/proxy/activity-service-1.2/json/',
	ACTIVITY_SERVICE_1_3_JSON_URL: '/proxy/activity-service-1.3/json/',
	ACTIVITY_SEARCH_SERVICE_1_1_JSON_URL: '/proxy/activity-search-service-1.1/json/',

	// Relative Noun Paths
	ACTIVITY_NOUN_PATH: 'activity/',
    ACTIVITY_NOUN_PATH_RELATIVE: 'activityrelative',
	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/',
    ACTIVITY_FAVORITE_NOUN_PATH: 'favorite/',
	COURSE_NOUN_PATH: 'course/',
	ACTIVITY_DETAIL_NOUN_PATH: 'activityDetails/',
	SWIM_DETAIL_NOUN_PATH: 'swimDetails/'
};

/**
 * @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_1_2_JSON_URL + ActivityClientConstants.ACTIVITY_NOUN_PATH + location,
			{},
			callbackFunctions
		);
	},
	
	getGeocoder : function(location, callbackFunctions) {
		this.getResource(
			ActivityClientConstants.ACTIVITY_SERVICE_GEOCODER_URL + location,
			{},
			callbackFunctions	
		);
	},
	
	getActivities : function(callbackFunctions) {
		this.getResource(
				ActivityClientConstants.ACTIVITY_SEARCH_SERVICE_1_1_JSON_URL + ActivityClientConstants.ACTIVITIES_NOUN_PATH,
				{
					limit: 3
				},
				callbackFunctions
		);
	},
	
	getRelative : function(id, startValue, callbackFunctions) {
		this.getResource(
				ActivityClientConstants.ACTIVITY_SEARCH_SERVICE_1_1_JSON_URL + ActivityClientConstants.ACTIVITY_NOUN_PATH_RELATIVE,
				{
					userId: id,
					startPointKey: 'activitySummaryBeginTimestampGmt',
					startPointValue: startValue
				},
				callbackFunctions
		);
	},
	
	/**
	 * Delete an activity
	 * 
	 * @param {String} activityId
	 * @param {Object} callbackFunctions
	 */
	deleteActivity : function(activityId, callbackFunctions) {
		this.deleteResource(
			ActivityClientConstants.ACTIVITY_SERVICE_1_2_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_2_AXM_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_1_2_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_1_2_JSON_URL + ActivityClientConstants.EVENT_TYPE_NOUN_PATH + activityId,
			{
				value: eventTypeKey
			},
			callbackFunctions
		);
	},
	
	/**
	 * Update an activity's course
	 * 
	 * @param {String} activityId
	 * @param {String} eventTypeKey
	 * @param {Object} callbackFunctions
	 */
	updateCourse : function(activityId, coursePk, callbackFunctions) {
		if(coursePk == -1){
			this.deleteCourse(activityId, callbackFunctions);
		}
		else{
			this.postResource(
				ActivityClientConstants.ACTIVITY_SERVICE_1_2_JSON_URL + ActivityClientConstants.COURSE_NOUN_PATH + activityId,
				{
					coursePK: coursePk
				},
				callbackFunctions
			);
		}
	},
	
	/**
	 * Delete an activity's course
	 * 
	 * @param {String} activityId
	 * @param {String} eventTypeKey
	 * @param {Object} callbackFunctions
	 */
	deleteCourse : function(activityId, callbackFunctions) {
		this.deleteResource(
			ActivityClientConstants.ACTIVITY_SERVICE_1_2_JSON_URL + ActivityClientConstants.COURSE_NOUN_PATH + activityId,
			{},
			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_1_2_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_1_2_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_1_2_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_1_2_JSON_URL + ActivityClientConstants.ACTIVITY_PRIVACY_NOUN_PATH + activityId,
			{
				value: privacyKey
			},
			callbackFunctions
		);
	},

   /**
	 * Update an activity's favorite
	 *
	 * @param {String} activityId
	 * @param {String} favoriteKey
	 * @param {Object} callbackFunctions
	 */
	updateFavorite : function(activityId, favoriteKey, callbackFunctions) {
		this.postResource(
			ActivityClientConstants.ACTIVITY_SERVICE_1_2_JSON_URL + ActivityClientConstants.ACTIVITY_FAVORITE_NOUN_PATH + activityId,
			{
				value: favoriteKey
			},
			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
		);
	},	
	
	getAxm: function(activityId, creationHistorySeq, callbackFunctions) {
	    this.getResource(
//	       'http://localhost.garmin.com:9090/activity-service-1.2/axm/activity/' + activityId, {
//	       'http://localhost.garmin.com:8080/proxy/activity-service-1.2/axm/activity/' + activityId, {
	       ActivityClientConstants.ACTIVITY_SERVICE_1_2_AXM_URL + ActivityClientConstants.ACTIVITY_NOUN_PATH + activityId, {
	           full: true,
	           seq: creationHistorySeq
	       },
	       callbackFunctions
	    );
	},
	
	getActivityDetail : function(activityId, callbackFunctions) {
		this.getResource(
			ActivityClientConstants.ACTIVITY_SERVICE_1_2_JSON_URL + ActivityClientConstants.ACTIVITY_DETAIL_NOUN_PATH + activityId,
			{
				maxSize: 250
			},
			callbackFunctions
		);
	},
	getSwimDetail : function(activityId, callbackFunctions) {
		this.getResource(
			ActivityClientConstants.ACTIVITY_SERVICE_1_3_JSON_URL + ActivityClientConstants.SWIM_DETAIL_NOUN_PATH + activityId,
			{
				maxSize: 250
			},
			callbackFunctions
		);
	}

});
