var	AppInfo	= {
	url: 'http://msdunkin.appspot.com/',
	title: 'Send Glitter!',
	link: 'http://profile.myspace.com/Modules/Applications/Pages/Canvas.aspx?appId=134776',
	logo: '',
	page: 'send',
	init: function(){
		var	prefs =	gadgets.views.getParams();
		AppInfo.page = prefs['page'] !== undefined ? prefs['page'] : 'send';
		/*
		Event.observe($('tabs').getElementsByTagName('li')[0], 'click',	function(event){
			var	canvas_view	= new gadgets.views.View('canvas');
			gadgets.views.requestNavigateTo(canvas_view, {
				'page':	'home'
			});
		});*/
		Event.observe($('tabs').getElementsByTagName('li')[0], 'click',	function(event){
			var	canvas_view	= new gadgets.views.View('canvas');
			gadgets.views.requestNavigateTo(canvas_view, {
				'page':	'send'
			});
		});
		Event.observe($('tabs').getElementsByTagName('li')[1], 'click',	function(event){
			var	canvas_view	= new gadgets.views.View('canvas');
			gadgets.views.requestNavigateTo(canvas_view, {
				'page':	'received'
			});
		});
		
		
		$('sendBtn').observe('click', function(event){
			Feed.init(Gift.send);
		});
		
		OpenSocial.init(UserInfo.req);
		
		
		switch (AppInfo.page) {
			/*case 'home':
				$('homeDiv').show();
				$('sendDiv').hide();
				$('receivedDiv').hide();
				break;*/
			case 'send':
			//	$('homeDiv').hide();
				$('sendDiv').show();
				$('receivedDiv').hide();
				break;
			case 'received':
			//	$('homeDiv').hide();
				$('sendDiv').hide();
				$('receivedDiv').show();
				break;
		}
	}
};
/**
 * Class name :	OpenSocial
 *
 * Instances :
 *	- os : opensocial container
 *	- os_token : myspace opensocial	token
 *	- dataReqObj : object of data request
 * Methods :
 *	- init() : initialization function for opensocial
 *	- ajax() : ajax	function using opensocial io gadget
 */
var	OpenSocial = {
	/* Instances */
	os:	null,
	os_token: null,
	dataReqObj:	null,
	/* Methods */
	init: function(callback){
		this.os	= opensocial.Container.get();
		this.os_token =	MyOpenSpace.MySpaceContainer.OSToken;
		
		this.dataReqObj	= this.os.newDataRequest();
		
		if (typeof(callback) === 'function') {
			callback();
		}
	},
	/**
	 *	method name	: ajax()
	 *
	 *	url	: target url of	ajax request
	 *	data : post	data of	ajax request
	 *	callback: callback function	of ajax	request
	 */
	ajax: function(url,	data, callback){
		if (typeof(callback) === 'function') {
			var	params = {};
			
			params[gadgets.io.RequestParameters.CONTENT_TYPE] =	gadgets.io.ContentType.JSON;
			params[gadgets.io.RequestParameters.METHOD]	= gadgets.io.MethodType.POST;
			params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(data);
			params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
			
			gadgets.io.makeRequest(url,	callback, params);
		}
		else {
			try	{ // for firefox javscript console
				console.log('callback parameter	makes error.');
			} 
			catch (e) {
			}
		}
	}
};

/**
 * Class name :	UserInfo
 *
 * Instances :
 *	- uid :	uid	of viewer
 *	- name : display name of viewer
 *	- thumb	: thumbnail	image of viewer
 *	- profile_link : profile link of viewer
 *
 * Methods :
 *	- req()	: retrieve user	information
 *	- reqCallback()	: callback function	for	userReq()
 *	- update() : update	user information to	database
 */
var	UserInfo = {
	/* instances */
	uid: null,
	name: null,
	thumb: null,
	profile_link: null,
	key: null, // for google app engine	datastore
	/* methods */
	req: function(){
		var	viewerReq =	OpenSocial.os.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER);
		
		OpenSocial.dataReqObj.add(viewerReq, 'userInfo');
		OpenSocial.dataReqObj.send(UserInfo.reqCallback);
	},
	reqCallback: function(res){
		if (res.hadError())	{
			var	data = res.get('userInfo');
			
			try	{
				console.log(data.getErrorCode()	+ '\n' + data.getErrorMessage());
			} 
			catch (e) {
			
			}
		}
		else {
			var	viewer = res.get('userInfo').getData();
			
			UserInfo.uid = viewer.getId();
			UserInfo.name =	viewer.getDisplayName();
			UserInfo.thumb = viewer.getField(opensocial.Person.Field.THUMBNAIL_URL);
			UserInfo.profile_link =	viewer.getField(opensocial.Person.Field.PROFILE_URL);
			
			UserInfo.update();
		}
	},
	update:	function(){
		var	data = {
			uid: this.uid,
			name: this.name,
			thumb: this.thumb,
			profile_link: this.profile_link
		};
		
		var	url	= AppInfo.url +	'member/add';
		
		OpenSocial.ajax(url, data, function(res){
			if (res.data['error'] === 0) {
				UserInfo.key = res.data['data']['user_key']; //	for	google app engine datastore
				
					if (AppInfo.page === 'send') {
						FriendsInfo.init('app',	FriendsSelector.viewFriendsList);
						$('giftList').update('');
						OpenSocial.ajax(AppInfo.url	+ 'gift/list', '', function(res){

							var	strTemplate	=	'<li id=\"#{gift_key}\">' +
													'<a id=\"#{gift_url}\">'+
												'	<img src="#{gift_url}">' +
													'</a>'+
												'</li>';
							var	giftTemplate = new Template(strTemplate);
							res.data['data'].each(
								function (gift)	{
									$('giftList').insert(
										giftTemplate.evaluate({
											'gift_url':	gift['image'],
											'gift_key' : gift['gift_key']
										})
									);
								}
							);
							Character.init();
						});

						
					}
					else 
						if (AppInfo.page === 'received') {
							var	data = {
								receiver_key: UserInfo.key
							};
							
							OpenSocial.ajax(AppInfo.url	+ 'history/rcvlist', data, function(res){
								if (res.data['error'] === 0) {
									if (res.data['error'] === 0) {
										Gift.rcvList(res.data['data']);
									}
								}
							});
						}
			}
		});
	}
};

/**
 * Class name :	FriendsInfo
 *
 * Instances :
 *	- list : list of viewer's friends
 *	- obj :	json obj of	viewer's friends
 *	- callback : callback function for friends request
 *	- first	: start	number of friends request; default = 0
 */
var	FriendsInfo	= {
	/* instances */
	mode: 'app',
	added: [],
	data: [],
	callback: null,
	first: 1,
	max: 80,
	/* methods */
	init: function(mode, callback){
		FriendsInfo.mode = mode;
		FriendsInfo.first =	1;
		
		if (typeof(callback) === 'function') {
			FriendsInfo.callback = callback;
		}
		
		if (FriendsInfo.mode === 'app')	{
			FriendsInfo.added =	[];
		}
		else 
			if (FriendsInfo.mode === 'all')	{
				FriendsInfo.data = [];
			}
		
		FriendsInfo.req();
	},
	req: function(){
		var	params = {};
		params[opensocial.DataRequest.PeopleRequestFields.FIRST] = FriendsInfo.first;
		params[opensocial.DataRequest.PeopleRequestFields.MAX] = FriendsInfo.max;
		params[opensocial.DataRequest.PeopleRequestFields.SORT_ORDER] =	opensocial.DataRequest.SortOrder.NAME;
		
		if (FriendsInfo.mode === 'all')	{
			params[opensocial.DataRequest.PeopleRequestFields.FILTER] =	opensocial.DataRequest.FilterType.ALL;
		}
		else 
			if (FriendsInfo.mode === 'app')	{
				params[opensocial.DataRequest.PeopleRequestFields.FILTER] =	opensocial.DataRequest.FilterType.HAS_APP;
			}
		
		var	friendsIdSpec =	opensocial.newIdSpec({
			'userId': 'VIEWER',
			'groupId': 'FRIENDS'
		});
		
		var	viewerFriendsReq = OpenSocial.os.newFetchPeopleRequest(friendsIdSpec, params);
		OpenSocial.dataReqObj.add(viewerFriendsReq,	'friendsReq');
		
		OpenSocial.dataReqObj.send(FriendsInfo.reqCallback);
	},
	reqCallback: function(res){
		if (res.hadError())	{
			var	data = res.get('friendsReq');
			try	{
				console.log(data.getErrorCode()	+ '\n' + data.getErrorMessage());
				FriendsInfo.max	-= 1;
				FriendsInfo.req();
			} 
			catch (e) {
			
			}
		}
		else {
			var	obj	= res.get('friendsReq').getData();
			
			if (FriendsInfo.mode === 'app')	{
				obj.each(function(friend){
					FriendsInfo.added.push(friend.getId());
				});
			}
			else 
				if (FriendsInfo.mode === 'all')	{
					var	handle_list	= false;
					obj.each(function(friend){
						FriendsInfo.data.push({
							'uid': friend.getId(),
							'name':	friend.getDisplayName(),
							'thumb': friend.getField(opensocial.Person.Field.THUMBNAIL_URL),
							'profile_link':	friend.getField(opensocial.Person.Field.PROFILE_URL),
							'has_app': FriendsInfo.added.indexOf(friend.getId()) === -1	? false	: true
						});
					});
				}
			
			if (obj.getTotalSize() < FriendsInfo.max) {
				FriendsInfo.first =	1;
				
				if (typeof(FriendsInfo.callback) === 'function') {
					FriendsInfo.callback();
				}
				
				if (FriendsInfo.mode === 'app')	{
					FriendsInfo.added.push(UserInfo.uid);
					
					FriendsInfo.init('all');
				}
			}
			else {
				FriendsInfo.first += FriendsInfo.max;
				FriendsInfo.req();
			}
		}
	}
};

var	Feed = {
	selectedFriends: null,
	idx: 0,
	callback: null,
	init: function(callback){
		Feed.selectedFriends = [];
		var	selected = $('friendsList').getElementsByClassName('selected');
		
		for	(var idx = 0; idx <	selected.length; ++idx)	{
			var	uid	= selected[idx].id.split('_')[1];
			Feed.selectedFriends.push({
				uid: uid,
				name: selected[idx].getElementsByClassName('name')[0].innerHTML,
				hasapp:	$('hasapp_'	+ uid).value
			});
		}
		
		Feed.idx = 0;
		
		if (typeof(callback) === 'function') {
			Feed.callback =	callback;
		}
		
		if (Feed.selectedFriends.size()	> 0) {
			Feed.send();
		}
	},
	send: function(){
		if (typeof(Feed.callback) === 'function') {
			Feed.callback(Feed.selectedFriends[Feed.idx].uid);
		}
		if (Feed.selectedFriends[Feed.idx].hasapp === 'true') {
			var	strTemplate	= '<img	src=\"#{logo}\"	alt=\"#{title}\" style="width: 100px"/>' +
			'<p>' +
			'	#{sender} has just sent you glitter! ' +
			'	<a href=\"#{link}\">Click here to send one back</a>' +
			'</p>';
			
			var	template = new Template(strTemplate);
			//console.log(Character.selgift);
			var	msg	= opensocial.newMessage(template.evaluate({
				sender:	UserInfo.name,
				title: AppInfo.title,
				logo: Character.selgift,
				link: AppInfo.link
			}));
			
			msg.setField(opensocial.Message.Field.TITLE, "Send Glitter!");
			msg.setField(opensocial.Message.Field.TYPE,	opensocial.Message.Type.PUBLIC_MESSAGE);
			
			OpenSocial.os.requestSendMessage(Feed.selectedFriends[Feed.idx].uid, msg, Feed.sendCallback);
		}
		else {
			var	strTemplate	= 'Hey #{receiver},	#{sender} has just sent you glitter! ' +
			'Click \"Add\" below to	send glitter!';
			
			var	template = new Template(strTemplate);
			
			var	msg	= opensocial.newMessage(template.evaluate({
				receiver: Feed.selectedFriends[Feed.idx].name,
				sender:	UserInfo.name,
				title: AppInfo.title
			}));
			
			msg.setField(opensocial.Message.Field.TITLE, "Send Glitter!");
			
			OpenSocial.os.requestShareApp(Feed.selectedFriends[Feed.idx].uid, msg, Feed.sendCallback);
		}
	},
	sendCallback: function(res){
        if (res === MyOpenSpace.PostTo.Result.ERROR) {
	    //console.log('callback gave error');
        }
        else if (res.data_ === 0) {
	    window.parent.location = AppInfo.link;
        }
        else {
        }
		++Feed.idx;
		try	{
			console.log(Feed.idx);
		} 
		catch (e) {
		
		}
		if (Feed.idx < Feed.selectedFriends.size())	{
			Feed.send();
		}
		else {
			//Game.view();
			window.parent.location = AppInfo.link;
		}
	}
};

var	FriendsSelector	= {
	list: null,
	size: 0,
	selected_num: 0,
	handleInputBox:	'init',
	clear: function(){
		for	(var idx = 0; idx <	FriendsSelector.size; ++idx) {
			FriendsSelector.list[idx].className	= '';
		}
	},
	seeAll:	function(){
		for	(var idx = 0; idx <	FriendsSelector.size; ++idx) {
			FriendsSelector.list[idx].parentNode.style.display = '';
		}
	},
	selectAll: function(){
		$('searchUsersField').value	= 'Start Typing a Friend\'s Name';
		FriendsSelector.handleInputBox = 'init';
		
		for	(var idx = 0; idx <	FriendsSelector.size; ++idx) {
			var	friend = FriendsSelector.list[idx];
			
			friend.parentNode.style.display	= '';
			
			if (!friend.hasClassName('selected')) {
				friend.toggleClassName('selected');
			}
			
			FriendsSelector.selected_num = FriendsSelector.size;
		}
	},
	viewFriendsList: function(){
		if (FriendsInfo.data.size()	> 0) {
			$('friendsList').update('');
			
			var	strTemplate	= '<li style="overflow:hidden;">' +
			'	<a id=\"challengeUser_#{uid}\">' +
			'	<span class="name" style="overflow:hidden;">#{name}</span>' +
			'	<span class="thumb">' +
			'		<img src=\"#{thumb}\" />' +
			'	</span>' +
			'		<img class=\"msgType\" src=\"#{msg_img}\" alt=\"#{msg_type}\" />' +
			'	</a>' +
			'	<input type=\"hidden\" name=\"hasapp[]\" id=\"hasapp_#{uid}\" value=\"#{has_app}\" />' +
			'</li>';
			
			var	friendsTemplate	= new Template(strTemplate);
			
			FriendsInfo.data.each(function(friend){
				$('friendsList').insert(friendsTemplate.evaluate({
					'uid': friend['uid'],
					'thumb': friend['thumb'],
					'name':	friend['name'],
					'msg_img': AppInfo.url + (friend['has_app']	? 'img/comment_icon.gif' : 'img/invite_icon.gif'),
					'msg_type':	friend['has_app'] ?	'added'	: 'have not added',
					'has_app': friend['has_app']
				}));
			});
			
			FriendsSelector.init();
		}
	},
	init: function(){
		FriendsSelector.list = $('friendsList').getElementsByTagName('a');
		FriendsSelector.size = FriendsSelector.list.length;
		FriendsSelector.selected_num = 0;
		FriendsSelector.handleInputBox = 'init';
		
		$('searchUsersField').value	= 'Start Typing a Friend\'s Name';
		
		for	(var idx = 0; idx <	FriendsSelector.size; ++idx) {
			Event.observe(FriendsSelector.list[idx], 'click', function(event){
				Event.findElement(event, 'a').toggleClassName('selected');
			});
		}
		
		$('selectAllBtn').observe('click', function(){
			FriendsSelector.selectAll();
		});
		
		// clear selections
		$('clearBtn').observe('click', function(){
			for	(var idx = 0; idx <	FriendsSelector.size; ++idx) {
				var	friend = FriendsSelector.list[idx];
				
				if (!friend.parentNode.style.display !== 'none'	&& friend.hasClassName('selected'))	{
					friend.toggleClassName('selected');
				}
				
				--FriendsSelector.selected_num;
			}
		});
		
		// search users	by keyword
		$('searchUsersField').observe('focus', function(){
			if (FriendsSelector.handleInputBox === 'init') {
				$('searchUsersField').value	= '';
				FriendsSelector.handleInputBox = 'set';
				
				new	Form.Element.Observer('searchUsersField', 0.2, function(element, value){
				
					if (value !== '' &&	FriendsSelector.handleInputBox !== 'init') {
						for	(var idx = 0; idx <	FriendsSelector.size; ++idx) {
							var	lower_value	= value.toLowerCase();
							var	nameSpan = FriendsSelector.list[idx].getElementsByClassName('name')[0];
							var	lower_name = nameSpan.innerHTML.toLowerCase();
							
							if (lower_name.include(lower_value)) {
								FriendsSelector.list[idx].parentNode.style.display = '';
							}
							else {
								FriendsSelector.list[idx].parentNode.style.display = 'none';
							}
						}
					}
					else {
						FriendsSelector.seeAll();
					}
				});
			}
		});
		
		$('searchUsersField').observe('blur', function(){
			var	inputBox = $('searchUsersField');
			
			if (inputBox.value.blank())	{
				inputBox.value = 'Start Typing a Friend\'s Name';
				FriendsSelector.handleInputBox = 'init';
			}
		});
		
		$('seeAllBtn').observe('click',	function(){
			$('searchUsersField').value	= 'Start Typing a Friend\'s Name';
			FriendsSelector.handleInputBox = 'init';
			
			FriendsSelector.seeAll();
		});
		
	}
};
var	Gift = {
	key: null,
	page: 0,
	selected: null,
	send: function(receiver_uid){
		OpenSocial.ajax(AppInfo.url	+ 'gift/list', '', function(res){
			if (res.data['error'] === 0) {
				var	selected = $('giftList').getElementsByClassName('selected');
				
				var	data = {
					sender_key:	UserInfo.key,
					receiver_uid: receiver_uid,
					receiver_name: Feed.selectedFriends[Feed.idx].name,
					gift_key: Character.selected
					
				};
				OpenSocial.ajax(AppInfo.url	+ 'history/update',	data, function(res){
				});
			}
		});
		
	},
	sendBack: function(uid,	name){
		Feed.selectedFriends = [];
		
		uid	= 'myspace.com:' + uid;
		Feed.selectedFriends.push({
			uid: uid,
			name: name,
			hasapp:	'true'
		});
		
		Feed.idx = 0;
		
			
		//console.log(Character.selected);
		var	data = {
			sender_key:	UserInfo.key,
			receiver_uid: uid,
			receiver_name: name,
			gift_key: Character.selected
		};
		
		OpenSocial.ajax(AppInfo.url	+ 'history/update',	data, function(res){
		});
		
		Feed.send();
		
	},
	list: function(res){
	
	},
	sendList: function(res){
		sentCnt	= res.length;
		
		$('sendHeartsTop').update('');
		var	strTemplate	= '<li	class=\"giftBoxContainer\">' +
		'<div class=\"giftImg\">' +
		'<img src=\"#{giftImg}\" />' +
		'</div>' +
		'<div class=\"giftData\">' +
		'<div>'	+
		'<a	href=\"http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&friendid=#{uid}\">#{name}</a>' +
		'</div>' +
		'<div>'	+
		'Sent #{time}' +
		'</div>' +
		'</div>' +
		'</li>'
		
		var	giftTemplate = new Template(strTemplate);
		
		for	(var idx = 0; idx <	sentCnt; ++idx)	{
			$('sendHeartsTop').insert(giftTemplate.evaluate({
				'giftImg': res[idx]['gift']['image'],
				'uid': res[idx]['receiver']['uid'].split(":")[1],
				'name':	res[idx]['receiver']['name'],
				'time':	res[idx]['time'].split('.')[0]
			}));
		}
	},
	rcvList: function(res){
		rcvCnt = res.length;
		
		$('yourHearts').update('');
		//$('rcvGiftBoxTitle').innerHTML = '&nbsp&nbsp&nbsp	You	received ' + rcvCnt	+ '	sneakers.';
		var	strTemplate	= '<li	class=\"giftBoxContainer\" id=\"#{key\}">' +
		'<div class=\"giftImg\">' +
		'<img src=\"#{giftImg}\" />' +
		'</div>' +
		'<div class=\"giftData\">' +
		'<div>'	+
		'<span style="color: deepPink">#{name}</span>' +
		'</div>' +
		'<div>'	+
		'Received #{time}' +
		'</div>' +
		'<div>'	+
		'<a	onclick=\"Gift.sendBack(\'#{uid}\',\'#{name}\',\'#{item}\');\">Send	#{name}	back this glitter</a>' +
		'</div>' +
		'</div>' +
		'</li>'
		
		var	giftTemplate = new Template(strTemplate);
		
		for	(var idx = 0; idx <	rcvCnt;	++idx) {
			$('yourHearts').insert(giftTemplate.evaluate({
				'giftImg': res[idx]['gift']['image'],
				'name':	res[idx]['sender']['name'],
				'uid': res[idx]['sender']['uid'].split(":")[1],
				'time':	res[idx]['time'].split('.')[0],
				'key': res[idx]['key']
			}));
		}
		shoeaholic.receive();
	}
};

var	Character =	{
	list: [],
	selected: null,
	selgift: null,
	init: function(){
		Character.list = [];
		Character.selected = null;
		
		var	items =	$('giftList').getElementsByTagName('a');
		
		for	(var idx = 0; idx <	items.length; idx += 1)	{
			Event.observe(items[idx], 'click', function(event){
				var	selected = Event.findElement(event,	'a');

				Character.selected = selected;
				$('giftsSelector').hide();
				$('friendsSelector').show();
				Character.selected = this.parentNode.id;
				Character.selgift = this.id;
				//console.log(Character.selected);
			});
		}
	}
};

Event.observe(window, 'load', function(){
	AppInfo.init();
});

var shoeaholic = {

	receive: function() {

		var list = $('yourHearts').getElementsByTagName('img');
		
		for (var idx = 0; idx < list.length; idx++)
		{
			Event.observe(list[idx], 'click', function(event){
				var selected = Event.findElement(event, 'li').id;
			});
		}
	}
}
