materio-base-legacy/js/materio_search_api_ajax.js
Bachir Soussi Chiadmi 90c6d5e6e9 fixe @koala-prepend
2013-12-06 12:46:57 +01:00

340 lines
10 KiB
JavaScript
Executable File

// @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
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);