var FriendIntroducer = function() {};
FriendIntroducer = {
  friends:'',
  owner:'',
  init:function() {
    var view = gadgets.views.getCurrentView();
    switch (view.getName()) {
      case 'canvas' :
        FriendIntroducer.init_canvas();
        break;
      case 'profile' :
      default :
        FriendIntroducer.init_profile();
        break;
    }
  },
  init_profile:function() {
    $('#friends').html('Requesting friends...');
    var req = opensocial.newDataRequest();
    var owner = opensocial.IdSpec.PersonId.OWNER;
    var owner_friends = opensocial.newIdSpec({'userId':owner, 'groupId':opensocial.IdSpec.GroupId.FRIENDS});
    req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), 'viewer');
    req.add(req.newFetchPersonRequest(owner), 'owner');
    req.add(req.newFetchPeopleRequest(owner_friends), 'friends');
    req.add(req.newFetchPersonAppDataRequest(owner_friends, 'Introduction'), 'intro');
    req.send(FriendIntroducer.onLoadOwnerFriends);
  },
  init_canvas:function() {
    $('#friends').html('Requesting friends...');
    var req = opensocial.newDataRequest();
    var viewer = opensocial.IdSpec.PersonId.VIEWER;
    var viewer_friends = opensocial.newIdSpec({'userId':viewer, 'groupId':opensocial.IdSpec.GroupId.FRIENDS});
    req.add(req.newFetchPersonRequest(viewer), 'viewer');
    req.add(req.newFetchPeopleRequest(viewer_friends), 'friends');
    var idspec = opensocial.newIdSpec({'userId':viewer, 'groupId':opensocial.IdSpec.GroupId.SELF});
    req.add(req.newFetchPersonAppDataRequest(idspec, 'Introduction'), 'intro');
    req.send(FriendIntroducer.onLoadViewerFriends);
  },
  onLoadOwnerFriends:function(response) {
    var viewer   = response.get('viewer').getData();
    var owner    = response.get('owner').getData();
    var friends  = response.get('friends').getData();
    var intro    = response.get('intro').getData();
    var owner_id = owner.getId();
    $('#title').html('<p>Introduction of '+owner.getDisplayName()+':</p>');
    var html = '';
    var no_intro = true;
    friends.each(function(person) {
      var json = '';
      if (intro[person.getId()]) {
        var json_str = gadgets.util.unescapeString(intro[person.getId()].Introduction);
        var json = eval(json_str)[0];
      }
      if (json[owner_id]) {
        no_intro = false;
        var t = FriendIntroducer.template.friend_list_profile;
        t = t.replace('##thumbnail_url##', person.getField(opensocial.Person.Field.THUMBNAIL_URL));
        t = t.replace('##profile_url##',   person.getField(opensocial.Person.Field.PROFILE_URL));
        t = t.replace('##display_name##',  person.getDisplayName());
        t = t.replace('##intro_text##',  json[owner_id]);
        html += t;
      }
    });
    if (no_intro) {
      if (viewer.getId() != owner.getId()) {
        $('#message').html('<p>No introduction from friends yet!!<br />Let\'s be the first one to introduce him!</p>');
      } else {
        $('#message').html('<p>No introduction from friends yet!!</p>');
      }
    }
    $('#friends').html('<ul>'+html+'</ul>');
    gadgets.window.adjustHeight();
  },
  onLoadViewerFriends:function(response) {
    var viewer    = response.get('viewer').getData();
    var friends   = response.get('friends').getData();
    var intro     = response.get('intro').getData();
    var viewer_id = viewer.getId();
    var json = null;
    if (intro[viewer_id]) {
      if (intro[viewer_id].Introduction) {
        var json_str = gadgets.util.unescapeString(intro[viewer_id].Introduction);
        var json = gadgets.json.parse(json_str);
      }
    }
    $('#title').html('<p>Friends of '+viewer.getDisplayName()+':</p>');
    var html = '';
    if (friends.size() == 0) {
      $('#message').html("<p>You don't have any friends yet!</p>");
    }
    friends.each(function(person) {
      var t = FriendIntroducer.template.friend_list_canvas;
      t = t.replace('##thumbnail_url##', person.getField(opensocial.Person.Field.THUMBNAIL_URL));
      t = t.replace('##profile_url##',   person.getField(opensocial.Person.Field.PROFILE_URL));
      t = t.replace('##display_name##',  person.getDisplayName());
      t = t.replace('##input_id##',      'input_'+person.getId());
      if (json) {
        t = t.replace('##intro_text##',  json[person.getId()] ? json[person.getId()] : '');
      } else {
        t = t.replace('##intro_text##', '');
      }
      html += t;
    });
    $('#friends').html('<ul>'+html+'</ul>');
    gadgets.window.adjustHeight();
  },
  putIntroduction:function() {
    var list = $('#friends ul li');
    var result = {};
    $.each(list, function() {
      var text = $(this).find('textarea');
      var uid = text.attr('id').substring(6);
      result[uid] = text.val();
    });
    var intro = gadgets.json.stringify(result);
    var req = opensocial.newDataRequest();
    req.add(req.newUpdatePersonAppDataRequest(opensocial.IdSpec.PersonId.VIEWER, 'Introduction', intro));
    FriendIntroducer.createActivity();
    req.send(function() {
      $('#message').html('<p>Your introduction has been submitted.</p>');
    });
    gadgets.window.adjustHeight();
  },
  template: {
    'friend_list_canvas':'<li><div class="thumbnail"><a href="##profile_url##" target="_blank"><img src="##thumbnail_url##"></a></div><div class="introduction"><p>##display_name##</p><textarea id="##input_id##">##intro_text##</textarea></div></li>',
    'friend_list_profile':'<li><div class="thumbnail"><a href="##profile_url##" target="_blank"><img src="##thumbnail_url##"></a></div><div class="introduction"><p>##display_name##</p><p class="intro_text">##intro_text##</p></div></li>'
  },
  createActivity:function() {
    var params = {};
    params[opensocial.Activity.Field.TITLE] = 'updated introduction.';
    var activity = opensocial.newActivity(params);
    opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.LOW);
  }
};
