// @codekit-prepend "gui.js" (function($) { MaterioSearchApiAjax = function(){ var _History = window.History, _isloadingresults = false; _$content = $('#content'); // TODO: define $content by module settings /** * init() */ function init(){ trace('init module'); initSearchAjax(); initHistoryNav(); initViewMode(); }; /** * searchAjax */ function initSearchAjax(){ // trace('initSearchAjax'); // $('#edit-searchfield').focus(); $('#materio-search-api-search-form').bind('submit', function(event) { // trace('search submited', event); var $this = $(this); setTimeout(function(){ loadResults(getSearchKeys()); },10); return false; }); // /!\ AUTOCOMPLETE SELECT EVENT need a patch http://drupal.org/node/365241#comment-5374686 $("#edit-searchfield").bind('autocompleteSelect', function(event) { $(this).parents('.form').trigger('submit'); }); _$content .bind('jsp-initialised', function(event, isScrollable){ // trace('isScrollable = '+isScrollable); // TODO: better to check scroll-y than isscrollable, load next page before the end of scroll if(!isScrollable) loadNextResultsPage(); // TODO: what happend when there is no more page }) .bind('jsp-scroll-y', function(event, scrollPositionY, isAtTop, isAtBottom){ if(isAtBottom) loadNextResultsPage(); }); // trigger updated event on search results for direct html loading if($('.search-results', _$content).length){ setTimeout(function(){ var event = jQuery.Event('resultsupdated'); event.container = $('.search-results', _$content); $(window).trigger(event); }, 10); } }; function getSearchKeys(){ return $('#materio-search-api-search-form').find('input[name*="searchfield"]').val(); }; function loadResults(keys){ // trace('keys', keys); if(keys !== undefined){ keys = keys.replace('/', ' '); var types = {}; $('#edit-bundles-filter', '#materio-search-api-search-form').find('input[type*="checkbox"]').each(function(i){ $this = $(this); // if ( $this.attr('checked') ) { types[$this.val()] = $this.attr('checked'); // } }); trace('types', types); if(!_isloadingresults){ _isloadingresults = true; $('#materio-search-api-search-form').addClass('loading'); // TODO: record ajax path in a variable from materio_search_api_ajax_init $.getJSON(Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/search/'+keys, {'types':types}, function(json){ trace('json', json); $.event.trigger('resultsloaded'); _isloadingresults = false; $('#materio-search-api-search-form').removeClass('loading'); updateContent(json); }); } } }; function updateContent(json){ if(json.return){ $('.inner-content',_$content).html(json.return); var path = Drupal.settings.basePath + Drupal.settings.pathPrefix + json.search_path + '/' + json.keys; _History.pushState({content:json.return}, json.keys, path); $('input[name=location]','#feedback-form').attr('value', path); for (language in Drupal.settings.materio_search_api_ajax.languages) { var l = Drupal.settings.materio_search_api_ajax.languages[language]; $('#block-locale-language li.'+language+' a').attr('href', Drupal.settings.basePath + l.prefix+'/' + json.search_path + '/' + json.keys) }; var event = jQuery.Event('resultschanged'); event.container = $('.search-results', _$content); $.event.trigger(event); }else{ trace('no results'); } }; /** * infinit scroll */ function loadNextResultsPage(){ var $nextpage = $('ul.pager .pager-current', _$content).next(), href = $('a', $nextpage).attr('href'); if(href){ var keys = href.match(/explore\/([^\/|\?]+)/); var page = href.match(/\?page=([0-9]+)/); if(!_isloadingresults){ _isloadingresults = true; $('.materiobase-results', _$content).addClass('loading'); $.getJSON('/materio_search_api_ajax/search/'+keys[1]+'/'+page[1], function(json){ // trace('json', json); _isloadingresults = false; $('.materiobase-results', _$content).removeClass('loading'); addNextpage(json); }); } } }; function addNextpage(json){ var $newcontent = $(json.return), $newresults = $('.search-results', $newcontent).children('article').addClass('just-added'), $newpager = $('ul.pager', $newcontent); $('.search-results', _$content).append($newresults); $('ul.pager', _$content).replaceWith($newpager); $('.search-results', _$content).children('.just-added').each(function(i){ // $(this).delay(5000*i).removeClass('just-added'); var $this = $(this); setTimeout(function(){ $this.removeClass('just-added'); }, 150*i); }); var event = jQuery.Event('resultscompleted'); event.container = $('.search-results', _$content); $(window).trigger(event); }; /** * history navigation */ function initHistoryNav(){ var state = _History.getState(); _History.log('initial:', state.data, state.title, state.url); _History.Adapter.bind(window,'statechange',function(){ var state = _History.getState(); _History.log('statechange:', state.data, state.title, state.url); // TODO: History : empty content if we go back to the homepage $('.inner-content',_$content).html(state.data.content); }); }; /** * viewmode */ function initViewMode(){ $('.viewmode-link').click(function(event){ changeViewMode($(this).attr('rel'), $(this)); }); }; function changeViewMode(vm, $btn){ $.getJSON(Drupal.settings.basePath+'materio_search_api_ajax/viewmode/change/'+vm, function(json){ trace('viewmode json', json); if (json.statut == "saved"){ loadResults(getSearchKeys()); $('.viewmode-link').removeClass('active'); $btn.addClass('active'); } }); }; init(); }; var materiosearchapiajax = new MaterioSearchApiAjax(); })(jQuery);