PageRenderTime 58ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/all-my-plus/index.php

https://github.com/Web5design/gplus-experiments
PHP | 540 lines | 511 code | 14 blank | 15 comment | 40 complexity | 76e7b1bcb411308548ceb2a0372eb35d MD5 | raw file
Possible License(s): Apache-2.0
  1. <?php
  2. /*
  3. * Copyright 2011-2012 Gerwin Sturm
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. include "config.php";
  18. $user_ip = $_SERVER["REMOTE_ADDR"];
  19. if (!$user_ip || $user_ip == "") {
  20. $user_ip = $_SERVER["SERVER_ADDR"];
  21. }
  22. require_once $gapi_client_path . "apiClient.php";
  23. require_once $gapi_client_path . "contrib/apiPlusService.php";
  24. session_start();
  25. $client = new apiClient();
  26. $client->setApplicationName("All my +");
  27. $client->setClientId($client_id);
  28. $client->setClientSecret($client_secret);
  29. $client->setRedirectUri($base_url . "index.php");
  30. $client->setDeveloperKey($developer_key);
  31. $client->setScopes(array("https://www.googleapis.com/auth/plus.me"));
  32. $plus = new apiPlusService($client);
  33. $maxresults = 100;
  34. if (isset($_GET["code"])) {
  35. $client->authenticate();
  36. try {
  37. $me = $plus->people->get("me");
  38. header("Location: " . $base_url . "u/" . $me["id"]);
  39. exit;
  40. } catch (Exception $e) {
  41. header("Location: " . $base_url . "?quota_exceeded");
  42. exit;
  43. }
  44. }
  45. if (isset($_GET["error"])) {
  46. header("Location: " . $base_url);
  47. exit;
  48. }
  49. if ($_POST["userid"] && $_POST["userid"] != "") {
  50. $pattern = "/[0-9]{10,30}/";
  51. if (preg_match($pattern, $_POST["userid"], $matches)) {
  52. header("Location: " . $base_url . "u/" . $matches[0]);
  53. exit;
  54. } else {
  55. header("Location: " . $base_url);
  56. exit;
  57. }
  58. } else {
  59. if ($_POST["keyword"] && $_POST["keyword"] != "") {
  60. header("Location: " . $base_url . "s/" . urlencode(trim($_POST["keyword"])));
  61. exit;
  62. }
  63. }
  64. $q_user = "";
  65. $q_keyword = "";
  66. $request = $_SERVER["REQUEST_URI"];
  67. $p = strrpos($request, "/u/");
  68. if (!($p === false)) {
  69. $request = substr($request, $p);
  70. if ($request == "?quota_exceeded") {
  71. $q_user = "";
  72. } else {
  73. $p = strrpos($request, "?");
  74. if (!($p === false)) {
  75. $q_user = substr($request, 3, $p-3);
  76. } else {
  77. $q_user = substr($request, 3);
  78. }
  79. }
  80. } else {
  81. $p = strrpos($request, "/s/");
  82. if (!($p === false)) {
  83. $request = substr($request, $p);
  84. $p = strrpos($request, "?");
  85. if (!($p === false)) {
  86. $q_keyword = substr($request, 3, $p-3);
  87. } else {
  88. $q_keyword = substr($request, 3);
  89. }
  90. $q_keyword = urldecode($q_keyword);
  91. }
  92. }
  93. $authUrl = $client->createAuthUrl();
  94. $authUrl = str_replace("&amp;", "&", $authUrl);
  95. $authUrl = str_replace("&", "&amp;", $authUrl);
  96. $num_activities = 0;
  97. $activities = array();
  98. $str_author_id = "";
  99. $str_author_name = "";
  100. $str_author_url = "";
  101. $str_author_pic = "";
  102. $str_errors = "";
  103. if ($q_user != "") {
  104. $optParams = array("userIp" => $user_ip);
  105. try {
  106. $actor = $plus->people->get($q_user);
  107. if (isset($actor["id"])) {
  108. $str_author_id = $actor["id"];
  109. $str_author_name = $actor["displayName"];
  110. $str_author_url = $actor["url"];
  111. if (isset($actor["image"])){
  112. if (isset($actor["image"]["url"])){
  113. $str_author_pic = $actor["image"]["url"];
  114. $str_author_pic = str_replace("?sz=50", "?sz=200", $str_author_pic);
  115. }
  116. }
  117. }
  118. } catch (Exception $e) {
  119. $str_errors = $str_errors . $e->getMessage() . "<br>";
  120. }
  121. }
  122. ?>
  123. <!DOCTYPE html>
  124. <html itemscope itemtype="http://schema.org/Person">
  125. <head>
  126. <meta charset="UTF-8">
  127. <?php
  128. if ($str_author_name == "") {
  129. if ($q_keyword == "") {
  130. printf(" <title>All my + Statistics</title>\n");
  131. printf(" <meta itemprop=\"name\" content=\"All my +\">\n");
  132. printf(" <meta itemprop=\"description\" content=\"A quick overview and statistics of your public g+ activities.\">\n");
  133. } else {
  134. printf(" <title>All my + Statistics for %s</title>\n", $q_keyword);
  135. printf(" <meta itemprop=\"name\" content=\"All my + Statistics for %s\">\n",$q_keyword);
  136. printf(" <meta itemprop=\"description\" content=\"A quick overview and statistics of the g+ activities about %s.\">\n",$q_keyword);
  137. printf(" <meta itemprop=\"image\" content=\"%simages/search.png\">\n",$base_url);
  138. }
  139. } else {
  140. printf(" <title>All my + Statistics for %s</title>\n",$str_author_name);
  141. printf(" <meta itemprop=\"name\" content=\"All my + Statistics for %s\">\n",$str_author_name);
  142. printf(" <meta itemprop=\"description\" content=\"A quick overview and statistics of the g+ activities of %s.\">\n",$str_author_name);
  143. printf(" <meta itemprop=\"image\" content=\"%s\">\n",$str_author_pic);
  144. }
  145. ?>
  146. <link rel="stylesheet" type="text/css" href="<?php echo $base_url; ?>css/style.css?v=4">
  147. <link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/base/jquery-ui.css">
  148. <link rel="shortcut icon" href="/favicon.ico">
  149. <link rel="icon" href="/favicon.ico">
  150. <base target="_blank">
  151. <script type="text/javascript">
  152. var base_url = "<?php echo $base_url; ?>";
  153. </script>
  154. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  155. <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
  156. <script src="https://www.google.com/jsapi"></script>
  157. <script src="<?php echo $base_url; ?>scripts/jquery.jsonp-2.3.0.min.js"></script>
  158. <script src="<?php echo $base_url; ?>scripts/sorttable.js"></script>
  159. <script src="<?php echo $base_url; ?>scripts/allmyplus.js?v=4"></script>
  160. <script type="text/javascript">
  161. $(function () {
  162. var allmyplus = new AllMyPlus(window, "<?php echo $base_url; ?>", "<?php echo $developer_key; ?>", <?php echo json_encode($actor); ?>, <?php echo json_encode($q_keyword); ?>);
  163. });
  164. </script>
  165. </head>
  166. <body>
  167. <div id="header">
  168. <div id="header1"></div>
  169. <div id="header2">
  170. <div id="header2_info">
  171. <table style="width: 100%;"><tr>
  172. <td style="width: 70px;"><a href="<?php echo $base_url; ?>" target="_self"><img src="<?php echo $base_url; ?>images/allmy+.png" alt="All my +"></a></td>
  173. <td>
  174. <table><tr style="vertical-align: center;">
  175. <td><h1 id="title">All my + Statistics</h1></td>
  176. <td id="progress"><img src="<?php echo $base_url; ?>images/spinner.gif" alt="spinner"> Preparing data, please wait...</td>
  177. </tr></table>
  178. <div class="menubar">
  179. <a class="menue menue_sel" id="men_start" href="#start" target="_self">Start</a>
  180. <a class="menue menue_unsel" id="men_overview" href="#overview" target="_self">Overview</a>
  181. <a class="menue menue_unsel" id="men_locations" href="#locations" target="_self">Locations</a>
  182. <a class="menue menue_unsel" id="men_charts" href="#charts" target="_self">Charts</a>
  183. <a class="menue menue_unsel" id="men_popular" href="#popular" target="_self">Popular posts</a>
  184. <a class="menue menue_unsel" id="men_people" href="#people" target="_self">People</a>
  185. <a class="menue menue_unsel" id="men_photos" href="#photos" target="_self">Photos</a>
  186. <a class="menue menue_unsel" id="men_posts" href="#posts" target="_self">Posts</a>
  187. <a class="menue menue_unsel" id="men_data" href="#data" target="_self">Raw Data</a>
  188. </div>
  189. </td>
  190. </tr></table>
  191. </div>
  192. </div>
  193. </div>
  194. <div id="main">
  195. <div id="start" class="anchor"></div>
  196. <div id="overview" class="anchor"></div>
  197. <div id="locations" class="anchor"></div>
  198. <div id="popular" class="anchor"></div>
  199. <div id="photos" class="anchor"></div>
  200. <div id="charts" class="anchor"></div>
  201. <div id="posts" class="anchor"></div>
  202. <div id="people" class="anchor"></div>
  203. <div id="data" class="anchor"></div>
  204. <div id="d_start" class="contents">
  205. <table style="width: 100%;"><tr>
  206. <td style="text-align: center; width: 400px;">
  207. <div id="user_data" style="display: none;">
  208. <table><tr>
  209. <td><a href="#" id="user_pic"><img src="<?php echo $base_url; ?>images/noimage.png" alt="No User" title="No User"></a></td>
  210. <td><a href="#" id="user_name">No User</a><br><br><span id="user_activities"></span></td>
  211. </tr></table>
  212. </div>
  213. <div id="login_version">
  214. <div class="instructions">Login via Google+&#8482; to access your own public data (<a href="#" target="_self">more info</a>)</div>
  215. <a href="<?php echo $authUrl; ?>" target="_self" id="login" title="Read the privacy statement for details.">Login via Google+</a>
  216. </div>
  217. <div class="or">or</div>
  218. <div id="api_version">
  219. <div class="instructions">Enter the ID or URL of a Google+ Profile or Page (<a href="#" target="_self">more info</a>)</div>
  220. <form method="post" action="<?php echo $base_url; ?>" target="_self">
  221. <input id="userid" name="userid" type="text">
  222. <input id="submit" type="submit">
  223. </form>
  224. </div>
  225. <div class="or">or</div>
  226. <div id="takeout_version">
  227. <div class="instructions">Use your downloaded Google Takeout data (<a href="#" target="_self">more info</a>)</div>
  228. <div id="drop_zone" title="All your data will stay local. Nothing will be uploaded to any server.">Drop files here</div>
  229. </div>
  230. <div class="or">or</div>
  231. <div id="search_version">
  232. <div class="instructions">Enter a search term (<a href="#" target="_self">more info</a>)</div>
  233. <form method="post" action="<?php echo $base_url; ?>" target="_self">
  234. <input id="keyword" name="keyword" type="text">
  235. <input id="submit" type="submit">
  236. </form>
  237. </div>
  238. <div id="load_more" style="display: none;">
  239. <button id="load_500">Load more activities</button>
  240. <button id="load_all">Load all activities</button>
  241. </div>
  242. <div id="filter_data" style="display: none;">
  243. <h1>Filter activities</h1><br>
  244. <div id="date_range">
  245. Date between <input type="text" id="date_from"> and <input type="text" id="date_to">
  246. </div>
  247. <div id="date_slider"></div>
  248. Keyword <input type="text" id="filter_keyword"><br>
  249. <button id="all_activities">Reset filters</button><br>
  250. <span id="filtered_activities"></span>
  251. </div>
  252. </td>
  253. <td id="instructions">
  254. <div id="login_instructions" style="display: none;">
  255. <h1>Login via Google+</h1><br>
  256. Clicking on the login button will redirect you to a Google page where you will be asked to give permission to this page to access some of your information.<br><br>
  257. <img src="<?php echo $base_url; ?>images/instructions_login.png" alt="Login"><br>
  258. Clicking on "Allow access" will redirect you back to this page with your profile information added automatically.<br><br>
  259. The permission will only be used once to get your profile ID and access your public profile information. None of this data will be stored on our server.
  260. </div>
  261. <div id="api_instructions" style="display: none;">
  262. <h1>ID or URL of a Google+ Profile or Page</h1><br>
  263. You can find the necessary ID by opening the Google+ profile of the person/page you are interested in. The URL will look something like this:<br><br>
  264. <a class="highlight" href="https://plus.google.com/102056575560237938284/posts">https://plus.google.com/102056575560237938284/posts</a><br><br>
  265. You can either copy &amp; paste the whole URL or just the long number into the input field and press "Submit". This will load the data for the person/page of your choice.<br>
  266. </div>
  267. <div id="takeout_instructions" style="display: none;">
  268. <h1>Using Google Takeout Data</h1><br>
  269. This method has the advantage that you have access to all your posts and not only to your public posts which are available through the Google+ API.
  270. You will need your "Stream"-data in JSON format.<br>
  271. To get started visit the following URL:<br>
  272. <a class="highlight" href="https://www.google.com/takeout/#custom:stream">https://www.google.com/takeout/#custom:stream</a><br><br>
  273. The important thing is that you click on "Configure" and change the activity type to "JSON" before you create the archive.<br>
  274. <img src="<?php echo $base_url; ?>images/instructions_takeout.png" alt="Takeout Configuration"><br>
  275. Once your package is ready you will have to download and extract it. Then you can drag the .json files from your file browser and drop them into the field on the left.<br><br>
  276. All your data will be analysed locally on your computer, nothing will be uploaded.
  277. </div>
  278. <div id="search_instructions" style="display: none;">
  279. <h1>Google+ Search</h1><br>
  280. As opposed to offering statistics for one specific person or page this will use the Google+ Search API to find posts matching your search term and analyse those.<br>
  281. The way the Google+ Search API works this won't find all the matching posts but I try my best to get as many posts as possible out of the API.<br>
  282. When no more posts can be found you will be able to restart the search after a short timeout which often produces some additional results.
  283. </div>
  284. </td>
  285. <td><div id="stat_types" style="display: none";>
  286. <h1>What are you interested in?</h1><br>
  287. <div class="stat_type" id="stat_overview">
  288. <img src="<?php echo $base_url; ?>images/stat_overview.png" alt="Overview"><br>
  289. Overview
  290. </div>
  291. <div class="stat_type" id="stat_locations">
  292. <img src="<?php echo $base_url; ?>images/stat_locations.png" alt="Locations"><br>
  293. Locations
  294. </div>
  295. <div class="stat_type" id="stat_charts">
  296. <img src="<?php echo $base_url; ?>images/stat_charts.png" alt="Charts"><br>
  297. Charts
  298. </div>
  299. <div class="stat_type" id="stat_popular">
  300. <img src="<?php echo $base_url; ?>images/stat_popular.png" alt="Popular Posts"><br>
  301. Popular Posts
  302. </div>
  303. <div class="stat_type" id="stat_people">
  304. <img src="<?php echo $base_url; ?>images/stat_people.png" alt="People"><br>
  305. People
  306. </div>
  307. <div class="stat_type" id="stat_photos">
  308. <img src="<?php echo $base_url; ?>images/stat_photos.png" alt="Photos"><br>
  309. Photos
  310. </div>
  311. <div class="stat_type" id="stat_posts">
  312. <img src="<?php echo $base_url; ?>images/stat_posts.png" alt="All Posts"><br>
  313. All Posts
  314. </div>
  315. <div class="stat_type" id="stat_data">
  316. <img src="<?php echo $base_url; ?>images/stat_data.png" alt="Raw Data Export"><br>
  317. Raw Data Export
  318. </div>
  319. </div>
  320. </td>
  321. </tr></table>
  322. </div>
  323. <div id="d_overview" class="contents">
  324. <table style="width: 100%;"><tr>
  325. <td>
  326. <table>
  327. <tr><th colspan="4" style="text-align: center; background-color: yellow;">Total</th></tr>
  328. <tr><th></th><th>Total</th><th>Original</th><th>Reshared</th></tr>
  329. <tr><th>Posts</th><td class="stats" id="t_posts"></td><td class="stats" id="t_posts_o"></td><td class="stats" id="t_posts_r"></td></tr>
  330. <tr><th>Location</th><td class="stats" id="t_loc"></td><td class="stats" id="t_loc_o"></td><td class="stats" id="t_loc_r"></td></tr>
  331. <tr><th>Photos</th><td class="stats" id="t_photos"></td><td class="stats" id="t_photos_o"></td><td class="stats" id="t_photos_r"></td></tr>
  332. <tr><th>GIFs</th><td class="stats" id="t_gifs"></td><td class="stats" id="t_gifs_o"></td><td class="stats" id="t_gifs_r"></td></tr>
  333. <tr><th>Videos</th><td class="stats" id="t_videos"></td><td class="stats" id="t_videos_o"></td><td class="stats" id="t_videos_r"></td></tr>
  334. <tr><th>Links</th><td class="stats" id="t_links"></td><td class="stats" id="t_links_o"></td><td class="stats" id="t_links_r"></td></tr>
  335. <tr><th>Comments</th><td class="stats" id="t_comments"></td><td class="stats" id="t_comments_o"></td><td class="stats" id="t_comments_r"></td></tr>
  336. <tr><td class="stats noborder">per post</td><td class="stats" id="t_cpp"></td><td class="stats" id="t_cpp_o"></td><td class="stats" id="t_cpp_r"></td></tr>
  337. <tr><th>+1's</th><td class="stats" id="t_plusones"></td><td class="stats" id="t_plusones_o"></td><td class="stats" id="t_plusones_r"></td></tr>
  338. <tr><td class="stats noborder">per post</td><td class="stats" id="t_ppp"></td><td class="stats" id="t_ppp_o"></td><td class="stats" id="t_ppp_r"></td></tr>
  339. <tr><th>Reshares</th><td class="stats" id="t_reshares"></td><td class="stats" id="t_reshares_o"></td><td class="stats" id="t_reshares_r"></td></tr>
  340. <tr><td class="stats noborder">per post</td><td class="stats" id="t_rpp"></td><td class="stats" id="t_rpp_o"></td><td class="stats" id="t_rpp_r"></td></tr>
  341. </table>
  342. </td>
  343. <td></td>
  344. <td>
  345. <table class="takeout">
  346. <tr><th colspan="4" style="text-align: center; background-color: yellow;">Public</th></tr>
  347. <tr><th></th><th>Total</th><th>Original</th><th>Reshared</th></tr>
  348. <tr><th>Posts</th><td class="stats" id="tp_posts"></td><td class="stats" id="tp_posts_o"></td><td class="stats" id="tp_posts_r"></td></tr>
  349. <tr><th>Location</th><td class="stats" id="tp_loc"></td><td class="stats" id="tp_loc_o"></td><td class="stats" id="tp_loc_r"></td></tr>
  350. <tr><th>Photos</th><td class="stats" id="tp_photos"></td><td class="stats" id="tp_photos_o"></td><td class="stats" id="tp_photos_r"></td></tr>
  351. <tr><th>GIFs</th><td class="stats" id="tp_gifs"></td><td class="stats" id="tp_gifs_o"></td><td class="stats" id="tp_gifs_r"></td></tr>
  352. <tr><th>Videos</th><td class="stats" id="tp_videos"></td><td class="stats" id="tp_videos_o"></td><td class="stats" id="tp_videos_r"></td></tr>
  353. <tr><th>Links</th><td class="stats" id="tp_links"></td><td class="stats" id="tp_links_o"></td><td class="stats" id="tp_links_r"></td></tr>
  354. <tr><th>Comments</th><td class="stats" id="tp_comments"></td><td class="stats" id="tp_comments_o"></td><td class="stats" id="tp_comments_r"></td></tr>
  355. <tr><td class="stats noborder">per post</td><td class="stats" id="tp_cpp"></td><td class="stats" id="tp_cpp_o"></td><td class="stats" id="tp_cpp_r"></td></tr>
  356. <tr><th>+1's</th><td class="stats" id="tp_plusones"></td><td class="stats" id="tp_plusones_o"></td><td class="stats" id="tp_plusones_r"></td></tr>
  357. <tr><td class="stats noborder">per post</td><td class="stats" id="tp_ppp"></td><td class="stats" id="tp_ppp_o"></td><td class="stats" id="tp_ppp_r"></td></tr>
  358. <tr><th>Reshares</th><td class="stats" id="tp_reshares"></td><td class="stats" id="tp_reshares_o"></td><td class="stats" id="tp_reshares_r"></td></tr>
  359. <tr><td class="stats noborder">per post</td><td class="stats" id="tp_rpp"></td><td class="stats" id="tp_rpp_o"></td><td class="stats" id="tp_rpp_r"></td></tr>
  360. </table>
  361. </td></tr>
  362. <tr><td>
  363. <table class="takeout">
  364. <tr><th colspan="4" style="text-align: center; background-color: yellow;">Extended Circles</th></tr>
  365. <tr><th></th><th>Total</th><th>Original</th><th>Reshared</th></tr>
  366. <tr><th>Posts</th><td class="stats" id="te_posts"></td><td class="stats" id="te_posts_o"></td><td class="stats" id="te_posts_r"></td></tr>
  367. <tr><th>Location</th><td class="stats" id="te_loc"></td><td class="stats" id="te_loc_o"></td><td class="stats" id="te_loc_r"></td></tr>
  368. <tr><th>Photos</th><td class="stats" id="te_photos"></td><td class="stats" id="te_photos_o"></td><td class="stats" id="te_photos_r"></td></tr>
  369. <tr><th>GIFs</th><td class="stats" id="te_gifs"></td><td class="stats" id="te_gifs_o"></td><td class="stats" id="te_gifs_r"></td></tr>
  370. <tr><th>Videos</th><td class="stats" id="te_videos"></td><td class="stats" id="te_videos_o"></td><td class="stats" id="te_videos_r"></td></tr>
  371. <tr><th>Links</th><td class="stats" id="te_links"></td><td class="stats" id="te_links_o"></td><td class="stats" id="te_links_r"></td></tr>
  372. <tr><th>Comments</th><td class="stats" id="te_comments"></td><td class="stats" id="te_comments_o"></td><td class="stats" id="te_comments_r"></td></tr>
  373. <tr><td class="stats noborder">per post</td><td class="stats" id="te_cpp"></td><td class="stats" id="te_cpp_o"></td><td class="stats" id="te_cpp_r"></td></tr>
  374. <tr><th>+1's</th><td class="stats" id="te_plusones"></td><td class="stats" id="te_plusones_o"></td><td class="stats" id="te_plusones_r"></td></tr>
  375. <tr><td class="stats noborder">per post</td><td class="stats" id="te_ppp"></td><td class="stats" id="te_ppp_o"></td><td class="stats" id="te_ppp_r"></td></tr>
  376. <tr><th>Reshares</th><td class="stats" id="te_reshares"></td><td class="stats" id="te_reshares_o"></td><td class="stats" id="te_reshares_r"></td></tr>
  377. <tr><td class="stats noborder">per post</td><td class="stats" id="te_rpp"></td><td class="stats" id="te_rpp_o"></td><td class="stats" id="te_rpp_r"></td></tr>
  378. </table>
  379. </td>
  380. <td>
  381. <table class="takeout">
  382. <tr><th colspan="4" style="text-align: center; background-color: yellow;">Circles</th></tr>
  383. <tr><th></th><th>Total</th><th>Original</th><th>Reshared</th></tr>
  384. <tr><th>Posts</th><td class="stats" id="tc_posts"></td><td class="stats" id="tc_posts_o"></td><td class="stats" id="tc_posts_r"></td></tr>
  385. <tr><th>Location</th><td class="stats" id="tc_loc"></td><td class="stats" id="tc_loc_o"></td><td class="stats" id="tc_loc_r"></td></tr>
  386. <tr><th>Photos</th><td class="stats" id="tc_photos"></td><td class="stats" id="tc_photos_o"></td><td class="stats" id="tc_photos_r"></td></tr>
  387. <tr><th>GIFs</th><td class="stats" id="tc_gifs"></td><td class="stats" id="tc_gifs_o"></td><td class="stats" id="tc_gifs_r"></td></tr>
  388. <tr><th>Videos</th><td class="stats" id="tc_videos"></td><td class="stats" id="tc_videos_o"></td><td class="stats" id="tc_videos_r"></td></tr>
  389. <tr><th>Links</th><td class="stats" id="tc_links"></td><td class="stats" id="tc_links_o"></td><td class="stats" id="tc_links_r"></td></tr>
  390. <tr><th>Comments</th><td class="stats" id="tc_comments"></td><td class="stats" id="tc_comments_o"></td><td class="stats" id="tc_comments_r"></td></tr>
  391. <tr><td class="stats noborder">per post</td><td class="stats" id="tc_cpp"></td><td class="stats" id="tc_cpp_o"></td><td class="stats" id="tc_cpp_r"></td></tr>
  392. <tr><th>+1's</th><td class="stats" id="tc_plusones"></td><td class="stats" id="tc_plusones_o"></td><td class="stats" id="tc_plusones_r"></td></tr>
  393. <tr><td class="stats noborder">per post</td><td class="stats" id="tc_ppp"></td><td class="stats" id="tc_ppp_o"></td><td class="stats" id="tc_ppp_r"></td></tr>
  394. <tr><th>Reshares</th><td class="stats" id="tc_reshares"></td><td class="stats" id="tc_reshares_o"></td><td class="stats" id="tc_reshares_r"></td></tr>
  395. <tr><td class="stats noborder">per post</td><td class="stats" id="tc_rpp"></td><td class="stats" id="tc_rpp_o"></td><td class="stats" id="tc_rpp_r"></td></tr>
  396. </table>
  397. </td>
  398. <td>
  399. <table class="takeout">
  400. <tr><th colspan="4" style="text-align: center; background-color: yellow;">Limited</th></tr>
  401. <tr><th></th><th>Total</th><th>Original</th><th>Reshared</th></tr>
  402. <tr><th>Posts</th><td class="stats" id="tl_posts"></td><td class="stats" id="tl_posts_o"></td><td class="stats" id="tl_posts_r"></td></tr>
  403. <tr><th>Location</th><td class="stats" id="tl_loc"></td><td class="stats" id="tl_loc_o"></td><td class="stats" id="tl_loc_r"></td></tr>
  404. <tr><th>Photos</th><td class="stats" id="tl_photos"></td><td class="stats" id="tl_photos_o"></td><td class="stats" id="tl_photos_r"></td></tr>
  405. <tr><th>GIFs</th><td class="stats" id="tl_gifs"></td><td class="stats" id="tl_gifs_o"></td><td class="stats" id="tl_gifs_r"></td></tr>
  406. <tr><th>Videos</th><td class="stats" id="tl_videos"></td><td class="stats" id="tl_videos_o"></td><td class="stats" id="tl_videos_r"></td></tr>
  407. <tr><th>Links</th><td class="stats" id="tl_links"></td><td class="stats" id="tl_links_o"></td><td class="stats" id="tl_links_r"></td></tr>
  408. <tr><th>Comments</th><td class="stats" id="tl_comments"></td><td class="stats" id="tl_comments_o"></td><td class="stats" id="tl_comments_r"></td></tr>
  409. <tr><td class="stats noborder">per post</td><td class="stats" id="tl_cpp"></td><td class="stats" id="tl_cpp_o"></td><td class="stats" id="tl_cpp_r"></td></tr>
  410. <tr><th>+1's</th><td class="stats" id="tl_plusones"></td><td class="stats" id="tl_plusones_o"></td><td class="stats" id="tl_plusones_r"></td></tr>
  411. <tr><td class="stats noborder">per post</td><td class="stats" id="tl_ppp"></td><td class="stats" id="tl_ppp_o"></td><td class="stats" id="tl_ppp_r"></td></tr>
  412. <tr><th>Reshares</th><td class="stats" id="tl_reshares"></td><td class="stats" id="tl_reshares_o"></td><td class="stats" id="tl_reshares_r"></td></tr>
  413. <tr><td class="stats noborder">per post</td><td class="stats" id="tl_rpp"></td><td class="stats" id="tl_rpp_o"></td><td class="stats" id="tl_rpp_r"></td></tr>
  414. </table>
  415. </td>
  416. </tr></table><br>
  417. </div>
  418. <div id="d_locations" class="contents">
  419. <div id="map_canvas"></div>
  420. </div>
  421. <div id="d_charts" class="contents">
  422. <p class="smalll">Note: All times are based on your local timezone.</p>
  423. <table class="smalll"><tr>
  424. <td>Type: Total <input type="checkbox" id="chk_total" name="chk_total" value="chk_total" checked> / Original <input type="checkbox" id="chk_original" name="chk_original" value="chk_original" checked> / Reshared <input type="checkbox" id="chk_reshared" name="chk_reshared" value="chk_reshared"></td>
  425. <td class="takeout smallr">Audience: Total <input type="checkbox" id="chk_all" name="chk_all" value="chk_all" checked> / Public <input type="checkbox" id="chk_public" name="chk_public" value="chk_public"> / Extended Circles <input type="checkbox" id="chk_extended" name="chk_extended" value="chk_extended"> / Circles <input type="checkbox" id="chk_circles" name="chk_circles" value="chk_circles"> / Limited <input type="checkbox" id="chk_limited" name="chk_limited" value="chk_limited"></td>
  426. </tr><tr><td colspan="2">
  427. Values: Posts <input type="checkbox" id="chk_posts" name="chk_posts" value="chk_posts" checked>
  428. / Location <input type="checkbox" id="chk_location" name="chk_location" value="chk_location">
  429. / Photos <input type="checkbox" id="chk_photos" name="chk_photos" value="chk_photos">
  430. / GIFs <input type="checkbox" id="chk_gifs" name="chk_gifs" value="chk_gifs">
  431. / Videos <input type="checkbox" id="chk_videos" name="chk_videos" value="chk_videos">
  432. / Links <input type="checkbox" id="chk_links" name="chk_links" value="chk_links">
  433. / Comments <input type="checkbox" id="chk_comments" name="chk_comments" value="chk_comments">
  434. / CpP <input type="checkbox" id="chk_cpp" name="chk_cpp" value="chk_cpp">
  435. / +1's <input type="checkbox" id="chk_plusones" name="chk_plusones" value="chk_plusones">
  436. / PpP <input type="checkbox" id="chk_ppp" name="chk_ppp" value="chk_ppp">
  437. / Reshares <input type="checkbox" id="chk_reshares" name="chk_reshares" value="chk_reshares">
  438. / RpP <input type="checkbox" id="chk_rpp" name="chk_rpp" value="chk_rpp">
  439. </td></tr></table>
  440. <div id="chart_warning" style="font-weight:bold;">No values selected.<br><br></div>
  441. <div id="day_chart"></div>
  442. <div id="weekday_chart"></div>
  443. <div id="hour_chart"></div>
  444. </div>
  445. <div id="d_popular" class="contents"></div>
  446. <div id="d_people" class="contents">
  447. <table class="followers">
  448. <tr>
  449. <th title="People who commented on posts" class="takeout">Commenters</th>
  450. <th title="People who reshared posts" class="takeout">Resharers</th>
  451. <th title="People who +1'd posts" class="takeout" id="plusoners_head">+1'ers</th>
  452. <th title="People whose posts have been reshared">Reshared</th>
  453. </tr>
  454. <tr>
  455. <td id="commenters" class="takeout"></td>
  456. <td id="resharers" class="takeout"></td>
  457. <td id="plusoners" class="takeout"></td>
  458. <td id="reshared"></td>
  459. </tr>
  460. </table>
  461. </div>
  462. <div id="d_photos" class="contents"></div>
  463. <div id="d_posts" class="contents">
  464. You can sort the table by clicking on the column headers.<br><br>
  465. Filter options:
  466. <table class="filter_table">
  467. <tr>
  468. <td colspan="5" style="text-align: left;" class="takeout">Audience: Public <input type="checkbox" id="posts_public" name="posts_public" value="posts_public" checked> /
  469. Extended Circles <input type="checkbox" id="posts_extended" name="posts_extended" value="posts_extended" checked> /
  470. Circles <input type="checkbox" id="posts_circles" name="posts_circles" value="posts_circles" checked> /
  471. Limited <input type="checkbox" id="posts_limited" name="posts_limited" value="posts_limited" checked></td>
  472. </tr>
  473. <tr>
  474. <td>Type: Original <input type="checkbox" id="posts_original" name="posts_original" value="posts_original" checked> /
  475. Reshared <input type="checkbox" id="posts_reshared" name="posts_reshared" value="posts_reshared" checked></td>
  476. <td>Comments: With <input type="checkbox" id="posts_comments" name="posts_comments" value="posts_comments" checked> /
  477. Without <input type="checkbox" id="posts_comments_wo" name="posts_comments_wo" value="posts_comments_wo" checked></td>
  478. <td>+1's: With <input type="checkbox" id="posts_plusones" name="posts_plusones" value="posts_plusones" checked> /
  479. Without <input type="checkbox" id="posts_plusones_wo" name="posts_plusones_wo" value="posts_plusones_wo" checked></td>
  480. <td colspan="2" style="text-align: left;">Reshares: With <input type="checkbox" id="posts_reshares" name="posts_reshares" value="posts_reshares" checked> /
  481. Without <input type="checkbox" id="posts_reshares_wo" name="posts_reshares_wo" value="posts_reshares_wo" checked></td>
  482. </tr>
  483. <tr>
  484. <td>Location: With <input type="checkbox" id="posts_location" name="posts_location" value="posts_location" checked> /
  485. Without <input type="checkbox" id="posts_location_wo" name="posts_location_wo" value="posts_location_wo" checked></td>
  486. <td>Photos: With <input type="checkbox" id="posts_photos" name="posts_photos" value="posts_photos" checked> /
  487. Without <input type="checkbox" id="posts_photos_wo" name="posts_photos_wo" value="posts_photos_wo" checked></td>
  488. <td>GIFs: With <input type="checkbox" id="posts_gifs" name="posts_gifs" value="posts_gifs" checked> /
  489. Without <input type="checkbox" id="posts_gifs_wo" name="posts_gifs_wo" value="posts_gifs_wo" checked></td>
  490. <td>Videos: With <input type="checkbox" id="posts_videos" name="posts_videos" value="posts_videos" checked> /
  491. Without <input type="checkbox" id="posts_videos_wo" name="posts_videos_wo" value="posts_videos_wo" checked></td>
  492. <td>Links: With <input type="checkbox" id="posts_links" name="posts_links" value="posts_links" checked> /
  493. Without <input type="checkbox" id="posts_links_wo" name="posts_links_wo" value="posts_links_wo" checked></td>
  494. </tr>
  495. </table><br>
  496. <table class="sortable" id="posts_table">
  497. <thead>
  498. <tr><th>Date</th><th class="sorttable_numeric" title="Audience: P = Public, E = Extended Circles, C = Circles, L = Limited">A</th><th class="sorttable_numeric" title="Comments">C</th><th class="sorttable_numeric" title="Reshares">R</th><th class="sorttable_numeric" title="+1's">+1</th><th class="sorttable_numeric" title="Post Length">L</th><th>Post</th></tr>
  499. </thead>
  500. <tbody>
  501. </tbody>
  502. </table>
  503. </div>
  504. <div id="d_data" class="contents">
  505. <span id="data_download"></span><br><br>
  506. <table id="data_table">
  507. <thead>
  508. <tr><th>Date</th><th>Day</th><th>Weekday</th><th>Hour</th><th>Audience</th><th>Org</th><th>Reshare</th><th>Location</th><th>Photos</th><th>GIFs</th><th>Videos</th><th>Links</th><th>C</th><th>R</th><th>+1</th><th>Link</th><th>Poster</th><th>Poster ID</th><th>Org Poster</th><th>Org Poster ID</th><th>Annotation</th><th>Post</th></tr>
  509. </thead>
  510. <tbody>
  511. </tbody>
  512. </table>
  513. </div>
  514. </div>
  515. <div id="footer" class="footer_data">
  516. <a href="https://plus.google.com/105696887942257432718?rel=publisher" style="display: none;"></a>
  517. <p class="smallr">
  518. Google+ is a trademark of Google Inc. Use of this trademarks is subject to <a href="http://www.google.com/permissions/index.html">Google Permissions</a>.<br>
  519. This site is not affiliated with, sponsored by, or endorsed by <a href="http://www.google.com/">Google Inc</a>.<br>
  520. Programming by <a href="https://plus.google.com/112336147904981294875" rel="author">Gerwin Sturm</a>, <a href="http://www.foldedsoft.at/">FoldedSoft e.U.</a><br><br>
  521. </p>
  522. </div>
  523. </body>
  524. </html>