// @codekit-prepend "gui.js" // @koala-prepend "gui_ck_fw/gui.js" (function($) { MaterioSearchApiAjax = function(){ var _isloadingresults = false; var _$content = $('#content'); // TODO: define $content by module settings /** * init() */ function init(){ //trace('init MaterioSearchApiAjax'); initSearchAjax(); initViewMode(); }; /** * searchAjax */ function initSearchAjax(){ // trace('initSearchAjax'); $('#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'); setTimeout(function(){ loadResults(getSearchKeys(), "taxonomy"); },10); }) .bind('focus', function(event){ $(this).select(); }); $(document) .bind('theme-ready', onThemeReady) .bind('init-scroller-pager', onInitScrollerPager) .bind('load-scroller-pager', onLoadScrollerPager) .bind('view-mode-changed', onViewModeChanged) .bind('history-state-change', onHistoryStateChange); }; function onThemeReady(event){ // trace('MaterioSearchApiAjax :: onThemeReady'); if( isActuality() || isExplore() ){ $.event.trigger({ type : 'resultschanged', container : isActuality() ? '#content .actuality-items' : '#content .search-results' }); } }; function getSearchKeys(){ return $('#materio-search-api-search-form').find('input[name*="searchfield"]').val(); }; function loadResults(keys, searchmode){ //trace('keys', keys); if(keys !== undefined && keys !== '' && keys.length >= 2){ keys = keys.replace('/', ' '); // define mode (between full text or only term selected on autocompletion) searchmode = searchmode || "fulltext"; // record the "node type filter" form item var types = {}, stringTypes = []; $('#edit-bundles-filter', '#materio-search-api-search-form').find('input[type*="checkbox"]').each(function(i){ $this = $(this); if ( $this.attr('checked') ) stringTypes.push($this.val()); types[$this.val()] = $this.attr('checked'); }); //trace('types', types); if(!_isloadingresults){ $.event.trigger('loading-content'); _isloadingresults = true; $('#materio-search-api-search-form').addClass('loading'); // trace('window.location.href',window.location.href); // 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/', {'types':types,'current_path':document.location.href, 'keys':keys, 'searchmode':searchmode}, function(json){ //trace('json', json); // google analytics $.event.trigger({ type : "record-stat", categorie : 'Search', action : keys, label : 'filters : '+ stringTypes.join(' ,'), value : json.count }); if(json.redirect){ window.location = json.redirect; }else{ $.event.trigger('loaded-content'); _isloadingresults = false; $('#materio-search-api-search-form').removeClass('loading'); changeContent(json); } }); } } }; function loadActuality(){ if(!_isloadingresults){ $.event.trigger('loading-content'); _isloadingresults = true; $('#materio-search-api-search-form').addClass('loading'); var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/actuality'; $.getJSON(url, function(json){ //trace('json', json); $.event.trigger('loaded-content'); _isloadingresults = false; $('#materio-search-api-search-form').removeClass('loading'); changeContent(json); }); } }; function changeContent(json){ //trace('MaterioSearchApiAjax changeContent | json', json); if(json.returned){ $.event.trigger('loaded-content'); $('.inner-content',_$content).html(json.returned).find('ul.pager').hide(); triggerContentChanged(); }else{ //trace('no results'); } $.event.trigger({ type : 'new-history-page', path : Drupal.settings.basePath + Drupal.settings.pathPrefix + json.path, title : json.title, content : json.returned }); 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) }; }; function triggerContentChanged(){ //trace('MaterioSearchApiAjax :: triggerContentChanged'); $.event.trigger({ type : 'resultschanged', container : '#content .search-results, #content .actuality-items' }); }; function onInitScrollerPager(event){ // trace("onInitScrollerPager"); if(isActuality() || isExplore()) event.pager.hide(); }; function onLoadScrollerPager(event){ // trace("onLoadScrollerPager"); if(!_isloadingresults){ if (isExplore()) loadNextResultsPage(event.href); if(isActuality()) loadNextActualityPage(event.href); } }; function loadNextResultsPage(href){ trace('loadNextResultsPage'); var keys = href.match(/explore\/([^\/|\?]+)/); var page = href.match(/\?page=([0-9]+)/); var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/search/'+page[1]; loadNextPage(url, keys[1], $('.materiobase-results', _$content), '.search-results'); }; function loadNextActualityPage(href){ // trace('loadNextActualityPage'); var page = href.match(/\?page=([0-9]+)/); var url = Drupal.settings.basePath+Drupal.settings.pathPrefix+'materio_search_api_ajax/actuality/'+page[1]; loadNextPage(url, '', $('.materiobase-actuality', _$content), '.actuality-items'); }; function loadNextPage(url, keys, $container, target){ // trace('MaterioSearchApiAjax :: loadNextPage()'); _isloadingresults = true; $container.addClass('loading'); $.getJSON(url, {'keys':keys}, function(json){ //trace('json', json); $container.removeClass('loading'); addNextpage(json, target); // addNextpageItemByItem($(json.return), target); }); }; function addNextpage(json, container_class){ // trace('json',json); if(json){ var $newcontent = $(json.returned), $newitems = $(container_class, $newcontent).children('article'), //.addClass('just-added'), $newpager = $('ul.pager', $newcontent); $(container_class, _$content).append($newitems); $('ul.pager', _$content).replaceWith($newpager.hide()); // TODO: animation, this should be on theme side $(container_class, _$content).children('.just-added').each(function(i){ var $this = $(this); setTimeout(function(){ $this.removeClass('just-added'); }, 150*i); }); $.event.trigger({ type : 'resultscompleted', container : $(container_class, _$content) }); } _isloadingresults = false; }; // TEST not used function addNextpageItemByItem($newcontent, container_class){ //trace('MaterioSearchApiAjax :: addNextpageItemByItem()'); $('ul.pager', _$content).remove(); $(container_class, _$content).append($(container_class, $newcontent).children('article').eq(0)); if($(container_class, $newcontent).children('article').length){ setTimeout(function(){ addNextpageItemByItem($newcontent, container_class); }, 200); }else{ _isloadingresults = false; $('ul.pager', _$content).replaceWith($('ul.pager', $newcontent).hide()); $.event.trigger({ type : 'resultscompleted', container : $(container_class, _$content) }); } }; /** * viewmode */ function initViewMode(){ $('.viewmode-link').click(function(event){ event.preventDefault(); if(!$(this).is('.active')){ $(this).trigger({type:'vm-clicked'}); changeViewMode($(this).attr('rel'), $(this)); }else{ $(this).trigger({type:'vm-clicked-active'}); } return false; }); }; function changeViewMode(vm, $btn){ if(!_isloadingresults){ _isloadingresults = true; $.getJSON(Drupal.settings.basePath+'materio_search_api_ajax/viewmode/change/'+vm, function(json){ //trace('viewmode json', json); _isloadingresults = false; if (json.statut == "saved"){ // google analytics $.event.trigger({ type : "record-stat", categorie : 'Viewmode', action : vm, label : isActuality() ? 'Actualities' : 'Search results' }); $.event.trigger('view-mode-changed'); $('.viewmode-link, .viewmode-link i').removeClass('active'); $btn.addClass('active').find('i').addClass('active'); } }); } }; function onViewModeChanged(event){ if (isExplore()) loadResults(getSearchKeys()); if(isActuality()) loadActuality(); }; /** * history */ function onHistoryStateChange(event){ if(isExplore() || isActuality()) triggerContentChanged(); // TODO: pushstate trogger state change, so we have a retriggerring here on loading new results … how to avoid this }; /** * helpers */ function isExplore(){ return $('.search-results', '#content').length; }; function isActuality(){ return $('.actuality-items', '#content').length; }; init(); }; $(document).ready(function() { var materiosearchapiajax = new MaterioSearchApiAjax(); }); })(jQuery);