materio_search_api_ajax.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. // @codekit-prepend "gui.js"
  2. // @koala-prepend "gui.js"
  3. (function($) {
  4. MaterioSearchApiAjax = function(){
  5. var _isloadingresults = false;
  6. var _$content = $('#content');
  7. // TODO: define $content by module settings
  8. /**
  9. * init()
  10. */
  11. function init(){
  12. //trace('init MaterioSearchApiAjax');
  13. initSearchAjax();
  14. initViewMode();
  15. };
  16. /**
  17. * searchAjax
  18. */
  19. function initSearchAjax(){
  20. // trace('initSearchAjax');
  21. $('#materio-search-api-search-form').bind('submit', function(event) {
  22. // trace('search submited', event);
  23. // var $this = $(this);
  24. setTimeout(function(){
  25. loadResults(getSearchKeys());
  26. },10);
  27. return false;
  28. });
  29. // /!\ AUTOCOMPLETE SELECT EVENT need a patch http://drupal.org/node/365241#comment-5374686
  30. $("#edit-searchfield")
  31. .bind('autocompleteSelect', function(event) {
  32. $(this).parents('.form').trigger('submit');
  33. })
  34. .bind('focus', function(event){
  35. $(this).select();
  36. });
  37. $(document)
  38. .bind('theme-ready', onThemeReady)
  39. .bind('init-scroller-pager', onInitScrollerPager)
  40. .bind('load-scroller-pager', onLoadScrollerPager)
  41. .bind('view-mode-changed', onViewModeChanged)
  42. .bind('history-state-change', onHistoryStateChange);
  43. };
  44. function onThemeReady(event){
  45. // trace('MaterioSearchApiAjax :: onThemeReady');
  46. if( isActuality() || isExplore() ){
  47. $.event.trigger({
  48. type : 'resultschanged',
  49. container : isActuality() ? '#content .actuality-items' : '#content .search-results'
  50. });
  51. }
  52. };
  53. function getSearchKeys(){
  54. return $('#materio-search-api-search-form').find('input[name*="searchfield"]').val();
  55. };
  56. function loadResults(keys){
  57. trace('keys', keys);
  58. if(keys !== undefined && keys !== '' && keys.length >= 2){
  59. keys = keys.replace('/', ' ');
  60. var types = {}, stringTypes = [];
  61. $('#edit-bundles-filter', '#materio-search-api-search-form').find('input[type*="checkbox"]').each(function(i){
  62. $this = $(this);
  63. if ( $this.attr('checked') )
  64. stringTypes.push($this.val());
  65. types[$this.val()] = $this.attr('checked');
  66. });
  67. //trace('types', types);
  68. if(!_isloadingresults){
  69. $.event.trigger('loading-content');
  70. _isloadingresults = true;
  71. $('#materio-search-api-search-form').addClass('loading');
  72. // trace('window.location.href',window.location.href);
  73. // TODO: record ajax path in a variable from materio_search_api_ajax_init
  74. $.getJSON(Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/search/',
  75. {'types':types,'current_path':document.location.href, keys:keys},
  76. function(json){
  77. //trace('json', json);
  78. // google analytics
  79. $.event.trigger({
  80. type : "record-stat",
  81. categorie : 'Search',
  82. action : keys,
  83. label : 'filters : '+ stringTypes.join(' ,'),
  84. value : json.count
  85. });
  86. if(json.redirect){
  87. window.location = json.redirect;
  88. }else{
  89. $.event.trigger('loaded-content');
  90. _isloadingresults = false;
  91. $('#materio-search-api-search-form').removeClass('loading');
  92. changeContent(json);
  93. }
  94. });
  95. }
  96. }
  97. };
  98. function loadActuality(){
  99. if(!_isloadingresults){
  100. $.event.trigger('loading-content');
  101. _isloadingresults = true;
  102. $('#materio-search-api-search-form').addClass('loading');
  103. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/actuality';
  104. $.getJSON(url,
  105. function(json){
  106. //trace('json', json);
  107. $.event.trigger('loaded-content');
  108. _isloadingresults = false;
  109. $('#materio-search-api-search-form').removeClass('loading');
  110. changeContent(json);
  111. });
  112. }
  113. };
  114. function changeContent(json){
  115. trace('MaterioSearchApiAjax changeContent | json', json);
  116. if(json.return){
  117. $.event.trigger('loaded-content');
  118. $('.inner-content',_$content).html(json.return).find('ul.pager').hide();
  119. triggerContentChanged();
  120. }else{
  121. //trace('no results');
  122. }
  123. $.event.trigger({
  124. type : 'new-history-page',
  125. path : Drupal.settings.basePath + Drupal.settings.pathPrefix + json.path,
  126. title : json.title,
  127. content : json.return
  128. });
  129. for (language in Drupal.settings.materio_search_api_ajax.languages) {
  130. var l = Drupal.settings.materio_search_api_ajax.languages[language];
  131. $('#block-locale-language li.'+language+' a').attr('href', Drupal.settings.basePath + l.prefix+'/' + json.search_path + '/' + json.keys)
  132. };
  133. };
  134. function triggerContentChanged(){
  135. //trace('MaterioSearchApiAjax :: triggerContentChanged');
  136. $.event.trigger({
  137. type : 'resultschanged',
  138. container : '#content .search-results, #content .actuality-items'
  139. });
  140. };
  141. function onInitScrollerPager(event){
  142. if(isActuality() || isExplore())
  143. event.pager.hide();
  144. };
  145. function onLoadScrollerPager(event){
  146. if(!_isloadingresults){
  147. if (isExplore())
  148. loadNextResultsPage(event.href);
  149. if(isActuality())
  150. loadNextActualityPage(event.href);
  151. }
  152. };
  153. function loadNextResultsPage(href){
  154. // trace('loadNextResultsPage');
  155. var keys = href.match(/explore\/([^\/|\?]+)/);
  156. var page = href.match(/\?page=([0-9]+)/);
  157. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/search/'+page[1];
  158. loadNextPage(url, keys[1], $('.materiobase-results', _$content), '.search-results');
  159. };
  160. function loadNextActualityPage(href){
  161. // trace('loadNextActualityPage');
  162. var page = href.match(/\?page=([0-9]+)/);
  163. var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/actuality/'+page[1];
  164. loadNextPage(url, '', $('.materiobase-actuality', _$content), '.actuality-items');
  165. };
  166. function loadNextPage(url, keys, $container, target){
  167. //trace('MaterioSearchApiAjax :: loadNextPage()');
  168. _isloadingresults = true;
  169. $container.addClass('loading');
  170. $.getJSON(url, {'keys':keys}, function(json){
  171. //trace('json', json);
  172. $container.removeClass('loading');
  173. addNextpage(json, target);
  174. // addNextpageItemByItem($(json.return), target);
  175. });
  176. };
  177. function addNextpage(json, container_class){
  178. // trace('json',json);
  179. if(json){
  180. var $newcontent = $(json.return),
  181. $newitems = $(container_class, $newcontent).children('article'), //.addClass('just-added'),
  182. $newpager = $('ul.pager', $newcontent);
  183. $(container_class, _$content).append($newitems);
  184. $('ul.pager', _$content).replaceWith($newpager.hide());
  185. // TODO: animation, this should be on theme side
  186. $(container_class, _$content).children('.just-added').each(function(i){
  187. var $this = $(this);
  188. setTimeout(function(){
  189. $this.removeClass('just-added');
  190. }, 150*i);
  191. });
  192. $.event.trigger({
  193. type : 'resultscompleted',
  194. container : $(container_class, _$content)
  195. });
  196. }
  197. _isloadingresults = false;
  198. };
  199. // TEST not used
  200. function addNextpageItemByItem($newcontent, container_class){
  201. //trace('MaterioSearchApiAjax :: addNextpageItemByItem()');
  202. $('ul.pager', _$content).remove();
  203. $(container_class, _$content).append($(container_class, $newcontent).children('article').eq(0));
  204. if($(container_class, $newcontent).children('article').length){
  205. setTimeout(function(){
  206. addNextpageItemByItem($newcontent, container_class);
  207. }, 200);
  208. }else{
  209. _isloadingresults = false;
  210. $('ul.pager', _$content).replaceWith($('ul.pager', $newcontent).hide());
  211. $.event.trigger({
  212. type : 'resultscompleted',
  213. container : $(container_class, _$content)
  214. });
  215. }
  216. };
  217. /**
  218. * viewmode
  219. */
  220. function initViewMode(){
  221. $('.viewmode-link').click(function(event){
  222. event.preventDefault();
  223. if(!$(this).is('.active')){
  224. $(this).trigger({type:'vm-clicked'});
  225. changeViewMode($(this).attr('rel'), $(this));
  226. }else{
  227. $(this).trigger({type:'vm-clicked-active'});
  228. }
  229. return false;
  230. });
  231. };
  232. function changeViewMode(vm, $btn){
  233. if(!_isloadingresults){
  234. _isloadingresults = true;
  235. $.getJSON(Drupal.settings.basePath+'materio_search_api_ajax/viewmode/change/'+vm, function(json){
  236. //trace('viewmode json', json);
  237. _isloadingresults = false;
  238. if (json.statut == "saved"){
  239. // google analytics
  240. $.event.trigger({
  241. type : "record-stat",
  242. categorie : 'Viewmode',
  243. action : vm,
  244. label : isActuality() ? 'Actualities' : 'Search results'
  245. });
  246. $.event.trigger('view-mode-changed');
  247. $('.viewmode-link, .viewmode-link i').removeClass('active');
  248. $btn.addClass('active').find('i').addClass('active');
  249. }
  250. });
  251. }
  252. };
  253. function onViewModeChanged(event){
  254. if (isExplore())
  255. loadResults(getSearchKeys());
  256. if(isActuality())
  257. loadActuality();
  258. };
  259. /**
  260. * history
  261. */
  262. function onHistoryStateChange(event){
  263. if(isExplore() || isActuality())
  264. triggerContentChanged();
  265. // TODO: pushstate trogger state change, so we have a retriggerring here on loading new results … how to avoid this
  266. };
  267. /**
  268. * helpers
  269. */
  270. function isExplore(){
  271. return $('.search-results', '#content').length;
  272. };
  273. function isActuality(){
  274. return $('.actuality-items', '#content').length;
  275. };
  276. init();
  277. };
  278. $(document).ready(function() {
  279. var materiosearchapiajax = new MaterioSearchApiAjax();
  280. });
  281. })(jQuery);