var AppInfo = {
    url: 'http://collectpinkribbons.appspot.com/',
    title: 'Spread Pink Awareness!',
    link: 'http://profile.myspace.com/Modules/Applications/Pages/Canvas.aspx?appId=132670&appvers=dev',
    logo: 'http://collectpinkribbons.appspot.com/images/pink64.gif',
    page: 'send',
    init: function () {
		
        var prefs = gadgets.views.getParams();

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

		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) {
	    //console.log('mydiv');
            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'
            });
        });

        OpenSocial.init(UserInfo.req);
		//console.log(AppInfo.page);
        switch (AppInfo.page) {

	    case 'send':
		//console.log("1st hit");
                $('div1').show();
                $('div2').hide();
				$('div3').hide();
				$('sendDiv').className='current';
				$('myDiv').className='';
				$('hotDiv').className='';
                break;
	    case 'receive':
		//console.log("2st hit");
                $('div1').hide();
                $('div2').show();
				$('div3').hide();
				$('sendDiv').className='';
				$('myDiv').className='current';
				$('hotDiv').className='';
                break;
	    case 'sent':
		//console.log("3st hit");
                $('div1').hide();
                $('div2').hide();
				$('div3').show();
				$('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('here');
                if (AppInfo.page === 'receive') {
                    Receive_func.init();
                }
				else if (AppInfo.page === 'sent') {
					Sent_func.init();
				}
				else if (AppInfo.page === 'send') {
					FriendsInfo.init('app', FriendsSelector.viewFriendsList);
					Event.observe('send','click', function (event) {
					Feed.init();
					});		
				}
			}
        });
    }
};

/**history sent/receive **/
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 itemnum1000= Math.floor(itemnum/1000);
				var itemnum100= Math.floor((itemnum%1000)/100);
				var itemnum10= Math.floor((itemnum%100)/10);
				var itemnum1= itemnum%10;
				for(var i=0;i<itemnum1000;i++){
					$('recv_hearts').innerHTML+='<img src="'+AppInfo.url+'images/pink32_1000.gif" />';
				};
				for(var i=0;i<itemnum100;i++){
					$('recv_hearts').innerHTML+='<img src="'+AppInfo.url+'images/pink32_100.gif" />';
				};
				for(var i=0;i<itemnum10;i++){
					$('recv_hearts').innerHTML+='<img src="'+AppInfo.url+'images/pink32_10.gif" />';
				};
				for(var i=0;i<itemnum1;i++){
					$('recv_hearts').innerHTML+='<img src="'+AppInfo.url+'images/pink32.gif" />';
				};
				$('recv_cnt').innerHTML+= itemnum;	

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

var Sent_func={
	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 itemnum1000= Math.floor(itemnum/1000);
				var itemnum100= Math.floor((itemnum%1000)/100);
				var itemnum10= Math.floor((itemnum%100)/10);
				var itemnum1= itemnum%10;
				for(var i=0;i<itemnum1000;i++){
					$('send_hearts').innerHTML+='<img src="'+AppInfo.url+'images/pink32_100.gif" />';
				};
				for(var i=0;i<itemnum100;i++){
					$('send_hearts').innerHTML+='<img src="'+AppInfo.url+'images/pink32_100.gif" />';
				};
				for(var i=0;i<itemnum10;i++){
					$('send_hearts').innerHTML+='<img src="'+AppInfo.url+'images/pink32_10.gif" />';
				};
				for(var i=0;i<itemnum1;i++){
					$('send_hearts').innerHTML+='<img src="'+AppInfo.url+'images/pink32.gif" />';
				};
				$('send_cnt').innerHTML+= itemnum;	

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

/**
 * 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,
                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);
        }

        if (Feed.selectedFriends[Feed.idx].hasapp === 'true') {
            
			var strTemplate =   '<img src= \"#{logo}\" "alt="Pink Ribbon" />' +
                                '<p>' +
                                '   Hey! #{sender} has sent you a Pink Ribbon' +
                                '   <a href=\"#{link}\">Click here to send one 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, "Spread Pink Awareness!");
            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 = 'Hi~ #{receiver}, #{sender} has sent you a Pink Ribbon!' +
                              ' <font color="blue">Click</font> "Add" below to find out.' +
							  'Send your Pink Ribbon back 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, "Spread Pink Awareness!");

            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(){

	AppInfo.init();
	//FriendsSelector.init();
	//Character.init();
});
