Source: Clickbox.js

  1. require ('./iView.js');
  2. /**
  3. * @param {Telll} t the telll object
  4. * @author Monsenhor filipo at kobkob.org
  5. * Clickbox --> init -> loadPhotolinks -> telll.getPhotolinksOfUser -> tws.readUserPhotolinks
  6. * @constructor
  7. */
  8. function Clickbox(t){
  9. this.t = t;
  10. this._init(t);
  11. }
  12. Clickbox.prototype = Object.create(iView.prototype);
  13. /**
  14. * @param t {}
  15. * @return bool
  16. */
  17. Clickbox.prototype._init = function(t){
  18. if (!this.t.credentials.authKey){ throw("No authKey ... hmmm, aborting!"); }
  19. //this.verifyCWS(); // to have compatibility
  20. this.date = this.Date(0);
  21. // default pick photolinks from one week ago
  22. this.beginDate = this.Date(-7);
  23. var me = this;
  24. this.loadPhotolinks(this.beginDate, function(ps){
  25. me.photolinks = ps;
  26. me.state = "loaded";
  27. me.emit("loaded", me);
  28. t.store.clickbox = ps;
  29. me._showWidget(t.store);
  30. });
  31. me.state = "init";
  32. me.emit ("init");
  33. me.createPhotolink();
  34. return null;
  35. }
  36. /**
  37. * @param data {}
  38. * @return bool
  39. */
  40. Clickbox.prototype.verifyCWS = function(){
  41. // to be done ... ;)
  42. };
  43. /**
  44. * @param data {}
  45. * @return bool
  46. */
  47. Clickbox.prototype._showWidget = function(data){
  48. var tmpl = require('./templates/clickbox.mtjs');
  49. var html = Mustache.render(tmpl.html, data);
  50. if (tmpl.css)
  51. $('<style id="clickbox-css">'+tmpl.css+'</style>').appendTo('head');
  52. $(html).appendTo('body');
  53. var telll = this.t;
  54. var me = this;
  55. $(".telll-clickbox-widget .close").on( "click", function( e, data ) {
  56. me.detach();
  57. });
  58. // The popup
  59. $('<div id="popup-clickbox" class="popup"><div class="top-line rgb-bg" style="z-index: 9;"></div></div>').appendTo('body');
  60. $("#clickbox-widget").appendTo('#popup-clickbox').fadeIn();
  61. $('#popup-clickbox').css('z-index','999');
  62. $('html').addClass('overlay');
  63. this.state = "show";
  64. me.emit("show", me);
  65. return true;
  66. };
  67. /**
  68. * @return null
  69. */
  70. Clickbox.prototype.createPhotolink = function(){
  71. var me = this;
  72. me.t.getPhotolink( function(e,got){
  73. if (e) throw (e)
  74. else {
  75. // TODO: deprecate photolinkbb param
  76. if (got.photolinkbb){
  77. got.photolink = got.photolinkbb; // compatibility with demo
  78. }
  79. var rData = unescape(got.extra_data);
  80. try {
  81. var got = JSON.parse(rData); } catch(e){
  82. throw(e)}
  83. me.state = "got";
  84. me.emit ("got", got);
  85. me.updatePhotolinksList(got);
  86. me.showPhotolinkImage(got);
  87. }
  88. });
  89. me.state = "created";
  90. me.emit ("created");
  91. };
  92. /**
  93. */
  94. Clickbox.prototype.showPhotolinkImage = function (got){
  95. var me = this;
  96. var myPl = got;
  97. // TODO hmmm ... it looks bad ... we need an image size manager
  98. try {
  99. var img = got.thumb.replace('_180x90','');
  100. } catch (err) {
  101. var img = "/img/transp.png";
  102. }
  103. $('<div id="photolink-image"><img class="main"/></div>').appendTo("body");
  104. $('#photolink-image img.main').attr('src', img);
  105. $('#photolink-image img.main').css({'width':'100%'});
  106. $('#photolink-image a').attr('href', myPl.link);
  107. $('#photolink-image a').attr('target', '_blank');
  108. $('#photolink-image').fadeIn();
  109. setTimeout(function(){
  110. $('#photolink-image').fadeOut("slow", function (){$('#photolink-image').detach()});
  111. }, 4000);
  112. me.state = "image";
  113. me.emit ("image",got);
  114. };
  115. /**
  116. *
  117. * @see Telll.store.clickbox
  118. */
  119. Clickbox.prototype.updatePhotolinksList = function (got) {
  120. var me = this;
  121. var myList ="";
  122. this.t.store.clickbox.push(got);
  123. var devicePhotolinks = this.t.store.clickbox;
  124. this.emit("got", got);
  125. $('#clickbox-empty').detach();
  126. $('#clickbox *').detach();
  127. $('#clickbox').height($(window).height()-40);
  128. for(var i=0; i<devicePhotolinks.length;i++){
  129. if (! devicePhotolinks[i] || devicePhotolinks[i].photolink === undefined){
  130. throw("Error: clickbox has a bad photolinks list ...");
  131. return false
  132. }
  133. else {
  134. var $element = $('<div class="photolink-list-element"></div>');
  135. var $controlsFrm = $('<div class="ple-controls-frame"></div>');
  136. var $shareBtn = $('<div class="share telll-control"></div>');
  137. var $favBlueBtn = $('<div class="favorite-blue telll-control"></div>');
  138. var $buyBtn = $('<div class="buy telll-control"></div>');
  139. var myPl = devicePhotolinks[i];
  140. var $content = $('<a target="_blank" href="'+myPl.link+'"><div class="ple-img"><img src="'+myPl.thumb+'"></div><div class="ple-info"><span class="ple-title">'+myPl.title+'</span><span class="ple-desc">'+myPl.description+'</span><span class="ple-desc">'+myPl.imdbPlot+'</span></a>');
  141. $element.append(
  142. $content,
  143. $controlsFrm.append($shareBtn, $favBlueBtn, $buyBtn)
  144. );
  145. // Special share feed
  146. $shareBtn.on ("click", function(){
  147. FB.ui({
  148. method: 'feed',
  149. picture: myPl.thumb,
  150. link: 'http://webapp.telll.me/cgi-bin/photolink.pl?id='+myPl.id,
  151. caption: myPl.title,
  152. }, function(response){
  153. if (response) telllDialog("Thanks to share on Facebook!",3000);
  154. });
  155. });
  156. $buyBtn.on ("click", function(){
  157. window.open(myPl.link,'_blank');
  158. });
  159. $favBlueBtn.on ("click", function(){
  160. window.open("http://webapp.telll.me/cgi-bin/photolink.pl?id="+myPl.id,'_blank');
  161. });
  162. $('#clickbox').append($element);
  163. }
  164. }
  165. me.state = "list";
  166. me.emit ("list",got);
  167. };
  168. /**
  169. * @return null
  170. */
  171. Clickbox.prototype.detach = function(){
  172. $('.telll-clickbox-widget').detach();
  173. $('#popup-clickbox').detach();
  174. this.state = "detached";
  175. this.emit("detached");
  176. };
  177. /**
  178. * @return null
  179. */
  180. Clickbox.prototype.attach = function(){
  181. this._showWidget(this.t.store);
  182. };
  183. /**
  184. * Return actual date plus offset
  185. * @param offset {int} number off days
  186. * @return {string} the time in the format YYY-MM-DD hh:mm:ss
  187. * it must be escaped to work in tws
  188. */
  189. Clickbox.prototype.Date = function(offset){
  190. var n = new Date();
  191. var m = new Date(n.getTime() + offset * 24 * 60 * 60 * 1000);
  192. var dateString =
  193. m.getUTCFullYear() +"-"+
  194. ("0" + (m.getUTCMonth()+1)).slice(-2) +"-"+
  195. ("0" + m.getUTCDate()).slice(-2) + " " +
  196. ("0" + m.getUTCHours()).slice(-2) + ":" +
  197. ("0" + m.getUTCMinutes()).slice(-2) + ":" +
  198. ("0" + m.getUTCSeconds()).slice(-2);
  199. return dateString;
  200. };
  201. /**
  202. * @param date {String} the date from
  203. * @param cb {Function} callback
  204. * @return null
  205. * the list of photolinks sent to this user since date
  206. */
  207. Clickbox.prototype.loadPhotolinks = function(date, cb){
  208. var me = this;
  209. // read cookies
  210. var deleted = this.t.getCookie("deleted");
  211. this.deleted = deleted || this.deleted || [];
  212. // read user data
  213. me.t.getPhotolinksOfUser(null, escape(date), function(list){
  214. if (!list.length) {
  215. // TODO what can we do here? :P
  216. list = [];
  217. }
  218. if (cb){ cb(list) }
  219. else{
  220. throw("Fatal error: Clickbox.loadPhotolinks needs a callback, please.")}
  221. });
  222. };
  223. module.exports = {Clickbox:Clickbox};