PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/KitchenSink/Resources/examples/twitter.js

https://github.com/Val9/KitchenSink
JavaScript | 309 lines | 272 code | 18 blank | 19 comment | 59 complexity | 76c6d181ec5761a8f6d54ae9d5c15705 MD5 | raw file
  1. // Kosso
  2. // Another attempt to create a simple Twitter client list.
  3. // This time using a vertical layout view within each row containing the avatar image and labels for the
  4. // date, the username and the tweet itself.
  5. // @kosso : kosso@phreadz.com
  6. // set up a twitter screen name.
  7. var twitter_name = 'appcelerator';
  8. var win = Ti.UI.currentWindow;
  9. win.title = '@'+twitter_name;
  10. function getTweets(screen_name){
  11. // create table view data object
  12. var data = [];
  13. var xhr = Ti.Network.createHTTPClient();
  14. xhr.timeout = 1000000;
  15. xhr.open("GET","http://api.twitter.com/1/statuses/user_timeline.json?screen_name="+screen_name);
  16. xhr.onload = function()
  17. {
  18. try
  19. {
  20. var tweets = eval('('+this.responseText+')');
  21. for (var c=0;c<tweets.length;c++){
  22. var tweet = tweets[c].text;
  23. var user = tweets[c].user.screen_name;
  24. var avatar = tweets[c].user.profile_image_url;
  25. var created_at = prettyDate(strtotime(tweets[c].created_at));
  26. var bgcolor = (c % 2) == 0 ? '#fff' : '#eee';
  27. var row = Ti.UI.createTableViewRow({hasChild:true,height:'auto',backgroundColor:bgcolor});
  28. // Create a vertical layout view to hold all the info labels and images for each tweet
  29. var post_view = Ti.UI.createView({
  30. height:'auto',
  31. layout:'vertical',
  32. left:5,
  33. top:5,
  34. bottom:5,
  35. right:5,
  36. });
  37. var av = Ti.UI.createImageView({
  38. image:avatar,
  39. left:0,
  40. top:0,
  41. height:48,
  42. width:48
  43. });
  44. // Add the avatar image to the view
  45. post_view.add(av);
  46. var user_label = Ti.UI.createLabel({
  47. text:user,
  48. left:54,
  49. width:120,
  50. top:-48,
  51. bottom:2,
  52. height:16,
  53. textAlign:'left',
  54. color:'#444444',
  55. font:{fontFamily:'Trebuchet MS',fontSize:14,fontWeight:'bold'}
  56. });
  57. // Add the username to the view
  58. post_view.add(user_label);
  59. var date_label = Ti.UI.createLabel({
  60. text:created_at,
  61. right:0,
  62. top:-18,
  63. bottom:2,
  64. height:14,
  65. textAlign:'right',
  66. width:110,
  67. color:'#444444',
  68. font:{fontFamily:'Trebuchet MS',fontSize:12}
  69. });
  70. // Add the date to the view
  71. post_view.add(date_label);
  72. var tweet_text = Ti.UI.createLabel({
  73. text:tweet,
  74. left:54,
  75. top:0,
  76. bottom:2,
  77. height:'auto',
  78. width:236,
  79. textAlign:'left',
  80. font:{fontSize:14}
  81. });
  82. // Add the tweet to the view
  83. post_view.add(tweet_text);
  84. // Add the vertical layout view to the row
  85. row.add(post_view);
  86. row.className = 'item'+c;
  87. data[c] = row;
  88. }
  89. // Create the tableView and add it to the window.
  90. var tableview = Titanium.UI.createTableView({data:data,minRowHeight:58});
  91. Ti.UI.currentWindow.add(tableview);
  92. }
  93. catch(E){
  94. alert(E);
  95. }
  96. };
  97. // Get the data
  98. xhr.send();
  99. }
  100. function strtotime (str, now) {
  101. // Emlulates the PHP strtotime function in JavaScript
  102. // obtained from http://phpjs.org/functions/strtotime:554
  103. var i, match, s, strTmp = '', parse = '';
  104. strTmp = str;
  105. strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
  106. strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars
  107. if (strTmp == 'now') {
  108. return (new Date()).getTime()/1000; // Return seconds, not milli-seconds
  109. } else if (!isNaN(parse = Date.parse(strTmp))) {
  110. return (parse/1000);
  111. } else if (now) {
  112. now = new Date(now*1000); // Accept PHP-style seconds
  113. } else {
  114. now = new Date();
  115. }
  116. strTmp = strTmp.toLowerCase();
  117. var __is =
  118. {
  119. day:
  120. {
  121. 'sun': 0,
  122. 'mon': 1,
  123. 'tue': 2,
  124. 'wed': 3,
  125. 'thu': 4,
  126. 'fri': 5,
  127. 'sat': 6
  128. },
  129. mon:
  130. {
  131. 'jan': 0,
  132. 'feb': 1,
  133. 'mar': 2,
  134. 'apr': 3,
  135. 'may': 4,
  136. 'jun': 5,
  137. 'jul': 6,
  138. 'aug': 7,
  139. 'sep': 8,
  140. 'oct': 9,
  141. 'nov': 10,
  142. 'dec': 11
  143. }
  144. };
  145. var process = function (m) {
  146. var ago = (m[2] && m[2] == 'ago');
  147. var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);
  148. switch (m[0]) {
  149. case 'last':
  150. case 'next':
  151. switch (m[1].substring(0, 3)) {
  152. case 'yea':
  153. now.setFullYear(now.getFullYear() + num);
  154. break;
  155. case 'mon':
  156. now.setMonth(now.getMonth() + num);
  157. break;
  158. case 'wee':
  159. now.setDate(now.getDate() + (num * 7));
  160. break;
  161. case 'day':
  162. now.setDate(now.getDate() + num);
  163. break;
  164. case 'hou':
  165. now.setHours(now.getHours() + num);
  166. break;
  167. case 'min':
  168. now.setMinutes(now.getMinutes() + num);
  169. break;
  170. case 'sec':
  171. now.setSeconds(now.getSeconds() + num);
  172. break;
  173. default:
  174. var day;
  175. if (typeof (day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
  176. var diff = day - now.getDay();
  177. if (diff == 0) {
  178. diff = 7 * num;
  179. } else if (diff > 0) {
  180. if (m[0] == 'last') {diff -= 7;}
  181. } else {
  182. if (m[0] == 'next') {diff += 7;}
  183. }
  184. now.setDate(now.getDate() + diff);
  185. }
  186. }
  187. break;
  188. default:
  189. if (/\d+/.test(m[0])) {
  190. num *= parseInt(m[0], 10);
  191. switch (m[1].substring(0, 3)) {
  192. case 'yea':
  193. now.setFullYear(now.getFullYear() + num);
  194. break;
  195. case 'mon':
  196. now.setMonth(now.getMonth() + num);
  197. break;
  198. case 'wee':
  199. now.setDate(now.getDate() + (num * 7));
  200. break;
  201. case 'day':
  202. now.setDate(now.getDate() + num);
  203. break;
  204. case 'hou':
  205. now.setHours(now.getHours() + num);
  206. break;
  207. case 'min':
  208. now.setMinutes(now.getMinutes() + num);
  209. break;
  210. case 'sec':
  211. now.setSeconds(now.getSeconds() + num);
  212. break;
  213. }
  214. } else {
  215. return false;
  216. }
  217. break;
  218. }
  219. return true;
  220. };
  221. match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);
  222. if (match != null) {
  223. if (!match[2]) {
  224. match[2] = '00:00:00';
  225. } else if (!match[3]) {
  226. match[2] += ':00';
  227. }
  228. s = match[1].split(/-/g);
  229. for (i in __is.mon) {
  230. if (__is.mon[i] == s[1] - 1) {
  231. s[1] = i;
  232. }
  233. }
  234. s[0] = parseInt(s[0], 10);
  235. s[0] = (s[0] >= 0 && s[0] <= 69) ? '20'+(s[0] < 10 ? '0'+s[0] : s[0]+'') : (s[0] >= 70 && s[0] <= 99) ? '19'+s[0] : s[0]+'';
  236. return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2])+(match[4] ? match[4]/1000 : ''), 10);
  237. }
  238. var regex = '([+-]?\\d+\\s'+
  239. '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
  240. '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+
  241. '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday)'+
  242. '|(last|next)\\s'+
  243. '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
  244. '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+
  245. '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday))'+
  246. '(\\sago)?';
  247. match = strTmp.match(new RegExp(regex, 'gi')); // Brett: seems should be case insensitive per docs, so added 'i'
  248. if (match == null) {
  249. return false;
  250. }
  251. for (i = 0; i < match.length; i++) {
  252. if (!process(match[i].split(' '))) {
  253. return false;
  254. }
  255. }
  256. return (now.getTime()/1000);
  257. }
  258. // creates a 'pretty date' from a unix time stamp
  259. function prettyDate(time){
  260. var monthname = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  261. var date = new Date(time*1000),
  262. diff = (((new Date()).getTime() - date.getTime()) / 1000),
  263. day_diff = Math.floor(diff / 86400);
  264. if ( isNaN(day_diff) || day_diff < 0 ){
  265. return '';
  266. }
  267. if(day_diff >= 31){
  268. var date_year = date.getFullYear();
  269. var month_name = monthname[date.getMonth()];
  270. var date_month = date.getMonth() + 1;
  271. if(date_month < 10){
  272. date_month = "0"+date_month;
  273. }
  274. var date_monthday = date.getDate();
  275. if(date_monthday < 10){
  276. date_monthday = "0"+date_monthday;
  277. }
  278. return date_monthday + " " + month_name + " " + date_year;
  279. }
  280. return day_diff == 0 && (
  281. diff < 60 && "just now" ||
  282. diff < 120 && "1 minute ago" ||
  283. diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
  284. diff < 7200 && "1 hour ago" ||
  285. diff < 86400 && "about " + Math.floor( diff / 3600 ) + " hours ago") ||
  286. day_diff == 1 && "Yesterday" ||
  287. day_diff < 7 && day_diff + " days ago" ||
  288. day_diff < 31 && Math.ceil( day_diff / 7 ) + " week" + ((Math.ceil( day_diff / 7 )) == 1 ? "" : "s") + " ago";
  289. }
  290. // Get the tweets for 'twitter_name'
  291. getTweets(twitter_name);