/* * :organization: Logilab * :copyright: 2003-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. * :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr */CubicWeb.require('htmlhelpers.js');CubicWeb.require('ajax.js');//============= filter form functions ========================================//functioncopyParam(origparams,newparams,param){varindex=findValue(origparams[0],param);if(index>-1){newparams[param]=origparams[1][index];}}functionfacetFormContent(form){varnames=[];varvalues=[];jQuery(form).find('.facet').each(function(){varfacetName=jQuery(this).find('.facetTitle').attr('cubicweb:facetName');varfacetValues=jQuery(this).find('.facetValueSelected').each(function(x){names.push(facetName);values.push(this.getAttribute('cubicweb:value'));});});jQuery(form).find('input').each(function(){names.push(this.name);values.push(this.value);});jQuery(form).find('select option[selected]').each(function(){names.push(this.parentNode.name);values.push(this.value);});return[names,values];}functionbuildRQL(divid,vid,paginate,vidargs){jQuery(CubicWeb).trigger('facets-content-loading',[divid,vid,paginate,vidargs]);varform=getNode(divid+'Form');varzipped=facetFormContent(form);zipped[0].push('facetargs');zipped[1].push(vidargs);vard=asyncRemoteExec('filter_build_rql',zipped[0],zipped[1]);d.addCallback(function(result){varrql=result[0];var$bkLink=jQuery('#facetBkLink');if($bkLink.length){varbkPath='view?rql='+escape(rql);if(vid){bkPath+='&vid='+escape(vid);}varbkUrl=$bkLink.attr('cubicweb:target')+'&path='+escape(bkPath);$bkLink.attr('href',bkUrl);}vartoupdate=result[1];varextraparams=vidargs;vardisplayactions=jQuery('#'+divid).attr('cubicweb:displayactions');if(displayactions){extraparams['displayactions']=displayactions;}if(paginate){extraparams['paginate']='1';}// copy some parameters// XXX cleanup vid/divid mess// if vid argument is specified , the one specified in form params will// be overriden by replacePageChunkcopyParam(zipped,extraparams,'vid');extraparams['divid']=divid;copyParam(zipped,extraparams,'divid');copyParam(zipped,extraparams,'subvid');copyParam(zipped,extraparams,'fromformfilter');// paginate used to know if the filter box is acting, in which case we// want to reload action box to match current selection (we don't want// this from a table filter)replacePageChunk(divid,rql,vid,extraparams,true,function(){jQuery(CubicWeb).trigger('facets-content-loaded',[divid,rql,vid,extraparams]);});if(paginate){// FIXME the edit box might not be displayed in which case we don't// know where to put the potential new one, just skip this case// for nowif(jQuery('#edit_box').length){reloadComponent('edit_box',rql,'boxes','edit_box');}if(jQuery('#breadcrumbs').length){reloadComponent('breadcrumbs',rql,'components','breadcrumbs');}}vard=asyncRemoteExec('filter_select_content',toupdate,rql);d.addCallback(function(updateMap){for(facetIdinupdateMap){varvalues=updateMap[facetId];jqNode(facetId).find('.facetCheckBox').each(function(){varvalue=this.getAttribute('cubicweb:value');if(!values.contains(value)){if(!jQuery(this).hasClass('facetValueDisabled')){jQuery(this).addClass('facetValueDisabled');}}else{if(jQuery(this).hasClass('facetValueDisabled')){jQuery(this).removeClass('facetValueDisabled');}}});}});});}varSELECTED_IMG=baseuri()+"data/black-check.png";varUNSELECTED_IMG=baseuri()+"data/no-check-no-border.png";varUNSELECTED_BORDER_IMG=baseuri()+"data/black-uncheck.png";functioninitFacetBoxEvents(root){// facetargs : (divid, vid, paginate, extraargs)root=root||document;jQuery(root).find('form').each(function(){varform=jQuery(this);// NOTE: don't evaluate facetargs here but in callbacks since its value// may changes and we must send its value when the callback is// called, not when the page is initializedvarfacetargs=form.attr('cubicweb:facetargs');if(facetargs!==undefined){form.submit(function(){buildRQL.apply(null,evalJSON(form.attr('cubicweb:facetargs')));returnfalse;});form.find('div.facet').each(function(){varfacet=jQuery(this);facet.find('div.facetCheckBox').each(function(i){this.setAttribute('cubicweb:idx',i);});facet.find('div.facetCheckBox').click(function(){var$this=jQuery(this);// NOTE : add test on the facet operator (i.e. OR, AND)// if ($this.hasClass('facetValueDisabled')){// return// }if($this.hasClass('facetValueSelected')){$this.removeClass('facetValueSelected');$this.find('img').each(function(i){if(this.getAttribute('cubicweb:unselimg')){this.setAttribute('src',UNSELECTED_BORDER_IMG);this.setAttribute('alt',(_('not selected')));}else{this.setAttribute('src',UNSELECTED_IMG);this.setAttribute('alt',(_('not selected')));}});varindex=parseInt($this.attr('cubicweb:idx'));// we dont need to move the element when cubicweb:idx == 0if(index>0){varshift=jQuery.grep(facet.find('.facetValueSelected'),function(n){varnindex=parseInt(n.getAttribute('cubicweb:idx'));returnnindex>index;}).length;index+=shift;varparent=this.parentNode;var$insertAfter=jQuery(parent).find('.facetCheckBox:nth('+index+')');if(!($insertAfter.length==1&&shift==0)){// only rearrange element if necessary$insertAfter.after(this);}}}else{varlastSelected=facet.find('.facetValueSelected:last');if(lastSelected.length){lastSelected.after(this);}else{varparent=this.parentNode;jQuery(parent).prepend(this);}jQuery(this).addClass('facetValueSelected');var$img=jQuery(this).find('img');$img.attr('src',SELECTED_IMG).attr('alt',(_('selected')));}buildRQL.apply(null,evalJSON(form.attr('cubicweb:facetargs')));facet.find('.facetBody').animate({scrollTop:0},'');});facet.find('select.facetOperator').change(function(){varnbselected=facet.find('div.facetValueSelected').length;if(nbselected>=2){buildRQL.apply(null,evalJSON(form.attr('cubicweb:facetargs')));}});facet.find('div.facetTitle').click(function(){facet.find('div.facetBody').toggleClass('hidden').toggleClass('opened');jQuery(this).toggleClass('opened');});});}});}// trigger this function on document ready event if you provide some kind of// persistent search (eg crih)functionreorderFacetsItems(root){root=root||document;jQuery(root).find('form').each(function(){varform=jQuery(this);if(form.attr('cubicweb:facetargs')){form.find('div.facet').each(function(){varfacet=jQuery(this);varlastSelected=null;facet.find('div.facetCheckBox').each(function(i){var$this=jQuery(this);if($this.hasClass('facetValueSelected')){if(lastSelected){lastSelected.after(this);}else{varparent=this.parentNode;jQuery(parent).prepend(this);}lastSelected=$this;}});});}});}// we need to differenciate cases where initFacetBoxEvents is called// with one argument or without any argument. If we use `initFacetBoxEvents`// as the direct callback on the jQuery.ready event, jQuery will pass some argument// of his, so we use this small anonymous function instead.jQuery(document).ready(function(){initFacetBoxEvents();});CubicWeb.provide('facets.js');