var AppInfo = {
    url: 'http://hughugme.appspot.com/',
    title: 'Hug Me',
    link: 'http://profile.myspace.com/Modules/Applications/Pages/Canvas.aspx?appId=132587',
    logo: 'http://hughugme.appspot.com/img/logo.jpg',
    page: 'home',
    init: function(){
        var prefs = gadgets.views.getParams();
        
        AppInfo.page = prefs['page'] !== undefined ? prefs['page'] : 'home';
        Event.observe('first', 'click', function(event){
        
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'home'
            });
        });
        Event.observe('second', 'click', function(event){
        
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'second'
            });
        });
        Event.observe('third', 'click', function(event){
        
            var canvas_view = new gadgets.views.View('canvas');
            gadgets.views.requestNavigateTo(canvas_view, {
                'page': 'third'
            });
        });
        OpenSocial.init(UserInfo.req);
        
        switch (AppInfo.page) {
            case 'home':
                $('firstpage').show();
                $('secondpage').hide();
                $('thirdpage').hide();
                $('first').toggleClassName('selected');
                break;
            case 'second':
                $('firstpage').hide();
                $('secondpage').show();
                $('thirdpage').hide();
                $('second').toggleClassName('selected');
                break;
            case 'third':
                $('firstpage').hide();
                $('secondpage').hide();
                $('thirdpage').show();
                $('third').toggleClassName('selected');
                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['user_key']; // for google app engine datastore
                if (AppInfo.page === 'home') {
                    FriendsInfo.init('app', FriendsSelector.viewFriendsList);
                    myitem.init();
                    Event.observe('sendboxTop', 'click', function(event){
                        Feed.init(Gift.send);
                    });
					Event.observe('sendboxDown', 'click', function(event){
                        Feed.init(Gift.send);
                    });
                }
                else 
                    if (AppInfo.page === 'second') {
                    	Receiver_write.ReceiveHistory();
                    }
                    else 
                        if (AppInfo.page === 'third') {
							Sender_write.SenderHistory();
                        }
            }
        });
    }
};


/**
 * 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: 20,
    /* methods */
    init: function(mode, callback){
        FriendsInfo.mode = mode;
        FriendsInfo.first = 1;
		FriendsInfo.max = 20;
        
        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].getElementsByClassName('thumb')[0].innerHTML.split('"')[1],
                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}\" />' +
            '<p>' +
            '   Send Hug To Your Friends.<br/> Spread love to your friends!!<br/> #{title}! ' +
            '   <a href=\"#{link}\">Click here! ! !.</a>' +
            '</p>';
            
            var template = new Template(strTemplate);
            
            var msg = opensocial.newMessage(template.evaluate({
                sender: UserInfo.name,
                title: AppInfo.title,
                logo: myitem.img,
                link: AppInfo.link
            }));
           
            msg.setField(opensocial.Message.Field.TITLE, "Hug me");
            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}, Spread the love!!<br/> ' +
            'Hug your friends and get more Hugs in return!<br/> ' +
            'Click \"Send\" below to Hug!';
            
            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, "Hug Me");
            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 === MyOpenSpace.PostTo.Result.CANCELLED) {
       //  console.log('user cancelled PostTo');
         }
         else if (res === MyOpenSpace.PostTo.Result.SUCCESS) {
  //       console.log('WE ARE MEETING WITH GREAT SUCCESS!!!');
         }
         else {
     //    console.log('Unrecognized response: ' + res);
         }
      //   console.log(res)
        ++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>' +
            '   <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'] ? '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');
            });
        }
        
        Event.observe('selectAllBtn', 'click', function(){
            FriendsSelector.selectAll();
        });
        
        // clear selections
        Event.observe('clearAllBtn', '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();
        });
    }
};
var myitem = {
    list: null,
    choice: null,
    bbb: null,
    key: null,
    select: null,
	img: null,
    init: function(){
        myitem.list = $('myitemlist').getElementsByTagName('a');
        
        for (var idx = 0; idx < myitem.list.length; ++idx) {
            Event.observe(myitem.list[idx], 'click', function(event){
                if (myitem.choice == null) {
                    Event.findElement(event, 'a').toggleClassName('selected');
                    myitem.choice = this;
                    var imgSrc = myitem.choice.getElementsByTagName('img')[0].src;
                    $('pic').update('<img src=\"' + imgSrc + '\"/>');
					myitem.img = imgSrc;
                    
                }
                else 
                    if (myitem.choice === this) {
                        Event.findElement(event, 'a').toggleClassName('selected');
                        myitem.choice = null;
                        $('pic').update('<img src="http://hughugme.appspot.com/img/loveyou.jpg"/>');
                        
                    }
                    else {
                        myitem.choice.toggleClassName('selected');
                        myitem.choice = this;
                        Event.findElement(event, 'a').toggleClassName('selected');
                        var imgSrc = myitem.choice.getElementsByTagName('img')[0].src;
                        $('pic').update('<img src=\"' + imgSrc + '\"/>');
                        myitem.img = imgSrc;
                    }
            })
        }
    }
}
var Gift = {
    key: null,
    page: 0,
    selected: null,
    receiver_uid: null,
    send: function(receiver_uid){
       
        OpenSocial.ajax(AppInfo.url + 'gift/list', '', function(res){
            if (res.data['error'] === 0) {
                var selected = $('myitemlist').getElementsByClassName('selected');
           
                for (var i = 0; i < selected.length; ++i) {
                 
                    for (var j = 0; j < res.data['data'].length; ++j) {
                    
                        if (selected[i].id === res.data['data'][j]['name']) {                        
                            Gift.key = res.data['data'][j]['gift_key']
                        }
                    }
                }

                var data = {
                    sender_key: UserInfo.key,
                    receiver_uid: receiver_uid,
					receiver_name: Feed.selectedFriends[Feed.idx].name,
					receiver_thumb: Feed.selectedFriends[Feed.idx].thumb,
                    gift_key: Gift.key
                };

                OpenSocial.ajax(AppInfo.url + 'history/update', data, function(res){
                });
            }
			
        });
    }
}
var Receiver_set = {
	
    data: [],
	amount:0,
    init: function(req){
        Receiver_set.data = [];
        
        OpenSocial.ajax(AppInfo.url + 'history/list', req, function(res){
            if (res.data['error'] === 0) {
			
                for (var idx = 0; idx < res.data['data'].size(); ++idx) {
                    Receiver_set.data.push({
                        sender: res.data['data'][idx]['sender']['name'],
                        thumb: res.data['data'][idx]['sender']['thumb'],
                        gift_name: res.data['data'][idx]['gift']['name'],
                        gift_img: res.data['data'][idx]['gift']['img'],
                        amount: res.data['data'][idx]['amount'],
						time: res.data['data'][idx]['time']
                    });

					Receiver_set.amount = Receiver_set.amount+res.data['data'][idx]['amount'];
				
                }

            }
	
            Receiver_write.viewReceive();
        });
    } 
}
var Receiver_write = {

    ReceiveHistory: function(){
        var req = {
            receiver_key: UserInfo.key
        };
        Receiver_set.init(req);
    },
    viewReceive: function(){
		
	
        if (Receiver_set.data.size() > 0) {
        	
            $('receivepage').update('');
            
            var strTemplate = '<table class=\"itemtable\">' +
            '   <tbody>' +
            '		<tr>' +
            '			<td class=\"item\">' +
            '				<img src=\"#{gift_img}\" />' +
            '			</td>' +
            '			<td class=\"data\">' +
            '				<div>' +
            '					<span>From</span>' +
            '						<a href=\"#\">\#{sender}\</a>' +
            '				</div>' +
            '				<div>\#{time}\</div>' +

            '			</td>' +
            '		</tr>' +
            '	</tbody>' +
            '</table>';
            
    
            var receiverTemplate = new Template(strTemplate);
            
            Receiver_set.data.each(function(history){
		
                $('receivepage').insert(receiverTemplate.evaluate({
                    'sender': history['sender'],
                    'gift_img': history['gift_img'],
                    'thumb': history['thumb'],
					'time': history['time'].split(' ')[0]
                }));
			
            });

        }
    }
}
var Sender_set = {
	
    data: [],
	amount:0,
    init: function(req){
        Sender_set.data = [];
        
        OpenSocial.ajax(AppInfo.url + 'history/list2', req, function(res){
            if (res.data['error'] === 0) {
		
                for (var idx = 0; idx < res.data['data'].size(); ++idx) {
                    Sender_set.data.push({
                        receiver: res.data['data'][idx]['receiver']['name'],
                        thumb: res.data['data'][idx]['receiver']['thumb'],
                        gift_name: res.data['data'][idx]['gift']['name'],
                        gift_img: res.data['data'][idx]['gift']['image'],
                        amount: res.data['data'][idx]['amount'],
						time: res.data['data'][idx]['time']
                    });

					Sender_set.amount = Sender_set.amount+res.data['data'][idx]['amount'];
				
                }
            }
		
            Sender_write.viewSender();
        });
    } 
}
var Sender_write = {

    SenderHistory: function(){
        var req = {
            sender_key: UserInfo.key
        };
        Sender_set.init(req);
    },
    viewSender: function(){
		
        if (Sender_set.data.size() > 0) {

            $('sentpage').update('');
            
            var strTemplate = '<table class=\"itemtable\">' +
            '   <tbody>' +
            '		<tr>' +
            '			<td class=\"item\">' +
            '				<img src=\"#{gift_img}\" />' +
            '			</td>' +
            '			<td class=\"data\">' +
            '				<div>' +
            '					<span>To</span>' +
            '						<a href=\"#\">\#{receiver}\</a>' +
            '				</div>' +
            '				<div>\#{time}\</div>' +
        
            '			</td>' +
            '		</tr>' +
            '	</tbody>' +
            '</table>';
            
  
            var senderTemplate = new Template(strTemplate);
            
            Sender_set.data.each(function(history){
	                $('sentpage').insert(senderTemplate.evaluate({
                    'receiver': history['receiver'],
                    'gift_img': history['gift_img'],
                    'thumb': history['thumb'],
					'time': history['time'].split(' ')[0]
                }));
		     });

        }
    }
}
Event.observe(window, 'load', function(){
	AppInfo.init();

});
		
