  <?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://static.brianngo.net/ig/ig_profile.png" 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://static.brianngo.net/ig/facebook/screenshot.png" thumbnail="http://static.brianngo.net/ig/facebook/thumbnail.png" scaling="true">
  <Require feature="dynamic-height" /> 
  <Require feature="setprefs" /> 
  <Require feature="tabs" /> 
  <Require feature="minimessage" /> 
  <Require feature="analytics" /> 
  </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 3
			 *	--------------------------------------------------------------------------------------------------
			 *   - Migrated away from Google Code servers, users now have latest version.
                 *
			 *  --------------------------------------------------------------------------------------------------
			 *	Changes in Release 2 and 1/2th
			 *	--------------------------------------------------------------------------------------------------
			 *   - Fixed several small bugs from feedback
			 *   - Added transition to slideshow
			 *
		 	 *	--------------------------------------------------------------------------------------------------
			 *	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://api.facebook.com/restserver.php?";
			var SecureAPIServer__MODULE_ID__ = "https://api.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://static.brianngo.net/ig/facebook/";
			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 + " " + 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 received <a href=\"" + fbUrl_home__MODULE_ID__ + "\" target=\"_blank\"><strong>" + callbackStorageObj__MODULE_ID__.pokes.unread + "</strong> pokes</a>.";
					} else {
						content.innerHTML = "You received <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> " + 
												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 = "&nbsp;";
					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 = "<form action=\"javascript:void(0)\"><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=\"submit\" onclick=\"runSearch__MODULE_ID__()\" /></td></tr>" + 
										 "</table></form>";
						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.open(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 in a bit.");
					//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__() {
				_gel("debug__MODULE_ID__").innerHTML = "Facebook servers could not be contacted. 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 = md5_gg__MODULE_ID__(c, d, a, b, x[i+ 7], 14,  1735328473);
			    b = md5_gg__MODULE_ID__(b, c, d, a, x[i+12], 20, -1926607734);

			    a = md5_hh__MODULE_ID__(a, b, c, d, x[i+ 5], 4 , -378558);
			    d = md5_hh__MODULE_ID__(d, a, b, c, x[i+ 8], 11, -2022574463);
			    c = md5_hh__MODULE_ID__(c, d, a, b, x[i+11], 16,  1839030562);
			    b = md5_hh__MODULE_ID__(b, c, d, a, x[i+14], 23, -35309556);
			    a = md5_hh__MODULE_ID__(a, b, c, d, x[i+ 1], 4 , -1530992060);
			    d = md5_hh__MODULE_ID__(d, a, b, c, x[i+ 4], 11,  1272893353);
			    c = md5_hh__MODULE_ID__(c, d, a, b, x[i+ 7], 16, -155497632);
			    b = md5_hh__MODULE_ID__(b, c, d, a, x[i+10], 23, -1094730640);
			    a = md5_hh__MODULE_ID__(a, b, c, d, x[i+13], 4 ,  681279174);
			    d = md5_hh__MODULE_ID__(d, a, b, c, x[i+ 0], 11, -358537222);
			    c = md5_hh__MODULE_ID__(c, d, a, b, x[i+ 3], 16, -722521979);
			    b = md5_hh__MODULE_ID__(b, c, d, a, x[i+ 6], 23,  76029189);
			    a = md5_hh__MODULE_ID__(a, b, c, d, x[i+ 9], 4 , -640364487);
			    d = md5_hh__MODULE_ID__(d, a, b, c, x[i+12], 11, -421815835);
			    c = md5_hh__MODULE_ID__(c, d, a, b, x[i+15], 16,  530742520);
			    b = md5_hh__MODULE_ID__(b, c, d, a, x[i+ 2], 23, -995338651);

			    a = md5_ii__MODULE_ID__(a, b, c, d, x[i+ 0], 6 , -198630844);
			    d = md5_ii__MODULE_ID__(d, a, b, c, x[i+ 7], 10,  1126891415);
			    c = md5_ii__MODULE_ID__(c, d, a, b, x[i+14], 15, -1416354905);
			    b = md5_ii__MODULE_ID__(b, c, d, a, x[i+ 5], 21, -57434055);
			    a = md5_ii__MODULE_ID__(a, b, c, d, x[i+12], 6 ,  1700485571);
			    d = md5_ii__MODULE_ID__(d, a, b, c, x[i+ 3], 10, -1894986606);
			    c = md5_ii__MODULE_ID__(c, d, a, b, x[i+10], 15, -1051523);
			    b = md5_ii__MODULE_ID__(b, c, d, a, x[i+ 1], 21, -2054922799);
			    a = md5_ii__MODULE_ID__(a, b, c, d, x[i+ 8], 6 ,  1873313359);
			    d = md5_ii__MODULE_ID__(d, a, b, c, x[i+15], 10, -30611744);
			    c = md5_ii__MODULE_ID__(c, d, a, b, x[i+ 6], 15, -1560198380);
			    b = md5_ii__MODULE_ID__(b, c, d, a, x[i+13], 21,  1309151649);
			    a = md5_ii__MODULE_ID__(a, b, c, d, x[i+ 4], 6 , -145523070);
			    d = md5_ii__MODULE_ID__(d, a, b, c, x[i+11], 10, -1120210379);
			    c = md5_ii__MODULE_ID__(c, d, a, b, x[i+ 2], 15,  718787259);
			    b = md5_ii__MODULE_ID__(b, c, d, a, x[i+ 9], 21, -343485551);

			    a = safe_add__MODULE_ID__(a, olda);
			    b = safe_add__MODULE_ID__(b, oldb);
			    c = safe_add__MODULE_ID__(c, oldc);
			    d = safe_add__MODULE_ID__(d, oldd);
			  }
			  return Array(a, b, c, d);

			}

			function safe_add__MODULE_ID__(x, y)
			{
			  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
			  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
			  return (msw << 16) | (lsw & 0xFFFF);
			}

			function bit_rol__MODULE_ID__(num, cnt)
			{
			  return (num << cnt) | (num >>> (32 - cnt));
			}

			function md5_cmn__MODULE_ID__(q, a, b, x, s, t)
			{
			  return safe_add__MODULE_ID__(bit_rol__MODULE_ID__(safe_add__MODULE_ID__(safe_add__MODULE_ID__(a, q), safe_add__MODULE_ID__(x, t)), s),b);
			}
			function md5_ff__MODULE_ID__(a, b, c, d, x, s, t)
			{
			  return md5_cmn__MODULE_ID__((b & c) | ((~b) & d), a, b, x, s, t);
			}
			function md5_gg__MODULE_ID__(a, b, c, d, x, s, t)
			{
			  return md5_cmn__MODULE_ID__((b & d) | (c & (~d)), a, b, x, s, t);
			}
			function md5_hh__MODULE_ID__(a, b, c, d, x, s, t)
			{
			  return md5_cmn__MODULE_ID__(b ^ c ^ d, a, b, x, s, t);
			}
			function md5_ii__MODULE_ID__(a, b, c, d, x, s, t)
			{
			  return md5_cmn__MODULE_ID__(c ^ (b | (~d)), a, b, x, s, t);
			}

			function binl2hex__MODULE_ID__(binarray)
			{
			  var hex_tab = hexcase__MODULE_ID__ ? "0123456789ABCDEF" : "0123456789abcdef";
			  var str = "";
			  for(var i = 0; i < binarray.length * 4; i++)
			  {
			    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
			           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
			  }
			  return str;
			}
			// **END MD5 UTILITY FUNCTIONS**
			
			// browser detect code for workarounds to browser quirks
			var BrowserDetect__MODULE_ID__ = {
				init: function () {
					this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
					this.version = this.searchVersion(navigator.userAgent)
						|| this.searchVersion(navigator.appVersion)
						|| "an unknown version";
					this.OS = this.searchString(this.dataOS) || "an unknown OS";
				},
				searchString: function (data) {
					for (var i=0;i<data.length;i++)	{
						var dataString = data[i].string;
						var dataProp = data[i].prop;
						this.versionSearchString = data[i].versionSearch || data[i].identity;
						if (dataString) {
							if (dataString.indexOf(data[i].subString) != -1)
								return data[i].identity;
						}
						else if (dataProp)
							return data[i].identity;
					}
				},
				searchVersion: function (dataString) {
					var index = dataString.indexOf(this.versionSearchString);
					if (index == -1) return;
					return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
				},
				dataBrowser: [
					{ 	string: navigator.userAgent,
						subString: "OmniWeb",
						versionSearch: "OmniWeb/",
						identity: "OmniWeb"
					},
					{
						string: navigator.vendor,
						subString: "Apple",
						identity: "Safari"
					},
					{
						prop: window.opera,
						identity: "Opera"
					},
					{
						string: navigator.vendor,
						subString: "iCab",
						identity: "iCab"
					},
					{
						string: navigator.vendor,
						subString: "KDE",
						identity: "Konqueror"
					},
					{
						string: navigator.userAgent,
						subString: "Firefox",
						identity: "Firefox"
					},
					{
						string: navigator.vendor,
						subString: "Camino",
						identity: "Camino"
					},
					{		// for newer Netscapes (6+)
						string: navigator.userAgent,
						subString: "Netscape",
						identity: "Netscape"
					},
					{
						string: navigator.userAgent,
						subString: "MSIE",
						identity: "Explorer",
						versionSearch: "MSIE"
					},
					{
						string: navigator.userAgent,
						subString: "Gecko",
						identity: "Mozilla",
						versionSearch: "rv"
					},
					{ 		// for older Netscapes (4-)
						string: navigator.userAgent,
						subString: "Mozilla",
						identity: "Netscape",
						versionSearch: "Mozilla"
					}
				],
				dataOS : [
					{
						string: navigator.platform,
						subString: "Win",
						identity: "Windows"
					},
					{
						string: navigator.platform,
						subString: "Mac",
						identity: "Mac"
					},
					{
						string: navigator.platform,
						subString: "Linux",
						identity: "Linux"
					}
				]

			};
			BrowserDetect__MODULE_ID__.init();
		</script>
		<script>
		  _IG_Analytics("UA-3219603-1", "/ig/facebook");
		</script>
	

  ]]> 
  </Content>
  </Module>
