var AppInfo = {
    url: 'http://cheerupupup.appspot.com/',
    title: '',
    link: 'http://profile.myspace.com/Modules/Applications/Pages/Canvas.aspx?appId=131715&appvers=dev',
    logo: '',
    page: 'main',
    init: function () {
		
        var prefs = gadgets.views.getParams();

        AppInfo.page = prefs['page'] !== undefined ? prefs['page'] : 'main'; //페이지 상태유지

        Event.observe($('sendDiv'), 'click', function (event) {
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'send'
            });			
        });
        Event.observe($('myDiv'),'click', function (event) {
	         var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'receive'
            });
        });
		Event.observe($('hotDiv'),'click', function (event) {
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'sent'
            });
        });
	   Event.observe($('main'),'click', function (event) {
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'main'
            });
        });
		 Event.observe($('PR'),'click', function (event) {
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'send'
            });
        });




       OpenSocial.init(UserInfo.req);
	
        switch (AppInfo.page) {
            case 'main':
		$('PR').show();
		$('div1').hide();
		$('div2').hide();
		$('div3').hide();
		$('main').className='current';
		$('sendDiv').className=''
		$('myDiv').className='';
		$('hotDiv').className='';
		break;
	    case 'send':
		$('PR').hide();
        $('div1').show();
        $('div2').hide();
		$('div3').hide();
		$('main').className=''
		$('sendDiv').className='current';
		$('myDiv').className='';
		$('hotDiv').className='';
                break;
	    case 'receive':
		$('PR').hide();
        $('div1').hide();
        $('div2').show();
		$('div3').hide();
		$('main').className=''
		$('sendDiv').className='';
		$('myDiv').className='current';
		$('hotDiv').className='';
                break;
	    case 'sent':
		$('PR').hide();
        $('div1').hide();
        $('div2').hide();
	    $('div3').show();
		$('main').className=''
		$('sendDiv').className='';
		$('myDiv').className='';
		$('hotDiv').className='current';
                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
				///console.log(res);
                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();
                }
            }
        });
    }
};
/**history sent/receive **/
var Receive_func={
	name:[],
	thumb:[],
	amount:[],
	data:[],
	url:[],

	 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'];
					Receive_func.url[i] = 'http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&friendid=' + res.data['data'][i]['sender']['uid'].split(':')[1];
					itemnum=itemnum + Receive_func.amount[i];
				}
				var itemnum50=Math.floor(itemnum/50);
				var itemnum10= Math.floor( (itemnum%50)/10);
				var itemnum1= itemnum%10;
				for(var i=0;i<itemnum50;i++){
					$('recv_hearts').innerHTML+='<img src="'+AppInfo.url+'images/High-Five.gif" />';
				};
				for(var i=0;i<itemnum10;i++){
					$('recv_hearts').innerHTML+='<img src="'+AppInfo.url+'images/High-Five.gif" />';
				};
				for(var i=0;i<itemnum1;i++){
					$('recv_hearts').innerHTML+='<img src="'+AppInfo.url+'images/High-Five.gif" />';
				};
				$('recv_cnt').innerHTML+= itemnum;	

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

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

	 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'];
					Sent_func.url[i] = 'http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&friendid=' + res.data['data'][i]['receiver']['uid'].split(':')[1];
					itemnum=itemnum + Sent_func.amount[i];
				}
				var itemnum50=Math.floor(itemnum/50);
				var itemnum10= Math.floor( (itemnum%50)/10);
				var itemnum1= itemnum%10;
				for(var i=0;i<itemnum50;i++){
					$('send_hearts').innerHTML+='<img src="'+AppInfo.url+'images/High-Five.gif" />';
				};
				for(var i=0;i<itemnum10;i++){
					$('send_hearts').innerHTML+='<img src="'+AppInfo.url+'images/High-Five.gif" />';
				};
				for(var i=0;i<itemnum1;i++){
					$('send_hearts').innerHTML+='<img src="'+AppInfo.url+'images/High-Five.gif" />';
				};
				$('send_cnt').innerHTML+= itemnum;	

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






/**
 * 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': friend.getField(opensocial.Person.Field.HAS_APP)
                    });
                });
            }
            
            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= "http://cheerupupup.appspot.com/images/hi11.gif" "alt="High-Five.gif" />' +
                                '<p>' +
                                '   Hey!#{sender} has sent you a #{title}! ' +
                                '   <a href=\"#{link}\">Click here to send back!</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, "High Five!");
             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 sent you a High-Five!' +
                              ' <font color="blue">Click</font> "Add" below to find out.' +
								 ' Send back High-Five! to #{sender}!';
            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, "High Five!");

            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();
        });
        
        // clear selections
        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;
            }
        });
    
      // search users by keyword
        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(){                 //페이지의 모든 것이 로드 되었을 때 이 함수를 실행(초기화 함수임)
	//FriendsSelector.init();	
	AppInfo.init();
});

