TimesShare

From OpenSocial Directory

Jump to: navigation, search
Thumbnail
app_logo.png
Application Details
Description Highlight and share the latest news, features, and multimedia that matters to you most from NYTimes.com. Functional but still in development...
Publisher The New York Times
Author Michael Donohoe
Code http://code.nytimes.com/xml/google/gadget/timesshare/index.xml
Genre News
Supports OpenSocial
Screenshot
app_screenshot.png

Image:Example.jpg==Reviews== Add a Review
Template:TimesShare Reviews

[edit] Comments

Leave a comment

Your Name:
Heading:
Comment:


[edit] Code

View Code

  <?xml version="1.0" encoding="UTF-8" ?> 
  <Module>
  <ModulePrefs title="TimesShare" directory_title="TimesShare" description="Read, share and collect news and features from NYTimes.com" thumbnail="http://code.nytimes.com/xml/google/gadget/timesshare/images/app_logo.png" screenshot="http://code.nytimes.com/xml/google/gadget/timesshare/images/app_screenshot.png" author_photo="http://code.nytimes.com/xml/google/gadget/timesshare/images/app_author.png" author="Michael Donohoe" author_email="donohoe+timesshare@gmail.com" author_affiliation="The New York Times" author_link="http://open.nytimes.com" author_location="New York City, NY" author_aboutme="From Ireland. Live in NYC.">
  <Locale lang="en" country="us" /> 
  <Require feature="opensocial-0.5" /> 
  <Require feature="dynamic-height" /> 
  <Require feature="tabs" /> 
  </ModulePrefs>
  <UserPref name="numFavorites" display_name="Number of Headlines" default_value="10" datatype="enum">
  <EnumValue value="1" display_value="1" /> 
  <EnumValue value="3" display_value="3" /> 
  <EnumValue value="5" display_value="5" /> 
  <EnumValue value="10" display_value="10" /> 
  <EnumValue value="0" display_value="All" /> 
  </UserPref>
  <UserPref name="numSuggested" display_name="Number of Suggestions for each Friend" default_value="3" datatype="enum">
  <EnumValue value="1" display_value="1" /> 
  <EnumValue value="3" display_value="3" /> 
  <EnumValue value="5" display_value="5" /> 
  <EnumValue value="0" display_value="All" /> 
  </UserPref>
  <UserPref name="numResults" display_name="Limit results to" default_value="0" datatype="enum">
  <EnumValue value="1" display_value="1" /> 
  <EnumValue value="3" display_value="3" /> 
  <EnumValue value="5" display_value="5" /> 
  <EnumValue value="10" display_value="10" /> 
  <EnumValue value="0" display_value="All" /> 
  </UserPref>
  <Content type="html">
  <![CDATA[ 

<link rel="stylesheet" type="text/css" href="http://code.nytimes.com/xml/google/gadget/timesshare/css/style.css" />
<link rel="stylesheet" type="text/css" href="http://code.nytimes.com/xml/google/gadget/timesshare/css/orkut.css" />

<script type="text/javascript">
	var console = console || {};
	console.log = console.log || function(msg) {};
</script>
 
<script type="text/javascript">

var NYTS_Application = {
	"Tabs": [
			{ "id": "tab0", "title": "Favorites",  "method": "tabFavorites()", "description": "__OWNER__ most recently saved articles." },
			{ "id": "tab1", "title": "Suggested",  "method": "tabSuggested()", "description": "The newest suggestions from __OWNER__ Friends."},
			{ "id": "tab2", "title": "Browse",     "method": "tabBrowse()",    "description": "The latest news and breaking stories." }
			]
	};

var NYTS_Feed_Default = { 
	"Options" : [
			{ "title": "Homepage", "url": "http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml" },
			{ "title": "Most E-mailed Articles", "url": "http://www.nytimes.com/services/xml/rss/nyt/pop_top.xml" },
			{ "title": "Multimedia", "url": "http://www.nytimes.com/services/xml/rss/nyt/pop_top.xml" },
			{ "title": "Dining and Wine", "url": "http://www.nytimes.com/services/xml/rss/nyt/DiningandWine.xml" },
			{ "title": "Week in Review", "url": "http://www.nytimes.com/services/xml/rss/nyt/WeekinReview.xml" }
			]
	};

var NYTS_Text = {
	"Message" : [
			{ "name": "empty",       "msg": "" },
			{ "name": "oops",        "msg": "Oops! There was a problem retrieving Orkut data. Click <a href='javascript:void(0)' onClick='initialize()'>here</a> to retry." },
			{ "name": "noarticles",  "msg": "Looks like no articles have been added yet." },
			{ "name": "nosuggested", "msg": "Your freinds haven't made any suggestions yet." },
			{ "name": "loading",     "msg": "Loading…<img src='http://code.nytimes.com/xml/google/gadget/timesshare/images/loading.gif' border='0'/>" },
			{ "name": "errsuggested","msg": "There was an error getting __OWNER__ Friends suggestions. Click <a href='javascript:void(0)' onClick='tabSuggested()'>here</a> to retry." },
			{ "name": "errarticles", "msg": "There was an error getting __OWNER__ articles. Click <a href='javascript:void(0)' onClick='tabFavorites()'>here</a> to retry." },
			{ "name": "errfeeds",    "msg": "There was an error loading article feeds. Click <a href='javascript:void(0)' onClick='tabBrowse()'>here</a> to retry." },
			{ "name": "errsave",     "msg": "Sorry - there was a problem saving. Try again in a moment." }
		]
	};

var NYTS_Favorites = { "Article": [] };
var NYTS_Suggested = { "Article": [] };

var NYTS_Prefs   = new _IG_Prefs(__MODULE_ID__);
var numFavorites = NYTS_Prefs.getInt("numFavorite");
var numSuggested = NYTS_Prefs.getInt("numSuggested");
var numResults   = NYTS_Prefs.getInt("numResults");

var orkut_server_url = "http://sandbox.orkut.com";
var host_server_url  = "http://code.6ix.us";
var app_home_url     = "http://code.nytimes.com/xml/google/gadget/timesshare/";

var owner       = null;
var owner_data  = null;

var owner_friends       = null;
var owner_friends_data  = null;

var viewer      = null;
var viewer_data = null;

var viewer_friends      = null;
var viewer_friends_data = null;

var isLoaded  = false;
var currentID = false;

var loadedFavorites   = false; 
var loadedSuggestions = false;


var tabsLoaded = false;

var activeTabDiv;

_IG_RegisterOnloadHandler(initialize);
_IG_AdjustIFrameHeight();

//	=== Initialize ==================================================

function initialize() {
//	Update status
	showMessage("loading")
//	Load basic Viewer and Owner info
	var req = opensocial.newDataRequest();
	req.add(req.newFetchPersonRequest("OWNER"), "owner");
	req.add(req.newFetchPersonRequest("VIEWER"), "viewer");
	req.send(setup);
//	Check that data loaded
	setTimeout('checkIfLoaded()',25000);
}

function setup(data) {
//	Return any value from Viewer Data given a key
	if(data.hadError()) {
		showMessage("oops");
		return false;
	}

	if(typeof(data)!="undefined") {

		owner  = !data.get("owner").getError()  ? data.get("owner").getData()  : null;
		viewer = !data.get("viewer").getError() ? data.get("viewer").getData() : null;

	//	Populate full feed list
		feedInit();
	//	Create Tabs
		tabInit();
	} else {
		showMessage("oops");
	}
}

//	In the event of a problem loading Orkurt api related stuff
function checkIfLoaded() {
	if(!isLoaded) {
		showMessage("oops");
	}
	_IG_AdjustIFrameHeight();
}

//	=== FEEDS =======================================================

/*	
	RSS FEEDS
	Populate master feed list in drop-down
*/
function feedInit() {

	feedList = _gel("feeds");
	console.log("Loading feed list...");

	_IG_FetchXmlContent("http://www.nytimes.com/services/xml/rss/nyt/index.opml",
        function (xmlDoc) { 
		//	In case of error loading or pasing feed list
			function basicList(){
			//	Error - popluate with some default feeds in the case we can't access the OPML
				for (var a = 0; a < NYTS_Feed_Default.length; a++) {
					var title = NYTS_Feed_Default.Options[a].title;
					var url   = NYTS_Feed_Default.Options[a].url;
					feedList.options[feedList.length] = new Option(title, url);
				}
			}

            if (xmlDoc == '') {
				//	Error - popluate with some default feeds in the case we can't access the OPML
				basicList();
            } else {

				var newsItems = xmlDoc.getElementsByTagName("outline");
				var itemName;
				var itemLink;
				var itemTotal = newsItems.length;

				if (parseInt(itemTotal)==0) {
				//	Error - popluate with some default feeds in the case we can't access the OPML
					basicList();
				} else {
					listHTML = "";
				//	Add Homepage Feed so it is on top

					var title = NYTS_Feed_Default.Options[0].title;
					var url   = NYTS_Feed_Default.Options[0].url;
					feedList.options[feedList.length] = new Option(title, url);

					for (var a = 0; a < itemTotal; a++) {
						for (var b = 0; b < newsItems[a].childNodes.length; b++) {
						
							var n    = newsItems[a].childNodes.item(b);
							var nn   = n.nodeName.split(":");
							var base = nn[nn.length-1];

							if(base=="outline") {
								var title = n.getAttribute("title");
								var url   = n.getAttribute("xmlUrl");

								if ((title.length>0) && (!title.match("The New York Times")) ) {
									if (title.match("NYT")) {
										title = title.substring(6, title.length);
									}
									title = title.replace("New York Times ", "");
									title = title.replace("- Technology - ", "");
									var newOption = new Option(title, url);
									feedList.options[feedList.length] = new Option(title, url);
								}
							}
						}	//	End For b
					}	//	End For a
				//	Set default (Homepage as first option)
					feedList.options.selectedIndex=0;
					_gel("feedListDropDown").style.display = "block"; 
				}	//	End If xmlDoc
            }	//	End If
			
        }, { }
	);
}

/*
	Switch Feeds
*/
function feedSwitch() {
	var feedList  = _gel("feeds");
	var feedTitle = feedList.options[feedList.selectedIndex].text;
	var feedURL   = feedList.options[feedList. selectedIndex].value;

//	Switch to Browse tab view
	_gel("feedListTitle").innerHTML = "<h3>" + feedTitle + "</h3>";

	tabs.setSelectedTab(2);
	tabLeftImage();

//	Update articles
	feedLoad(feedURL, "tab2");
}


/*
**	Get NYT articles from RSS
*/
function feedLoad(feed, divID) {

	var htmlArt = "";
	var rssFile = "";

	console.log("Feed will output to: " + divID);

	_IG_FetchXmlContent(feed,
        function (xmlDoc) { 

		//	If the response was blank, try again later
            if (xmlDoc == '') {
                setTimeout('feedLoad()', 2000);	//	WILL NEED ARGUMENTS
            } else {
				
				var newsItems = xmlDoc.getElementsByTagName("item");
				var newsNode;

				var itemHeadline;
				var itemLink;
				var itemSummary;

				var itemTotal = newsItems.length;

			//	Limit depending on gadget settings
				if ((itemTotal > numResults) && (numResults > 0)) {
					itemTotal = numResults;
				}

				if (parseInt(itemTotal)==0) {
					htmlArt += "<div class='summary error'>"
					htmlArt += "Sorry - there is a problem loading feed, or it is unavailable.<br>";
					htmlArt += "Now would be a good time to panic.</div>";
				} else {
				
					for (var a = 0; a < itemTotal; a++) {
						for (var b = 0; b < newsItems[a].childNodes.length; b++) {
							newsNode = newsItems[a].childNodes[b];
							switch (newsNode.nodeName) {
								case "title"       : itemHeadline = newsNode.firstChild.nodeValue; break;
								case "link"        : itemLink     = newsNode.firstChild.nodeValue; break;
								case "description" : itemSummary  = newsNode.firstChild.nodeValue; break;
								default            : // Nothing
							}
						}
						htmlArt += articleDisplay(itemHeadline, itemLink, itemSummary);
					}	//	End For

				}	//	End If xmlDoc

            }	//	End If

            _gel(divID).innerHTML = htmlArt;
			_IG_AdjustIFrameHeight();
			articleTools(divID);


        },
		{ refreshInterval: (60 * 30) }
	);
}

//	=== TABS =====================================================

/*
**	Tab: Setup
*/
function tabInit() {
	if(!tabsLoaded) {
		tabs = new _IG_Tabs();
	
		var tabClass  = "tablib_extension_left_notselected";
		var tabParent = _gel('content');

		for (var t = 0; t < NYTS_Application.Tabs.length; t++) {
		//	Setup tab
			var tabID     = NYTS_Application.Tabs[t].id;
			var tabTitle  = NYTS_Application.Tabs[t].title;
			var tabMethod = NYTS_Application.Tabs[t].method;
			var tabDesc   = NYTS_Application.Tabs[t].description;

			tabClass      = (t==0) ? "tablib_extension_left_selected" : "tablib_extension_left_notselected";
			tabs.addTab('<span class="' +tabClass+ '" id="span' +tabID+ '"></span>' + tabTitle, tabID, tabSwitch);
		}

	//	Update global
		tabsLoaded = true;

	//	Move the tabs left to follow Orkut convention
		tabs.alignTabs('left', 2);
	}
}

/*
**	Tab: Switch between tabs
*/

function tabSwitch() {
	tabLeftImage();
	var tabArray    = tabs.getTabs();
	var tabSelected = tabs.getSelectedTab().getIndex();
	var tabDesc     = NYTS_Application.Tabs[tabSelected].description;
	var tabFunction = NYTS_Application.Tabs[tabSelected].method;
	var tabExecute  = eval(tabFunction);
	
	showMessage(tabDesc);
}

function tabLeftImage() {
	var tabArray = tabs.getTabs();
	for (x in tabArray) {
		var tabID = NYTS_Application.Tabs[x].id;
		if (tabs.getSelectedTab().getIndex() == x) {
			_gel("span" + tabID).className = 'tablib_extension_left_selected';
			if(_gel(tabID)) {	_gel(tabID).style.display = 'block';	}
		} else if (x != "peek") {
			_gel("span" + tabID).className = 'tablib_extension_left_notselected';
			if(_gel(tabID)) {	_gel(tabID).style.display = 'none';		}
		}
	}	//	End For
}

/*
**	TAB : Favorites
*/

function tabFavorites() {

	activeTabDiv = "tab0";
	
//	Some basic caching
	if(!loadedFavorites) {
		loadFavorites();
	}
}

/*
	TAB : Suggested
*/

function tabSuggested() {

	activeTabDiv = "tab1";
	loadSuggestions();
}

/*
	TAB : Browse
*/
function tabBrowse() {

	activeTabDiv = "tab2";

	feedLoad("http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml", activeTabDiv);
}

//	==== Article Building =======================================

/*
	Display HTML for an article entry
	- also tries to add to articleList
*/
function articleDisplay(headline, link, summary, timestamp) {

	var id = generateUniqueID(link);
	var html = "";
	var color = (activeTabDiv=="tab0") ? "green" : "blue";

	html += "<div class='crnr_" + color + "_box'>";
	html += "	<div class='crnr_" + color + "_top'><div></div></div>";
	html += "		<div id='article_" + id + "' class='crnr_" + color + "_content'>";

	html += 	"<div class='title'>";
	html += 		"<a id='link_"  + id + "' href='" + link + "' target='_blank'>" + headline + "</a>";
	html +=         "<span id='tools_" + id + "' class='tools' display='float:right;'></span>";

	if(activeTabDiv=="tab0" || activeTabDiv=="tab1") {
		html +=     "<span id='time_"  + id + "' class='time'>" + formatDate(new Date(timestamp)) + "</span>";
	}

	html += 	"</div>";
	html += 	"<div id='summary_" + id + "' class='summary'>" + summary + "</div>";

	html += "	</div>";
	html += "<div class='crnr_" + color + "_bottom'><div></div></div>";
	html += "</div>";
	
	return html;
}

/*
**	Iterate through all articles on a given tab and add appropiate Tools
**  - This varies depending on whether the user is Owner or Viewer
**  - May differ dependning on which tab is active
*/
function articleTools(tabID) {

	if(_gel(tabID)) {
	
		var elmDIV = document.getElementsByTagName( 'span' );
		
//		var divClass;
//		var divID;
		var articleID;

		for (var d = 0; d < elmDIV.length; d++ ) {
			
			var toolHTML = "";
			var divClass = elmDIV[d].className;
			var divID    = elmDIV[d].id;

			if (divClass == "tools") {		
				
				var artID   = divID.substring(6, divID.length );
				var artHTML = "";
				
				if(artID.length>0) {
			
					//var buttonFn     = "addSuggestion(\"" + artID + "\")";
					var buttonText   = "Suggest";
					var buttonTitle  = "Suggest to Friends";

					if (viewer.isOwner()) {
					//	buttonFn     = "addArticle(\"" + artID + "\")";
						buttonText   = "Save";
						buttonTitle  = "Add to Favorites";
					}

					artHTML +=	"<a id='btn_" +artID+ "' href='javascript:void(0);' class='button' title='" +buttonTitle+ "' onClick='addArticle(\"" + artID + "\")'>";
					artHTML += "<img src='http://code.nytimes.com/xml/google/gadget/timesshare/images/button/cross.png' border='0' alt='" + buttonText + "'>";
					artHTML += "</a> ";
				}
				
				elmDIV[d].innerHTML = artHTML;
			}
		
		}	//	End for
	}	//	End If
}

//	==== Article : Favorites : Load ===============================================

function loadFavorites() {
	console.log("Start loading Favorites...");

	var req = opensocial.newDataRequest();
	req.add(req.newFetchPersonRequest("OWNER"), "owner"); 
	req.add(req.newFetchPersonAppDataRequest("OWNER", "NYTS_Favorites"), "owner_data");

	req.add(req.newFetchPersonRequest("VIEWER"), "viewer"); 
	req.add(req.newFetchPersonAppDataRequest("VIEWER", "NYTS_Favorites"), "viewer_data");

	req.send(loadResponse);
}

function loadResponse(data) {
	var value = getData(data, "NYTS_Favorites")

	if(value) {
	//	Success. It is safe to update global var
		NYTS_Favorites = eval("(" + value + ")");

		var favHTML = "";
		var favNumResults = NYTS_Favorites.Article.length;

		if(favNumResults == 0) {
		//	No articles added yet
			showMessage("noarticles");
		} else {
		
		//	Limit depending on gadget settings
			if ((favNumResults > numFavorites) && (numFavorites > 0)) {
				favNumResults = numFavorites;
			}
		
		//	Go from last to first
			for (var m = favNumResults-1; m>=0; m--) {
				var article = NYTS_Favorites.Article[m];			
				favHTML += articleDisplay(article.headline, article.link, article.summary, article.timestamp);
			}

			_gel(activeTabDiv).innerHTML = favHTML;
		}
	}
	_IG_AdjustIFrameHeight();
}

function getData(data, key) {
//	Return any value from Viewer Data given a key
	console.log("DATA: ", data);

	if(data.hadError()) {
		showMessage("oops")
		return false;
	}

//	Mark gadget as loaded - whether articles are found at this point or not.
	isLoaded = true;

	try {
		var owner       = !data.get("owner").getError()       ? data.get("owner").getData()                       : null;
		var owner_data  = !data.get("owner_data").getError()  ? data.get("owner_data").getData()[owner.getId()]   : null;
		var viewer      = !data.get("viewer").getError()      ? data.get("viewer").getData()                      : null;

		if(typeof(owner_data[key])!="undefined") {
			console.log("Retrived data. Key: '" +key+ "', Value: ", owner_data[key]);
			return owner_data[key];
		} else {
			console.log("No articles have been added to Favorites");
			showMessage("noarticles");
		}
	} catch(err) {
	//	Catch exceptions for when key has never been set
	//	which results in the "has no properties" error message.
		showMessage("noarticles");
		console.log('No value found. Error name :'+err.name+' Error message :'+err.message);
	}
	return false;
}

//	==== Article : Favorites/Suggest : Save ===============================================

function addArticle(id) {
	var articleExists = false;
	currentID         = false;
		
	console.log("Trying to save article : " + id);

	if(_gel("article_" + id)) {

	//	Get article info from page
		var summary   = _gel("summary_" + id).innerHTML;
		var headline  = _gel("link_"    + id).innerHTML;
		var link      = _gel("link_"    + id).href;
		var timestamp = getTimeStamp("ms");

		currentID = id;

		console.log("Headline: " + headline + ", TS: " + timestamp);

		var NYTS_Holder;
		var	New_Article =  { 'id' : id, 'headline' : headline, 'summary' : summary , 'link' : link, 'timestamp': timestamp };

	//	Determine whether we are SUggesting or adding to Favorites
		if(viewer.isOwner()) {
		//	Add to your Favorites
			NYTS_Holder = NYTS_Favorites;
		} else {
		//	Suggest
			NYTS_Holder = NYTS_Suggested;
		}	

	//	Check if article already in list (applies for both Suggested and Favorites)
		for (var m = 0; m < NYTS_Holder.Article.length; m++) {			
			if(NYTS_Holder.Article[m].id == id) {
				articleExists = true;
				break;
			}
		}

		if(!articleExists) {
		//	Save
			console.log("Adding article...");

			NYTS_Holder.Article.push(New_Article);

			var req  = opensocial.newDataRequest();
			
			if(viewer.isOwner()) {
				req.add(req.newUpdatePersonAppDataRequest("VIEWER", "NYTS_Favorites", NYTS_Holder), "status");
			} else {
				req.add(req.newUpdatePersonAppDataRequest("VIEWER", "NYTS_Suggested", NYTS_Holder), "status");
			}
			req.send(addArticleResponse);
		}
	}
}

function addArticleResponse(data) {
	try {
		var error = data.get("status").hadError();
		if (error) {
			showMessage("errsave");
			console.log("Error saving. data: ", data);
		} else {
			console.log("Article was saved", data);
			if(currentID) {
				_gel("tools_" + currentID).innerHTML = "Saved";
			}
		}
	} catch (err) {
		showMessage("errsave");
		console.log('Error saving. Error name :'+err.name+' Error message :'+err.message);
	}
}

//	==== Article : Suggestion : Load ===============================================

function loadSuggestions(){

	console.log("Starting to load Friend suggestions");

	var req = opensocial.newDataRequest();
	//req.add(req.newFetchPeopleRequest('VIEWER_FRIENDS'), 'viewer_friends');
	//req.add(req.newFetchPersonAppDataRequest('VIEWER_FRIENDS', 'NYTS_Suggested'), 'viewer_friends_data');
	req.add(req.newFetchPeopleRequest('OWNER_FRIENDS'), 'owner_friends');
	req.add(req.newFetchPersonAppDataRequest('OWNER_FRIENDS', 'NYTS_Suggested'), 'owner_friends_data');
	req.send(responseSuggestions);
	
}

function responseSuggestions(data) {

	var value = getSuggestions(data, 'NYTS_Suggested')
	//if(value) {
	//	_gel("viewer_value").value = value;
	//}
	_IG_AdjustIFrameHeight();
}

function getSuggestions(data, key) {
//	Return any value from Viewer Data given a key
	if(data.hadError()) {
	
		showMessage("errsuggested");

		console.log("Error loading data. Try again.");
		return false;
	}

	try {
		//var viewer_friends = !data.get("viewer_friends").getError() ? data.get("viewer_friends").getData() : null;
		var owner_friends = !data.get("owner_friends").getError() ? data.get("owner_friends").getData() : null;
		console.log(owner_friends);
		
	//	Render Friends and any App data
		var sugHTML = "";
		var navFriendHTML = "";

		navFriendHTML += " <div class='crnr_yellow_box'> ";
		navFriendHTML += "	<div class='crnr_yellow_top'><div></div></div>";
		navFriendHTML += "		<div class='crnr_yellow_content'>";

		owner_friends.each(function(person) {

			var person_name = person.getDisplayName();
			var person_id   = person.getId();
			var owner_friends_data = !data.get("owner_friends_data").getError() ? data.get("owner_friends_data").getData()[person_id] : null;
			
			console.log("person_name: " + person_name + " (" + person_id + ")");

			if(typeof(owner_friends_data)!="undefined") {
				
				NYTS_Holder = eval("(" + owner_friends_data[key] + ")");
				console.log(NYTS_Holder);

				var sugNumResults = NYTS_Holder.Article.length;

				if(sugNumResults == 0) {
				//	No articles suggested by that friend
					console.log(person_name + " has made no suggestions");

				//	Add thumbnail and link to Friend Nav bar
					navFriendHTML += showThumbnail("tiny", "faded",  "anchor", person);
				} else {
				//	Add thumbnail and link to Friend Nav bar
					navFriendHTML += showThumbnail("tiny", "normal", "anchor", person);

				//	Limit depending on gadget settings
					if ((sugNumResults > numSuggested) && (numSuggested > 0)) {
						sugNumResults = numSuggested;
					}

					sugHTML += "<span id='anchor_" + person_id + "' class='suggester'>" + person_name + " suggests:</span>";
				//	Go from last to first
					for (var m = NYTS_Holder.Article.length-1; m>=0; m--) {
						var article = NYTS_Holder.Article[m];

						sugHTML += articleDisplay(article.headline, article.link, article.summary, article.timestamp);
						console.log(article.headline);
					}
				}

			} else {
				console.log("Caught undefined...");
				navFriendHTML += showThumbnail("tiny", "faded",  "anchor", person);
			}
		});
		
		navFriendHTML += "	</div>";
		navFriendHTML += "<div class='crnr_yellow_bottom'><div></div></div>";
		navFriendHTML += "</div>";

		_gel(activeTabDiv).innerHTML = navFriendHTML + sugHTML;
		return true;

	} catch(err) {
	//	Catch exceptions for when key has never been set
	//	which results in the "has no properties" error message.
		var msg = "No value found. Key '" +key+ "' does not exist.";
		console.log('No value found. Error name :'+err.name+' Error message :'+err.message);
	}
	return false;
}

//	==== Helper Functions ===============================================

/*
	Show user thumbnail
	
	INPUT:
	size   - tiny, small, medium
	status - faded, full
	link   - anchor, profile
	person - Person object
*/
function showThumbnail(size, status, linkType, person) {

	var pHTML = "";
	var pname = person.getDisplayName();
	var pid   = person.getId();

	var plink  = (linkType=="anchor") ? "#anchor_" + pid : person.getField(opensocial.Person.Field.PROFILE_URL);
	var pthumb = person.getField(opensocial.Person.Field.THUMBNAIL_URL);
	var pthumbRestraints = "";

	if(size=="medium") {
		pthumb.replace("small", "medium");
	} else if (size=="tiny") {
	//	Not recommended, but its an option
		pthumbRestraints = " width='32' height='32' ";
	}

	if (pthumb == null || pthumb == "" || pthumb.indexOf('null') != -1) {
		pthumb = orkut_server_url + "/img/i_nophoto64.gif";
	}

	pHTML += "<span class='friendthumbnail'>";
	if(status=="faded") {
		pHTML += "<img class='faded' src='" + pthumb + "'" + pthumbRestraints + "/>";
		//pHTML += "<span class='friendthumbnailtitle'>" + pname + "</span>";
	} else {
		pHTML += "<a href='" + plink + "' title='Go to suggestions'><img class='thumbnail' src='" + pthumb + "'" + pthumbRestraints + "/></a>";
		//pHTML += "<span class='friendthumbnailtitle'><a href='" + plink + "' title='Go to suggestions'>" + pname + "</a></span>";
	}
	pHTML += "</span>";

	return pHTML;
}

/*
**	Generate unique ID from a URL 
**	- It should check against nytimes.com domain
**	- Assumes all URLs include ".html" and not anything else (.htm, .php etc)
**  - If path contains alternate domain it will check against .com .net or .org
**  - Cannot guarantee will work for non-nyt urls
*/
function generateUniqueID(url) {
	var checkAgainst = "nytimes.com";
	var idString     = url.substring((url.indexOf(checkAgainst)+(checkAgainst.length+1)),(url.indexOf(".html")));
	idString = idString.replace(/\//g, "_");
	idString = idString.replace(/-/g,  "_");
	return(idString);
}

function getTimeStamp(version) {

	var d       = new Date();
	var hours   = d.getHours();
	var minutes = d.getMinutes();
	var date    = d.getDate();
	var month   = d.getMonth()+1;
	var year    = d.getFullYear();
	var ms      = d.getTime();
	var utc     = d.getTimezoneOffset() * 60000;
	
	if(minutes<10) { minutes = "0"+minutes }

	switch(version) {
		case "long":
			return (hours + ':' + minutes + ' ' + month + '-' + date + '-' + year);
			break;
		case "small":
			return (hours + ':' + minutes);
			break;
		default:
			return (ms + utc);
			break;
	}
}

function formatDate(d) {
//	Returns format such as: Thur, Nov 8th, 2007
//	If date<24 hrs, starts with time: 14:52

	var dDay   = d.getDay();
	var dDate  = d.getDate();
	var dMonth = d.getMonth();
	var dYear  = d.getFullYear();
	var dMSec  = d.getTime();

	var dHours = d.getHours();
	var dMin   = d.getMinutes();

	var day    = "";
	var month  = "";
	var time   = "";

	var t      = new Date();
	var tMSec  = t.getTime();

	var tHours = t.getHours();
	var tMin   = t.getMinutes();

	var introText = (activeTabDiv=="tab0") ? "Added " : "Suggested ";

	if(dMSec > (tMSec-43200000)) {
	//	Less than 12 hours ago
		var n        = new Date(tMSec-dMSec);
		var nHours   = n.getHours();
		var nMin     = n.getMinutes();
		var textHour = (nHours>1)? "hrs " :  "hr ";
		return (introText + nHours + textHour + nMin + " min ago");
	}

	if(dDay == 0){
		day = "Sun, ";
	} else if(dDay == 1){
		day = "Mon, ";
	} else if(dDay == 2){
		day = "Tue, ";
	} else if(dDay == 3){
		day = "Wed, ";
	} else if(dDay == 4){
		day = "Thur, ";
	} else if(dDay == 5){
		day = "Fri, ";
	} else if(dDay == 6){
		day = "Sat, ";
	}

	if(dMonth == 0){
		month = "Jan ";
	} else if(dMonth == 1) {
		month = "Feb ";
	} else if(dMonth == 2) {
		month = "Mar ";
	} else if(dMonth == 3) {
		month = "April ";
	} else if(dMonth == 4) {
		month = "May ";
	} else if(dMonth == 5) {
		month = "June ";
	} else if(dMonth == 6) {
		month = "July ";
	} else if(dMonth == 7) {
		month = "Aug ";
	} else if(dMonth == 8) {
		month = "Sept ";
	} else if(dMonth == 9) {
		month = "Oct ";
	} else if(dMonth == 10){
		month = "Nov ";
	} else if(dMonth == 11){
		month = "Dec ";
	}
//	Return full date: Suggested on Thur, Nov 8th, 2007
	return(introText + "on " + time + day + month + dDate + ", " + dYear);
}

function showMessage(name) {

	console.log("Message type: " + name);
	
	var msgFound       = false;
	var msgDestination = _gel("feedListTitle");
	
	for (var e = 0; e < NYTS_Text.Message.length; e++) {
		if(NYTS_Text.Message[e].name==name) {
			msgDestination.innerHTML = showMessageInContext(NYTS_Text.Message[e].msg);
			msgFound = true;
			break;
		}
	}
	if(!msgFound){
		msgDestination.innerHTML = showMessageInContext(name);
	}
}

/*
	Display a Message in a given context (viewer versus owner)
*/
function showMessageInContext(msg) {
//	Some user specific text to any description... currently just one
//	Find: __OWNER__ Replace: Your or Owner-Name
	try {
		if (viewer.isOwner()) {
			msg = msg.replace("__OWNER__", "your");
		} else {
			msg = msg.replace("__OWNER__", owner.getDisplayName()+"'s");
		}
	//	Ensure uppercase if at beginning of string.
		var firstChar = msg.substr(0,1).toUpperCase();
		msg = firstChar + msg.substr(1,msg.length);
	} catch(err) {
	//	nothing
	}
	return msg;
}

</script>

<div id="logo_nyt" style="position: absolute; top:3px; right:2px"><a href="http://www.nytimes.com" title="The New York Times"><img src="http://code.nytimes.com/xml/google/gadget/timesshare/images/logo.png" alt="Go to NYTimes.com" border="0"/></a></div>
<div id="feedlist">
	<div id="feedListTitle" style="position: absolute; top:30px; left:2px; height:25px; padding-top: 10px; padding-left: 5px;"> </div>
	<span id="feedListDropDown" style="display: none; position: absolute; top:30px; right:2px">
		Go to :
		<select id="feeds" name="feeds" onChange="feedSwitch();"></select>
		<a href="javascript:void(0)" onclick="feedSwitch()"><img src="http://graphics8.nytimes.com/images/global/buttons/go.gif" alt="Go" border="0"/></a>
	</span>
</div>
	
<div id="content" style="min-height:300px;">
	<div id="tab0"></div>
	<div id="tab1"></div>
	<div id="tab2"></div>
</div>



  ]]> 
  </Content>
  </Module>

Page Rating

Rating: 3.0/5 (2 votes cast)

Personal tools
communication