nikefootball.global.services = {
	proxy: null,
	queue: [],
	isProxyLoaded: false,
	onProxyLoaded: function() {
		var self = this;
		$.each(this.queue, function() {
			self.get(this);
		});
		this.queue = [];
	},
	
	getBridge: function() {
		var self = this;
		
		if (f4a_js_flash) {
			var f4a = new f4a_js_flash({'id':'f4a_nike','swfname':'f4a.swf','swfuri':'/nikeos/global/swf/f4a/f4a.swf'});
			f4a.createSwfObject();
			var intervalKey = window.setInterval(function(){	
				if (f4a.checkFlash()){
					window.clearInterval(intervalKey);
					self.proxy = f4a;
					self.isProxyLoaded = true;
					self.onProxyLoaded();
				}
			}, 100);
		}		
	},

	get: function(input) {
		var url = input.url || '';
		var method = input.method || 'GET';
		var data = input.data || {};
		var callback = input.callback || function() {return 'ding'};

		if (url.toLowerCase().substr(0, 4) == 'http') { // remote service call requires Flash proxy
			var dataExploded = '';
			$.each(data, function(name, value) {
				dataExploded += '&' + name + '=' + value;
			});
			if (dataExploded != '') {
				dataExploded = dataExploded.replace('&', '?'); // replaces first occurrence of '&' only
			}
		
			var proxyParams = {
				url: url + dataExploded,
				meth: method,
				contenttype: null,
				callback: callback,
				onready: function(data) {
					if (data) {
						data = '(' + data.replace(/\\n|\\r/g, '') + ')';
						callback(eval(data));  // JSON.parse doesn't work with responses from the proxy!?
					}
				}
			};
		
			if (this.isProxyLoaded) {
				this.proxy.open(proxyParams);
			} else {
				this.queue.push(proxyParams);
			}
		} else { // standard AJAX request for local service
			$.ajax({
				url: url,
				data: data,
				type: method,
				dataType: 'json',
				success: callback,
				error: function(response) {
					throw new Error(response.responseText);
				}
			});
		}
	}
}

$(function() {
	nikefootball.global.services.getBridge();
});

nikefootball.training.host = '';

nikefootball.training.services = {	
	urls: {
		getUserProfile: nikefootball.training.host + '/nikefootball/training/services/getUserProfile.json',
		getLeaderBoard: nikefootball.training.host + '/nikefootball/training/services/getLeaderboard.json',
		getLeaderRank: nikefootball.training.host + '/nikefootball/training/services/getLeaderRank.json',
		getProgressAndScores: nikefootball.training.host + '/nikefootball/training/services/getProgressAndScores.json',
		getProgress: nikefootball.training.host + '/nikefootball/training/services/getProgress.json',
		getScores: nikefootball.training.host + '/nikefootball/training/services/getScores.json',
		submitScore: nikefootball.training.host + '/nikefootball/training/services/submitScore.json',
		updateProgress: nikefootball.training.host + '/nikefootball/training/services/updateProgress.json',
		getVideos: nikefootball.training.host + '/nikeos/p/nikeos/en_US/video_wall/odaptor'
	},
	
	isServiceError: function(data) {
		var isError = data.success == 'ERROR';
		if (isError) {			
			throw new Error(data.errorMessages.join(', '));			
		}
		return isError;
	},
	
	getUserProfile: function(input) {
		var self = this;
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.getUserProfile,
			callback: function(json) {
console.log('--- getUserProfile json: ', json);
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}				
			}
		});

	},
	
	getProgress: function(input) {
console.log('--- getProgress', input);
		var self = this;
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.getProgress,
			callback: function(json) {
console.log('--- nikefootball.global.services.get', json);
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}				
			}
		});
	},
	
	updateProgress: function(input) {
console.log('--- updateProgress ', input);
		var self = this;
		var camp = input.camp || ''; // 'SPARQ', etc
		var week = (input.week != undefined)? input.week : ''; // '0', '1', '2', etc.
		var day = (input.day != undefined)? input.day : ''; // '0', '1', '2', etc.
		var complete = (input.complete === undefined) ? true : input.complete; // 'true' (update), 'false' (delete)
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.updateProgress,
			data: {
				camp: camp,
				week: week,
				day: day,
				complete: complete,
				locale: nikefootball.GLOBAL_VARIABLES.locale
			},
			callback: function(json) {
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}
			}
		});
	},
	
	getScores: function(input) {
		var self = this;
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.getScores,
			data: {
				locale: nikefootball.GLOBAL_VARIABLES.locale
			},
			callback: function(json) {
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}
			}
		});
	},
	
	isSubmittingScore: false,
	submitScore: function(input) {
		var self = this;
		if (self.isSubmittingScore) return;
		self.isSubmittingScore = true;
		var score = input.score || ''; // '1.0234', etc.
		var camp = input.camp || ''; // 'CONTROL', 'SPEED', 'ACCURACY', etc.
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.submitScore,
			data: {
				score: score,
				camp: camp,
				locale: nikefootball.GLOBAL_VARIABLES.locale
			},
			callback: function(json) {
				self.isSubmittingScore = false;
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}
			}
		});
	},
	
	isSubmittingAccuracyScore: false,
	submitAccuracyScore: function(input) {
		var self = this;
		if (self.isSubmittingScore) return;
		self.isSubmittingScore = true;
		var seconds = input.seconds || ''; // '1.02', etc.
		var points = input.points || ''; // '1', etc.
		var camp = input.camp || ''; // 'CONTROL', 'SPEED', 'ACCURACY', etc.
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.submitScore,
			data: {
				seconds: seconds,
				points: points,
				camp: camp,
				locale: nikefootball.GLOBAL_VARIABLES.locale
			},
			callback: function(json) {
				self.isSubmittingScore = false;
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}
			}
		});
	},
	
	isSubmittingSparqScore: false,
	submitSparqScore: function(input) {
		var self = this;
		if (self.isSubmittingSparqScore) return;
		self.isSubmittingSparqScore = true;
		var camp = input.camp || ''; // 'SPARQ'
		var speed = input.speed || '';
		var power = input.power || '';
		var agility = input.agility || '';
		var stamina = input.stamina || '';
		var weight = input.weight || '';
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.submitScore,
			data: {
				speed: speed,
				power: power,
				agility: agility,
				stamina: stamina,
				weight: weight,
				camp: camp,
				locale: nikefootball.GLOBAL_VARIABLES.locale
			},
			callback: function(json) {
				self.isSubmittingSparqScore = false;
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}
			}
		});
	},
	
	getLeaderBoard: function(input) {
		var self = this;
		var camp = input.camp || ''; // 'SPARQ', 'CONTROL', 'SPEED', 'ACCURACY', etc.
		var locale = input.locale || nikefootball.GLOBAL_VARIABLES.locale; // 'fr_FR', etc.
		var startIndex = input.startIndex || ''; // '1', etc.
		var resultCount = input.resultCount || ''; // '20', etc.
		var ageMin = input.ageMin || ''; // '18', etc.
		var ageMax = input.ageMax || ''; // '60', etc.
		var position = input.position || ''; // 'striker', 'midfielder', etc.
		var country = input.country || ''; // 'FR', etc.
		var friendsIds = input.friendsIds || ''; // '1,2,3', etc.
		var officialOnly = input.officialOnly || ''; // 'true', 'false'
		var sparq = input.sparq || ''; // 'speed', 'power', etc.
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.getLeaderBoard,
			data: {
				camp: camp,
				startIndex: startIndex,
				resultCount: resultCount,
				ageMin: ageMin,
				ageMax: ageMax,
				position: position,
				country: country,
				friendsIds: friendsIds,
				officialOnly: officialOnly,
				sparq: sparq,
				locale: locale
			},
			callback: function(json) {
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}
			}
		});
	},

	getLeaderRank: function(input) {
		var self = this;
		var camp = input.camp || ''; // 'SPARQ', 'CONTROL', 'SPEED', 'ACCURACY', etc.
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.getLeaderRank,
			data: {
				camp: camp,
				locale: nikefootball.GLOBAL_VARIABLES.locale
			},
			callback: function(json) {
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}
			}
		});
		// need to get country name based on locale retrieved, which involves an additional lookup
	},
	
	getProgressAndScores: function(input) {
		var self = this;
		var camps = input.camps || ''; // Comma-separated list of camps: 'SPARQ,CONTROL', etc
		var callback = input.callback || function(data) {};
		
		nikefootball.global.services.get({
			url: this.urls.getProgressAndScores,
			data: {
				camps: camps,
				locale: nikefootball.GLOBAL_VARIABLES.locale
			},
			callback: function(json) {
				if (!self.isServiceError(json)) {
					callback({
						data: json
					});
				}
			}
		});
	},
	
	getVideos: function(input) {
		var self = this;
		var channelId = input.channelId || []; // '345', ['345', '355'], etc.
		var locale = input.locale || nikefootball.GLOBAL_VARIABLES.locale; // 'en_GB', 'fr_FR', etc.
		var callback = input.callback || function(data) {};
		
		var videos = [];
		var channels = $.isArray(channelId) ? channelId : [channelId];
		var progress = 0;
		var self = this;
		
		$.each(channels, function() {
			var channel = this;
			
			nikefootball.global.services.get({
				url: self.urls.getVideos,
				data: {
					pageSize: 12,
					page: 1,
					'channelId': this + '',
					callback: false, // does this mean JSON-P is supported?
					sort_by: 'date',
					locale: locale
				},
				callback: function(json) {
					json.channelId = channel;
					videos.push(json);
					
					progress++;
					if (progress == channels.length) {
						callback({
							data: videos
						});
					}
				}
			});
		});
	}
}