// Copyright 2009 Google Inc. All Rights Reserved.

/**
 * @fileoverview Utilities for Google IO Demo of 
 * Friend Connect Extended Profiles
 * @author cwren@google.com (Chris Wren)
 */

function loadGioDemo() {
  google.load('friendconnect', '0.8', { 'base_domain':baseDomain });
  google.load('ads', '1');
  google.load("search", "1");
  google.setOnLoadCallback(init);
}

function init() {
  google.friendconnect.container.setParentUrl(parentUrl);
  google.friendconnect.container.initOpenSocialApi({
    site: siteId,
    onload: function(securityToken) { start(); }});
};

var skin = {};
skin['BORDER_COLOR'] = '#AAAAAA';
skin['ENDCAP_BG_COLOR'] = '#E4E4E4';
skin['ENDCAP_TEXT_COLOR'] = 'black';
skin['ENDCAP_LINK_COLOR'] = '#2244bb';
skin['ALTERNATE_BG_COLOR'] = '#E4E4E4';
skin['CONTENT_BG_COLOR'] = '#ffffff';
skin['CONTENT_LINK_COLOR'] = '#2244bb';
skin['CONTENT_TEXT_COLOR'] = '#333333';
skin['CONTENT_SECONDARY_LINK_COLOR'] = '#7777cc';
skin['CONTENT_SECONDARY_TEXT_COLOR'] = 'white';
skin['CONTENT_HEADLINE_COLOR'] = '#333333';
skin['ALIGNMENT'] = 'left';

function start() {
  google.friendconnect.container.setNoCache(1);
  google.friendconnect.container.setParentUrl(parentUrl);
  google.friendconnect.container.renderOpenSocialGadget(
    { id: 'gfcPoll',
      url:'http://' + baseDomain + '/friendconnect/gadgets/poll.xml',
      site: siteId },
    skin);
  
  google.friendconnect.container.setParentUrl(parentUrl);
  google.friendconnect.container.renderSignInGadget(
    { id: 'signinButton',
      site: siteId },
    skin);

  initAllData();
};

var seed = new Date().getTime() % 1000;
function initAllData() {
  explainHint('');
  seed = new Date().getTime() % 1000;
  var viewerParams = {};
  viewerParams[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] =
    [opensocial.Person.Field.NAME,
     opensocial.Person.Field.THUMBNAIL_URL,
     opensocial.Person.Field.CURRENT_LOCATION,
     opensocial.Person.Field.GENDER,
     opensocial.Person.Field.DATE_OF_BIRTH,
     'profileExtensions'];
  var req = opensocial.newDataRequest();
  req.add(req.newFetchPersonRequest('VIEWER', viewerParams), 'viewer');
  
  var ownerParams = {};
  ownerParams[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] =
    [opensocial.Person.Field.NAME,
     opensocial.Person.Field.THUMBNAIL_URL,
     opensocial.Person.Field.PROFILE_URL,
     'profileExtensions', 'profileAggregates'];
  req.add(req.newFetchPersonRequest('OWNER', ownerParams), 'owner');
  req.add(req.newFetchPeopleRequest(
      new opensocial.IdSpec({'userId' : 'OWNER', 'groupId' : 'FRIENDS'}), 
      ownerParams), 'ownerFriends');
  req.send(setupData);
};

function setupData(data) {
  var owner = data.get('owner').getData();
  var viewer = data.get('viewer').getData();
  var face = document.getElementById('visitorFace');

  var ownerFriends = data.get('ownerFriends').getData().asArray();
  var html = "";
  for (var i = 0; i < ownerFriends.length && i < 12; i++) {
    var person = ownerFriends[i];
    html += "<a title='" + person.getField("displayName") + "' href='javascript:void(0);' onclick='google.friendconnect.showMemberProfile(\"" + person.getField(opensocial.Person.Field.ID) + "\");'>";
    html += "<img style='padding: 3px;' width=50 height=50 class='memberPhoto' src='" + person.getField("thumbnailUrl")  + "'/>";
    html += "</a>&nbsp;&nbsp;";
  };
  document.getElementById('community').innerHTML = html;

  if (face) {
    if (viewer) {
      face.src = viewer.getField("thumbnailUrl");
    } else {
      face.src = 'http://' + baseDomain +
          '/friendconnect/static/images/NoPictureDark.png';
    }
  }
  
  displaySexAgeLocation(viewer);
  
  var viewerHint = getProfileExtensions(viewer);
  var communityHint = getCommunityAggregates(owner, viewer);
  
  if (viewerHint.length > 0) {
    displayContext(viewerHint);
  } else if (communityHint.length > 0) {
    displayContext(communityHint);
  } else {
    displayContext(['music']);
  }
};

/**
 *  Pull the SAL data out of the OpenSocial Person and display it.
 */
function displaySexAgeLocation(viewer) {
  var html = [];
  var i = 0;
  
  if (viewer) {
    var gender = viewer.getField(opensocial.Person.Field.GENDER);
    if (gender) {
      html[i++] = 'Gender: ' + gender.displayValue;
    }
    
    var location = viewer.getField(opensocial.Person.Field.CURRENT_LOCATION);
    if (location) {
      html[i++] = 'Location: ' + location.getField('formatted');
    }
    
    var birthday = viewer.getField("birthday");
    if (birthday) {
      var then = birthday.substring(0,4);
      var now = new Date().getFullYear();
      var age = now - then;
      html[i++] = 'Age: ' + age;
    }
    
  } else {
    html[i++] = 'Nobody is signed in.';
  }
  
  if (html.length == 0) {
    html[i++] = 'Visitor has supplied no information.';
  }
  
  if (document.getElementById('SAL')) {
    document.getElementById('SAL').innerHTML =
        '<ul><li>' + html.join('</li><li>')+ '</li></ul>';
  }
};


/**
 *  Pull the Site Specific Profile elements and display/save them.
 */
function getProfileExtensions(viewer) {
  var hint = [];
  var html = [];
  if (viewer) {
    var extensions = viewer.getField('profileExtensions');
    for (var i in extensions) {
      var ext = extensions[i];
      for (var j in ext.value.choice) {
        var answer = ext.value.choice[j];
        var label = answer.label;
        html[html.length] = ext.helpText + ': ' + label;
        hint[hint.length] = label;
      }
    }
  } else {
    html[html.length] = 'Nobody is signed in.';
  }
  
  if (html.length == 0) {
    html[html.length] = 'Visitor has supplied no information.';
  }
  
  if (document.getElementById('viewer')) {
    document.getElementById('viewer').innerHTML =
        '<ul><li>' + html.join('</li><li>') + '</li></ul>';
  }

  return hint;
};

/**
 *  Pull the Site Specific Profile aggregates and display/save them.
 */
function getCommunityAggregates(owner) {
  var hint = [];
  var html = [];
  if (owner) {
    var extensions = owner.getField('profileExtensions');
    for (var i in extensions) {
      var ext = extensions[i];
      var mostPopular;
      var mostLabel;
      var mostPeople = 0;
      if (ext.aggregate) {
        for (var j in ext.aggregate.response) {
          var response = ext.aggregate.response[j];
          var label = response.choice.label;
          if (response.count > mostPeople) {
            mostPeople = response.count;
            mostPopular = ext.helpText + ': ' + label;
            mostLabel = label;
          }
        }
      }
      if (mostPopular) {
        html[html.length] = mostPopular;
        hint[hint.length] = mostLabel;
      }
    }
  }
  
  if (html.length == 0) {
    html[html.length] = 'There is no data yet.';
  }
  
  if (document.getElementById('owner')) {
    document.getElementById('owner').innerHTML =
        '<ul><li>' + html.join('</li><li>') + '</li></ul>';
  }

  return hint;
};

var currentHint = 0;
function explainHint(hint) {
  if (document.getElementById('debug_ads')) {
    document.getElementById('debug_ads').innerHTML = hint;
  }
};

function fetchHint() {
  var req = opensocial.newDataRequest();
  req.add(google.friendconnect.newFetchInterestHintRequest(1, seed), 'hint');
  req.send(processHint);
};

function processHint(data) {
  var hint = data.get('hint').getData()['hint'];

  if (!hint || hint.length == 0) {
    hint = [ 'music' ];
  }
  
  explainHint(hint);
};

var ad;
function initAd(hint) {
  google.friendconnect.container.renderAdsGadget(
    { id: 'adblock',
      height: 250,
      site: siteId,
     prefs:{"google_ad_client":"ca-pub-5923697164723208","google_ad_host":"pub-6518359383560662","google_ad_slot":"1599400640","google_ad_format":"300x250",'seed':seed}
 });
  fetchHint();
};

function initSearch(hint, opt_id) {
 var id = opt_id || 'adblock';
google.friendconnect.container.renderOpenSocialGadget(
 { 'id': id,
   url:'http://' + baseDomain + '/friendconnect/gadgets/content_reveal.xml',
   site: siteId,
   'prefs':{"customSiteRestriction":"http://wikipedia.org/", "customHeaderTitle":"Featured Content", "seed" : seed}
 },
  skin);
  fetchHint();
};

function initPretty(hint) {
  initAd(hint);
  initSearch(hint, 'reveal');
};

