<?xml version="1.0" encoding="UTF-8" ?>
- <Module>
- <ModulePrefs title="Facebook" title_url="
http://www.facebook.com" directory_title="Facebook Gadget" description="Recieve your latest notifications on Facebook, check out your friends' latest updates, view photos, and even launch Facebook searches from all from your Google Homepage!" author="Brian Ngo" author_email="
briancse@gmail.com" author_location="Seattle, WA" author_aboutme="Developer contractor from Seattle." author_photo="
http://www.brianngo.net/images/ispeech.jpg" author_link="
http://www.brianngo.net" author_quote="Go confidently in the direction of your dreams. Live the life you've imagined. -Thoreau" height="200" scrolling="false" singleton="true" screenshot="
http://www.brianngo.net/ig/static/igfacebook_screenshot.png" thumbnail="
http://www.brianngo.net/ig/static/igfacebook_thumbnail.png" scaling="true">
<Require feature="dynamic-height" />
<Require feature="setprefs" />
<Require feature="tabs" />
<Require feature="minimessage" />
</ModulePrefs>
- <UserPref name="defaultTab" display_name="Tab to start with:" datatype="enum" default_value="You">
<EnumValue value="You" display_value="You" />
<EnumValue value="Friends" display_value="Friends" />
<EnumValue value="Photos" display_value="Photos" />
<EnumValue value="Search" display_value="Search" />
</UserPref>
- <UserPref name="listLimit" display_name="Number of updates to display:" datatype="enum" default_value="7">
<EnumValue value="3" />
<EnumValue value="4" />
<EnumValue value="5" />
<EnumValue value="6" />
<EnumValue value="7" />
<EnumValue value="8" />
<EnumValue value="9" />
<EnumValue value="10" />
</UserPref>
<UserPref name="sessionKey" datatype="hidden" default_value="" />
<UserPref name="userid" datatype="hidden" default_value="" />
<UserPref name="secretKey" datatype="hidden" default_value="f685c1bd9ac31aa049e420af84fa3dc8" />
- <Content type="html">
- <![CDATA[
<!-- cannot link to external css file via @import url due to __MODULE_ID__ macro! must hardcode =( -->
<style type="text/css">
@import url(
http://www.google.com/ig/tablib.css);
.hide__MODULE_ID__ { display: none; }
.show__MODULE_ID__ { display: block; }
.right__MODULE_ID__ { float: right; }
.left__MODULE_ID__ { float: left; }
img {
border: 0px none;
}
.fb__MODULE_ID__ {
font-family: "lucida grande", tahoma, verdana, arial, sans-serif;
font-size: 11px;
}
.fbInput__MODULE_ID__ {
font-family: "lucida grande", tahoma, verdana, arial, sans-serif;
font-size: 11px;
border-style: none none solid;
border:1px solid #BDC7D8;
background: white;
}
.fbButton__MODULE_ID__ {
background-color:#3B5998;
border-color:#D9DFEA rgb(14, 31, 91) rgb(14, 31, 91) rgb(217, 223, 234);
border-style:solid;
border-width:1px;
color:#FFFFFF;
font-family:"lucida grande",tahoma,verdana,arial,sans-serif;
font-size:11px;
}
.fb__MODULE_ID__ a:link {
color: #3b5998;
text-decoration: none;
}
.fb__MODULE_ID__ a:visited {
color: #3b5998;
text-decoration: none;
}
.fb__MODULE_ID__ a:active {
color: #3b5998;
text-decoration: none;
}
.fb__MODULE_ID__ a:hover {
color: #3b5998;
text-decoration: underline;
}
.divOverhead__MODULE_ID__ {
margin: 5px 5px 5px 5px;
}
.baseStyle__MODULE_ID__ {
text-align: right;
padding: 0px 5px 5px 0px;
border-top: 1px solid #666666;
}
.actionsStyle__MODULE_ID__ {
text-align: left;
float: left;
padding: 0px 0px 0px 5px;
}
.listItem__MODULE_ID__ {
padding: "0px";
display: block;
text-align: left;
}
.listItemIcon__MODULE_ID__ {
position:relative;
text-align: left;
float: left;
width: 23px;
}
.IEIconFix__MODULE_ID__ {
position:relative;
width: 19px;
}
.listItemContent__MODULE_ID__ {
}
.listItemSpacer__MODULE_ID__ {
height: 5px;
}
.time__MODULE_ID__ {
color:#cccccc;
}
.photo__MODULE_ID__ {
text-align:center;
}
.photoCaption__MODULE_ID__ {
text-align:center;
overflow:hidden;
white-space:nowrap;
text-overflow:ellipsis;
}
.photoCell__MODULE_ID__ {
vertical-align:center;
text-align:center;
}
.pseudoLink__MODULE_ID__ { cursor:pointer; }
</style>
<div id="you__MODULE_ID__" class="fb__MODULE_ID__"></div>
<div id="friends__MODULE_ID__" class="fb__MODULE_ID__"></div>
<div id="photos__MODULE_ID__" class="fb__MODULE_ID__"></div>
<div id="search__MODULE_ID__" class="fb__MODULE_ID__"></div>
<div id="base__MODULE_ID__" class="fb__MODULE_ID__ baseStyle__MODULE_ID__">
<div id="baseActions__MODULE_ID__" class="fb__MODULE_ID__ actionsStyle__MODULE_ID__"></div>
</div>
<div id="debug__MODULE_ID__" class="fb__MODULE_ID__"></div>
<script type="text/javascript">
/*
* Facebook Google Gadget
* Release 2
* Created by Brian Ngo (briancse@gmail.com) for Google Inc.
*
* Questions, comments, suggestions, death threats? Send me an email!
*
* --------------------------------------------------------------------------------------------------
* Changes in Release 2 and 1/4th
* --------------------------------------------------------------------------------------------------
* - Updated to use FQL, removed "friends" photo functionality - FQL can't handle it
* - Note that the gadget isn't completely changed to FQL - (ex., cannot get notifications via FQL)
* -
*
* --------------------------------------------------------------------------------------------------
* Changes in Release 2
* --------------------------------------------------------------------------------------------------
* - Moved error messages to use Google Gadgets MiniMessages - now user dismissable
* - Changed error messages to be "less scary" (thanks Taj)
* - Changed Facebook API to use a "Desktop" API key, fixes timeout and allows us to remove inline
* - Added more features to Photos tab (next photo, enable slideshow)
* - Added ability to refresh data in all tabs
* - Removed dependencies on currentTab in Gadget API
* - Changed to singleton gadget
* - The gadget now has screenshot & thumbnail images for the Gadget directory!
* - Modified some default gadget values for syndication/properties
*
* --------------------------------------------------------------------------------------------------
* Changes in Release 1
* --------------------------------------------------------------------------------------------------
* - Added 1500+ lines to an empty file
*
*/
//bootstrap function
function onLoadFunc__MODULE_ID__() {
initGadget__MODULE_ID__();
}
//register bootstrap function with igoogle
_IG_RegisterOnloadHandler(onLoadFunc__MODULE_ID__);
//----------------------------------------------------------------------------------------------------
// Globals
//----------------------------------------------------------------------------------------------------
var prefs__MODULE_ID__ = new _IG_Prefs(__MODULE_ID__);
var APIVersion__MODULE_ID__ = "1.0";
var APIKey__MODULE_ID__ = "65f2b548e04d91c9a8e5e8ad41a2ab90";
var SigKey__MODULE_ID__ = prefs__MODULE_ID__.getString("secretKey");
var defaultSigKey__MODULE_ID__ = "f685c1bd9ac31aa049e420af84fa3dc8";
var APIServer__MODULE_ID__ = "
http://www.facebook.com/restserver.php?";
var SecureAPIServer__MODULE_ID__ = "
https://www.facebook.com/restserver.php?";
var SessionKey__MODULE_ID__ = "";
var Auth_Token__MODULE_ID__ = "";
var tabs__MODULE_ID__ = null; //tab object
var callbackTab__MODULE_ID__ = 0;
var tabIdDict__MODULE_ID__ = new Object(); //NOTE: could be more efficient but its a really long story...
var uid__MODULE_ID__;
var callbackStorageObj__MODULE_ID__;
var friendsListLimit__MODULE_ID__ = prefs__MODULE_ID__.getInt("listLimit");
var defaultTab__MODULE_ID__ = prefs__MODULE_ID__.getString("defaultTab");
var targetGadgetArg__MODULE_ID__;
var msg__MODULE_ID__ = new _IG_MiniMessage(__MODULE_ID__);
var msgBay__MODULE_ID__ = new Array();
var PendingAsyncResponse__MODULE_ID__ = false;
var loginWindow__MODULE_ID__ = null;
var timeoutID__MODULE_ID__ = -1;
var slideshow__MODULE_ID__ = false;
var slideshowTimer__MODULE_ID__ = null;
var currentTab__MODULE_ID__ = defaultTab__MODULE_ID__;
// Facebook Image Constants
var imgServer__MODULE_ID__ = "
http://ig-facebook.googlecode.com/svn/images/";
var img_status_src__MODULE_ID__ = imgServer__MODULE_ID__ + "onlinenow.png";
var img_editprofile_src__MODULE_ID__ = imgServer__MODULE_ID__ + "edit_profile.gif";
var img_event_src__MODULE_ID__ = imgServer__MODULE_ID__ + "event.gif";
var img_friend_src__MODULE_ID__ = imgServer__MODULE_ID__ + "friend.gif";
var img_group_src__MODULE_ID__ = imgServer__MODULE_ID__ + "group.gif";
var img_note_src__MODULE_ID__ = imgServer__MODULE_ID__ + "note.gif";
var img_photo_src__MODULE_ID__ = imgServer__MODULE_ID__ + "photo.gif";
var img_wallpost_src__MODULE_ID__ = imgServer__MODULE_ID__ + "wall_post.gif";
var img_mail_src__MODULE_ID__ = imgServer__MODULE_ID__ + "mail.gif";
var img_share_src__MODULE_ID__ = imgServer__MODULE_ID__ + "share.gif";
var img_poke_src__MODULE_ID__ = imgServer__MODULE_ID__ + "poke.gif";
var img_friendguy_src__MODULE_ID__ = imgServer__MODULE_ID__ + "friend_guy.gif";
var img_spacer_src__MODULE_ID__ = imgServer__MODULE_ID__ + "spacer.gif";
// Facebook URLs
var fbUrl_profile__MODULE_ID__ = "
http://www.facebook.com/profile.php?id=";
var fbUrl_mailbox__MODULE_ID__ = "
http://www.facebook.com/mailbox.php";
var fbUrl_home__MODULE_ID__ = "
http://www.facebook.com/home.php";
var fbUrl_shared__MODULE_ID__ = "
http://www.facebook.com/shared.php";
var fbUrl_reqs__MODULE_ID__ = "
http://www.facebook.com/reqs.php";
var fbUrl_friends__MODULE_ID__ = "
http://www.facebook.com/friends.php";
var fbUrl_groups__MODULE_ID__ = "
http://www.facebook.com/grouphome.php";
var fbUrl_events__MODULE_ID__ = "
http://www.facebook.com/eventhome.php";
var fbUrl_search__MODULE_ID__ = "
http://www.facebook.com/s.php?q=";
var fbUrl_logout__MODULE_ID__ = "
http://www.facebook.com/logout.php?confirm=1";
var fbUrl_login__MODULE_ID__ = "
http://www.facebook.com/login.php?api_key=" + APIKey__MODULE_ID__ +"&v=" + APIVersion__MODULE_ID__ + "&popup";
//----------------------------------------------------------------------------------------------------
// Initial functionality, login functions, setting up of UI, etc
//----------------------------------------------------------------------------------------------------
function initGadget__MODULE_ID__() {
//retrieve sessionkey & uid from prefs
SessionKey__MODULE_ID__ = prefs__MODULE_ID__.getString("sessionKey");
uid__MODULE_ID__ = prefs__MODULE_ID__.getString("userid");
if(SessionKey__MODULE_ID__ == "") {
reset__MODULE_ID__();
}
createBaseLink__MODULE_ID__();
tabs__MODULE_ID__ = new _IG_Tabs(__MODULE_ID__, defaultTab__MODULE_ID__);
//insert tabs into tabs object
tabIdDict__MODULE_ID__.you = tabs__MODULE_ID__.addTab("You", "you__MODULE_ID__", selectTab_You__MODULE_ID__);
_gel(tabIdDict__MODULE_ID__.you).className="fb__MODULE_ID__ divOverhead__MODULE_ID__";
tabIdDict__MODULE_ID__.friends = tabs__MODULE_ID__.addTab("Friends", "friends__MODULE_ID__", selectTab_Friends__MODULE_ID__);
_gel(tabIdDict__MODULE_ID__.friends).className="fb__MODULE_ID__ divOverhead__MODULE_ID__";
tabIdDict__MODULE_ID__.photos = tabs__MODULE_ID__.addTab("Photos", "photos__MODULE_ID__", selectTab_Photos__MODULE_ID__);
_gel(tabIdDict__MODULE_ID__.photos).className="fb__MODULE_ID__ divOverhead__MODULE_ID__";
tabIdDict__MODULE_ID__.search = tabs__MODULE_ID__.addTab("Search", "search__MODULE_ID__", selectTab_Search__MODULE_ID__);
_gel(tabIdDict__MODULE_ID__.search).className="fb__MODULE_ID__ divOverhead__MODULE_ID__";
}
function showBase__MODULE_ID__() {
_gel("base__MODULE_ID__").style.display = "block";
}
function hideBase__MODULE_ID__() {
_gel("base__MODULE_ID__").style.display = "none";
}
function reset__MODULE_ID__() {
clearMessages__MODULE_ID__();
Auth_Token__MODULE_ID__ = "";
uid__MODULE_ID__ = "";
SessionKey__MODULE_ID__ = "";
SigKey__MODULE_ID__ = defaultSigKey__MODULE_ID__;
prefs__MODULE_ID__.set("secretKey", SigKey__MODULE_ID__);
prefs__MODULE_ID__.set("sessionKey", SessionKey__MODULE_ID__);
prefs__MODULE_ID__.set("userid", uid__MODULE_ID__);
firstLoad__MODULE_ID__ = true;
hideBase__MODULE_ID__();
//sendFbLogoutRequest__MODULE_ID__(confirmLogout__MODULE_ID__);
//put displays on hold
PendingAsyncResponse__MODULE_ID__ = true;
//start request for new auth token
sendFbRequest__MODULE_ID__("facebook.auth.createToken", new Array(), false, receiveAuthToken__MODULE_ID__);
if(tabs__MODULE_ID__ != null) {
loadDefaultTab__MODULE_ID__();
}
}
function loadDefaultTab__MODULE_ID__() {
switch(defaultTab__MODULE_ID__) {
case "You": loadTab__MODULE_ID__(0); break;
case "Friends": loadTab__MODULE_ID__(1); break;
case "Photos": loadTab__MODULE_ID__(2); break;
case "Search": loadTab__MODULE_ID__(3); break;
}
}
function confirmLogout__MODULE_ID__(response) {
//debug__MODULE_ID__(response);
//perform postprocessing of logout here
}
function createBaseLink__MODULE_ID__() {
var b_el = _gel("base__MODULE_ID__");
var resetLink = document.createElement("a");
resetLink.innerHTML = "Log out";
resetLink.href = "#";
resetLink.onclick = reset__MODULE_ID__;
b_el.appendChild(resetLink);
if(SessionKey__MODULE_ID__ != "") {
showBase__MODULE_ID__();
} else {
hideBase__MODULE_ID__();
}
}
function receiveAuthToken__MODULE_ID__(response) {
PendingAsyncResponse__MODULE_ID__ = false;
if(response == null || typeof response != "object" || response.firstChild == null) {
handleFacebookXMLErrorCode__MODULE_ID__(null);
} else {
//valid formed response
//check for errors
var error_code = response.getElementsByTagName("error_code");
if(error_code.length == 0) {
//get session and assign it
var authtoken = response.getElementsByTagName("auth_createToken_response");
Auth_Token__MODULE_ID__ = authtoken.item(0).firstChild.nodeValue;
}
else {
handleFacebookXMLErrorCode__MODULE_ID__(null);
}
}
//debugHTML__MODULE_ID__(Auth_Token__MODULE_ID__);
loadTab__MODULE_ID__(callbackTab__MODULE_ID__);
}
//show the login message to user
function displayLogin__MODULE_ID__(t_el) {
var loginContainer = document.createElement("div");
loginContainer.style.textAlign = "center";
var loginLink = document.createElement("a");
loginLink.href = "javascript:popup__MODULE_ID__()";
var fbImg = document.createElement("img");
fbImg.src = "
http://static.ak.facebook.com/images/devsite/facebook_login.gif";
fbImg.border = "0";
loginLink.appendChild(fbImg);
loginLink.appendChild(document.createElement("br"));
loginLink.appendChild(document.createTextNode("Click here to log in"));
loginContainer.appendChild(loginLink);
loginContainer.appendChild(document.createElement("br"));
loginContainer.appendChild(document.createTextNode("Please close the login window after logging in."))
t_el.appendChild(loginContainer);
_IG_AdjustIFrameHeight();
}
function checkWindow__MODULE_ID__() {
if(loginWindow__MODULE_ID__.closed == true) {
createStaticMessage__MODULE_ID__("Completing login process...");
var params = new Array("auth_token="+Auth_Token__MODULE_ID__);
sendFbRequest__MODULE_ID__("facebook.auth.getSession", params, true, processSessionCallback__MODULE_ID__);
}
else {
if(timeoutID__MODULE_ID__ != -1) {
clearTimeout(timeoutID__MODULE_ID__);
}
timeoutID__MODULE_ID__ = setTimeout(checkWindow__MODULE_ID__, 500);
}
}
function popup__MODULE_ID__() {
var uniqueID = (new Date()).getTime();
eval("loginWindow__MODULE_ID__ = window.open(\"" + (fbUrl_login__MODULE_ID__ + "&auth_token=" + Auth_Token__MODULE_ID__) + "\", \"" + uniqueID + "\", \"scrollbars=no, location=no, menubar=no, statusbar=no, resizable=no, width=640, height=480, toolbar=no\");");
if(timeoutID__MODULE_ID__ != -1) {
clearTimeout(timeoutID__MODULE_ID__);
}
timeoutID__MODULE_ID__ = setTimeout(checkWindow__MODULE_ID__, 2000);
}
function processSessionCallback__MODULE_ID__(response) {
prefs__MODULE_ID__.set("authKey", Auth_Token__MODULE_ID__);
clearMessages__MODULE_ID__();
if(response == null || typeof response != "object" || response.firstChild == null) {
handleFacebookXMLErrorCode__MODULE_ID__(null);
} else {
//valid formed response
//check for errors
var error_code = response.getElementsByTagName("error_code");
if(error_code.length == 0 && !(response.getElementsByTagName("session_key").item(0).firstChild == null || response.getElementsByTagName("session_key").item(0).firstChild.nodeValue == "")) {
//get session and assign it
var sessionKey = response.getElementsByTagName("session_key");
SessionKey__MODULE_ID__ = sessionKey.item(0).firstChild.nodeValue;
//get uid and assign it
var uid = response.getElementsByTagName("uid");
uid__MODULE_ID__ = uid.item(0).firstChild.nodeValue;
SigKey__MODULE_ID__ = response.getElementsByTagName("secret").item(0).firstChild.nodeValue;
prefs__MODULE_ID__.set("secretKey", SigKey__MODULE_ID__);
prefs__MODULE_ID__.set("sessionKey", SessionKey__MODULE_ID__);
prefs__MODULE_ID__.set("userid", uid__MODULE_ID__);
showBase__MODULE_ID__(); //enable user to log out
}
else {
handleFacebookXMLErrorCode__MODULE_ID__(null);
}
}
loadTab__MODULE_ID__(callbackTab__MODULE_ID__);
}
//add security checks to see if tabnum is in range
function loadTab__MODULE_ID__(tabNum) {
tabs__MODULE_ID__.setSelectedTab(tabNum);
switch(tabNum) {
case 0:
selectTab_You__MODULE_ID__(tabIdDict__MODULE_ID__.you);
break;
case 1:
selectTab_Friends__MODULE_ID__(tabIdDict__MODULE_ID__.friends);
break;
case 2:
selectTab_Photos__MODULE_ID__(tabIdDict__MODULE_ID__.photos);
break;
case 3:
selectTab_Search__MODULE_ID__(tabIdDict__MODULE_ID__.search);
break;
}
}
//----------------------------------------------------------------------------------------------------
// "You" tab functionality
//----------------------------------------------------------------------------------------------------
//callback function for selecting "You" tab
function selectTab_You__MODULE_ID__(tabId) {
currentTab__MODULE_ID__ = 0;
var t_el = _gel(tabId);
removeChildren__MODULE_ID__(t_el);
clearActions__MODULE_ID__();
if(PendingAsyncResponse__MODULE_ID__) {
callbackTab__MODULE_ID__ = 0;
t_el.appendChild(document.createTextNode("Talking with Facebook..."));
}
else if(SessionKey__MODULE_ID__ != "") {
t_el.appendChild(document.createTextNode("Getting your Facebook information..."));
var params = new Array("uids="+uid__MODULE_ID__, "fields=first_name,status");
sendFbRequest__MODULE_ID__("facebook.users.getInfo", params, false, processMyself__MODULE_ID__);
} else {
//display login information
displayLogin__MODULE_ID__(t_el);
}
}
//this function processes facebook.users.getInfo calls with fields=first_name,status and uid=self
function processMyself__MODULE_ID__(response) {
callbackStorageObj__MODULE_ID__ = new Object();
//debugHTML__MODULE_ID__("");
if(response == null || typeof response != "object" || response.firstChild == null) {
connectionError__MODULE_ID__();
return;
} else {
//valid formed response
//check for errors
var error_code = response.getElementsByTagName("error_code");
if(error_code.length == 0) {
var first_name = response.getElementsByTagName("first_name");
callbackStorageObj__MODULE_ID__.first_name = first_name.item(0).firstChild.nodeValue;
var statusMsg = response.getElementsByTagName("message");
callbackStorageObj__MODULE_ID__.statusMsg = (statusMsg.item(0).firstChild) ? statusMsg.item(0).firstChild.nodeValue : "";
//get the rest of the information from notifications
sendFbRequest__MODULE_ID__("facebook.notifications.get", new Array(), false, processNotifications__MODULE_ID__);
}
else {
handleFacebookXMLErrorCode__MODULE_ID__(response);
}
}
}
function processNotifications__MODULE_ID__(response) {
if(response == null || typeof response != "object" || response.firstChild == null) {
connectionError__MODULE_ID__();
return;
} else {
//valid formed response
//check for errors
var error_code = response.getElementsByTagName("error_code");
if(error_code.length == 0) {
var unread, mostRecent;
//check for messages
callbackStorageObj__MODULE_ID__.messages = new Object();
unread = response.getElementsByTagName("messages").item(0).getElementsByTagName("unread");
callbackStorageObj__MODULE_ID__.messages.unread = unread.item(0).firstChild.nodeValue;
mostRecent = response.getElementsByTagName("messages").item(0).getElementsByTagName("most_recent");
callbackStorageObj__MODULE_ID__.messages.most_recent = mostRecent.item(0).firstChild.nodeValue;
//check for pokes
callbackStorageObj__MODULE_ID__.pokes = new Object();
unread = response.getElementsByTagName("pokes").item(0).getElementsByTagName("unread");
callbackStorageObj__MODULE_ID__.pokes.unread = unread.item(0).firstChild.nodeValue;
mostRecent = response.getElementsByTagName("pokes").item(0).getElementsByTagName("most_recent");
callbackStorageObj__MODULE_ID__.pokes.most_recent = mostRecent.item(0).firstChild.nodeValue;
//check for shares
callbackStorageObj__MODULE_ID__.shares = new Object();
unread = response.getElementsByTagName("shares").item(0).getElementsByTagName("unread");
callbackStorageObj__MODULE_ID__.shares.unread = unread.item(0).firstChild.nodeValue;
mostRecent = response.getElementsByTagName("shares").item(0).getElementsByTagName("most_recent");
callbackStorageObj__MODULE_ID__.shares.most_recent = mostRecent.item(0).firstChild.nodeValue;
callbackStorageObj__MODULE_ID__.friendReqs = new Object(); //object because we may want to extend in the future to store the uids..
callbackStorageObj__MODULE_ID__.friendReqs.count = response.getElementsByTagName("friend_requests").item(0).getElementsByTagName("uid").length;
callbackStorageObj__MODULE_ID__.groupInvites = new Object();
callbackStorageObj__MODULE_ID__.groupInvites.count = response.getElementsByTagName("group_invites").item(0).getElementsByTagName("gid").length;
callbackStorageObj__MODULE_ID__.eventInvites = new Object();
callbackStorageObj__MODULE_ID__.eventInvites.count = response.getElementsByTagName("event_invites").item(0).getElementsByTagName("eid").length;
//trigger rendering of info
renderYouTab__MODULE_ID__();
}
else {
handleFacebookXMLErrorCode__MODULE_ID__(response);
}
}
}
function renderYouTab__MODULE_ID__() { //this is usually the part where my eyes start bleeding
var t_el = _gel(tabIdDict__MODULE_ID__.you);
removeChildren__MODULE_ID__(t_el);
var row, iconImg, content, link, rowIcon, spacer;
//Display self ID row
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_status_src__MODULE_ID__;
iconImg.className = "IEIconFix__MODULE_ID__";
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
if(callbackStorageObj__MODULE_ID__.statusMsg == "")
content.appendChild(document.createTextNode("Logged in as " + callbackStorageObj__MODULE_ID__.first_name + "."));
else
content.appendChild(document.createTextNode(callbackStorageObj__MODULE_ID__.first_name + " is " + callbackStorageObj__MODULE_ID__.statusMsg + "."));
content.appendChild(document.createTextNode(" ["));
link = document.createElement("a");
link.href = fbUrl_profile__MODULE_ID__ + uid__MODULE_ID__;
link.innerHTML = "go to profile";
link.target = "_blank";
content.appendChild(link);
content.appendChild(document.createTextNode("]"));
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
//Display messages row
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_mail_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
if(callbackStorageObj__MODULE_ID__.messages.unread > 1) {
content.innerHTML = "You have <a href=\"" + fbUrl_mailbox__MODULE_ID__ + "\" target=\"_blank\"><strong>" + callbackStorageObj__MODULE_ID__.messages.unread + "</strong> unread messages</a>.";
} else if (callbackStorageObj__MODULE_ID__.messages.unread == 1) {
content.innerHTML = "You have <a href=\"" + fbUrl_mailbox__MODULE_ID__ + "\" target=\"_blank\"><strong>1</strong> unread message</a>.";
}
else {
content.innerHTML = "You have no unread <a href=\"" + fbUrl_mailbox__MODULE_ID__ + "\" target=\"_blank\">messages</a>.";
}
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
//Display pokes row CONDITIONAL
if(callbackStorageObj__MODULE_ID__.pokes.unread > 0) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_poke_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
if(callbackStorageObj__MODULE_ID__.pokes.unread > 1) {
content.innerHTML = "You recieved <a href=\"" + fbUrl_home__MODULE_ID__ + "\" target=\"_blank\"><strong>" + callbackStorageObj__MODULE_ID__.pokes.unread + "</strong> pokes</a>.";
} else {
content.innerHTML = "You recieved <a href=\"" + fbUrl_home__MODULE_ID__ + "\" target=\"_blank\"><strong>1</strong> poke</a>.";
}
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
}
//Display shares row CONDITIONAL
if(callbackStorageObj__MODULE_ID__.shares.unread > 0) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_share_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
if(callbackStorageObj__MODULE_ID__.shares.unread > 1) {
content.innerHTML = "<a href=\"" + fbUrl_shared__MODULE_ID__ + "\" target=\"_blank\"><strong>" + callbackStorageObj__MODULE_ID__.shares.unread + "</strong> new shared item</a>";
} else {
content.innerHTML = "<a href=\"" + fbUrl_shared__MODULE_ID__ + "\" target=\"_blank\"><strong>1</strong> new shared item</a>";
}
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
}
//boolean switch values later for displaying static links
var dispNoFriends = false;
var dispNoEvents = false;
var dispNoGroups = false;
//Display friend requests CONDITIONAL
if(callbackStorageObj__MODULE_ID__.friendReqs.count > 0) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_friend_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
if(callbackStorageObj__MODULE_ID__.friendReqs.count > 1) {
content.innerHTML = "<a href=\"" + fbUrl_reqs__MODULE_ID__ + "\" target=\"_blank\"><strong>" + callbackStorageObj__MODULE_ID__.friendReqs.count + "</strong> friend requests</a>";
} else {
content.innerHTML = "<a href=\"" + fbUrl_reqs__MODULE_ID__ + "\" target=\"_blank\"><strong>1</strong> friend request</a>";
}
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
} else {
dispNoFriends = true;
}
//Display group invites CONDITIONAL
if(callbackStorageObj__MODULE_ID__.groupInvites.count > 0) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_group_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
if(callbackStorageObj__MODULE_ID__.groupInvites.count > 1) {
content.innerHTML = "<a href=\"" + fbUrl_reqs__MODULE_ID__ + "\" target=\"_blank\"><strong>" + callbackStorageObj__MODULE_ID__.groupInvites.count + "</strong> group invites</a>";
} else {
content.innerHTML = "<a href=\"" + fbUrl_reqs__MODULE_ID__ + "\" target=\"_blank\"><strong>1</strong> group invite</a>";
}
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
} else {
dispNoGroups = true;
}
//Display event invites CONDITIONAL
if(callbackStorageObj__MODULE_ID__.eventInvites.count > 0) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_event_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
if(callbackStorageObj__MODULE_ID__.eventInvites.count > 1) {
content.innerHTML = "<a href=\"" + fbUrl_reqs__MODULE_ID__ + "\" target=\"_blank\"><strong>" + callbackStorageObj__MODULE_ID__.eventInvites.count + "</strong> event invites</a>";
} else {
content.innerHTML = "<a href=\"" + fbUrl_reqs__MODULE_ID__ + "\" target=\"_blank\"><strong>1</strong> event invite</a>";
}
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
} else {
dispNoEvents = true;
}
if(dispNoFriends) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_friend_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
content.innerHTML = "<a href=\"" + fbUrl_friends__MODULE_ID__ + "\" target=\"_blank\">View your friends list</a>";
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
}
if(dispNoGroups) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_group_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
content.innerHTML = "<a href=\"" + fbUrl_groups__MODULE_ID__ + "\" target=\"_blank\">View your groups list</a>";
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
}
if(dispNoEvents) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
iconImg.src = img_event_src__MODULE_ID__;
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
content.innerHTML = "<a href=\"" + fbUrl_events__MODULE_ID__ + "\" target=\"_blank\">View your events list</a>";
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
}
var texts = new Array();
texts[0] = "Refresh";
var funcs = new Array();
funcs[0] = function(){loadTab__MODULE_ID__(0)};
setActions__MODULE_ID__(texts, funcs);
//final call to clean up
callbackStorageObj__MODULE_ID__ = new Object();
_IG_AdjustIFrameHeight();
}
function refreshCurrentTab__MODULE_ID__() {
loadTab__MODULE_ID__(callbackTab__MODULE_ID__);
}
//----------------------------------------------------------------------------------------------------
// "Friends" tab functionality
//----------------------------------------------------------------------------------------------------
//callback function for selecting "Friends" tab
function selectTab_Friends__MODULE_ID__(tabId) {
currentTab__MODULE_ID__ = 1;
var t_el = _gel(tabId);
removeChildren__MODULE_ID__(t_el);
clearActions__MODULE_ID__();
if(PendingAsyncResponse__MODULE_ID__) {
callbackTab__MODULE_ID__ = 1;
t_el.appendChild(document.createTextNode("Talking with Facebook..."));
}
else if(SessionKey__MODULE_ID__ != "") {
t_el.appendChild(document.createTextNode("Getting your friends information..."));
var fqlQuery = escape("SELECT uid, name, profile_update_time, status, sex FROM user WHERE uid IN (SELECT uid1 FROM friend WHERE uid2 = " + uid__MODULE_ID__ + ") AND ((status.time > now()-3600*24) OR (profile_update_time > now()-3600*24))");
var params = new Array("format=JSON", "query=" + fqlQuery);
sendFbRequest__MODULE_ID__("facebook.fql.query", params, false, processFriendsData__MODULE_ID__);
} else {
//display login information
displayLogin__MODULE_ID__(t_el);
}
}
function processFriendsData__MODULE_ID__(response) {
if(response == null) {
connectionError__MODULE_ID__();
return;
} else {
//debugHTML__MODULE_ID__("response: " + response);
var friends = eval("(" + response + ")");
if(friends.length == null)
{
_gel(tabIdDict__MODULE_ID__.friends).innerHTML = "No friends were found.";
return;
}
var i, pUpdateTime, sUpdateTime, tObj;
var updates = new Array();
for(i=0; i<friends.length; i++) {
//notes for conversion from xml parsing to json
//pUpdateTime -> friends[i].profile_update_time
//sUpdateTime -> friends[i].status.time
//sMsg -> friends[i].status.message
if(friends[i].profile_update_time != 0) {
tObj = new Object();
tObj.type = "profile";
tObj.uid = friends[i].uid;
tObj.time = friends[i].profile_update_time*1000; //convert back to ms
tObj.gender = friends[i].sex;
tObj.name = friends[i].name;
addToUpdateList__MODULE_ID__(updates, tObj);
}
if(friends[i].status && friends[i].status.time != 0 && friends[i].status.message != "") {
tObj = new Object();
tObj.type = "status";
tObj.uid = friends[i].uid;
tObj.time = friends[i].status.time*1000; //convert back to ms
tObj.gender = friends[i].sex;
tObj.msg = friends[i].status.message;
tObj.name = friends[i].name;
addToUpdateList__MODULE_ID__(updates, tObj);
}
}
renderFriendsTab__MODULE_ID__(updates);
}
}
function addToUpdateList__MODULE_ID__(array, obj) {
addToSortedTimeArray__MODULE_ID__(array, obj);
}
function renderFriendsTab__MODULE_ID__(updates) {
var t_el = _gel(tabIdDict__MODULE_ID__.friends);
removeChildren__MODULE_ID__(t_el);
if(updates.length == 0) {
t_el.innerHTML = "None of your friends have updated recently.";
return;
}
var row, iconImg, content, link, rowIcon, spacer, updateDateObj;
var i;
for(i=updates.length-1; i>=0 && i>updates.length-1-friendsListLimit__MODULE_ID__; i--) {
row = document.createElement("div");
row.className = "listItem__MODULE_ID__";
rowIcon = document.createElement("div");
rowIcon.className = "listItemIcon__MODULE_ID__";
iconImg = document.createElement("img");
content = document.createElement("div");
content.className = "listItemContent__MODULE_ID__";
updateDateObj = new Date();
updateDateObj.setTime(updates[i].time);
switch(updates[i].type) {
case "profile":
iconImg.src = img_editprofile_src__MODULE_ID__;
content.innerHTML = "<a href=\"" + fbUrl_profile__MODULE_ID__ + updates[i].uid + "&highlight\" target=\"_blank\">" + updates[i].name + "</a> has updated " +
((updates[i].gender == "") ? "their" : ((updates[i].gender == "male") ? "his" : "her" )) + " profile</a>. " +
"<span class=\"time__MODULE_ID__\">" + ((updateDateObj.getHours()>12)?((updateDateObj.getHours()-10)-2)

(updateDateObj.getHours()>0)?updateDateObj.getHours():12)) +
":" + ((updateDateObj.getMinutes()<10)?"0"+updateDateObj.getMinutes():updateDateObj.getMinutes()) +
((updateDateObj.getHours()>=12)?"pm":"am") + "</span>";
break;
case "status":
iconImg.src = img_friendguy_src__MODULE_ID__;
content.innerHTML = "<a href=\"" + fbUrl_profile__MODULE_ID__ + updates[i].uid + "&highlight\" target=\"_blank\">" + updates[i].name + "</a> is " +
updates[i].msg + ". " + "<span class=\"time__MODULE_ID__\">" +
((updateDateObj.getHours()>12)?((updateDateObj.getHours()-10)-2)

(updateDateObj.getHours()>0)?updateDateObj.getHours():12)) + ":" +
((updateDateObj.getMinutes()<10)?"0"+updateDateObj.getMinutes():updateDateObj.getMinutes()) +
((updateDateObj.getHours()>=12)?"pm":"am") + "</span>";
break;
}
rowIcon.appendChild(iconImg);
row.appendChild(rowIcon);
row.appendChild(content);
t_el.appendChild(row);
if(BrowserDetect__MODULE_ID__.browser == "Explorer") {
row.style.margin = "0px 0px 5px 0px";
} else {
spacer = document.createElement("div");
spacer.className = "listItemSpacer__MODULE_ID__";
t_el.appendChild(spacer);
}
}
var texts = new Array();
texts[0] = "Refresh";
var funcs = new Array();
funcs[0] = function(){loadTab__MODULE_ID__(1)};
setActions__MODULE_ID__(texts, funcs);
_IG_AdjustIFrameHeight();
}
//----------------------------------------------------------------------------------------------------
// "Photos" tab functionality
//----------------------------------------------------------------------------------------------------
//callback function for selecting "Photos" tab
function selectTab_Photos__MODULE_ID__(tabId) {
var t_el = _gel(tabId);
currentTab__MODULE_ID__ = 2;
removeChildren__MODULE_ID__(t_el);
clearActions__MODULE_ID__();
if(PendingAsyncResponse__MODULE_ID__) {
callbackTab__MODULE_ID__ = 2;
t_el.appendChild(document.createTextNode("Talking with Facebook..."));
}
else if(SessionKey__MODULE_ID__ != "") {
var table = document.createElement("table");
table.cellPadding = 0;
table.cellSpacing = 0;
table.border = 0;
table.height = 140;
table.width = "100%";
var tr = document.createElement("tr");
var td1 = document.createElement("td");
td1.width = 1;
td1.innerHTML = "<img src=\"" + img_spacer_src__MODULE_ID__ + "\" height=140 width=1 />";
tr.appendChild(td1);
var td2 = document.createElement("td");
td2.className = "fb__MODULE_ID__ photoCell__MODULE_ID__";
//td2.id = "photoDiv__MODULE_ID__";
var photoDiv = document.createElement("div");
photoDiv.id = "photoDiv__MODULE_ID__";
photoDiv.appendChild(document.createTextNode("Loading picture..."));
td2.appendChild(photoDiv);
tr.appendChild(td2);
table.appendChild(tr);
t_el.appendChild(table);
var caption = document.createElement("div");
caption.innerHTML = " ";
caption.className = "fb__MODULE_ID__";
caption.id = "photoCaptionDiv__MODULE_ID__";
t_el.appendChild(caption);
var params;
var fqlQuery = escape("SELECT src, link, caption FROM photo WHERE (pid IN (SELECT pid FROM photo_tag WHERE subject = " + uid__MODULE_ID__ + "))");
var params = new Array("format=JSON", "query=" + fqlQuery);
sendFbRequest__MODULE_ID__("facebook.fql.query", params, false, displayRandomPhoto__MODULE_ID__);
} else {
//display login information
displayLogin__MODULE_ID__(t_el);
}
}
/*function selectRandomFriend__MODULE_ID__(response) {
if(response == null || typeof response != "object" || response.firstChild == null) {
connectionError__MODULE_ID__();
return;
} else {
//valid formed response
//check for errors
var error_code = response.getElementsByTagName("error_code");
if(error_code.length == 0) {
var t_el = _gel(tabIdDict__MODULE_ID__.photos);
var uids = response.getElementsByTagName("uid");
if(uids.length== 0) {
_gel(tabIdDict__MODULE_ID__.photos).innerHTML = "No friends were found.";
return;
}
var randomFriend = Math.floor(Math.random()*uids.length);
var params = new Array("subj_id=" + uids.item(randomFriend).firstChild.nodeValue);
sendFbRequest__MODULE_ID__("facebook.photos.get", params, false, displayRandomPhoto__MODULE_ID__);
}
else {
handleFacebookXMLErrorCode__MODULE_ID__(response);
}
}
}*/
function switchSlideshow__MODULE_ID__(){
slideshow__MODULE_ID__ = !slideshow__MODULE_ID__;
if(!slideshow__MODULE_ID__ && slideshowTimer__MODULE_ID__!=null) {
clearTimeout(slideshowTimer__MODULE_ID__);
slideshowTimer__MODULE_ID__ = null;
var texts = new Array();
var funcs = new Array();
texts[0] = "Turn slideshow on";
funcs[0] = switchSlideshow__MODULE_ID__;
texts[1] = "Next photo";
funcs[1] = function(){loadTab__MODULE_ID__(2)};
setActions__MODULE_ID__(texts, funcs);
}
else {
nextSlide__MODULE_ID__();
}
}
function nextSlide__MODULE_ID__() {
//future: add picture transitions here for a better 'slideshow' effect
loadTab__MODULE_ID__(2); //lamest slideshow effect ever, i know.
}
function displayRandomPhoto__MODULE_ID__(response) {
if(response == null || response == "") {
connectionError__MODULE_ID__();
return;
} else {
var photos = eval("(" + response + ")");
if(photos.length == null)
{
_gel(tabIdDict__MODULE_ID__.photos).innerHTML = "No photos were found.";
return;
}
var t_el = _gel("photoDiv__MODULE_ID__");
removeChildren__MODULE_ID__(t_el);
var randomPhoto = Math.floor(Math.random()*photos.length);
var photo = new Object();
photo.src = photos[randomPhoto].src;
photo.href = photos[randomPhoto].link;
photo.caption = (photos[randomPhoto].caption != "") ? (photos[randomPhoto].caption) : "<i>No caption</i>";
var photoDiv = document.createElement("div");
photoDiv.className = "photo__MODULE_ID__";
photoDiv.innerHTML = "<table height=140 align=center valign=center border=0 cellpadding=0 cellspacing=0><tr>" +
"<td><a id=\"photoLink__MODULE_ID__\" href=\"" + photo.href + "\" target=\"_blank\">" +
"<img id=\"slideshowPhoto__MODULE_ID__\" src=\"" + photo.src + "\" style=\"border:1px solid #cccccc; padding:2px;\" />" +
"</a></td></tr></table>";
t_el.appendChild(photoDiv);
var photoCaption = _gel("photoCaptionDiv__MODULE_ID__");
photoCaption.className = "photoCaption__MODULE_ID__";
photoCaption.innerHTML = "<a href=\"" + photo.href + "\" target=\"_blank\">" + photo.caption + "</a>";
}
var texts = new Array();
var funcs = new Array();
if(!slideshow__MODULE_ID__) {
texts[0] = "Turn slideshow on";
}
else {
texts[0] = "Turn slideshow off";
}
funcs[0] = switchSlideshow__MODULE_ID__;
texts[1] = "Next photo";
funcs[1] = nextSlide__MODULE_ID__;
setActions__MODULE_ID__(texts, funcs);
updateSizeWithTimeout__MODULE_ID__();
if(slideshow__MODULE_ID__) {
slideshowTimer__MODULE_ID__ = setTimeout("nextSlide__MODULE_ID__()", 5000);
}
}
//----------------------------------------------------------------------------------------------------
// "Search" tab functionality
//----------------------------------------------------------------------------------------------------
//callback function for selecting "Search" tab
function selectTab_Search__MODULE_ID__(tabId) {
currentTab__MODULE_ID__ = 3;
var t_el = _gel(tabId);
removeChildren__MODULE_ID__(t_el);
clearActions__MODULE_ID__();
if(PendingAsyncResponse__MODULE_ID__) {
callbackTab__MODULE_ID__ = 3;
t_el.appendChild(document.createTextNode("Talking with Facebook..."));
}
else if(SessionKey__MODULE_ID__ != "") {
t_el.appendChild(document.createTextNode("Retrieving a list of your networks..."));
var params = new Array("uids=" + uid__MODULE_ID__, "fields=affiliations");
sendFbRequest__MODULE_ID__("facebook.users.getInfo", params, false, renderSearchTab__MODULE_ID__);
} else {
//display login information
displayLogin__MODULE_ID__(t_el);
}
}
function renderSearchTab__MODULE_ID__(response) {
if(response == null || typeof response != "object" || response.firstChild == null) {
connectionError__MODULE_ID__();
return;
} else {
//valid formed response
//check for errors
var error_code = response.getElementsByTagName("error_code");
if(error_code.length == 0) {
var t_el = _gel(tabIdDict__MODULE_ID__.search);
removeChildren__MODULE_ID__(t_el);
var networks = new Array();
networks[0] = new Object();
networks[0].nid = "-1";
networks[0].name = "All Networks"
var i,n;
var affiliations = response.getElementsByTagName("affiliation");
if(affiliations.length > 0) {
for(i=0; i<affiliations.length; i++) {
n=networks.length;
networks[n] = new Object();
networks[n].nid = affiliations.item(i).getElementsByTagName("nid").item(0).firstChild.nodeValue;
networks[n].name = affiliations.item(i).getElementsByTagName("name").item(0).firstChild.nodeValue;
}
}
//render
t_el.innerHTML = "<table class=\"fb__MODULE_ID__\" width=100% cellpadding=2 cellspacing=0>" +
"<tr><td width=1% nowrap align=right>Search for</td><td><input class=\"fbInput__MODULE_ID__\" style=\"width:100%\" id=\"query__MODULE_ID__\" name=\"query__MODULE_ID__\" /></td></tr>" +
"<tr><td width=1% nowrap align=right>within</td><td><select class=\"fbInput__MODULE_ID__\" style=\"width:100%\" id=\"network__MODULE_ID__\" name=\"network__MODULE_ID__\"></select></td></tr>" +
"<tr><td></td><td><input id=\"\" class=\"fbButton__MODULE_ID__\" value=\"Search\" type=\"button\" onclick=\"runSearch__MODULE_ID__()\" /></td></tr>" +
"</table>";
var dropdown = _gel("network__MODULE_ID__");
var opt;
for(i=0; i<networks.length; i++) {
opt = document.createElement("option");
opt.value = networks[i].nid;
opt.innerHTML = networks[i].name;
dropdown.appendChild(opt);
}
}
else {
handleFacebookXMLErrorCode__MODULE_ID__(response);
}
}
_IG_AdjustIFrameHeight();
}
function runSearch__MODULE_ID__() {
var url = fbUrl_search__MODULE_ID__ + _gel("query__MODULE_ID__").value + "&n=" + _gel("network__MODULE_ID__").value;
window.location.href = url;
}
//----------------------------------------------------------------------------------------------------
// Facebook Gadget JS "Library"
//----------------------------------------------------------------------------------------------------
function sendFbRequest__MODULE_ID__(method, params, secureSwitch, callbackFn) {
var sigArray = new Array();
var reqArray = new Array();
var targetUrl, sig;
var i;
addTokenToSortedArray__MODULE_ID__(sigArray, "api_key=" + APIKey__MODULE_ID__);
addTokenToSortedArray__MODULE_ID__(reqArray, "api_key=" + APIKey__MODULE_ID__);
var now = new Date();
addTokenToSortedArray__MODULE_ID__(sigArray, "call_id=" + now.getTime());
addTokenToSortedArray__MODULE_ID__(reqArray, "call_id=" + now.getTime());
addTokenToSortedArray__MODULE_ID__(sigArray, "method=" + method);
addTokenToSortedArray__MODULE_ID__(reqArray, "method=" + method);
addTokenToSortedArray__MODULE_ID__(sigArray, "v=" + APIVersion__MODULE_ID__);
addTokenToSortedArray__MODULE_ID__(reqArray, "v=" + APIVersion__MODULE_ID__);
for(i=0; i<params.length; i++) {
if(params[i].indexOf("query=SELECT") > -1) {
addTokenToSortedArray__MODULE_ID__(sigArray, unescape(params[i]));
} else {
addTokenToSortedArray__MODULE_ID__(sigArray, params[i]);
}
addTokenToSortedArray__MODULE_ID__(reqArray, params[i]);
}
if(method != "facebook.auth.getSession" && method != "facebook.auth.createToken") {
addTokenToSortedArray__MODULE_ID__(sigArray, "session_key=" + SessionKey__MODULE_ID__);
addTokenToSortedArray__MODULE_ID__(reqArray, "session_key=" + SessionKey__MODULE_ID__);
}
targetUrl = (secureSwitch) ? SecureAPIServer__MODULE_ID__ : APIServer__MODULE_ID__;
sig = "";
for(i=0; i<sigArray.length; i++) {
targetUrl = targetUrl + reqArray[i] + "&";
sig = sig + sigArray[i];
}
sig = sig + SigKey__MODULE_ID__;
targetUrl = targetUrl + "sig=" + hex_md5__MODULE_ID__(sig);
_IG_FetchXmlContent(targetUrl, callbackFn);
}
function sendFbLogoutRequest__MODULE_ID__(callbackFn) {
_IG_FetchXmlContent(fbUrl_logout__MODULE_ID__, callbackFn);
}
//----------------------------------------------------------------------------------------------------
// Helper & Debugging Functions
//----------------------------------------------------------------------------------------------------
//little did i know that JS has a built in sort() function... how embarrassing.
function addTokenToSortedArray__MODULE_ID__(array, token) {
var i = array.length;
for(; i>0 && token<array[i-1]; i--)
array[i] = array[i-1];
array[i] = token;
}
function addToSortedTimeArray__MODULE_ID__(array, obj) {
if(!obj.time)
return;
var i = array.length;
for(; i>0 && obj.time<array[i-1].time; i--)
array[i] = array[i-1];
array[i] = obj;
}
function addAction__MODULE_ID__(text, func) {
t_el = _gel("baseActions__MODULE_ID__");
if(text != "|") {
var link = document.createElement("a");
link.innerHTML = text;
link.href = "#";
link.onclick = func;
t_el.appendChild(link);
t_el.appendChild(document.createTextNode(" "));
}
else {
t_el.appendChild(document.createTextNode("| "));
}
}
function clearActions__MODULE_ID__() {
t_el = _gel("baseActions__MODULE_ID__");
removeChildren__MODULE_ID__(t_el);
}
//precondition: texts.length == funcs.length
function setActions__MODULE_ID__(texts, funcs) {
clearActions__MODULE_ID__();
var i;
for(i=0; i<texts.length; i++) {
if(i>0 && i<texts.length) {
addAction__MODULE_ID__("|", null)
}
addAction__MODULE_ID__(texts[i], funcs[i]);
}
}
function removeChildren__MODULE_ID__(t_el) {
while(t_el.firstChild) {
t_el.removeChild(t_el.firstChild);
}
}
function updateSizeWithTimeout__MODULE_ID__() {
setTimeout("_IG_AdjustIFrameHeight()", 800);
}
// var msgBay__MODULE_ID__ = new Array();
function createStaticMessage__MODULE_ID__(msgText) {
var i;
for(i=0; i<msgBay__MODULE_ID__.length; i++) {
msg__MODULE_ID__.dismissMessage(msgBay__MODULE_ID__[i]);
}
var id = msg__MODULE_ID__.createStaticMessage(msgText);
msgBay__MODULE_ID__[0] = id;
_IG_AdjustIFrameHeight();
}
function createMessage__MODULE_ID__(msgText) {
var i;
for(i=0; i<msgBay__MODULE_ID__.length; i++) {
msg__MODULE_ID__.dismissMessage(msgBay__MODULE_ID__[i]);
}
var id = msg__MODULE_ID__.createDismissibleMessage(msgText);
msgBay__MODULE_ID__[0] = id;
_IG_AdjustIFrameHeight();
}
function appendMessage__MODULE_ID__(msgText) {
var id = msg__MODULE_ID__.createDismissibleMessage(msgText);
msgBay__MODULE_ID__[msgBay__MODULE_ID__.length] = id;
_IG_AdjustIFrameHeight();
}
function clearMessages__MODULE_ID__() {
var i;
for(i=0; i<msgBay__MODULE_ID__.length; i++) {
if(msgBay__MODULE_ID__[i] != null)
msg__MODULE_ID__.dismissMessage(msgBay__MODULE_ID__[i]);
}
msgBay__MODULE_ID__ = new Array();
_IG_AdjustIFrameHeight()
}
function handleFacebookXMLErrorCode__MODULE_ID__(response) {
if(response==null){
createMessage__MODULE_ID__("Oops! Something went wrong while trying to talk to Facebook, please try again in a bit.");
//TODO: RETRY CONNECTION
}
else if(response.getElementsByTagName("error_code").item(0).firstChild.nodeValue == "102") {
createMessage__MODULE_ID__("We couldn't connect to your Facebook account, have you logged in from another location? Please try reconnecting again below.");
reset__MODULE_ID__();
}
else if(response.getElementsByTagName("error_code").item(0).firstChild.nodeValue == "4") {
createMessage__MODULE_ID__("Requests are being sent too frequently, please wait a while before attempting to access the Facebook gadget again.");
}
else {
createMessage__MODULE_ID__("Oops! Something went wrong while trying to talk to Facebook, please try again later.");
//TODO: RETRY CONNECTION
}
/*
debug__MODULE_ID__("Facebook XML Error: " + response.getElementsByTagName("error_code").item(0).firstChild.nodeValue + ": " + response.getElementsByTagName("error_msg").item(0).firstChild.nodeValue);
var request_args = response.getElementsByTagName("arg");
var i, j, key, val, nodeList, node;
for(i=0; i<request_args.length; i++) {
nodeList = request_args.item(i).childNodes;
for(j=0; j<nodeList.length; j++) {
node = nodeList.item(j);
if(node.nodeName == "key")
key = node.firstChild.nodeValue;
if(node.nodeName == "value")
val = node.firstChild.nodeValue;
}
debug__MODULE_ID__(" [" + key + "=" + val + "]");
}
*/
}
function debugHTML__MODULE_ID__(msg) {
_gel("debug__MODULE_ID__").innerHTML = msg;
}
function debug__MODULE_ID__(msg) {
_gel("debug__MODULE_ID__").appendChild(document.createTextNode(msg));
}
function connectionError__MODULE_ID__() {
createMessage__MODULE_ID__("Oops! Something went wrong while trying to talk to Facebook, please try again later.");
}
//----------------------------------------------------------------------------------------------------
// **BEGIN MD5 UTILITY FUNCTIONS**
//NOTE: for efficiency, I should put md5 functions into javascript object and call appropriately, modularize!
// portions of the MD5 UTILITY FUNCTIONS are from
http://pajhome.org.uk/crypt/md5/, see license below (BSD)
/*
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See
http://pajhome.org.uk/crypt/md5 for more info.
*/
var hexcase__MODULE_ID__ = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
var chrsz__MODULE_ID__ = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
function md5_vm_test__MODULE_ID__()
{
return hex_md5__MODULE_ID__("abc") == "900150983cd24fb0d6963f7d28e17f72";
}
function hex_md5__MODULE_ID__(s){ return binl2hex__MODULE_ID__(core_md5__MODULE_ID__(str2binl__MODULE_ID__(s), s.length * chrsz__MODULE_ID__));}
function str2binl__MODULE_ID__(str)
{
var bin = Array();
var mask = (1 << chrsz__MODULE_ID__) - 1;
for(var i = 0; i < str.length * chrsz__MODULE_ID__; i += chrsz__MODULE_ID__)
bin[i>>5] |= (str.charCodeAt(i / chrsz__MODULE_ID__) & mask) << (i%32);
return bin;
}
function core_md5__MODULE_ID__(x, len)
{
/* append padding */
x[len >> 5] |= 0x80 << ((len) % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
for(var i = 0; i < x.length; i += 16)
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
a = md5_ff__MODULE_ID__(a, b, c, d, x[i+ 0], 7 , -680876936);
d = md5_ff__MODULE_ID__(d, a, b, c, x[i+ 1], 12, -389564586);
c = md5_ff__MODULE_ID__(c, d, a, b, x[i+ 2], 17, 606105819);
b = md5_ff__MODULE_ID__(b, c, d, a, x[i+ 3], 22, -1044525330);
a = md5_ff__MODULE_ID__(a, b, c, d, x[i+ 4], 7 , -176418897);
d = md5_ff__MODULE_ID__(d, a, b, c, x[i+ 5], 12, 1200080426);
c = md5_ff__MODULE_ID__(c, d, a, b, x[i+ 6], 17, -1473231341);
b = md5_ff__MODULE_ID__(b, c, d, a, x[i+ 7], 22, -45705983);
a = md5_ff__MODULE_ID__(a, b, c, d, x[i+ 8], 7 , 1770035416);
d = md5_ff__MODULE_ID__(d, a, b, c, x[i+ 9], 12, -1958414417);
c = md5_ff__MODULE_ID__(c, d, a, b, x[i+10], 17, -42063);
b = md5_ff__MODULE_ID__(b, c, d, a, x[i+11], 22, -1990404162);
a = md5_ff__MODULE_ID__(a, b, c, d, x[i+12], 7 , 1804603682);
d = md5_ff__MODULE_ID__(d, a, b, c, x[i+13], 12, -40341101);
c = md5_ff__MODULE_ID__(c, d, a, b, x[i+14], 17, -1502002290);
b = md5_ff__MODULE_ID__(b, c, d, a, x[i+15], 22, 1236535329);
a = md5_gg__MODULE_ID__(a, b, c, d, x[i+ 1], 5 , -165796510);
d = md5_gg__MODULE_ID__(d, a, b, c, x[i+ 6], 9 , -1069501632);
c = md5_gg__MODULE_ID__(c, d, a, b, x[i+11], 14, 643717713);
b = md5_gg__MODULE_ID__(b, c, d, a, x[i+ 0], 20, -373897302);
a = md5_gg__MODULE_ID__(a, b, c, d, x[i+ 5], 5 , -701558691);
d = md5_gg__MODULE_ID__(d, a, b, c, x[i+10], 9 , 38016083);
c = md5_gg__MODULE_ID__(c, d, a, b, x[i+15], 14, -660478335);
b = md5_gg__MODULE_ID__(b, c, d, a, x[i+ 4], 20, -405537848);
a = md5_gg__MODULE_ID__(a, b, c, d, x[i+ 9], 5 , 568446438);
d = md5_gg__MODULE_ID__(d, a, b, c, x[i+14], 9 , -1019803690);
c = md5_gg__MODULE_ID__(c, d, a, b, x[i+ 3], 14, -187363961);
b = md5_gg__MODULE_ID__(b, c, d, a, x[i+ 8], 20, 1163531501);
a = md5_gg__MODULE_ID__(a, b, c, d, x[i+13], 5 , -1444681467);
d = md5_gg__MODULE_ID__(d, a, b, c, x[i+ 2], 9 , -51403784);
c