var AppInfo = {
    url: 'http://dovesofpeacepeace.appspot.com/',
    title: 'Doves of Peace',
    link: 'http://profile.myspace.com/Modules/Applications/Pages/Canvas.aspx?appId=132566&appvers=dev',
    logo: 'http://dovesofpeacepeace.appspot.com/images/64dove.gif',
    page: '',
    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': 'send'
            });
        });
		Event.observe($('tabs').getElementsByTagName('li')[1], 'click', function (event) {
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'receive'
            });
        });
		Event.observe($('tabs').getElementsByTagName('li')[2], 'click', function (event) {
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'sent'
            });
        });


        OpenSocial.init(UserInfo.req);

       FriendsInfo.init('app', FriendsSelector.viewFriendsList);



        switch (AppInfo.page) {
            case 'send':
                $('sendDiv').show();
                $('receivedDiv').hide();
				$('sentDiv').hide();
				$('send2').className="current";
				$('receive2').className="";
				$('sent2').className="";
                break;
            case 'receive':
				$('receivedDiv').show();
                $('sendDiv').hide();
				$('sentDiv').hide();
				$('send2').className="";
				$('receive2').className="current";
				$('sent2').className="";
                break;
		    case 'sent':
				$('sentDiv').show();
                $('sendDiv').hide();
				$('receivedDiv').hide();

				$('send2').className="";
				$('receive2').className="";
				$('sent2').className="current";
                break;
        }	
    }
};


var OpenSocial = {

    os: null,
    os_token: null,
    dataReqObj: null,

    init : function (callback) {
        this.os = opensocial.Container.get();
        this.os_token = MyOpenSpace.MySpaceContainer.OSToken;

        this.dataReqObj = this.os.newDataRequest();

        if (typeof (callback) === 'function') {//ÇÔ¼öÀÌ¸é ÇØ´çÇÏ´Â ÇÔ¼ö È£Ãâ
                callback();
        }
    },

    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) {
            }
        }
    }
};

var UserInfo = {

    uid : null,
    name : null,
    thumb : null,
    profile_link : null,
    key: null,

    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') {
                    					
                    //Character.init();//sendbtn part
					FriendsInfo.init('app', FriendsSelector.viewFriendsList);
					Event.observe('send','click', function (event) {
					 Feed.init();

				  });

                }
                else if (AppInfo.page === 'receive') {
                    Receive_func.init();
                }
				else if (AppInfo.page === 'sent') {
                    Sent_func.init();
                }
            }
        });
    }
};

var Receive_func={
	name:[],
	thumb:[],
	amount:[],
	data:[],

	 init:function(){
		var data = {
			receiver_key: UserInfo.key
        };
		var url = AppInfo.url + 'history/list';

		var itemnum=0;
		var sendernum=0;
		OpenSocial.ajax(url, data, function (res) {
			if (res.data['error'] === 0) {
				sendernum= res.data['data'];
		
				for(var i=0;i<sendernum.length;i++){
					Receive_func.name[i] = res.data['data'][i]['sender']['name'];	// for google app engine datastore
					Receive_func.thumb[i] = res.data['data'][i]['sender']['thumb'];
					Receive_func.amount[i] = res.data['data'][i]['amount'];
					itemnum=itemnum + Receive_func.amount[i];
				}

				var itemnum500= Math.floor(itemnum/500);
				var itemnum100= Math.floor((itemnum%500)/100);
				var itemnum50= Math.floor(((itemnum%500)%100)/50);
				var itemnum10= Math.floor((((itemnum%500)%100)%50)/10);
				var itemnum1= itemnum%10;

				for(i=0;i<itemnum500;i++){
					$('recv_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove500.gif" /></div>';
				}
				for(i=0;i<itemnum100;i++){
					$('recv_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove100.gif" /></div>';
				}
				for(i=0;i<itemnum50;i++){
					$('recv_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove50.gif" /></div>';
				}
				for(i=0;i<itemnum10;i++){
					$('recv_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove10.gif" /></div>';
				}
				for(i=0;i<itemnum1;i++){
					$('recv_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove.gif" /></div>';
				}

				$('recv_cnt').innerHTML+= itemnum;	

				for(i=0;i<sendernum.length; i++){
					$('recv_users').innerHTML += '<div id="historyput"><img src="'+ Receive_func.thumb[i] + '" /><br /><span>'+ Receive_func.name[i]+ '(<b>'+ Receive_func.amount[i]+'</b>)</span></div>';
				}
			}
				
		});
	 }
};

var Sent_func={
	uid:[],
	name:[],
	thumb:[],
	amount:[],
	data:[],

	 init:function(){
		var data = {
			sender_key: UserInfo.key
        };

		var url = AppInfo.url + 'history/list2';

		var itemnum=0;
		var sendernum=0;

		OpenSocial.ajax(url, data, function (res) {
			if (res.data['error'] === 0) {
				sendernum= res.data['data'];

				for(var i=0;i<sendernum.length;i++){
					Sent_func.name[i] = res.data['data'][i]['receiver']['name'];	// for google app engine datastore
					Sent_func.thumb[i] = res.data['data'][i]['receiver']['thumb'];
					Sent_func.amount[i] = res.data['data'][i]['amount'];
					itemnum=itemnum + Sent_func.amount[i];
				}

				var itemnum500= Math.floor(itemnum/500);
				var itemnum100= Math.floor((itemnum%500)/100);
				var itemnum50= Math.floor(((itemnum%500)%100)/50);
				var itemnum10= Math.floor((((itemnum%500)%100)%50)/10);
				var itemnum1= itemnum%10;

				for(i=0;i<itemnum500;i++){
					$('send_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove500.gif" /></div>';
				}
				for(i=0;i<itemnum100;i++){
					$('send_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove100.gif" /></div>';
				}
				for(i=0;i<itemnum50;i++){
					$('send_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove50.gif" /></div>';
				}
				for(i=0;i<itemnum10;i++){
					$('send_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove10.gif" /></div>';
				}
				for(i=0;i<itemnum1;i++){
					$('send_doves').innerHTML+='<div id="historyimgput"><img src="'+AppInfo.url+'images/dove.gif" /></div>';
				}

				$('send_cnt').innerHTML += itemnum;	

				for(i=0;i<sendernum.length; i++){
					$('send_users').innerHTML += '<div id="historyput"><img src="'+Sent_func.thumb[i]+'" /></a><br /><span>'+Sent_func.name[i]+ '(<b>'+Sent_func.amount[i]+'</b>)</span></div>';
				}
			}
				
		});
	 }
};


var FriendsInfo = {

    mode: 'app',
    added: [],
    data: [],
    callback: null,
    first: 1,
    max: 80,

    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,
                thumb: selected[idx].getElementsByTagName('img')[0].src,
				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);
        }
         try
         {
		 console.log('send hit');			
         }
         catch (e)
         {
         }

        if (Feed.selectedFriends[Feed.idx].hasapp === 'true') {
            
            var strTemplate =   '<img src=\"#{logo}\" alt=\"#{title}\" />' +
                                '<p>' +
                                '   Hey! #{sender} sent you a Dove of Peace! ' +
                                '   <a href=\"#{link}\">Click here to receive the Dove.</a>' +
                                '</p>';

            var template = new Template(strTemplate);
            
            var msg = opensocial.newMessage(template.evaluate({
                sender: UserInfo.name,
                title: AppInfo.title,
                logo: AppInfo.logo,
                link: AppInfo.link
            }));
            
            msg.setField(opensocial.Message.Field.TITLE, "Dove of Peace");
            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 invited you at #{title}. ' + '#{sender} wants to spread Peace with you. ' + 'Click \"Add\" below to Add.';
            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, "Dove of Peace");

            OpenSocial.os.requestShareApp(Feed.selectedFriends[Feed.idx].uid, msg, Feed.sendCallback);
        }
    },

	sendCallback : function (res) {

	if(res.data_===1)
		{
			Feed.update();
		}
		else
		{
			++Feed.idx;
			if (Feed.idx < Feed.selectedFriends.size()) {
				Feed.send();
			}
			else {
				window.parent.location = AppInfo.link;
			}
		}
	},
	update:function(){
		var data = {
			sender_key: UserInfo.key,
			receiver_uid: Feed.selectedFriends[Feed.idx].uid,
			receiver_name: Feed.selectedFriends[Feed.idx].name,
			receiver_thumb: Feed.selectedFriends[Feed.idx].thumb
		};
		
		var url = AppInfo.url + 'history/update';
		OpenSocial.ajax(url, data, function (res){
			++Feed.idx;
			if (Feed.idx < Feed.selectedFriends.size()) {
				Feed.send();
			}
			else {
				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>' +
                                '   <a id=\"challengeUser_#{uid}\">' +
                                '	<span class="name">#{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'] ? 'images/comment_icon.gif' : 'images/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');
            });
        }

        Event.observe($('selectAllBtn'), 'click', function(){
            FriendsSelector.selectAll();
        });

        Event.observe($('clearBtn'), '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;
            }
        });
    

        Event.observe($('searchUsersField'), '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();
                    }
                });
            }
        });
        
         Event.observe($('searchUsersField'), 'blur', function () {
            var inputBox = $('searchUsersField');

            if (inputBox.value.blank()) {
                inputBox.value = 'Start Typing a Friend\'s Name';
                FriendsSelector.handleInputBox = 'init';
            }
        });
        
        Event.observe($('seeAllBtn'), 'click', function () {
            $('searchUsersField').value = 'Start Typing a Friend\'s Name';
            FriendsSelector.handleInputBox = 'init';

            FriendsSelector.seeAll();
        });
    }
};


Event.observe(window, 'load', function(){    

	AppInfo.init();
});
