materio_flag.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  1. // @codekit-prepend "gui.js"
  2. (function($) {
  3. MaterioFlag = function(){
  4. var _isLoadingList = false ;
  5. /**
  6. * init()
  7. */
  8. function init(){
  9. //trace('MaterioFlag :: init MaterioFlag');
  10. buildBlocks();
  11. $(document)
  12. .bind('flagGlobalAfterLinkUpdate', onFlaging)
  13. .bind('resultscompleted resultschanged', onResultsUpdated)
  14. .bind('init-scroller-pager', onInitScrollerPager)
  15. .bind('load-scroller-pager', onLoadScrollerPager)
  16. .bind('view-mode-changed', onViewModeChanged)
  17. .bind('history-state-change', onHistoryStateChange);
  18. ajaxifyLinks();
  19. // trigger updated event for direct html loading
  20. if(isList()){
  21. setTimeout(function(){
  22. triggerContentChanged();
  23. }, 10);
  24. }
  25. };
  26. function onFlaging(event){
  27. //trace('MaterioFlag :: onFlaging', event);
  28. refreshBlocks();
  29. };
  30. function onResultsUpdated(event){
  31. //trace('MaterioFlag :: onResultsUpdated', event);
  32. ajaxifyLinks(event.container);
  33. };
  34. function buildBlocks(activename){
  35. //trace('MaterioFlag :: buildBlocks', activename);
  36. if($('#block-materio-flag-materio-flag-mybookmarks').length){
  37. var type = 'bookmarks';
  38. var block = '#block-materio-flag-materio-flag-mybookmarks';
  39. }else if($('#block-materio-flag-materio-flag-mylists').length){
  40. var type = 'lists';
  41. var block = '#block-materio-flag-materio-flag-mylists';
  42. }
  43. if(type == 'lists'){
  44. // nav block
  45. $('a.open-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists-nav').each(function(index){
  46. $this = $(this)
  47. .bind('click', onClickOpenLink)
  48. .addClass('ajax-processed');
  49. var name = $this.attr('class').match(/flag_lists_[^_]+_[0-9]+/);
  50. // trace('MaterioFlag :: name', name);
  51. $('<span class="preview"><i class="icon-eye-open"></i></span>').attr('name', name).insertAfter($this).bind('click', onClickShowPreview);
  52. });
  53. // preview block
  54. $('section.flag-list:not(.ajax-processed)', '#block-materio-flag-materio-flag-mylists').each(function(index){
  55. var name = $(this).attr('class').match(/flag_lists_[^_]+_[0-9]+/);
  56. $('<i class="icon-remove"></i>').appendTo($('h2.listname', this)).attr('name', name).bind('click', onClickClosePreview);
  57. $('a.open-list', this).bind('click', onClickOpenLink);
  58. }).addClass('ajax-processed');
  59. // trigger refresh block event for enabling lazyload images
  60. setTimeout(function(){
  61. $.event.trigger({
  62. type : 'my'+type+'-block-builded',
  63. block : block,
  64. name : name
  65. });
  66. },10);
  67. }
  68. // trace('MaterioFlag :: activename', activename);
  69. if(activename == undefined)
  70. activename = readCookie('materiomyflaglistsopened');
  71. // trace('MaterioFlag :: activename', activename);
  72. if(activename)
  73. showPreview(activename);
  74. };
  75. function refreshBlocks(name){
  76. //trace('MaterioFlag :: refreshBlocks | name', name);
  77. if($('#block-materio-flag-materio-flag-mybookmarks').length){
  78. var type = 'bookmarks';
  79. }else if($('#block-materio-flag-materio-flag-mylists').length){
  80. var type = 'lists';
  81. }
  82. if(type != undefined){
  83. var id = '#block-materio-flag-materio-flag-my'+type;
  84. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/refresh/block/'+type;
  85. $.getJSON(url, function(json){
  86. //trace('MaterioFlag :: block refreshed '+type, json);
  87. $(id).replaceWith(json.block);
  88. $('#block-materio-flag-materio-flag-mylists-nav').replaceWith(json.block_nav);
  89. buildBlocks(name);
  90. $.event.trigger({
  91. type : 'my'+type+'-block-updated',
  92. listname : name
  93. });
  94. });
  95. }
  96. ajaxifyLinks();
  97. };
  98. function ajaxifyLinks(container){
  99. //trace('MaterioFlag :: ajaxifyLinks', container);
  100. container = ((container != null) ? container : 'body');
  101. // trace('MaterioFlag :: typeof Drupal.flagLink', typeof Drupal.flagLink);
  102. if (typeof Drupal.flagLink != 'undefined')
  103. Drupal.flagLink(container);
  104. $('a.flag-lists-create:not(.ajax-processed)', container)
  105. .bind('click', onClickCreatLink)
  106. .addClass('ajax-processed');
  107. $('a.edit-list:not(.ajax-processed)', container)
  108. .bind('click', onCLickEditList)
  109. .addClass('ajax-processed');
  110. };
  111. /**
  112. * show hide preview
  113. */
  114. function onClickShowPreview(event){
  115. //trace('MaterioFlag :: onClickShowPreview', event);
  116. showPreview($(this).attr('name'));
  117. };
  118. function showPreview(name){
  119. //trace('MaterioFlag :: showPreview', name);
  120. $('section.'+name, '#block-materio-flag-materio-flag-mylists').addClass('active')
  121. .siblings('section').removeClass('active');
  122. createCookie('materiomyflaglistsopened', name, 1);
  123. $.event.trigger('init-layout');
  124. };
  125. function onClickClosePreview(event){
  126. //trace('MaterioFlag :: onClickClosePreview', event);
  127. eraseCookie('materiomyflaglistsopened');
  128. $(this).parents('section.flag-list').removeClass('active');
  129. $.event.trigger('init-layout');
  130. };
  131. /**
  132. * onClickOpenLink
  133. */
  134. function onClickOpenLink(event){
  135. event.preventDefault();
  136. var $link = $(event.currentTarget);
  137. var fid = $link.attr('href').match(/lists\/([0-9]+)$/);
  138. // trace('MaterioFlag :: type', type);
  139. loadList(fid[1]);
  140. return false;
  141. };
  142. function loadList(fid){
  143. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/ajax/list/'+fid;
  144. $.event.trigger('loading-content');
  145. $.getJSON(url, {'current_path':document.location.href},function(json){
  146. //trace('MaterioFlag :: json', json);
  147. if(json.redirect){
  148. window.location = json.redirect;
  149. }else{
  150. changeContent(json);
  151. }
  152. });
  153. };
  154. function changeContent(json){
  155. if(json.return){
  156. $('.inner-content','#content').html(json.return);
  157. $.event.trigger('loaded-content');
  158. // no need of ajaxifylinks because it's triggered with resultschanged
  159. // ajaxifyLinks('#content');
  160. var path = Drupal.settings.basePath + Drupal.settings.pathPrefix + json.path;
  161. $.event.trigger({
  162. type : 'new-history-page',
  163. path : path,
  164. title : json.title,
  165. content : json.return
  166. });
  167. // TODO: change language links for folders
  168. // for (language in Drupal.settings.materio_search_api_ajax.languages) {
  169. // var l = Drupal.settings.materio_search_api_ajax.languages[language];
  170. // $('#block-locale-language li.'+language+' a').attr('href', Drupal.settings.basePath + l.prefix+'/' + json.search_path + '/' + json.keys)
  171. // };
  172. triggerContentChanged();
  173. }else{
  174. //trace('MaterioFlag :: no results');
  175. }
  176. };
  177. function triggerContentChanged(){
  178. $.event.trigger({
  179. type: 'resultschanged',
  180. container : '#content .flaglist-items'
  181. });
  182. };
  183. /**
  184. * onClickCreatLink(event)
  185. */
  186. function onClickCreatLink(event){
  187. event.preventDefault();
  188. var $link = $(event.currentTarget);
  189. var type = $link.attr('href').match(/[^\/]*$/);
  190. // trace('MaterioFlag :: type', type);
  191. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/createlist/form/'+type[0];
  192. $.getJSON(url, function(json){
  193. //trace('MaterioFlag :: creat list : json', json);
  194. showCreateListForm(json, $link);
  195. });
  196. return false;
  197. };
  198. function showCreateListForm(json, $link){
  199. // google analytics
  200. $.event.trigger({
  201. type:"record-stat",
  202. categorie:"flagLists",
  203. action: 'show create form'
  204. });
  205. var $modal = $('<div id="modal" class="modal"/>').appendTo('body');
  206. $modal
  207. .css({
  208. position:'absolute',
  209. top:'40%', left:'50%',
  210. marginLeft:'-150px', width:'300px',
  211. zIndex:"99999"
  212. })
  213. .append(json.return)
  214. .find('input[type="submit"]', '#materio-flag-create-list-form').bind('click', function(event) {
  215. event.preventDefault();
  216. switch($(this).attr('name')){
  217. case 'cancel':
  218. //trace('MaterioFlag :: cancel',event);
  219. $(this).parents('#modal').remove();
  220. // google analytics
  221. $.event.trigger({
  222. type:"record-stat",
  223. categorie:"flagLists",
  224. action: 'cancel create form'
  225. });
  226. break;
  227. case 'create':
  228. //trace('MaterioFlag :: create',event);
  229. var title = $(this).parents('form').find('input[name*="flag-lists-name"]').val();
  230. var type = $(this).parents('form').find('input[name*="type"]').val();
  231. // google analytics
  232. $.event.trigger({
  233. type : "record-stat",
  234. categorie : "flagLists",
  235. action : "submit create form",
  236. label : 'title : '+title
  237. });
  238. createList($modal, type, title, $link);
  239. break;
  240. }
  241. return false;
  242. })
  243. .parents('form').find('input[type="text"]').focus();
  244. // TODO: esc keypressed close the form
  245. };
  246. function createList($modal, type, title, $link){
  247. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'flag-lists/add/'+type+'/js';
  248. $.getJSON(url, {name:title}, function(data) {
  249. if (data.error) {
  250. //trace(data.error);
  251. }
  252. else {
  253. // select.append('<option value="'+data.flag.fid+'">'+data.flag.title+'</option>');
  254. // $('input.name', $(this)).val('');
  255. // dialog.dialog('close');
  256. //trace('MaterioFlag :: created list : data', data);
  257. flagEntityWithList(data.flag.name, $link.attr('nid'), $link.attr('token'));
  258. $modal.remove();
  259. }
  260. });
  261. };
  262. function flagEntityWithList(name, nid, token){
  263. // var ret;
  264. // Send POST request
  265. $.ajax({
  266. type: 'POST',
  267. url: Drupal.settings.basePath+Drupal.settings.pathPrefix+'flag-lists/flag/'+name+'/'+nid,
  268. data: { js: true, token: token },
  269. dataType: 'json',
  270. success: function (data2) {
  271. //trace('MaterioFlag :: node taged with newly created list : data2', data2)
  272. if (data2.status) {
  273. // google analytics
  274. $.event.trigger({
  275. type : "record-stat",
  276. categorie : 'FlagLists',
  277. action : 'node flaged',
  278. label : 'nid : '+nid+' | flag : '+name
  279. });
  280. refreshBlocks(name);
  281. refreshNodeLinks();
  282. }else {
  283. // Failure.
  284. alert(data2.errorMessage);
  285. }
  286. },
  287. error: function (xmlhttp) {
  288. alert('An HTTP error '+ xmlhttp.status +' occurred.\n'+ element.href);
  289. }
  290. });
  291. };
  292. function refreshNodeLinks(){
  293. var nids = new Array();
  294. $('.flag-lists-entity-links').parents('.node').each(function(index) {
  295. nids.push($(this).attr('class').match(/node-([0-9]+)/)[1]);
  296. });
  297. // trace('MaterioFlag :: nids', nids);
  298. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/nodelinks';
  299. $.getJSON(url, {nids:nids.join(";")}, function(data) {
  300. // trace('MaterioFlag :: data', data);
  301. for(nid in data.links){
  302. // trace('MaterioFlag :: nid', nid);
  303. // trace('MaterioFlag :: data.links[nid]', data.links[nid]);
  304. $('.node-'+nid+' .flag-lists-entity-links').replaceWith(data.links[nid]);
  305. // trace('MaterioFlag :: typeof Drupal.flagLink', typeof Drupal.flagLink);
  306. // if (typeof Drupal.flagLink != 'undefined')
  307. // Drupal.flagLink($('.node-'+nid+' .flag-lists-entity-links'));
  308. ajaxifyLinks('.node-'+nid+' .flag-lists-entity-links');
  309. }
  310. });
  311. $.event.trigger({
  312. type : 'materioflag-nodelinks-updated',
  313. nids : nids
  314. });
  315. };
  316. /**
  317. * onCLickEditList(event)
  318. */
  319. function onCLickEditList(event){
  320. // TODO: empécher le double formulaire
  321. event.preventDefault();
  322. var $link = $(event.currentTarget);
  323. var lid = $link.attr('href').match(/[^\/]*$/);
  324. var type = 'materiau'; // this is cheap
  325. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/editlistform/'+type+'/'+lid[0];
  326. $.getJSON(url, function(json){
  327. //trace('MaterioFlag :: editlist : json', json);
  328. showEditListForm(json, $link);
  329. });
  330. return false;
  331. };
  332. function showEditListForm(json, $link){
  333. // google analytics
  334. $.event.trigger({
  335. type:"record-stat",
  336. categorie:"flagLists",
  337. action: 'show edit form'
  338. });
  339. var $modal = $('<div id="modal" class="modal"/>').appendTo('body');
  340. $modal
  341. .css({
  342. position:'absolute',
  343. top:'40%', left:'50%',
  344. marginLeft:'-150px', width:'300px',
  345. zIndex:"99999"
  346. })
  347. .append(json.return)
  348. .find('input[type="submit"]', '#materio-flag-edit-list-form').bind('click', function(event) {
  349. event.preventDefault();
  350. var $form = $(this).parents('form');
  351. var title = $form.find('input[name*="flag-lists-title"]').val();
  352. var fid = $form.find('input[name*="fid"]').val();
  353. var name = $form.find('input[name*="name"]').val();
  354. switch($(this).attr('name')){
  355. case 'cancel':
  356. //trace('MaterioFlag :: cancel',event);
  357. $(this).parents('#modal').remove();
  358. // google analytics
  359. var action = 'cancel edit form';
  360. break;
  361. case 'save':
  362. //trace('MaterioFlag :: create',event);
  363. // google analytics
  364. var action = "submit edit form";
  365. editList($modal, fid, name, title);
  366. break;
  367. case 'delete':
  368. //trace('MaterioFlag :: delete',event);
  369. if(confirm('Do you realy want to delete the folder '+title+'?')){
  370. var action = "submit delete form";
  371. deleteList($modal, fid);
  372. }else{
  373. var action = "cancel delete form";
  374. }
  375. break;
  376. }
  377. // google analytics
  378. $.event.trigger({
  379. type:"record-stat",
  380. categorie:"flagLists",
  381. action: action
  382. });
  383. return false;
  384. })
  385. .parents('form').find('input[type="text"]').focus();
  386. // TODO: esc keypressed close the form
  387. };
  388. function editList($modal, fid, name, title){
  389. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/editlist/'+fid+'/'+name+'/'+title;
  390. $.getJSON(url, function(data) {
  391. if (data.error) {
  392. // trace(data.error);
  393. if(data.message)
  394. alert(data.message);
  395. }
  396. else {
  397. //trace('MaterioFlag :: saved list : data', data);
  398. $.event.trigger({
  399. type : 'list-edited',
  400. name : data.listname,
  401. title : data.title,
  402. });
  403. refreshBlocks();
  404. refreshNodeLinks();
  405. $modal.remove();
  406. }
  407. });
  408. };
  409. function deleteList($modal, fid){
  410. // prompt('are you sure ?');
  411. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/deletelist/'+fid;
  412. $.getJSON(url, function(data) {
  413. if (data.error) {
  414. // trace(data.error);
  415. if(data.message)
  416. alert(data.message);
  417. }
  418. else {
  419. //trace('MaterioFlag :: deleted list : data', data);
  420. refreshBlocks();
  421. refreshNodeLinks();
  422. // TODO: if the deleted list was the current displayed list ??
  423. $modal.remove();
  424. }
  425. });
  426. }
  427. /**
  428. *
  429. */
  430. function onInitScrollerPager(event){
  431. // trace('MaterioFlag :: MaterioFlag :: onInitScrollerPager');
  432. if (isList()){
  433. // trace('MaterioFlag :: event.pager', event);
  434. event.pager.hide();
  435. }
  436. };
  437. function onLoadScrollerPager(event){
  438. if (isList())
  439. loadNextListPage(event.href);
  440. };
  441. function loadNextListPage(href){
  442. // trace('MaterioFlag :: loadNextListPage', href);
  443. if(!_isLoadingList){
  444. var fid = href.match(/lists\/([^\/|\?]+)/);
  445. var page = href.match(/\?page=([0-9]+)/);
  446. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materioflag/ajax/list/'+fid[1]+'/'+page[1];
  447. // trace('MaterioFlag :: url', url);
  448. loadNextPage(url, $('.materio-flags-list', '#content'), '.flaglist-items');
  449. }
  450. };
  451. function loadNextPage(url, $container, target){
  452. //trace('MaterioFlag :: loadNextPage');
  453. _isLoadingList = true;
  454. $container.addClass('loading');
  455. $.getJSON(url, function(json){
  456. //trace('json', json);
  457. _isLoadingList = false;
  458. $container.removeClass('loading');
  459. addNextpage(json, target);
  460. });
  461. };
  462. function addNextpage(json, container_class){
  463. var $newcontent = $(json.return),
  464. $newitems = $(container_class, $newcontent).children('article').addClass('just-added'),
  465. $newpager = $('ul.pager', $newcontent);
  466. $(container_class, '#content').append($newitems);
  467. $('ul.pager', '#content').replaceWith($newpager.hide());
  468. // TODO: animation, this should be on theme side
  469. $(container_class, '#content').children('.just-added').each(function(i){
  470. // $(this).delay(5000*i).removeClass('just-added');
  471. var $this = $(this);
  472. setTimeout(function(){
  473. $this.removeClass('just-added');
  474. }, 150*i);
  475. });
  476. $.event.trigger({
  477. type : 'resultscompleted',
  478. container : $(container_class, '#content')
  479. });
  480. };
  481. function onViewModeChanged(event){
  482. if (isList())
  483. loadList(getFid());
  484. };
  485. /**
  486. * history
  487. */
  488. function onHistoryStateChange(event){
  489. if(isList())
  490. triggerContentChanged();
  491. };
  492. /**
  493. * Helpers
  494. */
  495. function getFid(){
  496. return $('.materio-flags-list', '#content').attr('fid');;
  497. };
  498. function isList(){
  499. return $('.materio-flags-list', '#content').length;
  500. };
  501. /**
  502. * cookies
  503. */
  504. function createCookie(name,value,days) {
  505. if (days) {
  506. var date = new Date();
  507. date.setTime(date.getTime()+(days*24*60*60*1000));
  508. var expires = "; expires="+date.toGMTString();
  509. }
  510. else var expires = "";
  511. document.cookie = name+"="+value+expires+"; path=/";
  512. }
  513. function readCookie(name) {
  514. var nameEQ = name + "=";
  515. var ca = document.cookie.split(';');
  516. for(var i=0;i < ca.length;i++) {
  517. var c = ca[i];
  518. while (c.charAt(0)==' ') c = c.substring(1,c.length);
  519. if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  520. }
  521. return null;
  522. }
  523. function eraseCookie(name) {
  524. createCookie(name,"",-1);
  525. }
  526. init();
  527. };
  528. var materioflag = new MaterioFlag();
  529. })(jQuery);