materio_flag.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. // @codekit-prepend "gui.js"
  2. (function($) {
  3. MaterioFlag = function(){
  4. var _isLoadingList = false ;
  5. /**
  6. * init()
  7. */
  8. function init(){
  9. trace('init MaterioFlag');
  10. $(document)
  11. .bind('flagGlobalAfterLinkUpdate', onFlaging)
  12. .bind('resultscompleted resultschanged', onResultsUpdated)
  13. .bind('init-scroller-pager', onInitScrollerPager)
  14. .bind('load-scroller-pager', onLoadScrollerPager)
  15. .bind('view-mode-changed', onViewModeChanged)
  16. .bind('history-state-change', onHistoryStateChange);
  17. ajaxifyLinks();
  18. // trigger updated event for direct html loading
  19. if(isList()){
  20. setTimeout(function(){
  21. triggerContentChanged();
  22. }, 10);
  23. }
  24. };
  25. function onFlaging(event){
  26. trace('onFlaging', event);
  27. refreshBlocks();
  28. };
  29. function refreshBlocks(name){
  30. trace('refreshBlocks | name', name);
  31. if($('#block-materio-flag-materio-flag-mybookmarks').length){
  32. var type = 'bookmarks';
  33. }else if($('#block-materio-flag-materio-flag-mylists').length){
  34. var type = 'lists';
  35. }
  36. if(type != undefined){
  37. var id = '#block-materio-flag-materio-flag-my'+type;
  38. $.getJSON(Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/refresh/block/'+type, function(json){
  39. trace('block refreshed '+type, json);
  40. $(id).replaceWith(json.block);
  41. var event = jQuery.Event('my'+type+'-block-updated');
  42. event.listname = name;
  43. $.event.trigger(event);
  44. });
  45. }
  46. ajaxifyLinks();
  47. };
  48. function onResultsUpdated(event){
  49. trace('MaterioFlag :: onResultsUpdated', event);
  50. ajaxifyLinks(event.container);
  51. };
  52. function ajaxifyLinks(container){
  53. trace('ajaxifyLinks', container);
  54. container = ((container != null) ? container : 'body');
  55. // trace('typeof Drupal.flagLink', typeof Drupal.flagLink);
  56. if (typeof Drupal.flagLink != 'undefined')
  57. Drupal.flagLink(container);
  58. $('a.flag-lists-create:not(.ajax-processed)', container)
  59. .bind('click', onClickCreatLink)
  60. .addClass('ajax-processed');
  61. $('a.open-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists')
  62. .bind('click', onClickOpenLink)
  63. .addClass('ajax-processed');
  64. };
  65. function onClickOpenLink(event){
  66. event.preventDefault();
  67. var $link = $(event.currentTarget);
  68. var fid = $link.attr('href').match(/lists\/([0-9]+)$/);
  69. // trace('type', type);
  70. loadList(fid[1]);
  71. return false;
  72. };
  73. function loadList(fid){
  74. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/ajax/list/'+fid;
  75. $.event.trigger('loading-content');
  76. $.getJSON(url, function(json){
  77. trace('json', json);
  78. changeContent(json);
  79. });
  80. };
  81. function changeContent(json){
  82. if(json.return){
  83. $('.inner-content','#content').html(json.return);
  84. $.event.trigger('loaded-content');
  85. // no need of ajaxifylinks because it's triggered with resultschanged
  86. // ajaxifyLinks('#content');
  87. var path = Drupal.settings.basePath + Drupal.settings.pathPrefix + json.path;
  88. var event = jQuery.Event('new-history-page');
  89. event.path = path;
  90. event.title = json.title;
  91. event.content = json.return;
  92. $.event.trigger(event);
  93. // TODO: change language links for folders
  94. // for (language in Drupal.settings.materio_search_api_ajax.languages) {
  95. // var l = Drupal.settings.materio_search_api_ajax.languages[language];
  96. // $('#block-locale-language li.'+language+' a').attr('href', Drupal.settings.basePath + l.prefix+'/' + json.search_path + '/' + json.keys)
  97. // };
  98. triggerContentChanged();
  99. }else{
  100. trace('no results');
  101. }
  102. };
  103. function triggerContentChanged(){
  104. var event = jQuery.Event('resultschanged');
  105. event.container = '#content .flaglist-items';
  106. $.event.trigger(event);
  107. };
  108. function onClickCreatLink(event){
  109. event.preventDefault();
  110. var $link = $(event.currentTarget);
  111. var type = $link.attr('href').match(/[^\/]*$/);
  112. // trace('type', type);
  113. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/createlist/form/'+type[0];
  114. $.getJSON(url, function(json){
  115. trace('json', json);
  116. showCreateListForm(json, $link);
  117. });
  118. return false;
  119. };
  120. function showCreateListForm(json, $link){
  121. // google analytics
  122. var estat = jQuery.Event('record-stat');
  123. estat.path = false;
  124. estat.categorie = 'FlagLists';
  125. estat.action = 'show create form';
  126. estat.label = '';
  127. $.event.trigger(estat);
  128. var $modal = $('<div id="modal" class="modal"/>').appendTo('body');
  129. $modal
  130. .css({
  131. position:'absolute',
  132. top:'40%', left:'50%',
  133. marginLeft:'-150px', width:'300px',
  134. zIndex:"99999"
  135. })
  136. .append(json.return)
  137. .find('input[type="submit"]', '#materio-flag-create-list-form').bind('click', function(event) {
  138. event.preventDefault();
  139. switch($(this).attr('name')){
  140. case 'cancel':
  141. trace('cancel',event);
  142. $(this).parents('#modal').remove();
  143. // google analytics
  144. var estat = jQuery.Event('record-stat');
  145. estat.path = false;
  146. estat.categorie = 'FlagLists';
  147. estat.action = 'cancel create form';
  148. estat.label = '';
  149. $.event.trigger(estat);
  150. break;
  151. case 'create':
  152. trace('create',event);
  153. var title = $(this).parents('form').find('input[name*="flag-lists-name"]').val();
  154. var type = $(this).parents('form').find('input[name*="type"]').val();
  155. // google analytics
  156. var estat = jQuery.Event('record-stat');
  157. estat.path = false;
  158. estat.categorie = 'FlagLists';
  159. estat.action = 'submit create form';
  160. estat.label = 'title : '+title;
  161. $.event.trigger(estat);
  162. createList($modal, type, title, $link);
  163. break;
  164. }
  165. return false;
  166. })
  167. .parents('form').find('input[type="text"]').focus();
  168. };
  169. function createList($modal, type, title, $link){
  170. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'flag-lists/add/'+type+'/js';
  171. $.getJSON(url, {name:title}, function(data) {
  172. if (data.error) {
  173. trace(data.error);
  174. }
  175. else {
  176. // select.append('<option value="'+data.flag.fid+'">'+data.flag.title+'</option>');
  177. // $('input.name', $(this)).val('');
  178. // dialog.dialog('close');
  179. trace('created list : data', data);
  180. flagEntityWithList(data.flag.name, $link.attr('nid'), $link.attr('token'));
  181. $modal.remove();
  182. }
  183. });
  184. };
  185. function flagEntityWithList(name, nid, token){
  186. // var ret;
  187. // Send POST request
  188. $.ajax({
  189. type: 'POST',
  190. url: Drupal.settings.basePath+Drupal.settings.pathPrefix+'flag-lists/flag/'+name+'/'+nid,
  191. data: { js: true, token: token },
  192. dataType: 'json',
  193. success: function (data2) {
  194. trace('node taged with newly created list : data2', data2)
  195. if (data2.status) {
  196. // google analytics
  197. var estat = jQuery.Event('record-stat');
  198. estat.path = false;
  199. estat.categorie = 'FlagLists';
  200. estat.action = 'node flaged';
  201. estat.label = 'nid : '+nid+' | flag : '+name;
  202. $.event.trigger(estat);
  203. refreshBlocks(name);
  204. refreshNodeLinks();
  205. }else {
  206. // Failure.
  207. alert(data2.errorMessage);
  208. }
  209. },
  210. error: function (xmlhttp) {
  211. alert('An HTTP error '+ xmlhttp.status +' occurred.\n'+ element.href);
  212. }
  213. });
  214. };
  215. function refreshNodeLinks(){
  216. var nids = new Array();
  217. $('.flag-lists-entity-links').parents('.node').each(function(index) {
  218. nids.push($(this).attr('class').match(/node-([0-9]+)/)[1]);
  219. });
  220. // trace('nids', nids);
  221. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/nodelinks';
  222. $.getJSON(url, {nids:nids.join(";")}, function(data) {
  223. // trace('data', data);
  224. for(nid in data.links){
  225. // trace('nid', nid);
  226. // trace('data.links[nid]', data.links[nid]);
  227. $('.node-'+nid+' .flag-lists-entity-links').parent('.item-list').replaceWith(data.links[nid]);
  228. // trace('typeof Drupal.flagLink', typeof Drupal.flagLink);
  229. // if (typeof Drupal.flagLink != 'undefined')
  230. // Drupal.flagLink($('.node-'+nid+' .flag-lists-entity-links'));
  231. ajaxifyLinks('.node-'+nid+' .flag-lists-entity-links');
  232. }
  233. });
  234. var event = jQuery.Event('materioflag-nodelinks-updated');
  235. event.nids = nids;
  236. $.event.trigger(event);
  237. };
  238. function onInitScrollerPager(event){
  239. // trace('MaterioFlag :: onInitScrollerPager');
  240. if (isList()){
  241. // trace('event.pager', event);
  242. event.pager.hide();
  243. }
  244. };
  245. function onLoadScrollerPager(event){
  246. if (isList())
  247. loadNextListPage(event.href);
  248. };
  249. function loadNextListPage(href){
  250. // trace('loadNextListPage', href);
  251. if(!_isLoadingList){
  252. var fid = href.match(/lists\/([^\/|\?]+)/);
  253. var page = href.match(/\?page=([0-9]+)/);
  254. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/ajax/list/'+fid[1]+'/'+page[1];
  255. // trace('url', url);
  256. loadNextPage(url, $('.materio-flags-list', '#content'), '.flaglist-items');
  257. }
  258. };
  259. function loadNextPage(url, $container, target){
  260. trace('loadNextPage');
  261. _isLoadingList = true;
  262. $container.addClass('loading');
  263. $.getJSON(url, function(json){
  264. trace('json', json);
  265. _isLoadingList = false;
  266. $container.removeClass('loading');
  267. addNextpage(json, target);
  268. });
  269. };
  270. function addNextpage(json, container_class){
  271. var $newcontent = $(json.return),
  272. $newitems = $(container_class, $newcontent).children('article').addClass('just-added'),
  273. $newpager = $('ul.pager', $newcontent);
  274. $(container_class, '#content').append($newitems);
  275. $('ul.pager', '#content').replaceWith($newpager.hide());
  276. // TODO: animation, this should be on theme side
  277. $(container_class, '#content').children('.just-added').each(function(i){
  278. // $(this).delay(5000*i).removeClass('just-added');
  279. var $this = $(this);
  280. setTimeout(function(){
  281. $this.removeClass('just-added');
  282. }, 150*i);
  283. });
  284. var event = jQuery.Event('resultscompleted');
  285. event.container = $(container_class, '#content');
  286. $.event.trigger(event);
  287. };
  288. function onViewModeChanged(event){
  289. if (isList())
  290. loadList(getFid());
  291. };
  292. /**
  293. * history
  294. */
  295. function onHistoryStateChange(event){
  296. if(isList())
  297. triggerContentChanged();
  298. };
  299. /**
  300. * Helpers
  301. */
  302. function getFid(){
  303. return $('.materio-flags-list', '#content').attr('fid');;
  304. };
  305. function isList(){
  306. return $('.materio-flags-list', '#content').length;
  307. };
  308. init();
  309. };
  310. var materioflag = new MaterioFlag();
  311. })(jQuery);