You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ja...@apache.org on 2015/06/18 02:30:14 UTC
[4/4] incubator-geode git commit: Publish of Github pages from Gradle.
Publish of Github pages from Gradle.
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/f3aaac35
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/f3aaac35
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/f3aaac35
Branch: refs/heads/asf-site
Commit: f3aaac354cf2667af2fc3c6f4f3e322bdce36af2
Parents: a393530
Author: jacksoncvm <cj...@pivotal.io>
Authored: Wed Jun 17 17:29:24 2015 -0700
Committer: jacksoncvm <cj...@pivotal.io>
Committed: Wed Jun 17 17:29:24 2015 -0700
----------------------------------------------------------------------
404.html | 3 +-
README.html | 3 +-
community/index.html | 5 +-
contribute/index.html | 3 +-
download/index.html | 3 +-
getting-started/index.html | 3 +-
index.html | 3 +-
javascripts/feeds.js | 6 +
javascripts/gfdynamicfeedcontrol-modified.js | 883 +++++++++++++
javascripts/jquery.jfeed.js | 1414 +++++++++++++++++++++
javascripts/jquery.jfeed.pack.js | 696 ++++++++++
javascripts/master.js | 23 +
stylesheets/styles.css | 18 +-
stylesheets/styles.scss | 4 +
14 files changed, 3059 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/404.html
----------------------------------------------------------------------
diff --git a/404.html b/404.html
index 85ce2d6..33e012d 100644
--- a/404.html
+++ b/404.html
@@ -7,6 +7,8 @@
<link rel="stylesheet" href="/stylesheets/styles.css">
<link rel="stylesheet" href="/stylesheets/pygment_trac.css">
<script src="/javascripts/scale.fix.js"></script>
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+ <script src="/javascripts/master.js"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
@@ -26,7 +28,6 @@
ga('send', 'pageview');
</script>
-
</head>
<body id='404'>
<div id='viewport'>
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/README.html
----------------------------------------------------------------------
diff --git a/README.html b/README.html
index 3123322..4738923 100644
--- a/README.html
+++ b/README.html
@@ -7,6 +7,8 @@
<link rel="stylesheet" href="/stylesheets/styles.css">
<link rel="stylesheet" href="/stylesheets/pygment_trac.css">
<script src="/javascripts/scale.fix.js"></script>
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+ <script src="/javascripts/master.js"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
@@ -26,7 +28,6 @@
ga('send', 'pageview');
</script>
-
</head>
<body id='readme'>
<div id='viewport'>
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/community/index.html
----------------------------------------------------------------------
diff --git a/community/index.html b/community/index.html
index 89037b5..499a575 100644
--- a/community/index.html
+++ b/community/index.html
@@ -7,6 +7,8 @@
<link rel="stylesheet" href="/stylesheets/styles.css">
<link rel="stylesheet" href="/stylesheets/pygment_trac.css">
<script src="/javascripts/scale.fix.js"></script>
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+ <script src="/javascripts/master.js"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
@@ -26,7 +28,6 @@
ga('send', 'pageview');
</script>
-
</head>
<body id='community'>
<div id='viewport'>
@@ -67,6 +68,8 @@ Commits: <a href="http://mail-archives.apache.org/mod_mbox/incubator-geode-commi
</ul>
</div><h2>Conferences</h2><p><img class='event-image' src='/images/events/oscon.png'></p><h3>OSCON Portland</h3><h5>July 20-24 2015 • Portland, OR</h5>
<div class='description'>OSCON is where all of the pieces come of the open source software movement come together: developers, innovators, businesspeople, and investors. </div>
+<hr/><h2>Events</h2>
+<div id="feed"></div>
<hr/><h2>Meetups & User Groups</h2><h3>Portland Java Users Group (PJUG)</h3><p>** Unleashing the Silicon Forest Fire: the open sourcing of GemFire **</p><h3><a href="http://pjug.org/" target="_blank"> Tuesday, May 17, 2015, 6:30PM in Porland. No RSVP required.</a></h3>
<hr/><h3>Spring / Pivotal Open Source Hub Virtual Meetup</h3><p>** Hands-on Virtual Meetup for Apache Geode #1 - Getting Started **</p><h3><a href="http://connect.pivotal.io/OSS_Webinar_9AMPOSH_Handson_Virtual_Meetup_Apache_Geode1_GettingStarted_Register.html"> Register for reminder or log in Tuesday, June 2, 2015, 9AM PST</a></h3>
<hr/><h3>Pivotal Open Source Hub Palo Alto</h3><p><strong>Creating a Highly-Scalable Stock Prediction System with R, Geode & Spring XD</strong></p><p>Video to be posted soon</p>
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/contribute/index.html
----------------------------------------------------------------------
diff --git a/contribute/index.html b/contribute/index.html
index 14c4ef4..55ad1c7 100644
--- a/contribute/index.html
+++ b/contribute/index.html
@@ -7,6 +7,8 @@
<link rel="stylesheet" href="/stylesheets/styles.css">
<link rel="stylesheet" href="/stylesheets/pygment_trac.css">
<script src="/javascripts/scale.fix.js"></script>
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+ <script src="/javascripts/master.js"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
@@ -26,7 +28,6 @@
ga('send', 'pageview');
</script>
-
</head>
<body id='contribute'>
<div id='viewport'>
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/download/index.html
----------------------------------------------------------------------
diff --git a/download/index.html b/download/index.html
index 3ca5e61..c30137d 100644
--- a/download/index.html
+++ b/download/index.html
@@ -7,6 +7,8 @@
<link rel="stylesheet" href="/stylesheets/styles.css">
<link rel="stylesheet" href="/stylesheets/pygment_trac.css">
<script src="/javascripts/scale.fix.js"></script>
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+ <script src="/javascripts/master.js"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
@@ -26,7 +28,6 @@
ga('send', 'pageview');
</script>
-
</head>
<body id='download'>
<div id='viewport'>
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/getting-started/index.html
----------------------------------------------------------------------
diff --git a/getting-started/index.html b/getting-started/index.html
index e953e52..1509177 100644
--- a/getting-started/index.html
+++ b/getting-started/index.html
@@ -7,6 +7,8 @@
<link rel="stylesheet" href="/stylesheets/styles.css">
<link rel="stylesheet" href="/stylesheets/pygment_trac.css">
<script src="/javascripts/scale.fix.js"></script>
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+ <script src="/javascripts/master.js"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
@@ -26,7 +28,6 @@
ga('send', 'pageview');
</script>
-
</head>
<body id='getting-started'>
<div id='viewport'>
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index c876e3d..77873eb 100644
--- a/index.html
+++ b/index.html
@@ -7,6 +7,8 @@
<link rel="stylesheet" href="/stylesheets/styles.css">
<link rel="stylesheet" href="/stylesheets/pygment_trac.css">
<script src="/javascripts/scale.fix.js"></script>
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+ <script src="/javascripts/master.js"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
@@ -26,7 +28,6 @@
ga('send', 'pageview');
</script>
-
</head>
<body id='home'>
<div id='viewport'>
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/javascripts/feeds.js
----------------------------------------------------------------------
diff --git a/javascripts/feeds.js b/javascripts/feeds.js
new file mode 100644
index 0000000..bbe5e43
--- /dev/null
+++ b/javascripts/feeds.js
@@ -0,0 +1,6 @@
+function loadFeedControl() {
+ var feed = "https://www.google.com/calendar/feeds/gejamo1ppmtohgneonsen1a9vc%40group.calendar.google.com/public/basic?"+new Date().getTime();
+ var fg = new GFdynamicFeedControl(feed, "calendar");
+}
+google.load("feeds", "1");
+google.setOnLoadCallback(loadFeedControl);
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/f3aaac35/javascripts/gfdynamicfeedcontrol-modified.js
----------------------------------------------------------------------
diff --git a/javascripts/gfdynamicfeedcontrol-modified.js b/javascripts/gfdynamicfeedcontrol-modified.js
new file mode 100644
index 0000000..48e0369
--- /dev/null
+++ b/javascripts/gfdynamicfeedcontrol-modified.js
@@ -0,0 +1,883 @@
+/**
+ * Copyright (c) 2008 Google Inc.
+ *
+ * You are free to copy and use this sample.
+ * License can be found here: http://code.google.com/apis/ajaxsearch/faq/#license
+*/
+
+/**
+ * @fileoverview A feed gadget based on the AJAX Feed API.
+ * @author dcollison@google.com (Derek Collison)
+ */
+
+/**
+ * GFdynamicFeedControl
+ * @param {string} feed The feed URL.
+ * @param {String|Object} container Either the id string or the element itself.
+ * @param {Object} options Options map.
+ * @constructor
+ */
+
+
+function GFdynamicFeedControl(feedUrls, container, options) {
+ // node elements.
+ this.nodes = {};
+ this.collapseElements = [];
+
+ // the feeds.
+ this.feeds = [];
+ this.results = [];
+
+ if (typeof feedUrls == 'string') {
+ this.feeds.push({url:feedUrls});
+ } else if (typeof feedUrls == 'object') {
+ for (var i=0; i<feedUrls.length; i++) {
+ var entry = feedUrls[i];
+ var o = {};
+ var feedUrl;
+ if (typeof entry == 'string') {
+ o.url = feedUrls[i];
+ } else if (typeof entry == 'object') {
+ o = feedUrls[i];
+ if (o && o.title) {
+ var s = o.title;
+ o.title = s.replace(/</g,'<').replace(/>/g, '>');
+ }
+ }
+ this.feeds.push(o);
+ }
+ }
+
+ if (typeof container == "string") {
+ container = document.getElementById(container);
+ }
+ this.parseOptions_(options);
+ this.setup_(container);
+}
+
+/*
+ * Default time in milliseconds for the feed to be reloaded.
+ * @type Number
+ */
+GFdynamicFeedControl.DEFAULT_NUM_RESULTS = 4;
+/*
+ * Default time in milliseconds for the feed to be reloaded.
+ * @type Number
+ */
+GFdynamicFeedControl.DEFAULT_FEED_CYCLE_TIME = 1800000;
+/*
+ * Default display time in milliseconds for each entry.
+ * @type Number
+ */
+GFdynamicFeedControl.DEFAULT_DISPLAY_TIME = 5000000;
+/*
+ * Default fadeout transition time in milliseconds for each entry.
+ * @type Number
+ */
+GFdynamicFeedControl.DEFAULT_FADEOUT_TIME = 1000;
+/*
+ * Default time between transition steps in milliseconds
+ * @type Number
+ */
+GFdynamicFeedControl.DEFAULT_TRANSISTION_STEP = 40;
+/*
+ * Default hover time in milliseconds for each entry.
+ * @type Number
+ */
+GFdynamicFeedControl.DEFAULT_HOVER_TIME = 100;
+
+/**
+ * Setup default option map and apply overrides from constructor.
+ * @param {Object} options Options map.
+ * @private
+ */
+GFdynamicFeedControl.prototype.parseOptions_ = function(options) {
+ // Default Options
+ // TODO(dcollison) - implement Feed Cycle.
+ this.options = {
+ numResults : GFdynamicFeedControl.DEFAULT_NUM_RESULTS,
+ feedCycleTime : GFdynamicFeedControl.DEFAULT_FEED_CYCLE_TIME,
+ linkTarget : google.feeds.LINK_TARGET_BLANK,
+ displayTime : GFdynamicFeedControl.DEFAULT_DISPLAY_TIME,
+ transitionTime : GFdynamicFeedControl.DEFAULT_TRANSISTION_TIME,
+ transitionStep : GFdynamicFeedControl.DEFAULT_TRANSISTION_STEP,
+ fadeOutTime: GFdynamicFeedControl.DEFAULT_FADEOUT_TIME,
+ scrollOnFadeOut : true,
+ pauseOnHover : false,
+ hoverTime : GFdynamicFeedControl.DEFAULT_HOVER_TIME,
+ autoCleanup : true,
+ transitionCallback : null,
+ feedTransitionCallback : null,
+ feedLoadCallback : null,
+ collapseable : false,
+ sortByDate : false,
+ horizontal : false,
+ stacked : false,
+ title : null
+ };
+
+ if (options) {
+ for (var o in this.options) {
+ if (typeof options[o] != 'undefined') {
+ this.options[o] = options[o];
+ }
+ }
+ }
+
+ // Cant be collapseable unless stacked
+ if(!this.options.stacked) {
+ this.options.collapseable = false;
+ }
+
+ // Override strange/bad options
+ this.options.displayTime = Math.max(200, this.options.displayTime);
+ this.options.fadeOutTime = Math.max(0, this.options.fadeOutTime);
+
+ // Calculated
+ var ts = this.options.fadeOutTime / this.options.transitionStep;
+ this.fadeOutDelta = Math.min(1, (1.0/ts));
+
+ // Flag to start
+ this.started = false;
+};
+
+/**
+ * Basic setup.
+ * @private
+ */
+GFdynamicFeedControl.prototype.setup_ = function(container) {
+ if (container == null) return;
+ this.nodes.container = container;
+
+ // Browser fun.
+ if (window.ActiveXObject) {
+ this.ie = this[window.XMLHttpRequest ? 'ie7' : 'ie6'] = true;
+ } else if (document.childNodes && !document.all && !navigator.taintEnabled) {
+ this.safari = true;
+ } else if (document.getBoxObjectFor != null) {
+ this.gecko = true;
+ }
+ // The feedControl instance for generating entry HTML.
+ this.feedControl = new google.feeds.FeedControl();
+ this.feedControl.setLinkTarget(this.options.linkTarget);
+
+ // The feeds
+ this.expected = this.feeds.length;
+ this.errors = 0;
+
+ for (var i = 0; i < this.feeds.length; i++) {
+ var feed = new google.feeds.Feed(this.feeds[i].url);
+ feed.setResultFormat(google.feeds.Feed.JSON_FORMAT);
+ feed.setNumEntries(this.options.numResults);
+ feed.load(this.bind_(this.feedLoaded_, i));
+ }
+};
+
+/**
+ * Helper method to bind this instance correctly.
+ * @param {Object} method function/method to bind.
+ * @return {Function}
+ * @private
+ */
+GFdynamicFeedControl.prototype.bind_ = function(method) {
+ var self = this;
+ var opt_args = [].slice.call(arguments, 1);
+ return function() {
+ var args = opt_args.concat([].slice.call(arguments));
+ return method.apply(self, args);
+ }
+};
+
+/**
+ * Callback associated with the AJAX Feed api after load.
+ * @param {Object} result Loaded result.
+ * @private
+ */
+GFdynamicFeedControl.prototype.feedLoaded_ = function(index, result) {
+ if (this.options.feedLoadCallback) {
+ this.options.feedLoadCallback(result);
+ }
+ if (result.error) {
+ // Ignore failed feeds for the most part.
+ // The user has control through the feedLoadCallback above
+ // if they choose to do something more createive.
+ // Only complain if we can't load anything.
+ if (++this.errors >= this.expected) {
+ this.nodes.container.innerHTML = 'Feed' + ((this.expected > 1)?'s ':' ') +
+ 'could not be loaded.';
+ }
+ return;
+ }
+ // Override of title option.
+ if (this.feeds[index].title) {
+ result.feed.title = this.feeds[index].title;
+ }
+ this.results.push(result);
+
+ if (!this.started) {
+ this.createSubContainers_();
+ this.displayResult_(0);
+ } else if (!this.options.horizontal && this.options.stacked) {
+ this.addResult_(this.results.length-1);
+ }
+};
+
+/**
+ * Insert blog in correct place
+ * @private
+ */
+GFdynamicFeedControl.prototype.sortByDate_ = function(resultIndex, newTitle,
+ newList) {
+ // if sorting by date, insert it into the correct spot
+ var newEntryDate = this.results[resultIndex].feed.entries[0].publishedDate;
+ var newEntryDateMS = Date.parse(newEntryDate);
+ var insertIndex = null;
+
+ for (var i = 0; i < this.results.length; i++) {
+ var mostRecentPost = this.results[i].feed.entries[0].publishedDate;
+ var mostRecentPostMS = Date.parse(mostRecentPost);
+ if(newEntryDateMS > mostRecentPostMS) {
+ insertIndex = i;
+ break;
+ }
+ }
+
+ // If it's most stale blog, just append as usual
+ if(insertIndex == null) {
+ this.nodes.root.appendChild(newTitle);
+ this.nodes.root.appendChild(newList);
+ this.createListEntries_(resultIndex, newList);
+ return;
+ }
+
+ // If it is fresher than a blog, insert to correct position
+ var insertBeforeIndex = 2 + (insertIndex * 2);
+ var swapToIndex = insertBeforeIndex + 2;
+ var tempSwap = null;
+ var myResultIndex = resultIndex + 1;
+
+ var sectionsToChange = this.nodes.root.childNodes;
+ var nodeToInsertBefore = sectionsToChange[insertBeforeIndex];
+
+ this.nodes.root.insertBefore(newTitle, nodeToInsertBefore);
+ this.nodes.root.insertBefore(newList, nodeToInsertBefore);
+
+ this.results.splice(insertIndex, 0, this.results[resultIndex]);
+ this.results.splice(myResultIndex, 1);
+
+ var nodesToChangeClick = sectionsToChange[swapToIndex].nextSibling.childNodes;
+
+ this.createListEntries_(insertIndex, newList);
+
+ // Keep freshest blog open first
+ if(insertIndex == 0) {
+ this.displayResult_(0);
+ }
+
+ insertIndex += 1;
+ // Reset all of the onmousehover listeners to highlight corect index
+ for (var i = swapToIndex; i < sectionsToChange.length; i += 2) {
+ var nodesToChangeClick = sectionsToChange[i].nextSibling.childNodes;
+ for (var j=0; j < nodesToChangeClick.length; j++) {
+ nodesToChangeClick[j].onmouseover = this.bind_(this.listMouseOver_,
+ insertIndex, j);
+ nodesToChangeClick[j].onmouseout = this.bind_(this.listMouseOut_,
+ insertIndex, j);
+ }
+ insertIndex++;
+ }
+};
+
+/**
+ * Setup to display the Result for stacked mode
+ * @private
+ */
+GFdynamicFeedControl.prototype.addResult_ = function(resultIndex) {
+ var result = this.results[resultIndex];
+ var newTitle = this.createDiv_('gfg-subtitle');
+ this.setTitle_(result.feed, newTitle);
+ var newList = this.createDiv_('gfg-list');
+
+ // add a collapseable button
+ if(this.options.collapseable) {
+ var collapseLink = document.createElement('div');
+ newList.style.display = 'none';
+ collapseLink.className = 'gfg-collapse-closed';
+ newTitle.appendChild(collapseLink);
+ collapseLink.onclick = this.toggleCollapse(this, newList, collapseLink);
+ this.collapseElements.push({
+ list : newList,
+ collapse : collapseLink
+ });
+ }
+
+
+ var clearFloat = document.createElement('div');
+ clearFloat.className = 'clearFloat';
+ newTitle.appendChild(clearFloat);
+
+ // If not sorting by date, add them as usual
+ if(!this.options.sortByDate) {
+ this.nodes.root.appendChild(newTitle);
+ this.nodes.root.appendChild(newList);
+ this.createListEntries_(resultIndex, newList);
+ } else {
+ this.sortByDate_(resultIndex, newTitle, newList);
+ }
+
+};
+
+/**
+ * Setup to display the Result
+ * @private
+ */
+GFdynamicFeedControl.prototype.displayResult_ = function(resultIndex) {
+ this.resultIndex = resultIndex;
+ var result = this.results[resultIndex];
+ if (this.options.feedTransitionCallback) {
+ this.options.feedTransitionCallback(result);
+ }
+ if (this.options.title) {
+ this.setPlainTitle_(this.options.title);
+ } else {
+ this.setTitle_(result.feed);
+ }
+ this.clearNode_(this.nodes.entry);
+
+ if (this.started && !this.options.horizontal && this.options.stacked) {
+ this.entries = result.feed.entries;
+ } else {
+ this.createListEntries_(resultIndex, this.nodes.list);
+ }
+ this.displayEntries_();
+}
+
+/**
+ * Set the Title to just plaintext
+ * @private
+ */
+GFdynamicFeedControl.prototype.setPlainTitle_ = function(title, opt_element) {
+ var el = opt_element || this.nodes.title;
+ el.innerHTML = title;
+}
+
+/**
+ * Set the Title
+ * @private
+ */
+GFdynamicFeedControl.prototype.setTitle_ = function(resultFeed, opt_element) {
+ var el = opt_element || this.nodes.title;
+ this.clearNode_(el);
+ var link = document.createElement('a');
+ link.target = google.feeds.LINK_TARGET_BLANK;
+ link.href = resultFeed.link;
+ link.className = 'gfg-collapse-href';
+ link.innerHTML = resultFeed.title;
+ el.appendChild(link);
+}
+
+GFdynamicFeedControl.prototype.toggleCollapse = function(feedControl,
+ listReference,
+ collapseLink) {
+ return function() {
+ var els = feedControl.collapseElements;
+ for (var i=0; i < els.length; i++) {
+ var el = els[i];
+ el.list.style.display = 'none';
+ el.collapse.className = 'gfg-collapse-closed';
+ }
+ listReference.style.display = 'block';
+ collapseLink.className = 'gfg-collapse-open';
+ }
+}
+
+/**
+ * Create the list Entries
+ * @private
+ */
+GFdynamicFeedControl.prototype.createListEntries_ = function(resultIndex, node) {
+ var entries = this.results[resultIndex].feed.entries;
+ this.clearNode_(node);
+ for (var i = 0; i < entries.length; i++) {
+ this.feedControl.createHtml(entries[i]);
+ var className = 'gfg-listentry ';
+ className += (i%2)?'gfg-listentry-even':'gfg-listentry-odd';
+ var listEntry = this.createDiv_(className);
+ var description = this.createDescription_(entries[i].content);
+ var monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
+ var date = this.createDate_(monthNames[new Date(entries[i].publishedDate).getMonth()] + ' ' + new Date(entries[i].publishedDate).getDate() + ', ' + new Date(entries[i].publishedDate).getFullYear());
+ var link = this.createLink_(entries[i].link,
+ entries[i].title,
+ this.options.linkTarget);
+ listEntry.appendChild(date);
+ // listEntry.appendChild(description);
+ listEntry.appendChild(link);
+ if (this.options.pauseOnHover) {
+ listEntry.onmouseover = this.bind_(this.listMouseOver_, resultIndex, i);
+ listEntry.onmouseout = this.bind_(this.listMouseOut_, resultIndex, i);
+ }
+ entries[i].listEntry = listEntry;
+ node.appendChild(listEntry);
+ }
+ if (node == this.nodes.list) {
+ this.entries = entries;
+ }
+}
+
+/**
+ * Begin to display the entries.
+ * @private
+ */
+GFdynamicFeedControl.prototype.displayEntries_ = function() {
+ this.entryIndex = 0;
+ this.displayCurrentEntry_();
+ this.setDisplayTimer_();
+ this.started = true;
+}
+
+/**
+ * Display next entry.
+ * @private
+ */
+GFdynamicFeedControl.prototype.displayNextEntry_ = function() {
+ // Check to see if we have been orphaned and need to cleanup..
+ if (this.options.autoCleanup && this.isOrphaned_()) {
+ this.cleanup_();
+ return;
+ }
+
+ if (++this.entryIndex >= this.entries.length) {
+ // End of list, see if we should rotate feeds..
+ if (this.results.length > 1) {
+ if (++this.resultIndex >= this.results.length) {
+ this.resultIndex = 0;
+ }
+ this.displayResult_(this.resultIndex);
+ return;
+ } else {
+ this.entryIndex = 0;
+ }
+ }
+
+ if (this.options.transitionCallback) {
+ this.options.transitionCallback(this.entries[this.entryIndex]);
+ }
+ this.displayCurrentEntry_();
+ this.setDisplayTimer_();
+}
+
+/**
+ * Display current entry.
+ * @private
+ */
+GFdynamicFeedControl.prototype.displayCurrentEntry_ = function() {
+ this.clearNode_(this.nodes.entry);
+ this.current = this.entries[this.entryIndex].html;
+ this.current.style.top = '0px';
+ this.nodes.entry.appendChild(this.current);
+ this.createOverlay_();
+
+ // Expand the blog who's post is being displayed
+ if(this.options.collapseable) {
+ var feedTitle = null;
+
+ for (var i=0; i < this.results.length; i++) {
+ if(this.results[i].feed.entries == this.entries) {
+ feedTitle = this.results[i].feed.title;
+ }
+ }
+
+ var els = this.collapseElements;
+
+ for (var i=0; i < els.length; i++) {
+ var el = els[i];
+ var divfeedTitle = el.collapse.previousSibling.innerHTML;
+ var expandClicker = el.collapse;
+ if(feedTitle == divfeedTitle) {
+ if(this.ie) {
+ expandClicker.click();
+ } else {
+ expandClicker.onclick();
+ }
+
+ }
+ }
+ }
+
+ if (this.currentList) {
+ var className = 'gfg-listentry ';
+ className += (this.currentListIndex%2)?
+ 'gfg-listentry-even':'gfg-listentry-odd';
+ this.currentList.className = className;
+ }
+ this.currentList = this.entries[this.entryIndex].listEntry;
+ this.currentListIndex = this.entryIndex;
+ var className = 'gfg-listentry gfg-listentry-highlight ';
+ className += (this.currentListIndex%2)?
+ 'gfg-listentry-even':'gfg-listentry-odd';
+ this.currentList.className = className;
+}
+
+/**
+ * Simulated mouse hover events for list entries.
+ * @private
+ */
+GFdynamicFeedControl.prototype.listMouseHover_ = function(resultIndex,
+ listIndex) {
+ var result = this.results[resultIndex];
+ var listEntry = result.feed.entries[listIndex].listEntry;
+ listEntry.selectTimer = null;
+ this.clearTransitionTimer_();
+ this.clearDisplayTimer_();
+ this.resultIndex = resultIndex;
+ this.entries = result.feed.entries;
+ this.entryIndex = listIndex;
+ this.displayCurrentEntry_();
+}
+
+/**
+ * Mouse over events for list entries.
+ * @private
+ */
+GFdynamicFeedControl.prototype.listMouseOver_ = function(resultIndex,
+ listIndex) {
+ var result = this.results[resultIndex];
+ var listEntry = result.feed.entries[listIndex].listEntry;
+ var cb = this.bind_(this.listMouseHover_, resultIndex, listIndex);
+ listEntry.selectTimer = setTimeout(cb, this.options.hoverTime);
+}
+
+/**
+ * Mouse out events for list entries.
+ * @private
+ */
+GFdynamicFeedControl.prototype.listMouseOut_ = function(resultIndex, listIndex) {
+ var result = this.results[resultIndex];
+ var listEntry = result.feed.entries[listIndex].listEntry;
+ if (listEntry.selectTimer) {
+ clearTimeout(listEntry.selectTimer);
+ listEntry.selectTimer = null;
+ } else {
+ this.setDisplayTimer_();
+ }
+}
+
+/**
+ * Mouse over events for main entry.
+ * @private
+ */
+GFdynamicFeedControl.prototype.entryMouseOver_ = function(e) {
+ this.clearDisplayTimer_();
+ if (this.transitionTimer) {
+ this.clearTransitionTimer_();
+ this.displayCurrentEntry_();
+ }
+}
+
+/**
+ * Mouse out events for main entry.
+ * @private
+ */
+GFdynamicFeedControl.prototype.entryMouseOut_ = function(e) {
+ this.setDisplayTimer_();
+}
+
+/**
+ * Create the overlay div. This hack is for IE and transparency effects.
+ * @private
+ */
+GFdynamicFeedControl.prototype.createOverlay_ = function() {
+ if (this.current == null) return;
+ // Create div lazily and hold on to it..
+ if (this.overlay == null) {
+ var overlay = this.createDiv_('gfg-entry');
+ overlay.style.position = 'absolute';
+ overlay.style.top = '0px';
+ overlay.style.left = '0px';
+ this.overlay = overlay;
+ }
+ this.setOpacity_(this.overlay, 0);
+ this.nodes.entry.appendChild(this.overlay);
+}
+
+/**
+ * Sets the display timer.
+ * @private
+ */
+GFdynamicFeedControl.prototype.setDisplayTimer_ = function() {
+ if (this.displayTimer) {
+ this.clearDisplayTimer_();
+ }
+ var cb = this.bind_(this.setFadeOutTimer_);
+ this.displayTimer = setTimeout(cb, this.options.displayTime);
+};
+
+/**
+ * Class helper method for the time now in milliseconds
+ * @private
+ */
+GFdynamicFeedControl.timeNow = function() {
+ var d = new Date();
+ return d.getTime();
+};
+
+/**
+ * Transition animation for fadeout. Cleanup when finished.
+ * @private
+ */
+GFdynamicFeedControl.prototype.fadeOutEntry_ = function() {
+ if (this.overlay) {
+ var delta = this.fadeOutDelta;
+ var ts = this.options.transitionStep;
+ var now = GFdynamicFeedControl.timeNow();
+ var tick = now - this.lastTick;
+ this.lastTick = now;
+ delta *= (tick/ts);
+
+ var op = this.overlay.opacity + delta;
+ // Overlay opacity
+ this.setOpacity_(this.overlay, op);
+ // Scroll down
+ if (this.options.scrollOnFadeOut && (op > .5)) {
+ var r = (op-.5)*2;
+ var newTop = Math.round(this.current.offsetHeight * r);
+ this.current.style.top = newTop + 'px';
+ }
+ if (op < 1) return;
+ }
+ // Finished.
+ this.clearTransitionTimer_();
+ this.displayNextEntry_();
+};
+
+/**
+ * Sets the transition timer for fadeout.
+ * @private
+ */
+GFdynamicFeedControl.prototype.setFadeOutTimer_ = function() {
+ this.clearTransitionTimer_();
+ this.lastTick = GFdynamicFeedControl.timeNow();
+ var cb = this.bind_(this.fadeOutEntry_);
+ this.transitionTimer = setInterval(cb, this.options.transitionStep);
+};
+
+/**
+ * Clear the transition timer. Used to prevent leaks.
+ * @private
+ */
+GFdynamicFeedControl.prototype.clearTransitionTimer_ = function() {
+ if (this.transitionTimer) {
+ clearInterval(this.transitionTimer);
+ this.transitionTimer = null;
+ }
+};
+
+/**
+ * Clear the display timer.
+ * @private
+ */
+GFdynamicFeedControl.prototype.clearDisplayTimer_ = function() {
+ if (this.displayTimer) {
+ clearTimeout(this.displayTimer);
+ this.displayTimer = null;
+ }
+};
+
+/**
+ * Setup our own subcontainer to the user supplied container.
+ * @private
+ */
+GFdynamicFeedControl.prototype.createSubContainers_ = function() {
+ var nodes = this.nodes;
+ var container = this.nodes.container;
+
+ this.clearNode_(container);
+ if (this.options.horizontal) {
+ container = this.createDiv_('gfg-horizontal-container');
+ nodes.root = this.createDiv_('gfg-horizontal-root');
+ this.nodes.container.appendChild(container);
+ } else {
+ nodes.root = this.createDiv_('gfg-root');
+ }
+ nodes.title = this.createDiv_('gfg-title');
+ nodes.entry = this.createDiv_('gfg-entry');
+ nodes.list = this.createDiv_('gfg-list');
+ nodes.root.appendChild(nodes.title);
+ nodes.root.appendChild(nodes.entry);
+
+ if (!this.options.horizontal && this.options.stacked) {
+ var newTitle = this.createDiv_('gfg-subtitle');
+ nodes.root.appendChild(newTitle);
+ this.setTitle_(this.results[0].feed, newTitle);
+
+ if(this.options.collapseable) {
+ var collapseLink = document.createElement('div');
+ collapseLink.className = 'gfg-collapse-open';
+ newTitle.appendChild(collapseLink);
+ collapseLink.onclick = this.toggleCollapse(this, nodes.list, collapseLink);
+ this.collapseElements.push({
+ list : nodes.list,
+ collapse : collapseLink
+ });
+ nodes.list.style.display = 'block';
+ }
+
+ var clearFloat = document.createElement('div');
+ clearFloat.className = 'clearFloat';
+ newTitle.appendChild(clearFloat);
+ }
+
+ nodes.root.appendChild(nodes.list);
+ container.appendChild(nodes.root);
+
+ if (this.options.pauseOnHover) {
+ nodes.entry.onmouseover = this.bind_(this.entryMouseOver_);
+ nodes.entry.onmouseout = this.bind_(this.entryMouseOut_);
+ }
+
+ // Add Branding.
+ if (this.options.horizontal) {
+ nodes.branding = this.createDiv_('gfg-branding');
+ google.feeds.getBranding(nodes.branding, google.feeds.VERTICAL_BRANDING);
+ container.appendChild(nodes.branding);
+ }
+};
+
+/**
+ * Helper method to properly clear a node and its children.
+ * @param {Object} node Node to clear.
+ * @private
+ */
+GFdynamicFeedControl.prototype.clearNode_ = function(node) {
+ if (node == null) return;
+ var child;
+ while ((child = node.firstChild)) {
+ node.removeChild(child);
+ }
+};
+
+/**
+ * Helper method to create a div with optional class and text.
+ * @param {string} opt_className Optional className for the div.
+ * @param {string} opt_text Optional text for the innerHTML.
+ * @private
+ */
+GFdynamicFeedControl.prototype.createDiv_ = function(opt_className, opt_text) {
+ var el = document.createElement("div");
+ if (opt_text) {
+ el.innerHTML = opt_text;
+ }
+ if (opt_className) { el.className = opt_className; }
+ return el;
+};
+
+/**
+ * Helper method to create a link with href and text.
+ * @param {string} href Href URL
+ * @param {string} text text for the link.
+ * @param {string} opt_target Optional link target.
+ * @private
+ */
+GFdynamicFeedControl.prototype.createLink_ = function(href, text, opt_target) {
+ var link = document.createElement('a');
+ link.href = href;
+ link.innerHTML = text;
+ if (opt_target) {
+ link.target = opt_target;
+ }
+ return link;
+};
+
+
+GFdynamicFeedControl.prototype.createDate_ = function(text) {
+ var date = document.createElement('p');
+ date.innerHTML = text;
+ return date;
+};
+
+GFdynamicFeedControl.prototype.createDescription_ = function(text) {
+ var description = document.createElement('p');
+ description.innerHTML = text;
+ return description;
+};
+
+/**
+ * Cleanup results on being orphaned.
+ * @private
+ */
+GFdynamicFeedControl.prototype.clearResults_ = function() {
+ for (var i=0; i < this.results.length; i++) {
+ var result = this.results[i];
+ var entries = result.feed.entries;
+ for (var i = 0; i < entries.length; i++) {
+ var entry = entries[i];
+ entry.html = null;
+ entry.listEntry.onmouseover = null;
+ entry.listEntry.onmouseout = null;
+ if (entry.listEntry.selectTimer) {
+ clearTimeout(entry.listEntry.selectTimer);
+ entry.listEntry.selectTimer = null;
+ }
+ entry.listEntry = null;
+ }
+ }
+}
+
+/**
+ * Check for being orphaned.
+ * @private
+ */
+GFdynamicFeedControl.prototype.isOrphaned_ = function() {
+ var root = this.nodes.root;
+ var orphaned = false;
+ if (!root || !root.parentNode) {
+ orphaned = true;
+ } else if (this.options.horizontal && !root.parentNode.parentNode) {
+ orphaned = true;
+ }
+ return orphaned;
+}
+
+/**
+ * Cleanup on being orphaned.
+ * @private
+ */
+GFdynamicFeedControl.prototype.cleanup_ = function() {
+ this.started = false;
+ // Timer Events.
+ this.clearDisplayTimer_();
+ this.clearTransitionTimer_();
+ // Structures
+ this.clearResults_();
+ // Nodes
+ this.clearNode_(this.nodes.root);
+ this.nodes.container = null;
+}
+
+/**
+ * Helper method to set opacity for nodes.. Also takes into account
+ * visibility in general.
+ * @param {Element} node element.
+ * @param {Number} opacity alpha level.
+ * @private
+ */
+GFdynamicFeedControl.prototype.setOpacity_ = function(node, opacity) {
+ if (node == null) return;
+ opacity = Math.max(0, Math.min(1, opacity));
+ if (opacity == 0) {
+ if (node.style.visibility != 'hidden') {
+ node.style.visibility = 'hidden';
+ }
+ } else {
+ if (node.style.visibility != 'visible') {
+ node.style.visibility = 'visible';
+ }
+ }
+ if (this.ie) {
+ var normalized = Math.round(opacity*100);
+ node.style.filter = 'alpha(opacity=' + normalized + ')';
+ }
+ node.style.opacity = node.opacity = opacity;
+};
+
+GFgadget = GFdynamicFeedControl;